From 69e440ca977af6720a020eeed2a56c2ae26f657d Mon Sep 17 00:00:00 2001 From: vladimir talas Date: Wed, 29 Nov 2023 11:34:29 +0100 Subject: [PATCH 01/58] init submodule --- src/appmixer/airtable/airtable-commons.js | 44 ++ src/appmixer/airtable/auth.js | 141 +++++ src/appmixer/airtable/bundle.json | 9 + src/appmixer/airtable/package.json | 7 + src/appmixer/airtable/quota.js | 14 + .../records/CreateRecord/CreateRecord.js | 42 ++ .../records/CreateRecord/component.json | 97 ++++ .../records/DeleteRecord/DeleteRecord.js | 22 + .../records/DeleteRecord/component.json | 80 +++ .../airtable/records/GetRecord/GetRecord.js | 24 + .../airtable/records/GetRecord/component.json | 89 +++ .../airtable/records/ListBases/ListBases.js | 100 ++++ .../airtable/records/ListBases/component.json | 64 ++ .../records/ListRecords/ListRecords.js | 140 +++++ .../records/ListRecords/component.json | 173 ++++++ .../airtable/records/ListTables/ListTables.js | 156 +++++ .../records/ListTables/component.json | 80 +++ .../records/UpdateRecord/UpdateRecord.js | 48 ++ .../records/UpdateRecord/component.json | 110 ++++ src/appmixer/airtable/service.json | 8 + src/appmixer/airtable/test-flow.json | 545 ++++++++++++++++++ 21 files changed, 1993 insertions(+) create mode 100644 src/appmixer/airtable/airtable-commons.js create mode 100644 src/appmixer/airtable/auth.js create mode 100644 src/appmixer/airtable/bundle.json create mode 100644 src/appmixer/airtable/package.json create mode 100644 src/appmixer/airtable/quota.js create mode 100644 src/appmixer/airtable/records/CreateRecord/CreateRecord.js create mode 100644 src/appmixer/airtable/records/CreateRecord/component.json create mode 100644 src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js create mode 100644 src/appmixer/airtable/records/DeleteRecord/component.json create mode 100644 src/appmixer/airtable/records/GetRecord/GetRecord.js create mode 100644 src/appmixer/airtable/records/GetRecord/component.json create mode 100644 src/appmixer/airtable/records/ListBases/ListBases.js create mode 100644 src/appmixer/airtable/records/ListBases/component.json create mode 100644 src/appmixer/airtable/records/ListRecords/ListRecords.js create mode 100644 src/appmixer/airtable/records/ListRecords/component.json create mode 100644 src/appmixer/airtable/records/ListTables/ListTables.js create mode 100644 src/appmixer/airtable/records/ListTables/component.json create mode 100644 src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js create mode 100644 src/appmixer/airtable/records/UpdateRecord/component.json create mode 100644 src/appmixer/airtable/service.json create mode 100644 src/appmixer/airtable/test-flow.json diff --git a/src/appmixer/airtable/airtable-commons.js b/src/appmixer/airtable/airtable-commons.js new file mode 100644 index 000000000..94cf11186 --- /dev/null +++ b/src/appmixer/airtable/airtable-commons.js @@ -0,0 +1,44 @@ +'use strict'; +const pathModule = require('path'); + +module.exports = { + + // TODO: Move to appmixer-lib + // Expects standardized outputType: 'object', 'array', 'file' + async sendArrayOutput({ context, outputPortName = 'out', outputType = 'array', records = [] }) { + if (outputType === 'object') { + // One by one. + await context.sendArray(records, outputPortName); + } else if (outputType === 'array') { + // All at once. + await context.sendJson({ result: records }, outputPortName); + } else if (outputType === 'file') { + // Into CSV file. + const headers = Object.keys(records[0] || {}); + let csvRows = []; + csvRows.push(headers.join(',')); + for (const record of records) { + const values = headers.map(header => { + const val = record[header]; + return `"${val}"`; + }); + // To add ',' separator between each value + csvRows.push(values.join(',')); + } + const csvString = csvRows.join('\n'); + let buffer = Buffer.from(csvString, 'utf8'); + const componentName = context.flowDescriptor[context.componentId].label || context.componentId; + const fileName = `${context.config.outputFilePrefix || 'airtable-export'}-${componentName}.csv`; + const savedFile = await context.saveFileStream(pathModule.normalize(fileName), buffer); + await context.log({ step: 'File was saved', fileName, fileId: savedFile.fileId }); + await context.sendJson({ fileId: savedFile.fileId }, outputPortName); + } else { + throw new context.CancelError('Unsupported outputType ' + outputType); + } + }, + + isAppmixerVariable(variable) { + + return variable?.startsWith('{{{') && variable?.endsWith('}}}'); + } +}; diff --git a/src/appmixer/airtable/auth.js b/src/appmixer/airtable/auth.js new file mode 100644 index 000000000..f369f8921 --- /dev/null +++ b/src/appmixer/airtable/auth.js @@ -0,0 +1,141 @@ +'use strict'; + +const crypto = require('crypto'); + +const airtableUrl = 'https://airtable.com'; + +module.exports = { + + type: 'oauth2', + + definition: () => { + + return { + + scope: ['user.email:read', 'schema.bases:read'], + + accountNameFromProfileInfo: 'email', + + authUrl: context => { + + // Taken from https://github.com/Airtable/oauth-example/blob/main/index.js + // But we need ticket from context otherwise there's "Unknown ticket" error. + const state = context.ticket; + // Using context.ticket here as we need to store the code_verifier and keep it the same for the token request. + const codeVerifier = crypto.createHash('sha256').update(context.ticket).digest('base64url'); + const codeChallengeMethod = 'S256'; + const codeChallenge = crypto + .createHash('sha256') + .update(codeVerifier) // hash the code verifier with the sha256 algorithm + .digest('base64') // base64 encode, needs to be transformed to base64url + .replace(/=/g, '') // remove = + .replace(/\+/g, '-') // replace + with - + .replace(/\//g, '_'); // replace / with _ now base64url encoded + + // ideally, entries in this cache expires after ~10-15 minutes + // we'll use this in the redirect url route + // any other data you want to store, like the user's ID + + // build the authorization URL + const authorizationUrl = new URL(`${airtableUrl}/oauth2/v1/authorize`); + authorizationUrl.searchParams.set('code_challenge', codeChallenge); + authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod); + authorizationUrl.searchParams.set('state', state); + authorizationUrl.searchParams.set('client_id', context.clientId); + authorizationUrl.searchParams.set('redirect_uri', context.callbackUrl); + authorizationUrl.searchParams.set('response_type', 'code'); + // your OAuth integration register with these scopes in the management page + authorizationUrl.searchParams.set('scope', context.scope.join(' ')); + + return authorizationUrl.toString(); + }, + + requestAccessToken: async (context) => { + + // Using context.ticket same as in authUrl. + const codeVerifier = crypto.createHash('sha256').update(context.ticket).digest('base64url'); + const headers = { + // Content-Type is always required + 'Content-Type': 'application/x-www-form-urlencoded' + }; + if (context.clientSecret !== '') { + // Authorization is required if your integration has a client secret + // omit it otherwise + const encodedCredentials = Buffer.from(`${context.clientId}:${context.clientSecret}`).toString('base64'); + const authorizationHeader = `Basic ${encodedCredentials}`; + headers.Authorization = authorizationHeader; + } + + const { data } = await context.httpRequest({ + method: 'POST', + url: `${airtableUrl}/oauth2/v1/token`, + headers, + // stringify the request body like a URL query string + data: new URLSearchParams({ + // client_id is optional if authorization header provided + // required otherwise. + client_id: context.clientId, + code_verifier: codeVerifier, + redirect_uri: context.callbackUrl, + code: context.authorizationCode, + grant_type: 'authorization_code' + }) + }); + let accessTokenExpDate = new Date(); + accessTokenExpDate.setTime(accessTokenExpDate.getTime() + (data['expires_in'] * 1000)); + let refreshTokenExpDate = new Date(); + refreshTokenExpDate + .setTime(refreshTokenExpDate.getTime() + (data['refresh_expires_in'] * 1000)); + + const result = { + accessToken: data['access_token'], + refreshToken: data['refresh_token'], + accessTokenExpDate, + refreshTokenExpDate + }; + + return result; + }, + + requestProfileInfo: { + method: 'GET', + url: 'https://api.airtable.com/v0/meta/whoami', + headers: { + 'Authorization': 'Bearer {{accessToken}}', + 'User-Agent': 'AppMixer' + } + }, + + refreshAccessToken: async context => { + + const tokenUrl = `${airtableUrl}/oauth2/v1/token`; + const headers = { + 'Authorization': + 'Basic ' + Buffer.from(context.clientId + ':' + context.clientSecret).toString('base64'), + 'Content-Type': 'application/x-www-form-urlencoded' + }; + + const { data } = await context.httpRequest.post(tokenUrl, { + grant_type: 'refresh_token', + refresh_token: context.refreshToken + }, { headers }); + + const newDate = new Date(); + newDate.setTime(newDate.getTime() + (data.expires_in * 1000)); + return { + accessToken: data.access_token, + accessTokenExpDate: newDate + }; + }, + + validateAccessToken: { + method: 'GET', + url: 'https://api.airtable.com/v0/meta/whoami', + headers: { + 'Authorization': 'Bearer {{accessToken}}', + 'User-Agent': 'AppMixer' + } + } + }; + } +}; diff --git a/src/appmixer/airtable/bundle.json b/src/appmixer/airtable/bundle.json new file mode 100644 index 000000000..a39d4a9bf --- /dev/null +++ b/src/appmixer/airtable/bundle.json @@ -0,0 +1,9 @@ +{ + "name": "appmixer.airtable", + "version": "1.0.4", + "changelog": { + "1.0.4": [ + "Initial release" + ] + } +} diff --git a/src/appmixer/airtable/package.json b/src/appmixer/airtable/package.json new file mode 100644 index 000000000..98d36f41c --- /dev/null +++ b/src/appmixer/airtable/package.json @@ -0,0 +1,7 @@ +{ + "name": "appmixer.airtable", + "version": "0.0.1", + "dependencies": { + "airtable": "0.12.2" + } +} diff --git a/src/appmixer/airtable/quota.js b/src/appmixer/airtable/quota.js new file mode 100644 index 000000000..c2bd14146 --- /dev/null +++ b/src/appmixer/airtable/quota.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + + rules: [ + { + limit: 5, // Official limit is 5 requests per second. + window: 1000, + queueing: 'fifo', + resource: 'messages.send', + scope: 'userId' + } + ] +}; diff --git a/src/appmixer/airtable/records/CreateRecord/CreateRecord.js b/src/appmixer/airtable/records/CreateRecord/CreateRecord.js new file mode 100644 index 000000000..44e96b694 --- /dev/null +++ b/src/appmixer/airtable/records/CreateRecord/CreateRecord.js @@ -0,0 +1,42 @@ +'use strict'; + +const Airtable = require('airtable'); + +module.exports = { + + async receive(context) { + + const { + baseId, tableIdOrName, fields, + returnFieldsByFieldId = false, typecast = false + } = context.messages.in.content; + + Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: context.auth.accessToken + }); + const base = Airtable.base(baseId); + + const queryParams = { + returnFieldsByFieldId, + typecast + }; + + let fieldsObject = {}; + try { + fieldsObject = JSON.parse(fields); + } catch (error) { + throw new context.CancelError('Invalid fields JSON'); + } + + context.log({ step: 'Creating record', queryParams, fieldsObject }); + + const result = await base(tableIdOrName).create([{ fields: fieldsObject }], queryParams); + + // Make it the same as in REST API + // eslint-disable-next-line no-underscore-dangle + const item = result[0]._rawJson; + + context.sendJson(item, 'out'); + } +}; diff --git a/src/appmixer/airtable/records/CreateRecord/component.json b/src/appmixer/airtable/records/CreateRecord/component.json new file mode 100644 index 000000000..bc738f9b2 --- /dev/null +++ b/src/appmixer/airtable/records/CreateRecord/component.json @@ -0,0 +1,97 @@ +{ + "name": "appmixer.airtable.records.CreateRecord", + "author": "Jiří Hofman ", + "label": "Create Record", + "description": "Creates a single record in a table.", + "private": false, + "version": "1.0.1", + "auth": { + "service": "appmixer:airtable", + "scope": ["data.records:write"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "tableIdOrName": { "type": "string" }, + "fields": { "type": "string" }, + "returnFieldsByFieldId": { "type": "boolean" }, + "typecast": { "type": "boolean" } + }, + "required": ["baseId", "tableIdOrName", "fields"] + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "tableIdOrName": { + "type": "select", + "label": "Table ID or Name", + "index": 2, + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "messages": { + "in/baseId": "inputs/in/baseId", + "in/isSource": true + }, + "transform": "./ListTables#toSelectArray" + } + } + }, + "fields": { + "type": "textarea", + "label": "Fields", + "index": 3, + "tooltip": "JSON object mapping field names to their values. Each field has a key corresponding to its field name and a value corresponding to its value. It is not necessary to specify every field in the table to create a record — only those that are non-empty. See more in the fields API docs." + }, + "returnFieldsByFieldId": { + "type": "toggle", + "label": "Return fields by field ID", + "index": 4, + "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." + }, + "typecast": { + "type": "toggle", + "label": "Typecast", + "index": 5, + "tooltip": "The Airtable API will perform best-effort automatic data conversion from string values if the typecast parameter is passed in. Automatic conversion is disabled by default to ensure data integrity, but it may be helpful for integrating with 3rd party data sources." + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { "label": "Fields", "value": "fields" }, + { "label": "ID", "value": "id" }, + { "label": "Created Time", "value": "createdTime" } + ] + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js b/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js new file mode 100644 index 000000000..dfaea4c04 --- /dev/null +++ b/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js @@ -0,0 +1,22 @@ +'use strict'; + +const Airtable = require('airtable'); + +module.exports = { + + async receive(context) { + + const { + baseId, tableIdOrName, recordId + } = context.messages.in.content; + + Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: context.auth.accessToken + }); + const base = Airtable.base(baseId); + const { id } = await base(tableIdOrName).destroy(recordId); + + context.sendJson({ id }, 'out'); + } +}; diff --git a/src/appmixer/airtable/records/DeleteRecord/component.json b/src/appmixer/airtable/records/DeleteRecord/component.json new file mode 100644 index 000000000..e4caf2f7e --- /dev/null +++ b/src/appmixer/airtable/records/DeleteRecord/component.json @@ -0,0 +1,80 @@ +{ + "name": "appmixer.airtable.records.DeleteRecord", + "author": "Jiří Hofman ", + "label": "Delete Record", + "description": "Deletes a single record in a table.", + "private": false, + "version": "1.0.1", + "auth": { + "service": "appmixer:airtable", + "scope": ["data.records:write"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "tableIdOrName": { "type": "string" }, + "recordId": { "type": "string" } + }, + "required": ["baseId", "tableIdOrName", "recordId"] + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "tableIdOrName": { + "type": "select", + "label": "Table ID or Name", + "index": 2, + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "messages": { + "in/baseId": "inputs/in/baseId", + "in/isSource": true + }, + "transform": "./ListTables#toSelectArray" + } + } + }, + "recordId": { + "type": "text", + "label": "Record ID", + "index": 3 + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { "label": "ID", "value": "id" } + ] + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/GetRecord/GetRecord.js b/src/appmixer/airtable/records/GetRecord/GetRecord.js new file mode 100644 index 000000000..2e82bd7d2 --- /dev/null +++ b/src/appmixer/airtable/records/GetRecord/GetRecord.js @@ -0,0 +1,24 @@ +'use strict'; + +const Airtable = require('airtable'); + +module.exports = { + + async receive(context) { + + const { baseId, tableIdOrName, recordId } = context.messages.in.content; + + Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: context.auth.accessToken + }); + const base = Airtable.base(baseId); + + const result = await base(tableIdOrName).find(recordId); + // Make it the same as in REST API + // eslint-disable-next-line no-underscore-dangle + const item = result._rawJson; + + context.sendJson(item, 'out'); + } +}; diff --git a/src/appmixer/airtable/records/GetRecord/component.json b/src/appmixer/airtable/records/GetRecord/component.json new file mode 100644 index 000000000..d59655454 --- /dev/null +++ b/src/appmixer/airtable/records/GetRecord/component.json @@ -0,0 +1,89 @@ +{ + "name": "appmixer.airtable.records.GetRecord", + "author": "Jiří Hofman ", + "label": "Get Record", + "description": "Gets a single record from a table.", + "private": false, + "version": "1.0.1", + "auth": { + "service": "appmixer:airtable", + "scope": ["data.records:read"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "tableIdOrName": { "type": "string" }, + "recordId": { "type": "string" }, + "returnFieldsByFieldId": { "type": "boolean" } + }, + "required": ["baseId", "tableIdOrName", "recordId"] + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "tableIdOrName": { + "type": "select", + "label": "Table ID or Name", + "index": 2, + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "messages": { + "in/baseId": "inputs/in/baseId", + "in/isSource": true + }, + "transform": "./ListTables#toSelectArray" + } + } + }, + "recordId": { + "type": "text", + "label": "Record ID", + "index": 3 + }, + "returnFieldsByFieldId": { + "type": "toggle", + "label": "Return fields by field ID", + "index": 4, + "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { "label": "Fields", "value": "fields" }, + { "label": "ID", "value": "id" }, + { "label": "Created Time", "value": "createdTime" } + ] + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/ListBases/ListBases.js b/src/appmixer/airtable/records/ListBases/ListBases.js new file mode 100644 index 000000000..f8e62a479 --- /dev/null +++ b/src/appmixer/airtable/records/ListBases/ListBases.js @@ -0,0 +1,100 @@ +'use strict'; + +const { sendArrayOutput } = require('../../airtable-commons'); + +module.exports = { + + // Private component used only to list bases in the inspector for other components. + async receive(context) { + + const generateOutputPortOptions = context.properties.generateOutputPortOptions; + const { outputType, isSource } = context.messages.in.content; + if (generateOutputPortOptions) { + return this.getOutputPortOptions(context, outputType); + } + + const cacheKey = 'airtable_bases_' + context.auth.accessToken; + let lock; + try { + lock = await context.lock(context.auth.accessToken); + + // Checking and returning cache only if this is a call from another component. + if (isSource) { + const basesCached = await context.staticCache.get(cacheKey); + if (basesCached) { + return context.sendJson({ items: basesCached }, 'out'); + } + } + + const { data } = await context.httpRequest.get('https://api.airtable.com/v0/meta/bases', { + headers: { + Authorization: `Bearer ${context.auth.accessToken}` + } + }); + const { bases } = data; + + // Cache the tables for 20 seconds unless specified otherwise in the config. + // Note that we only need name and id, so we can save some space in the cache. + // Caching only if this is a call from another component. + if (isSource) { + await context.staticCache.set( + cacheKey, + bases.map(item => ({ id: item.id, name: item.name })), + context.config.listBasesCacheTTL || (20 * 1000) + ); + + // Returning values into another component. + return context.sendJson({ items: bases }, 'out'); + } + + // Returning values to the flow. + await sendArrayOutput({ context, outputType, records: bases }); + } finally { + lock?.unlock(); + } + }, + + toSelectArray({ items }) { + + return items.map(base => { + return { label: base.name, value: base.id }; + }); + }, + + getOutputPortOptions(context, outputType) { + + if (outputType === 'object') { + return context.sendJson( + [ + { label: 'id', value: 'id' }, + { label: 'name', value: 'name' }, + { label: 'permissionLevel', value: 'permissionLevel' } + ], + 'out' + ); + } else if (outputType === 'array') { + return context.sendJson( + [ + { + label: 'Array', value: 'array', + schema: { + type: 'array', + items: { + type: 'object', + properties: { + id: { type: 'string', title: 'id' }, + name: { type: 'string', title: 'name' }, + permissionLevel: { type: 'string', title: 'permissionLevel' } + } + } + } + } + ], + 'out' + ); + } else { + // file + return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); + } + } +}; diff --git a/src/appmixer/airtable/records/ListBases/component.json b/src/appmixer/airtable/records/ListBases/component.json new file mode 100644 index 000000000..14f19eef4 --- /dev/null +++ b/src/appmixer/airtable/records/ListBases/component.json @@ -0,0 +1,64 @@ +{ + "name": "appmixer.airtable.records.ListBases", + "author": "Jiří Hofman ", + "label": "List Bases", + "description": "List available bases.", + "private": false, + "version": "1.0.2", + "auth": { + "service": "appmixer:airtable", + "scope": ["schema.bases:read"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "outputType": { "type": "string" } + } + }, + "inspector": { + "inputs": { + "outputType": { + "group": "last", + "type": "select", + "label": "Output Type", + "index": 1, + "defaultValue": "array", + "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", + "options": [ + { "label": "All items at once", "value": "array" }, + { "label": "One item at a time", "value": "object" }, + { "label": "File", "value": "file" } + ] + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "properties": { + "generateOutputPortOptions": true + }, + "messages": { + "in/outputType": "inputs/in/outputType" + } + } + } + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/ListRecords/ListRecords.js b/src/appmixer/airtable/records/ListRecords/ListRecords.js new file mode 100644 index 000000000..3e28a0416 --- /dev/null +++ b/src/appmixer/airtable/records/ListRecords/ListRecords.js @@ -0,0 +1,140 @@ +'use strict'; + +const Airtable = require('airtable'); +const { sendArrayOutput } = require('../../airtable-commons'); + +module.exports = { + + async receive(context) { + + const generateOutputPortOptions = context.properties.generateOutputPortOptions; + const { + baseId, tableIdOrName, + // Optional query params + fields, + filterByFormula, + maxRecords = 10000, + // Page size and offset doesn't make sense as the SDK does pagination automatically. + // pageSize, + // offset, + sort, + view, + cellFormat = 'json', + timeZone, + userLocale, + // method ?: string; + returnFieldsByFieldId, + recordMetadata, + // Appmixer specific + outputType + } = context.messages.in.content; + + if (generateOutputPortOptions) { + return this.getOutputPortOptions(context, outputType); + } + + Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: context.auth.accessToken + }); + const base = Airtable.base(baseId); + + const queryParams = { + // If not provided by user, use our default value. + maxRecords, + // If not provided by user, use our default value json. + cellFormat + }; + if (fields) { + queryParams.fields = fields.trim().split(','); + } + if (filterByFormula) { + queryParams.filterByFormula = filterByFormula.trim(); + } + if (sort) { + try { + queryParams.sort = JSON.parse(sort); + } catch (e) { + // noop + context.log({ step: 'sort', error: e }); + } + } + if (view) { + queryParams.view = view; + } + if (timeZone) { + queryParams.timeZone = timeZone; + } + if (userLocale) { + queryParams.userLocale = userLocale; + } + if (returnFieldsByFieldId) { + queryParams.returnFieldsByFieldId = returnFieldsByFieldId; + } + if (recordMetadata) { + // This one works only with ['commentCount']. If provided other values, it fails with 422: INVALID_REQUEST_UNKNOWN. + queryParams.recordMetadata = ['commentCount']; + } + context.log({ step: 'queryParams', queryParams }); + + const all = await base(tableIdOrName).select(queryParams).all(); + const items = all.map(item => { + const record = { + // eslint-disable-next-line no-underscore-dangle + createdTime: item.createdTime || item._rawJson?.createdTime, + fields: item.fields, + id: item.id + }; + + if (recordMetadata) { + record.commentCount = item.commentCount; + } + + return record; + }); + + await sendArrayOutput({ context, outputType, records: items }); + }, + + getOutputPortOptions(context, outputType) { + + if (outputType === 'item') { + return context.sendJson( + [ + { label: 'createdTime', value: 'createdTime' }, + { label: 'fields', value: 'fields', + // We can't know table columns beforehand, so we'll just use empty object as schema. + schema: { type: 'object' } + }, + { label: 'id', value: 'id' }, + { label: 'commentCount', value: 'commentCount' } + ], + 'out' + ); + } else if (outputType === 'array') { + return context.sendJson( + [ + { label: 'Result', value: 'result', + schema: { type: 'array', + items: { type: 'object', + properties: { + createdTime: { type: 'string', title: 'createdTime' }, + fields: { type: 'object', title: 'fields', + // We can't know table columns beforehand, so we'll just use empty object as schema. + schema: { type: 'object' } + }, + id: { type: 'string', title: 'id' }, + commentCount: { type: 'number', title: 'commentCount' } + } + } + } + } + ], + 'out' + ); + } else { + // file + return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); + } + } +}; diff --git a/src/appmixer/airtable/records/ListRecords/component.json b/src/appmixer/airtable/records/ListRecords/component.json new file mode 100644 index 000000000..1cae5ddba --- /dev/null +++ b/src/appmixer/airtable/records/ListRecords/component.json @@ -0,0 +1,173 @@ +{ + "name": "appmixer.airtable.records.ListRecords", + "author": "Jiří Hofman ", + "label": "List Records", + "description": "List records in a table.", + "private": false, + "version": "1.0.3", + "auth": { + "service": "appmixer:airtable", + "scope": ["data.records:read"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "tableIdOrName": { "type": "string" }, + "fields": { "type": "string" }, + "filterByFormula": { "type": "string" }, + "maxRecords": { "type": "number" }, + "sort": { "type": "string" }, + "view": { "type": "string" }, + "cellFormat": { "type": "string" }, + "timeZone": { "type": "string" }, + "userLocale": { "type": "string" }, + "returnFieldsByFieldId": { "type": "boolean" }, + "recordMetadata": { "type": "boolean" }, + "outputType": { "type": "string" } + }, + "required": ["baseId", "tableIdOrName"] + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "tableIdOrName": { + "type": "select", + "label": "Table ID or Name", + "index": 2, + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "messages": { + "in/baseId": "inputs/in/baseId", + "in/isSource": true + }, + "transform": "./ListTables#toSelectArray" + } + } + }, + "fields": { + "type": "text", + "label": "Fields", + "index": 3, + "tooltip": "Comma-separated list of fields to retrieve. Only data for fields whose names or IDs are in this list will be included in the result. If you don't need every field, you can use this parameter to reduce the amount of data transferred." + }, + "filterByFormula": { + "type": "textarea", + "label": "Filter by formula", + "index": 4, + "tooltip": "A formula used to filter records. The formula will be evaluated for each record, and if the result is not 0, false, \"\", NaN, [], or #Error! the record will be included in the response. We recommend testing your formula in the Formula field UI before using it in your API request. See more in the filterByFormula API docs." + }, + "maxRecords": { + "type": "number", + "label": "Max Records", + "index": 5, + "tooltip": "The maximum total number of records that will be returned in your requests. Default value is 10000." + }, + "sort": { + "type": "text", + "label": "Sort", + "index": 6, + "tooltip": "A list of sort objects that specifies how the records will be ordered. Each sort object must have a field key specifying the name of the field to sort on, and an optional direction key that is either asc or desc. The default direction is asc. Example: [{\"field\": \"Feature\", \"direction\": \"desc\"}]. See more in the sort API docs." + }, + "view": { + "type": "text", + "label": "View", + "index": 7, + "tooltip": "The name or ID of a view in the table. If set, only the records in that view will be returned. The records will be sorted according to the order of the view unless the sort parameter is included, which overrides that order. Fields hidden in this view will be returned in the results. To only return a subset of fields, use the fields parameter." + }, + "cellFormat": { + "type": "select", + "defaultValue": "json", + "options": [ + { "value": "json", "label": "json" }, + { "value": "string", "label": "string" } + ], + "label": "Cell Format", + "index": 8, + "tooltip": "The format that should be used for cell values. See more in the cellFormat API docs." + }, + "timeZone": { + "type": "text", + "label": "Timezone", + "index": 9, + "tooltip": "This parameter is required when using string as the cellFormat. For possible values see Supported timezones for SET_TIMEZONE." + }, + "userLocale": { + "type": "text", + "label": "User Locale", + "index": 10, + "tooltip": "This parameter is required when using string as the cellFormat. For possible values see Supported locale modifiers for SET_LOCALE." + }, + "returnFieldsByFieldId": { + "type": "toggle", + "label": "ReturnFieldsByFieldId", + "index": 11, + "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." + }, + "recordMetadata": { + "type": "toggle", + "label": "Record Metadata", + "index": 12, + "tooltip": "An optional field that, if specified, includes commentCount on each record returned." + }, + "outputType": { + "group": "last", + "type": "select", + "label": "Output Type", + "index": 13, + "defaultValue": "array", + "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", + "options": [ + { "label": "All items at once", "value": "array" }, + { "label": "One item at a time", "value": "object" }, + { "label": "File", "value": "file" } + ] + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "source": { + "url": "/component/appmixer/airtable/records/ListRecords?outPort=out", + "data": { + "properties": { + "generateOutputPortOptions": true + }, + "messages": { + "in/outputType": "inputs/in/outputType", + "in/baseId": 1, + "in/tableIdOrName": 1 + } + } + } + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/ListTables/ListTables.js b/src/appmixer/airtable/records/ListTables/ListTables.js new file mode 100644 index 000000000..e1f48db3c --- /dev/null +++ b/src/appmixer/airtable/records/ListTables/ListTables.js @@ -0,0 +1,156 @@ +'use strict'; + +const { sendArrayOutput, isAppmixerVariable } = require('../../airtable-commons'); + +module.exports = { + + // Private component used only to list tables in a base in the inspector. + async receive(context) { + + const generateOutputPortOptions = context.properties.generateOutputPortOptions; + const { baseId, outputType, isSource } = context.messages.in.content; + if (generateOutputPortOptions) { + return this.getOutputPortOptions(context, outputType); + } + if (!baseId || isAppmixerVariable(baseId)) { + // This is the case when component is added to the inspector and user didn't select a base yet. + // We don't want to throw an error yet. + return context.sendJson({ items: [] }, 'out'); + } + + const cacheKey = 'airtable_tables_' + baseId; + let lock; + try { + lock = await context.lock(baseId); + + // Checking and returning cache only if this is a call from another component. + if (isSource) { + const tablesCached = await context.staticCache.get(cacheKey); + if (tablesCached) { + return context.sendJson({ items: tablesCached }, 'out'); + } + } + + const { data } = await context.httpRequest.get(`https://api.airtable.com/v0/meta/bases/${baseId}/tables`, { + headers: { + Authorization: `Bearer ${context.auth.accessToken}` + } + }); + const { tables } = data; + + // Cache the tables for 20 seconds unless specified otherwise in the config. + // Note that we only need name and id, so we can save some space in the cache. + // Caching only if this is a call from another component. + if (isSource) { + await context.staticCache.set( + cacheKey, + tables.map(table => ({ id: table.id, name: table.name })), + context.config.listTablesCacheTTL || (20 * 1000) + ); + + return context.sendJson({ items: tables }, 'out'); + } + + // Returning values to the flow. + await sendArrayOutput({ context, outputType, records: tables }); + } finally { + lock?.unlock(); + } + }, + + toSelectArray({ items }) { + + return items.map(table => { + return { label: table.name, value: table.id }; + }); + }, + + getOutputPortOptions(context, outputType) { + + if (outputType === 'object') { + return context.sendJson( + [ + { label: 'description', value: 'description' }, + { + label: 'fields', value: 'fields', + schema: { + type: 'array', + items: { + type: 'object', + properties: { + description: { label: 'description', value: 'description' }, + id: { label: 'id', value: 'id' }, + name: { label: 'name', value: 'name' }, + type: { label: 'type', value: 'type' } + } + } + } + }, + { label: 'id', value: 'id' }, + { label: 'name', value: 'name' }, + { label: 'primaryFieldId', value: 'primaryFieldId' }, + { + label: 'views', value: 'views', + schema: { + type: 'array', + items: { + type: 'object', + properties: { + id: { label: 'id', value: 'id' }, + name: { label: 'name', value: 'name' }, + type: { label: 'type', value: 'type' } + } + } + } + } + ], + 'out' + ); + } else if (outputType === 'array') { + return context.sendJson( + [ + { + label: 'Array', value: 'array', + schema: { type: 'array', + items: { type: 'object', + properties: { + description: { type: 'string', title: 'description' }, + fields: { type: 'object', title: 'fields', + schema: { type: 'array', + items: { type: 'object', + properties: { + description: { label: 'description', value: 'description' }, + id: { label: 'id', value: 'id' }, + name: { label: 'name', value: 'name' }, + type: { label: 'type', value: 'type' } + } + } + } + }, + id: { type: 'string', title: 'id' }, + name: { type: 'string', title: 'name' }, + primaryFieldId: { type: 'string', title: 'primaryFieldId' }, + views: { type: 'object', title: 'views', + schema: { type: 'array', + items: { type: 'object', + properties: { + id: { label: 'id', value: 'id' }, + name: { label: 'name', value: 'name' }, + type: { label: 'type', value: 'type' } + } + } + } + } + } + } + } + } + ], + 'out' + ); + } else { + // file + return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); + } + } +}; diff --git a/src/appmixer/airtable/records/ListTables/component.json b/src/appmixer/airtable/records/ListTables/component.json new file mode 100644 index 000000000..288fe9597 --- /dev/null +++ b/src/appmixer/airtable/records/ListTables/component.json @@ -0,0 +1,80 @@ +{ + "name": "appmixer.airtable.records.ListTables", + "author": "Jiří Hofman ", + "label": "List Tables", + "description": "List available tables in a base.", + "private": false, + "version": "1.0.2", + "auth": { + "service": "appmixer:airtable", + "scope": ["schema.bases:read"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "outputType": { "type": "string" } + } + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "outputType": { + "group": "last", + "type": "select", + "label": "Output Type", + "index": 2, + "defaultValue": "array", + "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", + "options": [ + { "label": "All items at once", "value": "array" }, + { "label": "One item at a time", "value": "object" }, + { "label": "File", "value": "file" } + ] + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "properties": { + "generateOutputPortOptions": true + }, + "messages": { + "in/outputType": "inputs/in/outputType", + "in/baseId": 1 + } + } + } + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js b/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js new file mode 100644 index 000000000..4bb590d27 --- /dev/null +++ b/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js @@ -0,0 +1,48 @@ +'use strict'; + +const Airtable = require('airtable'); + +module.exports = { + + async receive(context) { + + const { + baseId, tableIdOrName, recordId, fields, + replace, + returnFieldsByFieldId = false, typecast = false + } = context.messages.in.content; + + Airtable.configure({ + endpointUrl: 'https://api.airtable.com', + apiKey: context.auth.accessToken + }); + const base = Airtable.base(baseId); + + const queryParams = { + returnFieldsByFieldId, + typecast + }; + + let fieldsObject = {}; + try { + fieldsObject = JSON.parse(fields); + } catch (error) { + throw new context.CancelError('Invalid fields JSON'); + } + const data = { fields: fieldsObject, id: recordId }; + + context.log({ step: 'Updating record', data, queryParams }); + + let result; + if (replace === true) { + result = await base(tableIdOrName).replace([data], queryParams); + } else { + result = await base(tableIdOrName).update([data], queryParams); + } + // Make it the same as in REST API + // eslint-disable-next-line no-underscore-dangle + const item = result[0]._rawJson; + + context.sendJson(item, 'out'); + } +}; diff --git a/src/appmixer/airtable/records/UpdateRecord/component.json b/src/appmixer/airtable/records/UpdateRecord/component.json new file mode 100644 index 000000000..27a1fa02e --- /dev/null +++ b/src/appmixer/airtable/records/UpdateRecord/component.json @@ -0,0 +1,110 @@ +{ + "name": "appmixer.airtable.records.UpdateRecord", + "author": "Jiří Hofman ", + "label": "Update Record", + "description": "Updates a single record in a table.", + "private": false, + "version": "1.0.1", + "auth": { + "service": "appmixer:airtable", + "scope": ["data.records:write"] + }, + "quota": { + "manager": "appmixer:airtable", + "resources": "messages.send", + "scope": { + "userId": "{{userId}}" + } + }, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "baseId": { "type": "string" }, + "tableIdOrName": { "type": "string" }, + "recordId": { "type": "string" }, + "fields": { "type": "string" }, + "replace": { "type": "boolean" }, + "returnFieldsByFieldId": { "type": "boolean" }, + "typecast": { "type": "boolean" } + }, + "required": ["baseId", "tableIdOrName", "recordId", "fields"] + }, + "inspector": { + "inputs": { + "baseId": { + "type": "select", + "label": "Base ID", + "index": 1, + "source": { + "url": "/component/appmixer/airtable/records/ListBases?outPort=out", + "data": { + "messages": { + "in/isSource": true + }, + "transform": "./ListBases#toSelectArray" + } + } + }, + "tableIdOrName": { + "type": "select", + "label": "Table ID or Name", + "index": 2, + "source": { + "url": "/component/appmixer/airtable/records/ListTables?outPort=out", + "data": { + "messages": { + "in/baseId": "inputs/in/baseId", + "in/isSource": true + }, + "transform": "./ListTables#toSelectArray" + } + } + }, + "recordId": { + "type": "text", + "label": "Record ID", + "index": 3 + }, + "fields": { + "type": "textarea", + "label": "Fields", + "index": 4, + "tooltip": "JSON object mapping field names to their values. Each field has a key corresponding to its field name and a value corresponding to its value. It is not necessary to specify every field in the table to create a record — only those that are non-empty. See more in the fields API docs." + }, + "replace": { + "type": "toggle", + "label": "Replace", + "index": 5, + "tooltip": "If true the request will perform a destructive update and clear all unspecified cell values. Otherwise, unspecified cell values will remain unchanged." + }, + "returnFieldsByFieldId": { + "type": "toggle", + "label": "Return fields by field ID", + "index": 6, + "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." + }, + "typecast": { + "type": "toggle", + "label": "Typecast", + "index": 7, + "tooltip": "The Airtable API will perform best-effort automatic data conversion from string values if the typecast parameter is passed in. Automatic conversion is disabled by default to ensure data integrity, but it may be helpful for integrating with 3rd party data sources." + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { "label": "Fields", "value": "fields" }, + { "label": "ID", "value": "id" }, + { "label": "Created Time", "value": "createdTime" } + ] + } + ], + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/service.json b/src/appmixer/airtable/service.json new file mode 100644 index 000000000..9f0a78e3a --- /dev/null +++ b/src/appmixer/airtable/service.json @@ -0,0 +1,8 @@ +{ + "name": "appmixer.airtable", + "label": "Airtable", + "category": "applications", + "description": "Airtable is a low-code platform to build next-gen apps. Move beyond rigid tools, operationalize your critical data, and reimagine workflows with AI.", + "version": "1.0.0", + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" +} diff --git a/src/appmixer/airtable/test-flow.json b/src/appmixer/airtable/test-flow.json new file mode 100644 index 000000000..08e546f11 --- /dev/null +++ b/src/appmixer/airtable/test-flow.json @@ -0,0 +1,545 @@ +{ + "name": "Jirka Airtable E2E", + "description": "Testing sh!t", + "flow": { + "1f0396b0-22cc-405b-a032-e34bcc2e9eeb": { + "type": "appmixer.utils.controls.OnStart", + "x": 192, + "y": -848, + "source": {}, + "version": "1.0.0", + "config": { + "transform": {} + } + }, + "3271690d-2d76-41e1-b242-18420b76bbda": { + "type": "appmixer.airtable.records.ListRecords", + "x": 592, + "y": -720, + "version": "1.0.0", + "source": { + "in": { + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": [ + "out" + ] + } + }, + "config": { + "transform": { + "in": { + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { + "out": { + "type": "json2new", + "modifiers": { + "cellFormat": {}, + "outputType": {}, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "cellFormat": "json", + "outputType": "items", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + } + }, + "3f0f938d-1944-4bf7-9e15-44dabd974325": { + "type": "appmixer.utils.test.Assert", + "x": 864, + "y": -592, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "0869e289-b124-473c-a759-a0cbbbaf3031": { + "out": { + "type": "json2new", + "modifiers": { + "expression": { + "50ef1796-0a04-4d81-a9ff-90da42f3f94b": { + "variable": "$.3271690d-2d76-41e1-b242-18420b76bbda.out.items", + "functions": [ + { + "name": "g_length" + } + ] + }, + "4cfc3566-29ef-4262-ae74-8930f274b131": { + "variable": "$.0869e289-b124-473c-a759-a0cbbbaf3031.out.items", + "functions": [ + { + "name": "g_length" + }, + { + "name": "g_add", + "params": [ + { + "value": "1" + } + ] + } + ] + } + } + }, + "lambda": { + "expression": { + "AND": [ + { + "expected": "{{{4cfc3566-29ef-4262-ae74-8930f274b131}}}", + "assertion": "equal", + "field": "{{{50ef1796-0a04-4d81-a9ff-90da42f3f94b}}}" + } + ] + } + } + } + } + } + } + }, + "source": { + "in": { + "0869e289-b124-473c-a759-a0cbbbaf3031": [ + "out" + ] + } + }, + "label": "Assert record numbers after delete" + }, + "3c0cdcc9-233f-440e-86e5-2e159b15ede5": { + "type": "appmixer.airtable.records.CreateRecord", + "x": 192, + "y": -720, + "source": { + "in": { + "196bfe41-967b-473c-9292-bc8e0f4eaf3d": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "196bfe41-967b-473c-9292-bc8e0f4eaf3d": { + "out": { + "type": "json2new", + "modifiers": { + "fields": { + "6c0bb4b5-e196-403e-91b3-9bf7be83f27a": { + "functions": [ + { + "name": "g_uuid4" + } + ] + } + }, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "fields": "{\"Name\":\"{{{6c0bb4b5-e196-403e-91b3-9bf7be83f27a}}}\",\"Status\":\"To do\",\"Priority\":\"Low\"}", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + } + }, + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { + "type": "appmixer.airtable.records.UpdateRecord", + "x": 464, + "y": -720, + "source": { + "in": { + "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": { + "out": { + "type": "json2new", + "modifiers": { + "recordId": { + "ad462837-5244-44e1-bc84-708d36cd68cf": { + "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", + "functions": [] + } + }, + "fields": { + "58adc5af-e282-4405-910e-5e7cf23b39e2": { + "functions": [ + { + "name": "g_uuid4" + } + ] + } + }, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "recordId": "{{{ad462837-5244-44e1-bc84-708d36cd68cf}}}", + "fields": "{\"Name\":\"updated - {{{58adc5af-e282-4405-910e-5e7cf23b39e2}}}\",\"Status\":\"Done\"}", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + } + }, + "8af86002-3998-48f5-bb53-e90f97571b38": { + "type": "appmixer.airtable.records.DeleteRecord", + "x": 720, + "y": -720, + "source": { + "in": { + "3271690d-2d76-41e1-b242-18420b76bbda": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "3271690d-2d76-41e1-b242-18420b76bbda": { + "out": { + "type": "json2new", + "modifiers": { + "recordId": { + "cb5e5fdd-c553-45ff-beb8-83b4f39722cf": { + "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", + "functions": [] + } + }, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "recordId": "{{{cb5e5fdd-c553-45ff-beb8-83b4f39722cf}}}", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + } + }, + "0869e289-b124-473c-a759-a0cbbbaf3031": { + "type": "appmixer.airtable.records.ListRecords", + "x": 864, + "y": -720, + "version": "1.0.0", + "source": { + "in": { + "8af86002-3998-48f5-bb53-e90f97571b38": [ + "out" + ] + } + }, + "config": { + "transform": { + "in": { + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { + "out": { + "type": "json2new", + "modifiers": { + "cellFormat": {}, + "outputType": {}, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "cellFormat": "json", + "outputType": "items", + "baseId": "appJfs4DY2gY9Z3x5", + "tableIdOrName": "tblswrR6NEm3SNpJz" + } + } + }, + "8af86002-3998-48f5-bb53-e90f97571b38": { + "out": { + "type": "json2new", + "modifiers": { + "cellFormat": {}, + "outputType": {}, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "cellFormat": "json", + "outputType": "items", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + }, + "label": "List Records - after delete" + }, + "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": { + "type": "appmixer.airtable.records.GetRecord", + "x": 320, + "y": -720, + "source": { + "in": { + "3c0cdcc9-233f-440e-86e5-2e159b15ede5": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "3c0cdcc9-233f-440e-86e5-2e159b15ede5": { + "out": { + "type": "json2new", + "modifiers": { + "recordId": { + "72606414-482e-43e3-be6c-01f6b0206cf9": { + "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", + "functions": [] + } + }, + "baseId": {}, + "tableIdOrName": {} + }, + "lambda": { + "recordId": "{{{72606414-482e-43e3-be6c-01f6b0206cf9}}}", + "baseId": "appo0bF6xV0gtlGxD", + "tableIdOrName": "tblJQwUF983wOvYz3" + } + } + } + } + } + } + }, + "196bfe41-967b-473c-9292-bc8e0f4eaf3d": { + "type": "appmixer.utils.test.BeforeAll", + "x": 320, + "y": -848, + "source": { + "in": { + "1f0396b0-22cc-405b-a032-e34bcc2e9eeb": [ + "out" + ] + } + }, + "version": "1.0.0" + }, + "31509eb7-a775-461b-84e8-85fa9decac1e": { + "type": "appmixer.utils.test.AfterAll", + "x": 1056, + "y": -592, + "source": { + "in": { + "3f0f938d-1944-4bf7-9e15-44dabd974325": [ + "out" + ], + "1dbccfda-2dae-4781-90fd-d1a167d07684": [ + "out" + ], + "1b41466e-fe9f-47f2-903d-759abc46bdaa": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "properties": { + "timeout": 30 + } + } + }, + "58fa73be-cff8-414d-9185-dbc34104f7aa": { + "type": "appmixer.utils.test.ProcessE2EResults", + "x": 1168, + "y": -592, + "source": { + "in": { + "31509eb7-a775-461b-84e8-85fa9decac1e": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "properties": { + "successStoreId": "64f6f1f9193228000754082f", + "failedStoreId": "64f6f1f0193228000754082e" + }, + "transform": { + "in": { + "31509eb7-a775-461b-84e8-85fa9decac1e": { + "out": { + "type": "json2new", + "modifiers": { + "recipients": {}, + "testCase": {}, + "result": { + "84fecc3c-3ba6-4119-942c-a9d68dc3c14b": { + "variable": "$.31509eb7-a775-461b-84e8-85fa9decac1e.out", + "functions": [] + } + } + }, + "lambda": { + "recipients": "jirka@client.io", + "testCase": "Jirka Airtable E2E", + "result": "{{{84fecc3c-3ba6-4119-942c-a9d68dc3c14b}}}" + } + } + } + } + } + } + }, + "1dbccfda-2dae-4781-90fd-d1a167d07684": { + "type": "appmixer.utils.test.Assert", + "x": 464, + "y": -592, + "source": { + "in": { + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": [ + "out" + ] + } + }, + "version": "1.0.0", + "label": "Assert updated record", + "config": { + "transform": { + "in": { + "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { + "out": { + "type": "json2new", + "modifiers": { + "expression": { + "14d35c03-d549-4d9d-ae8e-aba028612153": { + "variable": "$.72bea575-431e-48d8-b996-7b5a5ae5b6b6.out.id", + "functions": [] + }, + "391c0d40-edb8-46da-b9e3-f7988b94a2d1": { + "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", + "functions": [] + }, + "1ca0ec79-b66a-4784-8240-9d23aa2acfb4": { + "variable": "$.72bea575-431e-48d8-b996-7b5a5ae5b6b6.out.fields", + "functions": [ + { + "name": "g_jsonPath", + "params": [ + { + "value": "Name" + } + ] + } + ] + } + } + }, + "lambda": { + "expression": { + "AND": [ + { + "expected": "{{{391c0d40-edb8-46da-b9e3-f7988b94a2d1}}}", + "assertion": "equal", + "field": "{{{14d35c03-d549-4d9d-ae8e-aba028612153}}}" + }, + { + "regex": "^updated", + "assertion": "regex", + "field": "{{{1ca0ec79-b66a-4784-8240-9d23aa2acfb4}}}" + } + ] + } + } + } + } + } + } + } + }, + "1b41466e-fe9f-47f2-903d-759abc46bdaa": { + "type": "appmixer.utils.test.Assert", + "x": 720, + "y": -592, + "source": { + "in": { + "8af86002-3998-48f5-bb53-e90f97571b38": [ + "out" + ] + } + }, + "version": "1.0.0", + "label": "Assert deleted record", + "config": { + "transform": { + "in": { + "8af86002-3998-48f5-bb53-e90f97571b38": { + "out": { + "type": "json2new", + "modifiers": { + "expression": { + "0d9b6763-96e0-43d7-9953-eb08ae85872f": { + "variable": "$.8af86002-3998-48f5-bb53-e90f97571b38.out.id", + "functions": [] + }, + "9926b3e9-be32-4604-be65-ce000263f72d": { + "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", + "functions": [] + } + } + }, + "lambda": { + "expression": { + "AND": [ + { + "assertion": "equal", + "field": "{{{0d9b6763-96e0-43d7-9953-eb08ae85872f}}}", + "expected": "{{{9926b3e9-be32-4604-be65-ce000263f72d}}}" + } + ] + } + } + } + } + } + } + } + } + }, + "thumbnail": "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20joint-selector%3D%22svg%22%20id%3D%22v-24221%22%20viewBox%3D%22166.4375%20-858%201108.96875%20367.79998779296875%22%3E%3Cstyle%20id%3D%22v-24222%22%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5Bfont-family%3A%20sans-serif%3B%20font-display%3A%20auto%3B%20font-style%3A%20normal%3B%20font-size%3A%20100%25%5D%5D%3E%3C%2Fstyle%3E%3Cdefs%20joint-selector%3D%22defs%22%3E%3Cmarker%20id%3D%22v-42056921440%22%20orient%3D%22auto%22%20overflow%3D%22visible%22%20markerUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20id%3D%22v-1231%22%20stroke%3D%22%232853FF%22%20fill%3D%22%232853FF%22%20transform%3D%22rotate(180)%22%20display%3D%22none%22%2F%3E%3C%2Fmarker%3E%3C%2Fdefs%3E%3Cg%20joint-selector%3D%22layers%22%20class%3D%22joint-layers%22%3E%3Cg%20class%3D%22joint-back-layer%22%2F%3E%3Cg%20class%3D%22joint-cells-layer%20joint-viewport%22%3E%3Cg%20model-id%3D%22266ecae6-d853-40ab-a12c-72e403a310c0%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_21%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1228%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-686%20L%20586.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1229%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-686%20L%20586.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22b2c9f617-7354-4a51-8c6d-ea64b58474db%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_22%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1232%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20938.5%20-686%20L%20943%20-686%20C%20945.3999999999999%20-686%20946.7333333333332%20-683.3333333333333%20947%20-678%20L%20947%20-605%20C%20946.7333333333332%20-599.9333333333333%20944.0666666666666%20-597.2666666666667%20939%20-597%20L%20857%20-597%20C%20851.9333333333333%20-597.2666666666667%20849.2666666666667%20-594.5999999999999%20849%20-589%20L%20849%20-566%20C%20849.2666666666667%20-560.6666666666666%20850.9333333333333%20-558%20854%20-558%20L%20858.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1233%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20938.5%20-686%20L%20943%20-686%20C%20945.3999999999999%20-686%20946.7333333333332%20-683.3333333333333%20947%20-678%20L%20947%20-605%20C%20946.7333333333332%20-599.9333333333333%20944.0666666666666%20-597.2666666666667%20939%20-597%20L%20857%20-597%20C%20851.9333333333333%20-597.2666666666667%20849.2666666666667%20-594.5999999999999%20849%20-589%20L%20849%20-566%20C%20849.2666666666667%20-560.6666666666666%20850.9333333333333%20-558%20854%20-558%20L%20858.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%224bc1d2dd-e780-4e1f-88cb-88284aec5f77%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_24%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1236%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20394.5%20-686%20L%20458.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1237%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20394.5%20-686%20L%20458.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22ab372595-287a-40c3-a454-497df5d4a8d6%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_25%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1238%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20666.5%20-686%20L%20714.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1239%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20666.5%20-686%20L%20714.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22b6d04624-89a8-4ba4-bc85-82376715a7c2%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_26%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1240%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-686%20L%20858.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1241%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-686%20L%20858.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22ffaec3c0-f12d-48ed-8f1f-6b4ba7f11a05%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_27%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1242%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20266.5%20-686%20L%20314.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1243%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20266.5%20-686%20L%20314.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%229354f3b6-b970-49ec-a415-50b28976f052%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_28%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1244%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%201130.5%20-558%20L%201162.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1245%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%201130.5%20-558%20L%201162.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%2264e410f6-288d-4056-acd6-0d1fca42987d%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_40%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1246%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20266.5%20-814%20L%20314.5%20-814%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1247%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20266.5%20-814%20L%20314.5%20-814%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22e464e1a3-550a-4067-82e7-5b48ce3a3df1%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_42%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1696%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20394.5%20-814%20L%20399%20-814%20C%20401.73333333333335%20-814%20403.06666666666666%20-811.3333333333333%20403%20-806%20L%20403%20-733%20C%20403.06666666666666%20-727.9333333333333%20400.4%20-725.2666666666667%20395%20-725%20L%20185%20-725%20C%20179.6%20-725.2666666666667%20176.93333333333334%20-722.5999999999999%20177%20-717%20L%20177%20-694%20C%20176.93333333333334%20-688.6666666666666%20178.6%20-686%20182%20-686%20L%20186.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1697%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20394.5%20-814%20L%20399%20-814%20C%20401.73333333333335%20-814%20403.06666666666666%20-811.3333333333333%20403%20-806%20L%20403%20-733%20C%20403.06666666666666%20-727.9333333333333%20400.4%20-725.2666666666667%20395%20-725%20L%20185%20-725%20C%20179.6%20-725.2666666666667%20176.93333333333334%20-722.5999999999999%20177%20-717%20L%20177%20-694%20C%20176.93333333333334%20-688.6666666666666%20178.6%20-686%20182%20-686%20L%20186.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22d055c877-5c19-494a-be16-cb37a27c49f3%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_44%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-2369%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20938.5%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-2370%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20938.5%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22561c1313-4981-4b33-8150-e56a2bef56de%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_49%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-7973%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-686%20L%20543%20-686%20C%20545.4%20-686%20546.7333333333333%20-683.3333333333333%20547%20-678%20L%20547%20-605%20C%20546.7333333333333%20-599.9333333333333%20544.0666666666666%20-597.2666666666667%20539%20-597%20L%20457%20-597%20C%20451.9333333333333%20-597.2666666666667%20449.26666666666665%20-594.5999999999999%20449%20-589%20L%20449%20-566%20C%20449.26666666666665%20-560.6666666666666%20450.9333333333333%20-558%20454%20-558%20L%20458.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-7974%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-686%20L%20543%20-686%20C%20545.4%20-686%20546.7333333333333%20-683.3333333333333%20547%20-678%20L%20547%20-605%20C%20546.7333333333333%20-599.9333333333333%20544.0666666666666%20-597.2666666666667%20539%20-597%20L%20457%20-597%20C%20451.9333333333333%20-597.2666666666667%20449.26666666666665%20-594.5999999999999%20449%20-589%20L%20449%20-566%20C%20449.26666666666665%20-560.6666666666666%20450.9333333333333%20-558%20454%20-558%20L%20458.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22e02d7b09-603f-4c98-ae48-24174cd5639a%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_51%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-8465%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-558%20L%20848%20-558%20C%20853.5999999999999%20-558%20856.2666666666667%20-560.6666666666666%20856%20-566%20L%20856%20-590%20C%20856.2666666666667%20-595.3333333333333%20858.9333333333333%20-598%20864%20-598%20L%201033%20-598%20C%201038.3333333333333%20-598%201041%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041%20-560.6666666666666%201042.6666666666665%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-8466%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-558%20L%20848%20-558%20C%20853.5999999999999%20-558%20856.2666666666667%20-560.6666666666666%20856%20-566%20L%20856%20-590%20C%20856.2666666666667%20-595.3333333333333%20858.9333333333333%20-598%20864%20-598%20L%201033%20-598%20C%201038.3333333333333%20-598%201041%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041%20-560.6666666666666%201042.6666666666665%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22855d12f3-0996-4e7f-8f0e-11e513311cb5%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_57%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-20852%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-686%20L%20799%20-686%20C%20801.3999999999999%20-686%20802.7333333333332%20-683.3333333333333%20803%20-678%20L%20803%20-605%20C%20802.7333333333332%20-599.9333333333333%20800.0666666666666%20-597.2666666666667%20795%20-597%20L%20713%20-597%20C%20707.9333333333333%20-597.2666666666667%20705.2666666666667%20-594.5999999999999%20705%20-589%20L%20705%20-566%20C%20705.2666666666667%20-560.6666666666666%20706.9333333333333%20-558%20710%20-558%20L%20714.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-20853%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-686%20L%20799%20-686%20C%20801.3999999999999%20-686%20802.7333333333332%20-683.3333333333333%20803%20-678%20L%20803%20-605%20C%20802.7333333333332%20-599.9333333333333%20800.0666666666666%20-597.2666666666667%20795%20-597%20L%20713%20-597%20C%20707.9333333333333%20-597.2666666666667%20705.2666666666667%20-594.5999999999999%20705%20-589%20L%20705%20-566%20C%20705.2666666666667%20-560.6666666666666%20706.9333333333333%20-558%20710%20-558%20L%20714.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%223d66e239-312b-47b2-b24c-5b776940c549%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_59%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-23358%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-558%20L%20850%20-558%20C%20855%20-558%20857.6666666666666%20-560.6666666666666%20858%20-566%20L%20858%20-590%20C%20857.6666666666666%20-595.3333333333333%20860.3333333333333%20-598%20866%20-598%20L%201033%20-598%20C%201038.3999999999999%20-598%201041.0666666666666%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041.0666666666666%20-560.6666666666666%201042.7333333333331%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-23359%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-558%20L%20850%20-558%20C%20855%20-558%20857.6666666666666%20-560.6666666666666%20858%20-566%20L%20858%20-590%20C%20857.6666666666666%20-595.3333333333333%20860.3333333333333%20-598%20866%20-598%20L%201033%20-598%20C%201038.3999999999999%20-598%201041.0666666666666%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041.0666666666666%20-560.6666666666666%201042.7333333333331%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3C!--z-index%3A-1--%3E%3Cg%20model-id%3D%221f0396b0-22cc-405b-a032-e34bcc2e9eeb%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_29%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(192%2C-848)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1041%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%226%22%20ry%3D%226%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1042%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2256.53125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C5.7%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1043%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EOnStart%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1044%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBpZD0iR3JvdXBfNTQ3IiBkYXRhLW5hbWU9Ikdyb3VwIDU0NyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4OSAtMzUpIj4KICAgIDxyZWN0IGlkPSJSZWN0YW5nbGVfMzQ2OCIgZGF0YS1uYW1lPSJSZWN0YW5nbGUgMzQ2OCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyODkgMzUpIiBmaWxsPSJub25lIi8%2BCiAgICA8cGF0aCBpZD0iY29nIiBkPSJNMTgsNy4zNDdhMS45LDEuOSwwLDAsMCwwLDMuMzA3bC0uNjQ1LDIuMTY1YTEuODk1LDEuODk1LDAsMCwwLTIsMi43NTJMMTMuNSwxNy4wMTNBMS44OTQsMS44OTQsMCwwLDAsMTAuNDcsMThsLTIuOTYxLS4wMDdhMS44OTQsMS44OTQsMCwwLDAtMy4wMjYtLjk4NUwyLjYyOSwxNS41NTVBMS44OTUsMS44OTUsMCwwLDAsLjY0NCwxMi44MTZMMCwxMC42NDJBMS45LDEuOSwwLDAsMCwuOTQ2LDksMS44OTQsMS44OTQsMCwwLDAsMCw3LjM1OEwuNjQzLDUuMTg0QTEuODk1LDEuODk1LDAsMCwwLDIuNjMsMi40NDVMNC40ODIuOTkyYTEuODk0LDEuODk0LDAsMCwwLDEuNzgxLjMzMkExLjg5NCwxLjg5NCwwLDAsMCw3LjUwOC4wMDdMMTAuNDcxLDBhMS44OTQsMS44OTQsMCwwLDAsMS4yNDYsMS4zMjNBMS44OTQsMS44OTQsMCwwLDAsMTMuNS45ODdMMTUuMzU4LDIuNDNhMS44OTUsMS44OTUsMCwwLDAsMiwyLjc1MkwxOCw3LjM0NlpNMTMuMzQxLDMuMzEyYzAtLjA1NywwLS4xMTIsMC0uMTY5bC0uMDcyLS4wNTZBMy42OTMsMy42OTMsMCwwLDEsOS40LDEuOGwtLjgxNCwwQTMuNjksMy42OSwwLDAsMSw0LjcyMSwzLjA5MWwtLjA4NS4wNjhBMy43LDMuNywwLDAsMSwyLjA1MSw2Ljg0LDMuNjksMy42OSwwLDAsMSwyLjc0Niw5YTMuNywzLjcsMCwwLDEtLjY5NSwyLjE2QTMuNywzLjcsMCwwLDEsNC42MzYsMTQuODRsLjA4Ni4wNjhhMy42OTQsMy42OTQsMCwwLDEsMy44NiwxLjI4N2wuODE0LDBhMy42OSwzLjY5LDAsMCwxLDMuODc2LTEuMjg1bC4wNzItLjA1NmEzLjcsMy43LDAsMCwxLDIuNTg2LTMuNywzLjcsMy43LDAsMCwxLDAtNC4zMiwzLjcsMy43LDAsMCwxLTIuNTg4LTMuNTI3Wk05LDEyLjZBMy42LDMuNiwwLDEsMSwxMi42LDksMy42LDMuNiwwLDAsMSw5LDEyLjZabTAtMS44QTEuOCwxLjgsMCwxLDAsNy4yLDksMS44LDEuOCwwLDAsMCw5LDEwLjhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyOTIgMzgpIi8%2BCiAgPC9nPgo8L3N2Zz4K%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1045%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1046%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1047%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1040%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%224%22%20ry%3D%224%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1048%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1049%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1050%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1052%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1051%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A0--%3E%3Cg%20model-id%3D%223271690d-2d76-41e1-b242-18420b76bbda%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_30%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(592%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1054%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1055%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2285.03125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.5%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1056%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EList%C2%A0Records%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1057%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1058%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1059%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1060%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1053%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1061%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1062%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1063%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1068%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1067%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1064%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1065%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1066%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1070%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1069%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A1--%3E%3Cg%20model-id%3D%223f0f938d-1944-4bf7-9e15-44dabd974325%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_31%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(864%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1072%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1073%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22217.859375%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-74.9%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1074%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0record%C2%A0numbers%C2%A0after%C2%A0delete%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1075%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1076%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1077%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1078%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1071%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1079%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1080%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1081%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1086%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1085%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1082%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1083%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1084%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1088%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1087%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A2--%3E%3Cg%20model-id%3D%223c0cdcc9-233f-440e-86e5-2e159b15ede5%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_32%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(192%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1090%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1091%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2297.796875%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-14.9%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1092%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3ECreate%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1093%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1094%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1095%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1096%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1089%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1097%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1098%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1099%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1104%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1103%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1100%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1101%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1102%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1106%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1105%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A3--%3E%3Cg%20model-id%3D%2272bea575-431e-48d8-b996-7b5a5ae5b6b6%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_33%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(464%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1108%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1109%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22100.8125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-16.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1110%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EUpdate%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1111%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1112%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1113%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1114%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1107%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1115%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1116%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1117%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1122%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1121%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1118%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1119%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1120%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1124%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1123%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A4--%3E%3Cg%20model-id%3D%228af86002-3998-48f5-bb53-e90f97571b38%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_34%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(720%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1126%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1127%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2296.296875%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-14.1%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1128%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EDelete%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1129%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1130%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1131%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1132%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1125%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1133%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1134%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1135%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1140%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1139%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1136%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1137%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1138%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1142%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1141%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A5--%3E%3Cg%20model-id%3D%220869e289-b124-473c-a759-a0cbbbaf3031%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_35%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(864%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1144%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1145%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22164.578125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-48.3%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1146%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EList%C2%A0Records%C2%A0-%C2%A0after%C2%A0delete%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1147%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1148%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1149%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1150%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1143%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1151%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1152%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1153%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1158%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1157%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1154%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1155%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1156%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1160%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1159%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A6--%3E%3Cg%20model-id%3D%22d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_36%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(320%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1162%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1163%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2279.03125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1164%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EGet%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1165%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1166%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1167%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1168%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1161%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1169%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1170%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1171%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1176%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1175%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1172%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1173%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1174%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1178%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1177%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A7--%3E%3Cg%20model-id%3D%22196bfe41-967b-473c-9292-bc8e0f4eaf3d%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_37%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(320%2C-848)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1180%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1181%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2264.78125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C1.6%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1182%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EBeforeAll%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1183%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAACgklEQVR4nO3bTW4TMRgG4LfsQOUglNI78XMyfi7QbrkHcIwumi7LgiCq0iYzzrgeO88jvRtUEY9jje34cwIAAAAAAAAAHKuzJFdJbra52v4bR%2BAsyXWSuwfZJPmQ5KRd03gOV%2Fn%2Fy7%2Bfz0lOm7WO6m6yewDcJfmR5LxVA6lrygCoPSWcJbncfsaUthxzNtu%2BWmyNtm8KqD0lPLUGkd25zkKDoOQLWHJKuJz52fIvlwX9%2Fajz%2FPlS53z4UlOC1355NgX9%2FaTTJF8KGnHolNC6E3vPok6SfExyO7MRh0wJrTuw91TxLsnPmQ0pnRJad2DvqeY0ydeCBs2dElp3YO%2Bp6pAp4e3Ez2j6gB1YRf9cJPk1oTH3c53kzYT%2FexUPuGKr6Z%2FXSb5NaND9TNmnruYBV2pV%2FXOS5FOmTwlT9qmresAVOqh%2FXlRokOPhI2UKaGMV%2FWMR2E7T%2Fpk75%2F%2BNbeBymvWPH4L6SBUXKfsp%2BH38FNz1ADjkle8wqPMB4Di4zyziPM%2F3yn9IQUh5FikIURLWbxYpCVMU2mcWKwqdUxa%2BxCv%2FMcrCp2fxsnAXQ46cq2FHbtfl0FqvfFbG9XAAAAAAnoXDoIaHQa05Di7LYsfBrSkIKc%2FegpAeDnI2SV62bkSnbpO82vUHNe4G0pEeBsD31g3o2BB9ZxFYlmEWgYlt4JwMtw0EAAAAAAAAAMakIOSIC0KUhJVlmJIw9wLK417AkXMvgN16GABD1LY3MkTfWQSWZZhFYGIbOCfDbQMBAAAAAAAAgDGNVBCiYGOmUUvChirZqmnkewF76%2FZrcy%2Bgrb11%2B7X1UBZORT0MgCFq258w8rMtxiIQ20AAAAAAAAAAgKl%2BA0o61YoZmOw3AAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1184%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1185%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1186%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1179%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1187%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1188%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1189%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1194%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1193%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1190%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1191%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1192%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1196%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1195%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A8--%3E%3Cg%20model-id%3D%2231509eb7-a775-461b-84e8-85fa9decac1e%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_38%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(1056%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1198%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1199%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2253.515625%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7.2%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1200%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAfterAll%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1201%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAACe0lEQVR4nO3bS3LTQBQF0AtDwkIwIYviszE%2BG0jGrANYRgaYKQwSqlIUsaWO2v3xOVV35rJbzyq1WnqdAAAAAAAAAAC0sUtynWSf5LcczP6%2BVruiSndol%2BQ27Qs7Wm4zyUlwnfbFHDXXx4r77NgHOrBP8qL1IAb1K8nFoQ88P9FA6NQIJ8DX1gMY2BS1cxNYlmluAhPLwDWZbhkIAAAAAAAAAMxJQ8gZN4RoCSvLNC1h9gWUx76AM2dfAIeNcAJM0dveyBS1cxNYlmluAhPLwDWZbhkIAAAAAAAAAMxppoYQDRsrzdoSNlXLVk0z7ws42rdfm30BbR3t269thLZwKhrhBJiit%2F0RMx%2FbZtwEYhkIAAAAcCq7JDdJft7nJh5knI3HHsXuk7xrOC5O5CaHH21%2BTONXmtT1M8efb39LctlqgNS15ASoPSXM9DJouJdNx6aA2lPCrK%2BDa2ez180lf8CWU8LMPYG1s1nP4WXu%2FtQ1P77VlOCyX559Qb0fdZHkU8EgnjoltC7i6Nnc%2B9x1s64ZxFOmhNYFHD1VvEnyfeVASqeE1gUcPdVcJPlcMKC1U0LrAo6e6kqnhNcLv7%2F5AXaui%2FpcJfmxYDAPc5vk1YLv7uIAO9ZNfV4m%2BbJgQA%2BzZJ3azQF2qrv6fMjyKWHJOrW7A%2BzMk%2BpTY2vYCBtOqcAU0EYX9XET2E7z%2BqyZ8%2F%2FGMnA7zerjQdAYqeIqZY%2BC3xb8VusCjp7NlV7yvQwa%2FATwOnjMbOIyp7vk%2F0tDSHk2aQjREjZuNmkJ0xQ6ZjZrCl3TFr7FJf9%2FtIUvz%2BZt4TaGnDlbw87coc2htS75dMb2cAAAAAAAAACAQfwBzqrUt3ZEKhIAAAAASUVORK5CYII%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1202%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1203%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1204%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1197%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1205%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1206%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1207%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1212%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1211%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1208%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1209%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1210%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1214%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1213%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A9--%3E%3Cg%20model-id%3D%2258fa73be-cff8-414d-9185-dbc34104f7aa%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_39%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(1168%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1216%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1217%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22136.8125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-34.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1218%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EProcess%C2%A0E2E%C2%A0Results%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1219%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1220%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1221%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1222%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1215%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1223%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1224%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1225%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1227%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1226%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A10--%3E%3Cg%20model-id%3D%221dbccfda-2dae-4781-90fd-d1a167d07684%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_47%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(464%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-7235%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-7236%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22142.828125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-37.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-7237%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0updated%C2%A0record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-7238%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-7239%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-7240%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-7241%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-7234%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-7244%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-7245%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-7246%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-7251%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-7250%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-7247%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-7248%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-7249%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-7253%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-7252%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A11--%3E%3Cg%20model-id%3D%221b41466e-fe9f-47f2-903d-759abc46bdaa%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_55%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(720%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-20048%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-20049%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22138.328125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-35.2%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-20050%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0deleted%C2%A0record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-20051%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-20052%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-20053%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-20054%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-20047%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-20057%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-20058%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-20059%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-20064%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-20063%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-20060%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-20061%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-20062%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-20066%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-20065%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A12--%3E%3C%2Fg%3E%3Cg%20class%3D%22joint-labels-layer%20joint-viewport%22%2F%3E%3Cg%20class%3D%22joint-front-layer%22%2F%3E%3Cg%20class%3D%22joint-tools-layer%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E", + "wizard": { + "fields": [ + { + "type": "inspectorFieldset", + "label": "New field", + "tooltip": "", + "source": "13012bb6-facb-4194-bccf-812f67edad95.config.transform.in.1f0396b0-22cc-405b-a032-e34bcc2e9eeb.out", + "attrs": {} + } + ] + } +} From 1cadfc334d75cfff5f1640653c6bba5a5a5708ac Mon Sep 17 00:00:00 2001 From: vladimir talas Date: Wed, 29 Nov 2023 11:37:47 +0100 Subject: [PATCH 02/58] init submodule --- src/appmixer/airtable/airtable-commons.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/appmixer/airtable/airtable-commons.js b/src/appmixer/airtable/airtable-commons.js index 94cf11186..f9944bd85 100644 --- a/src/appmixer/airtable/airtable-commons.js +++ b/src/appmixer/airtable/airtable-commons.js @@ -1,6 +1,8 @@ 'use strict'; const pathModule = require('path'); + + module.exports = { // TODO: Move to appmixer-lib From 16b1a1a43a69693037e1c8441eacc0c0590eecf9 Mon Sep 17 00:00:00 2001 From: vladimir talas Date: Wed, 29 Nov 2023 11:41:59 +0100 Subject: [PATCH 03/58] revert --- src/appmixer/airtable/airtable-commons.js | 46 -- src/appmixer/airtable/auth.js | 141 ----- src/appmixer/airtable/bundle.json | 9 - src/appmixer/airtable/package.json | 7 - src/appmixer/airtable/quota.js | 14 - .../records/CreateRecord/CreateRecord.js | 42 -- .../records/CreateRecord/component.json | 97 ---- .../records/DeleteRecord/DeleteRecord.js | 22 - .../records/DeleteRecord/component.json | 80 --- .../airtable/records/GetRecord/GetRecord.js | 24 - .../airtable/records/GetRecord/component.json | 89 --- .../airtable/records/ListBases/ListBases.js | 100 ---- .../airtable/records/ListBases/component.json | 64 -- .../records/ListRecords/ListRecords.js | 140 ----- .../records/ListRecords/component.json | 173 ------ .../airtable/records/ListTables/ListTables.js | 156 ----- .../records/ListTables/component.json | 80 --- .../records/UpdateRecord/UpdateRecord.js | 48 -- .../records/UpdateRecord/component.json | 110 ---- src/appmixer/airtable/service.json | 8 - src/appmixer/airtable/test-flow.json | 545 ------------------ 21 files changed, 1995 deletions(-) delete mode 100644 src/appmixer/airtable/airtable-commons.js delete mode 100644 src/appmixer/airtable/auth.js delete mode 100644 src/appmixer/airtable/bundle.json delete mode 100644 src/appmixer/airtable/package.json delete mode 100644 src/appmixer/airtable/quota.js delete mode 100644 src/appmixer/airtable/records/CreateRecord/CreateRecord.js delete mode 100644 src/appmixer/airtable/records/CreateRecord/component.json delete mode 100644 src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js delete mode 100644 src/appmixer/airtable/records/DeleteRecord/component.json delete mode 100644 src/appmixer/airtable/records/GetRecord/GetRecord.js delete mode 100644 src/appmixer/airtable/records/GetRecord/component.json delete mode 100644 src/appmixer/airtable/records/ListBases/ListBases.js delete mode 100644 src/appmixer/airtable/records/ListBases/component.json delete mode 100644 src/appmixer/airtable/records/ListRecords/ListRecords.js delete mode 100644 src/appmixer/airtable/records/ListRecords/component.json delete mode 100644 src/appmixer/airtable/records/ListTables/ListTables.js delete mode 100644 src/appmixer/airtable/records/ListTables/component.json delete mode 100644 src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js delete mode 100644 src/appmixer/airtable/records/UpdateRecord/component.json delete mode 100644 src/appmixer/airtable/service.json delete mode 100644 src/appmixer/airtable/test-flow.json diff --git a/src/appmixer/airtable/airtable-commons.js b/src/appmixer/airtable/airtable-commons.js deleted file mode 100644 index f9944bd85..000000000 --- a/src/appmixer/airtable/airtable-commons.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; -const pathModule = require('path'); - - - -module.exports = { - - // TODO: Move to appmixer-lib - // Expects standardized outputType: 'object', 'array', 'file' - async sendArrayOutput({ context, outputPortName = 'out', outputType = 'array', records = [] }) { - if (outputType === 'object') { - // One by one. - await context.sendArray(records, outputPortName); - } else if (outputType === 'array') { - // All at once. - await context.sendJson({ result: records }, outputPortName); - } else if (outputType === 'file') { - // Into CSV file. - const headers = Object.keys(records[0] || {}); - let csvRows = []; - csvRows.push(headers.join(',')); - for (const record of records) { - const values = headers.map(header => { - const val = record[header]; - return `"${val}"`; - }); - // To add ',' separator between each value - csvRows.push(values.join(',')); - } - const csvString = csvRows.join('\n'); - let buffer = Buffer.from(csvString, 'utf8'); - const componentName = context.flowDescriptor[context.componentId].label || context.componentId; - const fileName = `${context.config.outputFilePrefix || 'airtable-export'}-${componentName}.csv`; - const savedFile = await context.saveFileStream(pathModule.normalize(fileName), buffer); - await context.log({ step: 'File was saved', fileName, fileId: savedFile.fileId }); - await context.sendJson({ fileId: savedFile.fileId }, outputPortName); - } else { - throw new context.CancelError('Unsupported outputType ' + outputType); - } - }, - - isAppmixerVariable(variable) { - - return variable?.startsWith('{{{') && variable?.endsWith('}}}'); - } -}; diff --git a/src/appmixer/airtable/auth.js b/src/appmixer/airtable/auth.js deleted file mode 100644 index f369f8921..000000000 --- a/src/appmixer/airtable/auth.js +++ /dev/null @@ -1,141 +0,0 @@ -'use strict'; - -const crypto = require('crypto'); - -const airtableUrl = 'https://airtable.com'; - -module.exports = { - - type: 'oauth2', - - definition: () => { - - return { - - scope: ['user.email:read', 'schema.bases:read'], - - accountNameFromProfileInfo: 'email', - - authUrl: context => { - - // Taken from https://github.com/Airtable/oauth-example/blob/main/index.js - // But we need ticket from context otherwise there's "Unknown ticket" error. - const state = context.ticket; - // Using context.ticket here as we need to store the code_verifier and keep it the same for the token request. - const codeVerifier = crypto.createHash('sha256').update(context.ticket).digest('base64url'); - const codeChallengeMethod = 'S256'; - const codeChallenge = crypto - .createHash('sha256') - .update(codeVerifier) // hash the code verifier with the sha256 algorithm - .digest('base64') // base64 encode, needs to be transformed to base64url - .replace(/=/g, '') // remove = - .replace(/\+/g, '-') // replace + with - - .replace(/\//g, '_'); // replace / with _ now base64url encoded - - // ideally, entries in this cache expires after ~10-15 minutes - // we'll use this in the redirect url route - // any other data you want to store, like the user's ID - - // build the authorization URL - const authorizationUrl = new URL(`${airtableUrl}/oauth2/v1/authorize`); - authorizationUrl.searchParams.set('code_challenge', codeChallenge); - authorizationUrl.searchParams.set('code_challenge_method', codeChallengeMethod); - authorizationUrl.searchParams.set('state', state); - authorizationUrl.searchParams.set('client_id', context.clientId); - authorizationUrl.searchParams.set('redirect_uri', context.callbackUrl); - authorizationUrl.searchParams.set('response_type', 'code'); - // your OAuth integration register with these scopes in the management page - authorizationUrl.searchParams.set('scope', context.scope.join(' ')); - - return authorizationUrl.toString(); - }, - - requestAccessToken: async (context) => { - - // Using context.ticket same as in authUrl. - const codeVerifier = crypto.createHash('sha256').update(context.ticket).digest('base64url'); - const headers = { - // Content-Type is always required - 'Content-Type': 'application/x-www-form-urlencoded' - }; - if (context.clientSecret !== '') { - // Authorization is required if your integration has a client secret - // omit it otherwise - const encodedCredentials = Buffer.from(`${context.clientId}:${context.clientSecret}`).toString('base64'); - const authorizationHeader = `Basic ${encodedCredentials}`; - headers.Authorization = authorizationHeader; - } - - const { data } = await context.httpRequest({ - method: 'POST', - url: `${airtableUrl}/oauth2/v1/token`, - headers, - // stringify the request body like a URL query string - data: new URLSearchParams({ - // client_id is optional if authorization header provided - // required otherwise. - client_id: context.clientId, - code_verifier: codeVerifier, - redirect_uri: context.callbackUrl, - code: context.authorizationCode, - grant_type: 'authorization_code' - }) - }); - let accessTokenExpDate = new Date(); - accessTokenExpDate.setTime(accessTokenExpDate.getTime() + (data['expires_in'] * 1000)); - let refreshTokenExpDate = new Date(); - refreshTokenExpDate - .setTime(refreshTokenExpDate.getTime() + (data['refresh_expires_in'] * 1000)); - - const result = { - accessToken: data['access_token'], - refreshToken: data['refresh_token'], - accessTokenExpDate, - refreshTokenExpDate - }; - - return result; - }, - - requestProfileInfo: { - method: 'GET', - url: 'https://api.airtable.com/v0/meta/whoami', - headers: { - 'Authorization': 'Bearer {{accessToken}}', - 'User-Agent': 'AppMixer' - } - }, - - refreshAccessToken: async context => { - - const tokenUrl = `${airtableUrl}/oauth2/v1/token`; - const headers = { - 'Authorization': - 'Basic ' + Buffer.from(context.clientId + ':' + context.clientSecret).toString('base64'), - 'Content-Type': 'application/x-www-form-urlencoded' - }; - - const { data } = await context.httpRequest.post(tokenUrl, { - grant_type: 'refresh_token', - refresh_token: context.refreshToken - }, { headers }); - - const newDate = new Date(); - newDate.setTime(newDate.getTime() + (data.expires_in * 1000)); - return { - accessToken: data.access_token, - accessTokenExpDate: newDate - }; - }, - - validateAccessToken: { - method: 'GET', - url: 'https://api.airtable.com/v0/meta/whoami', - headers: { - 'Authorization': 'Bearer {{accessToken}}', - 'User-Agent': 'AppMixer' - } - } - }; - } -}; diff --git a/src/appmixer/airtable/bundle.json b/src/appmixer/airtable/bundle.json deleted file mode 100644 index a39d4a9bf..000000000 --- a/src/appmixer/airtable/bundle.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "appmixer.airtable", - "version": "1.0.4", - "changelog": { - "1.0.4": [ - "Initial release" - ] - } -} diff --git a/src/appmixer/airtable/package.json b/src/appmixer/airtable/package.json deleted file mode 100644 index 98d36f41c..000000000 --- a/src/appmixer/airtable/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "appmixer.airtable", - "version": "0.0.1", - "dependencies": { - "airtable": "0.12.2" - } -} diff --git a/src/appmixer/airtable/quota.js b/src/appmixer/airtable/quota.js deleted file mode 100644 index c2bd14146..000000000 --- a/src/appmixer/airtable/quota.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -module.exports = { - - rules: [ - { - limit: 5, // Official limit is 5 requests per second. - window: 1000, - queueing: 'fifo', - resource: 'messages.send', - scope: 'userId' - } - ] -}; diff --git a/src/appmixer/airtable/records/CreateRecord/CreateRecord.js b/src/appmixer/airtable/records/CreateRecord/CreateRecord.js deleted file mode 100644 index 44e96b694..000000000 --- a/src/appmixer/airtable/records/CreateRecord/CreateRecord.js +++ /dev/null @@ -1,42 +0,0 @@ -'use strict'; - -const Airtable = require('airtable'); - -module.exports = { - - async receive(context) { - - const { - baseId, tableIdOrName, fields, - returnFieldsByFieldId = false, typecast = false - } = context.messages.in.content; - - Airtable.configure({ - endpointUrl: 'https://api.airtable.com', - apiKey: context.auth.accessToken - }); - const base = Airtable.base(baseId); - - const queryParams = { - returnFieldsByFieldId, - typecast - }; - - let fieldsObject = {}; - try { - fieldsObject = JSON.parse(fields); - } catch (error) { - throw new context.CancelError('Invalid fields JSON'); - } - - context.log({ step: 'Creating record', queryParams, fieldsObject }); - - const result = await base(tableIdOrName).create([{ fields: fieldsObject }], queryParams); - - // Make it the same as in REST API - // eslint-disable-next-line no-underscore-dangle - const item = result[0]._rawJson; - - context.sendJson(item, 'out'); - } -}; diff --git a/src/appmixer/airtable/records/CreateRecord/component.json b/src/appmixer/airtable/records/CreateRecord/component.json deleted file mode 100644 index bc738f9b2..000000000 --- a/src/appmixer/airtable/records/CreateRecord/component.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "appmixer.airtable.records.CreateRecord", - "author": "Jiří Hofman ", - "label": "Create Record", - "description": "Creates a single record in a table.", - "private": false, - "version": "1.0.1", - "auth": { - "service": "appmixer:airtable", - "scope": ["data.records:write"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "tableIdOrName": { "type": "string" }, - "fields": { "type": "string" }, - "returnFieldsByFieldId": { "type": "boolean" }, - "typecast": { "type": "boolean" } - }, - "required": ["baseId", "tableIdOrName", "fields"] - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "tableIdOrName": { - "type": "select", - "label": "Table ID or Name", - "index": 2, - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "messages": { - "in/baseId": "inputs/in/baseId", - "in/isSource": true - }, - "transform": "./ListTables#toSelectArray" - } - } - }, - "fields": { - "type": "textarea", - "label": "Fields", - "index": 3, - "tooltip": "JSON object mapping field names to their values. Each field has a key corresponding to its field name and a value corresponding to its value. It is not necessary to specify every field in the table to create a record — only those that are non-empty. See more in the fields API docs." - }, - "returnFieldsByFieldId": { - "type": "toggle", - "label": "Return fields by field ID", - "index": 4, - "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." - }, - "typecast": { - "type": "toggle", - "label": "Typecast", - "index": 5, - "tooltip": "The Airtable API will perform best-effort automatic data conversion from string values if the typecast parameter is passed in. Automatic conversion is disabled by default to ensure data integrity, but it may be helpful for integrating with 3rd party data sources." - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { "label": "Fields", "value": "fields" }, - { "label": "ID", "value": "id" }, - { "label": "Created Time", "value": "createdTime" } - ] - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js b/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js deleted file mode 100644 index dfaea4c04..000000000 --- a/src/appmixer/airtable/records/DeleteRecord/DeleteRecord.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -const Airtable = require('airtable'); - -module.exports = { - - async receive(context) { - - const { - baseId, tableIdOrName, recordId - } = context.messages.in.content; - - Airtable.configure({ - endpointUrl: 'https://api.airtable.com', - apiKey: context.auth.accessToken - }); - const base = Airtable.base(baseId); - const { id } = await base(tableIdOrName).destroy(recordId); - - context.sendJson({ id }, 'out'); - } -}; diff --git a/src/appmixer/airtable/records/DeleteRecord/component.json b/src/appmixer/airtable/records/DeleteRecord/component.json deleted file mode 100644 index e4caf2f7e..000000000 --- a/src/appmixer/airtable/records/DeleteRecord/component.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "appmixer.airtable.records.DeleteRecord", - "author": "Jiří Hofman ", - "label": "Delete Record", - "description": "Deletes a single record in a table.", - "private": false, - "version": "1.0.1", - "auth": { - "service": "appmixer:airtable", - "scope": ["data.records:write"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "tableIdOrName": { "type": "string" }, - "recordId": { "type": "string" } - }, - "required": ["baseId", "tableIdOrName", "recordId"] - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "tableIdOrName": { - "type": "select", - "label": "Table ID or Name", - "index": 2, - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "messages": { - "in/baseId": "inputs/in/baseId", - "in/isSource": true - }, - "transform": "./ListTables#toSelectArray" - } - } - }, - "recordId": { - "type": "text", - "label": "Record ID", - "index": 3 - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { "label": "ID", "value": "id" } - ] - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/GetRecord/GetRecord.js b/src/appmixer/airtable/records/GetRecord/GetRecord.js deleted file mode 100644 index 2e82bd7d2..000000000 --- a/src/appmixer/airtable/records/GetRecord/GetRecord.js +++ /dev/null @@ -1,24 +0,0 @@ -'use strict'; - -const Airtable = require('airtable'); - -module.exports = { - - async receive(context) { - - const { baseId, tableIdOrName, recordId } = context.messages.in.content; - - Airtable.configure({ - endpointUrl: 'https://api.airtable.com', - apiKey: context.auth.accessToken - }); - const base = Airtable.base(baseId); - - const result = await base(tableIdOrName).find(recordId); - // Make it the same as in REST API - // eslint-disable-next-line no-underscore-dangle - const item = result._rawJson; - - context.sendJson(item, 'out'); - } -}; diff --git a/src/appmixer/airtable/records/GetRecord/component.json b/src/appmixer/airtable/records/GetRecord/component.json deleted file mode 100644 index d59655454..000000000 --- a/src/appmixer/airtable/records/GetRecord/component.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "name": "appmixer.airtable.records.GetRecord", - "author": "Jiří Hofman ", - "label": "Get Record", - "description": "Gets a single record from a table.", - "private": false, - "version": "1.0.1", - "auth": { - "service": "appmixer:airtable", - "scope": ["data.records:read"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "tableIdOrName": { "type": "string" }, - "recordId": { "type": "string" }, - "returnFieldsByFieldId": { "type": "boolean" } - }, - "required": ["baseId", "tableIdOrName", "recordId"] - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "tableIdOrName": { - "type": "select", - "label": "Table ID or Name", - "index": 2, - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "messages": { - "in/baseId": "inputs/in/baseId", - "in/isSource": true - }, - "transform": "./ListTables#toSelectArray" - } - } - }, - "recordId": { - "type": "text", - "label": "Record ID", - "index": 3 - }, - "returnFieldsByFieldId": { - "type": "toggle", - "label": "Return fields by field ID", - "index": 4, - "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { "label": "Fields", "value": "fields" }, - { "label": "ID", "value": "id" }, - { "label": "Created Time", "value": "createdTime" } - ] - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/ListBases/ListBases.js b/src/appmixer/airtable/records/ListBases/ListBases.js deleted file mode 100644 index f8e62a479..000000000 --- a/src/appmixer/airtable/records/ListBases/ListBases.js +++ /dev/null @@ -1,100 +0,0 @@ -'use strict'; - -const { sendArrayOutput } = require('../../airtable-commons'); - -module.exports = { - - // Private component used only to list bases in the inspector for other components. - async receive(context) { - - const generateOutputPortOptions = context.properties.generateOutputPortOptions; - const { outputType, isSource } = context.messages.in.content; - if (generateOutputPortOptions) { - return this.getOutputPortOptions(context, outputType); - } - - const cacheKey = 'airtable_bases_' + context.auth.accessToken; - let lock; - try { - lock = await context.lock(context.auth.accessToken); - - // Checking and returning cache only if this is a call from another component. - if (isSource) { - const basesCached = await context.staticCache.get(cacheKey); - if (basesCached) { - return context.sendJson({ items: basesCached }, 'out'); - } - } - - const { data } = await context.httpRequest.get('https://api.airtable.com/v0/meta/bases', { - headers: { - Authorization: `Bearer ${context.auth.accessToken}` - } - }); - const { bases } = data; - - // Cache the tables for 20 seconds unless specified otherwise in the config. - // Note that we only need name and id, so we can save some space in the cache. - // Caching only if this is a call from another component. - if (isSource) { - await context.staticCache.set( - cacheKey, - bases.map(item => ({ id: item.id, name: item.name })), - context.config.listBasesCacheTTL || (20 * 1000) - ); - - // Returning values into another component. - return context.sendJson({ items: bases }, 'out'); - } - - // Returning values to the flow. - await sendArrayOutput({ context, outputType, records: bases }); - } finally { - lock?.unlock(); - } - }, - - toSelectArray({ items }) { - - return items.map(base => { - return { label: base.name, value: base.id }; - }); - }, - - getOutputPortOptions(context, outputType) { - - if (outputType === 'object') { - return context.sendJson( - [ - { label: 'id', value: 'id' }, - { label: 'name', value: 'name' }, - { label: 'permissionLevel', value: 'permissionLevel' } - ], - 'out' - ); - } else if (outputType === 'array') { - return context.sendJson( - [ - { - label: 'Array', value: 'array', - schema: { - type: 'array', - items: { - type: 'object', - properties: { - id: { type: 'string', title: 'id' }, - name: { type: 'string', title: 'name' }, - permissionLevel: { type: 'string', title: 'permissionLevel' } - } - } - } - } - ], - 'out' - ); - } else { - // file - return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); - } - } -}; diff --git a/src/appmixer/airtable/records/ListBases/component.json b/src/appmixer/airtable/records/ListBases/component.json deleted file mode 100644 index 14f19eef4..000000000 --- a/src/appmixer/airtable/records/ListBases/component.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "name": "appmixer.airtable.records.ListBases", - "author": "Jiří Hofman ", - "label": "List Bases", - "description": "List available bases.", - "private": false, - "version": "1.0.2", - "auth": { - "service": "appmixer:airtable", - "scope": ["schema.bases:read"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "outputType": { "type": "string" } - } - }, - "inspector": { - "inputs": { - "outputType": { - "group": "last", - "type": "select", - "label": "Output Type", - "index": 1, - "defaultValue": "array", - "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", - "options": [ - { "label": "All items at once", "value": "array" }, - { "label": "One item at a time", "value": "object" }, - { "label": "File", "value": "file" } - ] - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "properties": { - "generateOutputPortOptions": true - }, - "messages": { - "in/outputType": "inputs/in/outputType" - } - } - } - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/ListRecords/ListRecords.js b/src/appmixer/airtable/records/ListRecords/ListRecords.js deleted file mode 100644 index 3e28a0416..000000000 --- a/src/appmixer/airtable/records/ListRecords/ListRecords.js +++ /dev/null @@ -1,140 +0,0 @@ -'use strict'; - -const Airtable = require('airtable'); -const { sendArrayOutput } = require('../../airtable-commons'); - -module.exports = { - - async receive(context) { - - const generateOutputPortOptions = context.properties.generateOutputPortOptions; - const { - baseId, tableIdOrName, - // Optional query params - fields, - filterByFormula, - maxRecords = 10000, - // Page size and offset doesn't make sense as the SDK does pagination automatically. - // pageSize, - // offset, - sort, - view, - cellFormat = 'json', - timeZone, - userLocale, - // method ?: string; - returnFieldsByFieldId, - recordMetadata, - // Appmixer specific - outputType - } = context.messages.in.content; - - if (generateOutputPortOptions) { - return this.getOutputPortOptions(context, outputType); - } - - Airtable.configure({ - endpointUrl: 'https://api.airtable.com', - apiKey: context.auth.accessToken - }); - const base = Airtable.base(baseId); - - const queryParams = { - // If not provided by user, use our default value. - maxRecords, - // If not provided by user, use our default value json. - cellFormat - }; - if (fields) { - queryParams.fields = fields.trim().split(','); - } - if (filterByFormula) { - queryParams.filterByFormula = filterByFormula.trim(); - } - if (sort) { - try { - queryParams.sort = JSON.parse(sort); - } catch (e) { - // noop - context.log({ step: 'sort', error: e }); - } - } - if (view) { - queryParams.view = view; - } - if (timeZone) { - queryParams.timeZone = timeZone; - } - if (userLocale) { - queryParams.userLocale = userLocale; - } - if (returnFieldsByFieldId) { - queryParams.returnFieldsByFieldId = returnFieldsByFieldId; - } - if (recordMetadata) { - // This one works only with ['commentCount']. If provided other values, it fails with 422: INVALID_REQUEST_UNKNOWN. - queryParams.recordMetadata = ['commentCount']; - } - context.log({ step: 'queryParams', queryParams }); - - const all = await base(tableIdOrName).select(queryParams).all(); - const items = all.map(item => { - const record = { - // eslint-disable-next-line no-underscore-dangle - createdTime: item.createdTime || item._rawJson?.createdTime, - fields: item.fields, - id: item.id - }; - - if (recordMetadata) { - record.commentCount = item.commentCount; - } - - return record; - }); - - await sendArrayOutput({ context, outputType, records: items }); - }, - - getOutputPortOptions(context, outputType) { - - if (outputType === 'item') { - return context.sendJson( - [ - { label: 'createdTime', value: 'createdTime' }, - { label: 'fields', value: 'fields', - // We can't know table columns beforehand, so we'll just use empty object as schema. - schema: { type: 'object' } - }, - { label: 'id', value: 'id' }, - { label: 'commentCount', value: 'commentCount' } - ], - 'out' - ); - } else if (outputType === 'array') { - return context.sendJson( - [ - { label: 'Result', value: 'result', - schema: { type: 'array', - items: { type: 'object', - properties: { - createdTime: { type: 'string', title: 'createdTime' }, - fields: { type: 'object', title: 'fields', - // We can't know table columns beforehand, so we'll just use empty object as schema. - schema: { type: 'object' } - }, - id: { type: 'string', title: 'id' }, - commentCount: { type: 'number', title: 'commentCount' } - } - } - } - } - ], - 'out' - ); - } else { - // file - return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); - } - } -}; diff --git a/src/appmixer/airtable/records/ListRecords/component.json b/src/appmixer/airtable/records/ListRecords/component.json deleted file mode 100644 index 1cae5ddba..000000000 --- a/src/appmixer/airtable/records/ListRecords/component.json +++ /dev/null @@ -1,173 +0,0 @@ -{ - "name": "appmixer.airtable.records.ListRecords", - "author": "Jiří Hofman ", - "label": "List Records", - "description": "List records in a table.", - "private": false, - "version": "1.0.3", - "auth": { - "service": "appmixer:airtable", - "scope": ["data.records:read"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "tableIdOrName": { "type": "string" }, - "fields": { "type": "string" }, - "filterByFormula": { "type": "string" }, - "maxRecords": { "type": "number" }, - "sort": { "type": "string" }, - "view": { "type": "string" }, - "cellFormat": { "type": "string" }, - "timeZone": { "type": "string" }, - "userLocale": { "type": "string" }, - "returnFieldsByFieldId": { "type": "boolean" }, - "recordMetadata": { "type": "boolean" }, - "outputType": { "type": "string" } - }, - "required": ["baseId", "tableIdOrName"] - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "tableIdOrName": { - "type": "select", - "label": "Table ID or Name", - "index": 2, - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "messages": { - "in/baseId": "inputs/in/baseId", - "in/isSource": true - }, - "transform": "./ListTables#toSelectArray" - } - } - }, - "fields": { - "type": "text", - "label": "Fields", - "index": 3, - "tooltip": "Comma-separated list of fields to retrieve. Only data for fields whose names or IDs are in this list will be included in the result. If you don't need every field, you can use this parameter to reduce the amount of data transferred." - }, - "filterByFormula": { - "type": "textarea", - "label": "Filter by formula", - "index": 4, - "tooltip": "A formula used to filter records. The formula will be evaluated for each record, and if the result is not 0, false, \"\", NaN, [], or #Error! the record will be included in the response. We recommend testing your formula in the Formula field UI before using it in your API request. See more in the filterByFormula API docs." - }, - "maxRecords": { - "type": "number", - "label": "Max Records", - "index": 5, - "tooltip": "The maximum total number of records that will be returned in your requests. Default value is 10000." - }, - "sort": { - "type": "text", - "label": "Sort", - "index": 6, - "tooltip": "A list of sort objects that specifies how the records will be ordered. Each sort object must have a field key specifying the name of the field to sort on, and an optional direction key that is either asc or desc. The default direction is asc. Example: [{\"field\": \"Feature\", \"direction\": \"desc\"}]. See more in the sort API docs." - }, - "view": { - "type": "text", - "label": "View", - "index": 7, - "tooltip": "The name or ID of a view in the table. If set, only the records in that view will be returned. The records will be sorted according to the order of the view unless the sort parameter is included, which overrides that order. Fields hidden in this view will be returned in the results. To only return a subset of fields, use the fields parameter." - }, - "cellFormat": { - "type": "select", - "defaultValue": "json", - "options": [ - { "value": "json", "label": "json" }, - { "value": "string", "label": "string" } - ], - "label": "Cell Format", - "index": 8, - "tooltip": "The format that should be used for cell values. See more in the cellFormat API docs." - }, - "timeZone": { - "type": "text", - "label": "Timezone", - "index": 9, - "tooltip": "This parameter is required when using string as the cellFormat. For possible values see Supported timezones for SET_TIMEZONE." - }, - "userLocale": { - "type": "text", - "label": "User Locale", - "index": 10, - "tooltip": "This parameter is required when using string as the cellFormat. For possible values see Supported locale modifiers for SET_LOCALE." - }, - "returnFieldsByFieldId": { - "type": "toggle", - "label": "ReturnFieldsByFieldId", - "index": 11, - "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." - }, - "recordMetadata": { - "type": "toggle", - "label": "Record Metadata", - "index": 12, - "tooltip": "An optional field that, if specified, includes commentCount on each record returned." - }, - "outputType": { - "group": "last", - "type": "select", - "label": "Output Type", - "index": 13, - "defaultValue": "array", - "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", - "options": [ - { "label": "All items at once", "value": "array" }, - { "label": "One item at a time", "value": "object" }, - { "label": "File", "value": "file" } - ] - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "source": { - "url": "/component/appmixer/airtable/records/ListRecords?outPort=out", - "data": { - "properties": { - "generateOutputPortOptions": true - }, - "messages": { - "in/outputType": "inputs/in/outputType", - "in/baseId": 1, - "in/tableIdOrName": 1 - } - } - } - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/ListTables/ListTables.js b/src/appmixer/airtable/records/ListTables/ListTables.js deleted file mode 100644 index e1f48db3c..000000000 --- a/src/appmixer/airtable/records/ListTables/ListTables.js +++ /dev/null @@ -1,156 +0,0 @@ -'use strict'; - -const { sendArrayOutput, isAppmixerVariable } = require('../../airtable-commons'); - -module.exports = { - - // Private component used only to list tables in a base in the inspector. - async receive(context) { - - const generateOutputPortOptions = context.properties.generateOutputPortOptions; - const { baseId, outputType, isSource } = context.messages.in.content; - if (generateOutputPortOptions) { - return this.getOutputPortOptions(context, outputType); - } - if (!baseId || isAppmixerVariable(baseId)) { - // This is the case when component is added to the inspector and user didn't select a base yet. - // We don't want to throw an error yet. - return context.sendJson({ items: [] }, 'out'); - } - - const cacheKey = 'airtable_tables_' + baseId; - let lock; - try { - lock = await context.lock(baseId); - - // Checking and returning cache only if this is a call from another component. - if (isSource) { - const tablesCached = await context.staticCache.get(cacheKey); - if (tablesCached) { - return context.sendJson({ items: tablesCached }, 'out'); - } - } - - const { data } = await context.httpRequest.get(`https://api.airtable.com/v0/meta/bases/${baseId}/tables`, { - headers: { - Authorization: `Bearer ${context.auth.accessToken}` - } - }); - const { tables } = data; - - // Cache the tables for 20 seconds unless specified otherwise in the config. - // Note that we only need name and id, so we can save some space in the cache. - // Caching only if this is a call from another component. - if (isSource) { - await context.staticCache.set( - cacheKey, - tables.map(table => ({ id: table.id, name: table.name })), - context.config.listTablesCacheTTL || (20 * 1000) - ); - - return context.sendJson({ items: tables }, 'out'); - } - - // Returning values to the flow. - await sendArrayOutput({ context, outputType, records: tables }); - } finally { - lock?.unlock(); - } - }, - - toSelectArray({ items }) { - - return items.map(table => { - return { label: table.name, value: table.id }; - }); - }, - - getOutputPortOptions(context, outputType) { - - if (outputType === 'object') { - return context.sendJson( - [ - { label: 'description', value: 'description' }, - { - label: 'fields', value: 'fields', - schema: { - type: 'array', - items: { - type: 'object', - properties: { - description: { label: 'description', value: 'description' }, - id: { label: 'id', value: 'id' }, - name: { label: 'name', value: 'name' }, - type: { label: 'type', value: 'type' } - } - } - } - }, - { label: 'id', value: 'id' }, - { label: 'name', value: 'name' }, - { label: 'primaryFieldId', value: 'primaryFieldId' }, - { - label: 'views', value: 'views', - schema: { - type: 'array', - items: { - type: 'object', - properties: { - id: { label: 'id', value: 'id' }, - name: { label: 'name', value: 'name' }, - type: { label: 'type', value: 'type' } - } - } - } - } - ], - 'out' - ); - } else if (outputType === 'array') { - return context.sendJson( - [ - { - label: 'Array', value: 'array', - schema: { type: 'array', - items: { type: 'object', - properties: { - description: { type: 'string', title: 'description' }, - fields: { type: 'object', title: 'fields', - schema: { type: 'array', - items: { type: 'object', - properties: { - description: { label: 'description', value: 'description' }, - id: { label: 'id', value: 'id' }, - name: { label: 'name', value: 'name' }, - type: { label: 'type', value: 'type' } - } - } - } - }, - id: { type: 'string', title: 'id' }, - name: { type: 'string', title: 'name' }, - primaryFieldId: { type: 'string', title: 'primaryFieldId' }, - views: { type: 'object', title: 'views', - schema: { type: 'array', - items: { type: 'object', - properties: { - id: { label: 'id', value: 'id' }, - name: { label: 'name', value: 'name' }, - type: { label: 'type', value: 'type' } - } - } - } - } - } - } - } - } - ], - 'out' - ); - } else { - // file - return context.sendJson([{ label: 'File ID', value: 'fileId' }], 'out'); - } - } -}; diff --git a/src/appmixer/airtable/records/ListTables/component.json b/src/appmixer/airtable/records/ListTables/component.json deleted file mode 100644 index 288fe9597..000000000 --- a/src/appmixer/airtable/records/ListTables/component.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "name": "appmixer.airtable.records.ListTables", - "author": "Jiří Hofman ", - "label": "List Tables", - "description": "List available tables in a base.", - "private": false, - "version": "1.0.2", - "auth": { - "service": "appmixer:airtable", - "scope": ["schema.bases:read"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "outputType": { "type": "string" } - } - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "outputType": { - "group": "last", - "type": "select", - "label": "Output Type", - "index": 2, - "defaultValue": "array", - "tooltip": "Choose whether you want to receive the result set as one complete list, or one item at a time or stream the items to a file. For large datasets, streaming the rows to a file is the most efficient method.", - "options": [ - { "label": "All items at once", "value": "array" }, - { "label": "One item at a time", "value": "object" }, - { "label": "File", "value": "file" } - ] - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "properties": { - "generateOutputPortOptions": true - }, - "messages": { - "in/outputType": "inputs/in/outputType", - "in/baseId": 1 - } - } - } - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js b/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js deleted file mode 100644 index 4bb590d27..000000000 --- a/src/appmixer/airtable/records/UpdateRecord/UpdateRecord.js +++ /dev/null @@ -1,48 +0,0 @@ -'use strict'; - -const Airtable = require('airtable'); - -module.exports = { - - async receive(context) { - - const { - baseId, tableIdOrName, recordId, fields, - replace, - returnFieldsByFieldId = false, typecast = false - } = context.messages.in.content; - - Airtable.configure({ - endpointUrl: 'https://api.airtable.com', - apiKey: context.auth.accessToken - }); - const base = Airtable.base(baseId); - - const queryParams = { - returnFieldsByFieldId, - typecast - }; - - let fieldsObject = {}; - try { - fieldsObject = JSON.parse(fields); - } catch (error) { - throw new context.CancelError('Invalid fields JSON'); - } - const data = { fields: fieldsObject, id: recordId }; - - context.log({ step: 'Updating record', data, queryParams }); - - let result; - if (replace === true) { - result = await base(tableIdOrName).replace([data], queryParams); - } else { - result = await base(tableIdOrName).update([data], queryParams); - } - // Make it the same as in REST API - // eslint-disable-next-line no-underscore-dangle - const item = result[0]._rawJson; - - context.sendJson(item, 'out'); - } -}; diff --git a/src/appmixer/airtable/records/UpdateRecord/component.json b/src/appmixer/airtable/records/UpdateRecord/component.json deleted file mode 100644 index 27a1fa02e..000000000 --- a/src/appmixer/airtable/records/UpdateRecord/component.json +++ /dev/null @@ -1,110 +0,0 @@ -{ - "name": "appmixer.airtable.records.UpdateRecord", - "author": "Jiří Hofman ", - "label": "Update Record", - "description": "Updates a single record in a table.", - "private": false, - "version": "1.0.1", - "auth": { - "service": "appmixer:airtable", - "scope": ["data.records:write"] - }, - "quota": { - "manager": "appmixer:airtable", - "resources": "messages.send", - "scope": { - "userId": "{{userId}}" - } - }, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "properties": { - "baseId": { "type": "string" }, - "tableIdOrName": { "type": "string" }, - "recordId": { "type": "string" }, - "fields": { "type": "string" }, - "replace": { "type": "boolean" }, - "returnFieldsByFieldId": { "type": "boolean" }, - "typecast": { "type": "boolean" } - }, - "required": ["baseId", "tableIdOrName", "recordId", "fields"] - }, - "inspector": { - "inputs": { - "baseId": { - "type": "select", - "label": "Base ID", - "index": 1, - "source": { - "url": "/component/appmixer/airtable/records/ListBases?outPort=out", - "data": { - "messages": { - "in/isSource": true - }, - "transform": "./ListBases#toSelectArray" - } - } - }, - "tableIdOrName": { - "type": "select", - "label": "Table ID or Name", - "index": 2, - "source": { - "url": "/component/appmixer/airtable/records/ListTables?outPort=out", - "data": { - "messages": { - "in/baseId": "inputs/in/baseId", - "in/isSource": true - }, - "transform": "./ListTables#toSelectArray" - } - } - }, - "recordId": { - "type": "text", - "label": "Record ID", - "index": 3 - }, - "fields": { - "type": "textarea", - "label": "Fields", - "index": 4, - "tooltip": "JSON object mapping field names to their values. Each field has a key corresponding to its field name and a value corresponding to its value. It is not necessary to specify every field in the table to create a record — only those that are non-empty. See more in the fields API docs." - }, - "replace": { - "type": "toggle", - "label": "Replace", - "index": 5, - "tooltip": "If true the request will perform a destructive update and clear all unspecified cell values. Otherwise, unspecified cell values will remain unchanged." - }, - "returnFieldsByFieldId": { - "type": "toggle", - "label": "Return fields by field ID", - "index": 6, - "tooltip": "An optional boolean value that lets you return field objects where the key is the field id. This defaults to false, which returns field objects where the key is the field name." - }, - "typecast": { - "type": "toggle", - "label": "Typecast", - "index": 7, - "tooltip": "The Airtable API will perform best-effort automatic data conversion from string values if the typecast parameter is passed in. Automatic conversion is disabled by default to ensure data integrity, but it may be helpful for integrating with 3rd party data sources." - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { "label": "Fields", "value": "fields" }, - { "label": "ID", "value": "id" }, - { "label": "Created Time", "value": "createdTime" } - ] - } - ], - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/service.json b/src/appmixer/airtable/service.json deleted file mode 100644 index 9f0a78e3a..000000000 --- a/src/appmixer/airtable/service.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "appmixer.airtable", - "label": "Airtable", - "category": "applications", - "description": "Airtable is a low-code platform to build next-gen apps. Move beyond rigid tools, operationalize your critical data, and reimagine workflows with AI.", - "version": "1.0.0", - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI+IDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI+IDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c+IDwvZz4KDTwvc3ZnPg==" -} diff --git a/src/appmixer/airtable/test-flow.json b/src/appmixer/airtable/test-flow.json deleted file mode 100644 index 08e546f11..000000000 --- a/src/appmixer/airtable/test-flow.json +++ /dev/null @@ -1,545 +0,0 @@ -{ - "name": "Jirka Airtable E2E", - "description": "Testing sh!t", - "flow": { - "1f0396b0-22cc-405b-a032-e34bcc2e9eeb": { - "type": "appmixer.utils.controls.OnStart", - "x": 192, - "y": -848, - "source": {}, - "version": "1.0.0", - "config": { - "transform": {} - } - }, - "3271690d-2d76-41e1-b242-18420b76bbda": { - "type": "appmixer.airtable.records.ListRecords", - "x": 592, - "y": -720, - "version": "1.0.0", - "source": { - "in": { - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": [ - "out" - ] - } - }, - "config": { - "transform": { - "in": { - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { - "out": { - "type": "json2new", - "modifiers": { - "cellFormat": {}, - "outputType": {}, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "cellFormat": "json", - "outputType": "items", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - } - }, - "3f0f938d-1944-4bf7-9e15-44dabd974325": { - "type": "appmixer.utils.test.Assert", - "x": 864, - "y": -592, - "version": "1.0.0", - "config": { - "transform": { - "in": { - "0869e289-b124-473c-a759-a0cbbbaf3031": { - "out": { - "type": "json2new", - "modifiers": { - "expression": { - "50ef1796-0a04-4d81-a9ff-90da42f3f94b": { - "variable": "$.3271690d-2d76-41e1-b242-18420b76bbda.out.items", - "functions": [ - { - "name": "g_length" - } - ] - }, - "4cfc3566-29ef-4262-ae74-8930f274b131": { - "variable": "$.0869e289-b124-473c-a759-a0cbbbaf3031.out.items", - "functions": [ - { - "name": "g_length" - }, - { - "name": "g_add", - "params": [ - { - "value": "1" - } - ] - } - ] - } - } - }, - "lambda": { - "expression": { - "AND": [ - { - "expected": "{{{4cfc3566-29ef-4262-ae74-8930f274b131}}}", - "assertion": "equal", - "field": "{{{50ef1796-0a04-4d81-a9ff-90da42f3f94b}}}" - } - ] - } - } - } - } - } - } - }, - "source": { - "in": { - "0869e289-b124-473c-a759-a0cbbbaf3031": [ - "out" - ] - } - }, - "label": "Assert record numbers after delete" - }, - "3c0cdcc9-233f-440e-86e5-2e159b15ede5": { - "type": "appmixer.airtable.records.CreateRecord", - "x": 192, - "y": -720, - "source": { - "in": { - "196bfe41-967b-473c-9292-bc8e0f4eaf3d": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "transform": { - "in": { - "196bfe41-967b-473c-9292-bc8e0f4eaf3d": { - "out": { - "type": "json2new", - "modifiers": { - "fields": { - "6c0bb4b5-e196-403e-91b3-9bf7be83f27a": { - "functions": [ - { - "name": "g_uuid4" - } - ] - } - }, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "fields": "{\"Name\":\"{{{6c0bb4b5-e196-403e-91b3-9bf7be83f27a}}}\",\"Status\":\"To do\",\"Priority\":\"Low\"}", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - } - }, - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { - "type": "appmixer.airtable.records.UpdateRecord", - "x": 464, - "y": -720, - "source": { - "in": { - "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "transform": { - "in": { - "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": { - "out": { - "type": "json2new", - "modifiers": { - "recordId": { - "ad462837-5244-44e1-bc84-708d36cd68cf": { - "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", - "functions": [] - } - }, - "fields": { - "58adc5af-e282-4405-910e-5e7cf23b39e2": { - "functions": [ - { - "name": "g_uuid4" - } - ] - } - }, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "recordId": "{{{ad462837-5244-44e1-bc84-708d36cd68cf}}}", - "fields": "{\"Name\":\"updated - {{{58adc5af-e282-4405-910e-5e7cf23b39e2}}}\",\"Status\":\"Done\"}", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - } - }, - "8af86002-3998-48f5-bb53-e90f97571b38": { - "type": "appmixer.airtable.records.DeleteRecord", - "x": 720, - "y": -720, - "source": { - "in": { - "3271690d-2d76-41e1-b242-18420b76bbda": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "transform": { - "in": { - "3271690d-2d76-41e1-b242-18420b76bbda": { - "out": { - "type": "json2new", - "modifiers": { - "recordId": { - "cb5e5fdd-c553-45ff-beb8-83b4f39722cf": { - "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", - "functions": [] - } - }, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "recordId": "{{{cb5e5fdd-c553-45ff-beb8-83b4f39722cf}}}", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - } - }, - "0869e289-b124-473c-a759-a0cbbbaf3031": { - "type": "appmixer.airtable.records.ListRecords", - "x": 864, - "y": -720, - "version": "1.0.0", - "source": { - "in": { - "8af86002-3998-48f5-bb53-e90f97571b38": [ - "out" - ] - } - }, - "config": { - "transform": { - "in": { - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { - "out": { - "type": "json2new", - "modifiers": { - "cellFormat": {}, - "outputType": {}, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "cellFormat": "json", - "outputType": "items", - "baseId": "appJfs4DY2gY9Z3x5", - "tableIdOrName": "tblswrR6NEm3SNpJz" - } - } - }, - "8af86002-3998-48f5-bb53-e90f97571b38": { - "out": { - "type": "json2new", - "modifiers": { - "cellFormat": {}, - "outputType": {}, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "cellFormat": "json", - "outputType": "items", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - }, - "label": "List Records - after delete" - }, - "d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777": { - "type": "appmixer.airtable.records.GetRecord", - "x": 320, - "y": -720, - "source": { - "in": { - "3c0cdcc9-233f-440e-86e5-2e159b15ede5": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "transform": { - "in": { - "3c0cdcc9-233f-440e-86e5-2e159b15ede5": { - "out": { - "type": "json2new", - "modifiers": { - "recordId": { - "72606414-482e-43e3-be6c-01f6b0206cf9": { - "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", - "functions": [] - } - }, - "baseId": {}, - "tableIdOrName": {} - }, - "lambda": { - "recordId": "{{{72606414-482e-43e3-be6c-01f6b0206cf9}}}", - "baseId": "appo0bF6xV0gtlGxD", - "tableIdOrName": "tblJQwUF983wOvYz3" - } - } - } - } - } - } - }, - "196bfe41-967b-473c-9292-bc8e0f4eaf3d": { - "type": "appmixer.utils.test.BeforeAll", - "x": 320, - "y": -848, - "source": { - "in": { - "1f0396b0-22cc-405b-a032-e34bcc2e9eeb": [ - "out" - ] - } - }, - "version": "1.0.0" - }, - "31509eb7-a775-461b-84e8-85fa9decac1e": { - "type": "appmixer.utils.test.AfterAll", - "x": 1056, - "y": -592, - "source": { - "in": { - "3f0f938d-1944-4bf7-9e15-44dabd974325": [ - "out" - ], - "1dbccfda-2dae-4781-90fd-d1a167d07684": [ - "out" - ], - "1b41466e-fe9f-47f2-903d-759abc46bdaa": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "properties": { - "timeout": 30 - } - } - }, - "58fa73be-cff8-414d-9185-dbc34104f7aa": { - "type": "appmixer.utils.test.ProcessE2EResults", - "x": 1168, - "y": -592, - "source": { - "in": { - "31509eb7-a775-461b-84e8-85fa9decac1e": [ - "out" - ] - } - }, - "version": "1.0.0", - "config": { - "properties": { - "successStoreId": "64f6f1f9193228000754082f", - "failedStoreId": "64f6f1f0193228000754082e" - }, - "transform": { - "in": { - "31509eb7-a775-461b-84e8-85fa9decac1e": { - "out": { - "type": "json2new", - "modifiers": { - "recipients": {}, - "testCase": {}, - "result": { - "84fecc3c-3ba6-4119-942c-a9d68dc3c14b": { - "variable": "$.31509eb7-a775-461b-84e8-85fa9decac1e.out", - "functions": [] - } - } - }, - "lambda": { - "recipients": "jirka@client.io", - "testCase": "Jirka Airtable E2E", - "result": "{{{84fecc3c-3ba6-4119-942c-a9d68dc3c14b}}}" - } - } - } - } - } - } - }, - "1dbccfda-2dae-4781-90fd-d1a167d07684": { - "type": "appmixer.utils.test.Assert", - "x": 464, - "y": -592, - "source": { - "in": { - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": [ - "out" - ] - } - }, - "version": "1.0.0", - "label": "Assert updated record", - "config": { - "transform": { - "in": { - "72bea575-431e-48d8-b996-7b5a5ae5b6b6": { - "out": { - "type": "json2new", - "modifiers": { - "expression": { - "14d35c03-d549-4d9d-ae8e-aba028612153": { - "variable": "$.72bea575-431e-48d8-b996-7b5a5ae5b6b6.out.id", - "functions": [] - }, - "391c0d40-edb8-46da-b9e3-f7988b94a2d1": { - "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", - "functions": [] - }, - "1ca0ec79-b66a-4784-8240-9d23aa2acfb4": { - "variable": "$.72bea575-431e-48d8-b996-7b5a5ae5b6b6.out.fields", - "functions": [ - { - "name": "g_jsonPath", - "params": [ - { - "value": "Name" - } - ] - } - ] - } - } - }, - "lambda": { - "expression": { - "AND": [ - { - "expected": "{{{391c0d40-edb8-46da-b9e3-f7988b94a2d1}}}", - "assertion": "equal", - "field": "{{{14d35c03-d549-4d9d-ae8e-aba028612153}}}" - }, - { - "regex": "^updated", - "assertion": "regex", - "field": "{{{1ca0ec79-b66a-4784-8240-9d23aa2acfb4}}}" - } - ] - } - } - } - } - } - } - } - }, - "1b41466e-fe9f-47f2-903d-759abc46bdaa": { - "type": "appmixer.utils.test.Assert", - "x": 720, - "y": -592, - "source": { - "in": { - "8af86002-3998-48f5-bb53-e90f97571b38": [ - "out" - ] - } - }, - "version": "1.0.0", - "label": "Assert deleted record", - "config": { - "transform": { - "in": { - "8af86002-3998-48f5-bb53-e90f97571b38": { - "out": { - "type": "json2new", - "modifiers": { - "expression": { - "0d9b6763-96e0-43d7-9953-eb08ae85872f": { - "variable": "$.8af86002-3998-48f5-bb53-e90f97571b38.out.id", - "functions": [] - }, - "9926b3e9-be32-4604-be65-ce000263f72d": { - "variable": "$.3c0cdcc9-233f-440e-86e5-2e159b15ede5.out.id", - "functions": [] - } - } - }, - "lambda": { - "expression": { - "AND": [ - { - "assertion": "equal", - "field": "{{{0d9b6763-96e0-43d7-9953-eb08ae85872f}}}", - "expected": "{{{9926b3e9-be32-4604-be65-ce000263f72d}}}" - } - ] - } - } - } - } - } - } - } - } - }, - "thumbnail": "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20joint-selector%3D%22svg%22%20id%3D%22v-24221%22%20viewBox%3D%22166.4375%20-858%201108.96875%20367.79998779296875%22%3E%3Cstyle%20id%3D%22v-24222%22%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5Bfont-family%3A%20sans-serif%3B%20font-display%3A%20auto%3B%20font-style%3A%20normal%3B%20font-size%3A%20100%25%5D%5D%3E%3C%2Fstyle%3E%3Cdefs%20joint-selector%3D%22defs%22%3E%3Cmarker%20id%3D%22v-42056921440%22%20orient%3D%22auto%22%20overflow%3D%22visible%22%20markerUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20id%3D%22v-1231%22%20stroke%3D%22%232853FF%22%20fill%3D%22%232853FF%22%20transform%3D%22rotate(180)%22%20display%3D%22none%22%2F%3E%3C%2Fmarker%3E%3C%2Fdefs%3E%3Cg%20joint-selector%3D%22layers%22%20class%3D%22joint-layers%22%3E%3Cg%20class%3D%22joint-back-layer%22%2F%3E%3Cg%20class%3D%22joint-cells-layer%20joint-viewport%22%3E%3Cg%20model-id%3D%22266ecae6-d853-40ab-a12c-72e403a310c0%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_21%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1228%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-686%20L%20586.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1229%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-686%20L%20586.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22b2c9f617-7354-4a51-8c6d-ea64b58474db%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_22%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1232%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20938.5%20-686%20L%20943%20-686%20C%20945.3999999999999%20-686%20946.7333333333332%20-683.3333333333333%20947%20-678%20L%20947%20-605%20C%20946.7333333333332%20-599.9333333333333%20944.0666666666666%20-597.2666666666667%20939%20-597%20L%20857%20-597%20C%20851.9333333333333%20-597.2666666666667%20849.2666666666667%20-594.5999999999999%20849%20-589%20L%20849%20-566%20C%20849.2666666666667%20-560.6666666666666%20850.9333333333333%20-558%20854%20-558%20L%20858.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1233%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20938.5%20-686%20L%20943%20-686%20C%20945.3999999999999%20-686%20946.7333333333332%20-683.3333333333333%20947%20-678%20L%20947%20-605%20C%20946.7333333333332%20-599.9333333333333%20944.0666666666666%20-597.2666666666667%20939%20-597%20L%20857%20-597%20C%20851.9333333333333%20-597.2666666666667%20849.2666666666667%20-594.5999999999999%20849%20-589%20L%20849%20-566%20C%20849.2666666666667%20-560.6666666666666%20850.9333333333333%20-558%20854%20-558%20L%20858.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%224bc1d2dd-e780-4e1f-88cb-88284aec5f77%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_24%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1236%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20394.5%20-686%20L%20458.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1237%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20394.5%20-686%20L%20458.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22ab372595-287a-40c3-a454-497df5d4a8d6%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_25%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1238%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20666.5%20-686%20L%20714.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1239%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20666.5%20-686%20L%20714.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22b6d04624-89a8-4ba4-bc85-82376715a7c2%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_26%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1240%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-686%20L%20858.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1241%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-686%20L%20858.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22ffaec3c0-f12d-48ed-8f1f-6b4ba7f11a05%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_27%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1242%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20266.5%20-686%20L%20314.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1243%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20266.5%20-686%20L%20314.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%229354f3b6-b970-49ec-a415-50b28976f052%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_28%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1244%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%201130.5%20-558%20L%201162.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1245%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%201130.5%20-558%20L%201162.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%2264e410f6-288d-4056-acd6-0d1fca42987d%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_40%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1246%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20266.5%20-814%20L%20314.5%20-814%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1247%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20266.5%20-814%20L%20314.5%20-814%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22e464e1a3-550a-4067-82e7-5b48ce3a3df1%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_42%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-1696%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20394.5%20-814%20L%20399%20-814%20C%20401.73333333333335%20-814%20403.06666666666666%20-811.3333333333333%20403%20-806%20L%20403%20-733%20C%20403.06666666666666%20-727.9333333333333%20400.4%20-725.2666666666667%20395%20-725%20L%20185%20-725%20C%20179.6%20-725.2666666666667%20176.93333333333334%20-722.5999999999999%20177%20-717%20L%20177%20-694%20C%20176.93333333333334%20-688.6666666666666%20178.6%20-686%20182%20-686%20L%20186.5%20-686%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-1697%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20394.5%20-814%20L%20399%20-814%20C%20401.73333333333335%20-814%20403.06666666666666%20-811.3333333333333%20403%20-806%20L%20403%20-733%20C%20403.06666666666666%20-727.9333333333333%20400.4%20-725.2666666666667%20395%20-725%20L%20185%20-725%20C%20179.6%20-725.2666666666667%20176.93333333333334%20-722.5999999999999%20177%20-717%20L%20177%20-694%20C%20176.93333333333334%20-688.6666666666666%20178.6%20-686%20182%20-686%20L%20186.5%20-686%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22d055c877-5c19-494a-be16-cb37a27c49f3%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_44%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-2369%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20938.5%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-2370%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20938.5%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22561c1313-4981-4b33-8150-e56a2bef56de%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_49%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-7973%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-686%20L%20543%20-686%20C%20545.4%20-686%20546.7333333333333%20-683.3333333333333%20547%20-678%20L%20547%20-605%20C%20546.7333333333333%20-599.9333333333333%20544.0666666666666%20-597.2666666666667%20539%20-597%20L%20457%20-597%20C%20451.9333333333333%20-597.2666666666667%20449.26666666666665%20-594.5999999999999%20449%20-589%20L%20449%20-566%20C%20449.26666666666665%20-560.6666666666666%20450.9333333333333%20-558%20454%20-558%20L%20458.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-7974%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-686%20L%20543%20-686%20C%20545.4%20-686%20546.7333333333333%20-683.3333333333333%20547%20-678%20L%20547%20-605%20C%20546.7333333333333%20-599.9333333333333%20544.0666666666666%20-597.2666666666667%20539%20-597%20L%20457%20-597%20C%20451.9333333333333%20-597.2666666666667%20449.26666666666665%20-594.5999999999999%20449%20-589%20L%20449%20-566%20C%20449.26666666666665%20-560.6666666666666%20450.9333333333333%20-558%20454%20-558%20L%20458.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22e02d7b09-603f-4c98-ae48-24174cd5639a%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_51%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-8465%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20538.5%20-558%20L%20848%20-558%20C%20853.5999999999999%20-558%20856.2666666666667%20-560.6666666666666%20856%20-566%20L%20856%20-590%20C%20856.2666666666667%20-595.3333333333333%20858.9333333333333%20-598%20864%20-598%20L%201033%20-598%20C%201038.3333333333333%20-598%201041%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041%20-560.6666666666666%201042.6666666666665%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-8466%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20538.5%20-558%20L%20848%20-558%20C%20853.5999999999999%20-558%20856.2666666666667%20-560.6666666666666%20856%20-566%20L%20856%20-590%20C%20856.2666666666667%20-595.3333333333333%20858.9333333333333%20-598%20864%20-598%20L%201033%20-598%20C%201038.3333333333333%20-598%201041%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041%20-560.6666666666666%201042.6666666666665%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22855d12f3-0996-4e7f-8f0e-11e513311cb5%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_57%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-20852%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-686%20L%20799%20-686%20C%20801.3999999999999%20-686%20802.7333333333332%20-683.3333333333333%20803%20-678%20L%20803%20-605%20C%20802.7333333333332%20-599.9333333333333%20800.0666666666666%20-597.2666666666667%20795%20-597%20L%20713%20-597%20C%20707.9333333333333%20-597.2666666666667%20705.2666666666667%20-594.5999999999999%20705%20-589%20L%20705%20-566%20C%20705.2666666666667%20-560.6666666666666%20706.9333333333333%20-558%20710%20-558%20L%20714.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-20853%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-686%20L%20799%20-686%20C%20801.3999999999999%20-686%20802.7333333333332%20-683.3333333333333%20803%20-678%20L%20803%20-605%20C%20802.7333333333332%20-599.9333333333333%20800.0666666666666%20-597.2666666666667%20795%20-597%20L%20713%20-597%20C%20707.9333333333333%20-597.2666666666667%20705.2666666666667%20-594.5999999999999%20705%20-589%20L%20705%20-566%20C%20705.2666666666667%20-560.6666666666666%20706.9333333333333%20-558%20710%20-558%20L%20714.5%20-558%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%223d66e239-312b-47b2-b24c-5b776940c549%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_59%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-23358%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20794.5%20-558%20L%20850%20-558%20C%20855%20-558%20857.6666666666666%20-560.6666666666666%20858%20-566%20L%20858%20-590%20C%20857.6666666666666%20-595.3333333333333%20860.3333333333333%20-598%20866%20-598%20L%201033%20-598%20C%201038.3999999999999%20-598%201041.0666666666666%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041.0666666666666%20-560.6666666666666%201042.7333333333331%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-23359%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20794.5%20-558%20L%20850%20-558%20C%20855%20-558%20857.6666666666666%20-560.6666666666666%20858%20-566%20L%20858%20-590%20C%20857.6666666666666%20-595.3333333333333%20860.3333333333333%20-598%20866%20-598%20L%201033%20-598%20C%201038.3999999999999%20-598%201041.0666666666666%20-595.3333333333333%201041%20-590%20L%201041%20-566%20C%201041.0666666666666%20-560.6666666666666%201042.7333333333331%20-558%201046%20-558%20L%201050.5%20-558%22%2F%3E%3C%2Fg%3E%3C!--z-index%3A-1--%3E%3Cg%20model-id%3D%221f0396b0-22cc-405b-a032-e34bcc2e9eeb%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_29%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(192%2C-848)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1041%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%226%22%20ry%3D%226%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1042%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2256.53125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C5.7%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1043%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EOnStart%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1044%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBpZD0iR3JvdXBfNTQ3IiBkYXRhLW5hbWU9Ikdyb3VwIDU0NyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4OSAtMzUpIj4KICAgIDxyZWN0IGlkPSJSZWN0YW5nbGVfMzQ2OCIgZGF0YS1uYW1lPSJSZWN0YW5nbGUgMzQ2OCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyODkgMzUpIiBmaWxsPSJub25lIi8%2BCiAgICA8cGF0aCBpZD0iY29nIiBkPSJNMTgsNy4zNDdhMS45LDEuOSwwLDAsMCwwLDMuMzA3bC0uNjQ1LDIuMTY1YTEuODk1LDEuODk1LDAsMCwwLTIsMi43NTJMMTMuNSwxNy4wMTNBMS44OTQsMS44OTQsMCwwLDAsMTAuNDcsMThsLTIuOTYxLS4wMDdhMS44OTQsMS44OTQsMCwwLDAtMy4wMjYtLjk4NUwyLjYyOSwxNS41NTVBMS44OTUsMS44OTUsMCwwLDAsLjY0NCwxMi44MTZMMCwxMC42NDJBMS45LDEuOSwwLDAsMCwuOTQ2LDksMS44OTQsMS44OTQsMCwwLDAsMCw3LjM1OEwuNjQzLDUuMTg0QTEuODk1LDEuODk1LDAsMCwwLDIuNjMsMi40NDVMNC40ODIuOTkyYTEuODk0LDEuODk0LDAsMCwwLDEuNzgxLjMzMkExLjg5NCwxLjg5NCwwLDAsMCw3LjUwOC4wMDdMMTAuNDcxLDBhMS44OTQsMS44OTQsMCwwLDAsMS4yNDYsMS4zMjNBMS44OTQsMS44OTQsMCwwLDAsMTMuNS45ODdMMTUuMzU4LDIuNDNhMS44OTUsMS44OTUsMCwwLDAsMiwyLjc1MkwxOCw3LjM0NlpNMTMuMzQxLDMuMzEyYzAtLjA1NywwLS4xMTIsMC0uMTY5bC0uMDcyLS4wNTZBMy42OTMsMy42OTMsMCwwLDEsOS40LDEuOGwtLjgxNCwwQTMuNjksMy42OSwwLDAsMSw0LjcyMSwzLjA5MWwtLjA4NS4wNjhBMy43LDMuNywwLDAsMSwyLjA1MSw2Ljg0LDMuNjksMy42OSwwLDAsMSwyLjc0Niw5YTMuNywzLjcsMCwwLDEtLjY5NSwyLjE2QTMuNywzLjcsMCwwLDEsNC42MzYsMTQuODRsLjA4Ni4wNjhhMy42OTQsMy42OTQsMCwwLDEsMy44NiwxLjI4N2wuODE0LDBhMy42OSwzLjY5LDAsMCwxLDMuODc2LTEuMjg1bC4wNzItLjA1NmEzLjcsMy43LDAsMCwxLDIuNTg2LTMuNywzLjcsMy43LDAsMCwxLDAtNC4zMiwzLjcsMy43LDAsMCwxLTIuNTg4LTMuNTI3Wk05LDEyLjZBMy42LDMuNiwwLDEsMSwxMi42LDksMy42LDMuNiwwLDAsMSw5LDEyLjZabTAtMS44QTEuOCwxLjgsMCwxLDAsNy4yLDksMS44LDEuOCwwLDAsMCw5LDEwLjhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyOTIgMzgpIi8%2BCiAgPC9nPgo8L3N2Zz4K%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1045%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1046%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1047%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1040%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%224%22%20ry%3D%224%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1048%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1049%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1050%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1052%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1051%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A0--%3E%3Cg%20model-id%3D%223271690d-2d76-41e1-b242-18420b76bbda%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_30%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(592%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1054%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1055%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2285.03125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.5%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1056%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EList%C2%A0Records%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1057%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1058%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1059%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1060%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1053%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1061%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1062%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1063%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1068%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1067%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1064%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1065%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1066%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1070%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1069%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A1--%3E%3Cg%20model-id%3D%223f0f938d-1944-4bf7-9e15-44dabd974325%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_31%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(864%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1072%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1073%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22217.859375%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-74.9%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1074%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0record%C2%A0numbers%C2%A0after%C2%A0delete%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1075%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1076%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1077%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1078%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1071%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1079%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1080%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1081%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1086%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1085%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1082%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1083%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1084%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1088%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1087%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A2--%3E%3Cg%20model-id%3D%223c0cdcc9-233f-440e-86e5-2e159b15ede5%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_32%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(192%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1090%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1091%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2297.796875%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-14.9%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1092%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3ECreate%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1093%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1094%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1095%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1096%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1089%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1097%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1098%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1099%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1104%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1103%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1100%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1101%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1102%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1106%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1105%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A3--%3E%3Cg%20model-id%3D%2272bea575-431e-48d8-b996-7b5a5ae5b6b6%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_33%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(464%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1108%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1109%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22100.8125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-16.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1110%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EUpdate%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1111%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1112%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1113%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1114%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1107%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1115%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1116%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1117%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1122%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1121%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1118%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1119%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1120%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1124%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1123%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A4--%3E%3Cg%20model-id%3D%228af86002-3998-48f5-bb53-e90f97571b38%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_34%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(720%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1126%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1127%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2296.296875%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-14.1%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1128%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EDelete%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1129%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1130%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1131%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1132%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1125%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1133%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1134%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1135%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1140%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1139%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1136%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1137%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1138%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1142%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1141%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A5--%3E%3Cg%20model-id%3D%220869e289-b124-473c-a759-a0cbbbaf3031%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_35%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(864%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1144%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1145%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22164.578125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-48.3%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1146%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EList%C2%A0Records%C2%A0-%C2%A0after%C2%A0delete%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1147%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1148%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1149%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1150%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1143%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1151%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1152%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1153%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1158%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1157%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1154%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1155%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1156%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1160%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1159%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A6--%3E%3Cg%20model-id%3D%22d3d7786c-1a2b-4ad3-a84a-f55cdf7b4777%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_36%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(320%2C-720)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1162%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1163%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2279.03125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1164%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EGet%C2%A0Record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1165%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyB3aWR0aD0iNjRweCIgaGVpZ2h0PSI2NHB4IiB2aWV3Qm94PSIwIC0yMC41IDI1NiAyNTYiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiIGZpbGw9IiMwMDAwMDAiPgoNPGcgaWQ9IlNWR1JlcG9fYmdDYXJyaWVyIiBzdHJva2Utd2lkdGg9IjAiLz4KDTxnIGlkPSJTVkdSZXBvX3RyYWNlckNhcnJpZXIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPgoNPGcgaWQ9IlNWR1JlcG9faWNvbkNhcnJpZXIiPiA8Zz4gPHBhdGggZD0iTTExNC4yNTg3MywyLjcwMTAxNjk1IEwxOC44NjA0MDIzLDQyLjE3NTYzODQgQzEzLjU1NTI3MjMsNDQuMzcxMTYzOCAxMy42MTAyMzI4LDUxLjkwNjUzMTEgMTguOTQ4NjI4Miw1NC4wMjI1MDg1IEwxMTQuNzQ2MTQyLDkyLjAxMTc1MTQgQzEyMy4xNjM3NjksOTUuMzQ5ODc1NyAxMzIuNTM3NDE5LDk1LjM0OTg3NTcgMTQwLjk1MzYsOTIuMDExNzUxNCBMMjM2Ljc1MjU2LDU0LjAyMjUwODUgQzI0Mi4wODk1MSw1MS45MDY1MzExIDI0Mi4xNDU5MTYsNDQuMzcxMTYzOCAyMzYuODM5MzQsNDIuMTc1NjM4NCBMMTQxLjQ0MjQ1OSwyLjcwMTAxNjk1IEMxMzIuNzM4NDU5LC0wLjkwMDMzODk4MyAxMjIuOTYxMjg0LC0wLjkwMDMzODk4MyAxMTQuMjU4NzMsMi43MDEwMTY5NSIgZmlsbD0iI0ZGQkYwMCI%2BIDwvcGF0aD4gPHBhdGggZD0iTTEzNi4zNDkwNzEsMTEyLjc1Njg2MyBMMTM2LjM0OTA3MSwyMDcuNjU5MTAxIEMxMzYuMzQ5MDcxLDIxMi4xNzMwODkgMTQwLjkwMDY2NCwyMTUuMjYzODkyIDE0NS4wOTY0NjEsMjEzLjYwMDYxNSBMMjUxLjg0NDEyMiwxNzIuMTY2MjE5IEMyNTQuMjgxMTg0LDE3MS4yMDAwNzIgMjU1Ljg3OTM3NiwxNjguODQ1NDUxIDI1NS44NzkzNzYsMTY2LjIyNDcwNSBMMjU1Ljg3OTM3Niw3MS4zMjI0Njc4IEMyNTUuODc5Mzc2LDY2LjgwODQ3OTEgMjUxLjMyNzc4Myw2My43MTc2NzY4IDI0Ny4xMzE5ODYsNjUuMzgwOTUzNyBMMTQwLjM4NDMyNSwxMDYuODE1MzQ5IEMxMzcuOTQ4NzEsMTA3Ljc4MTQ5NiAxMzYuMzQ5MDcxLDExMC4xMzYxMTggMTM2LjM0OTA3MSwxMTIuNzU2ODYzIiBmaWxsPSIjMjZCNUY4Ij4gPC9wYXRoPiA8cGF0aCBkPSJNMTExLjQyMjc3MSwxMTcuNjUzNTUgTDc5Ljc0MjQwOSwxMzIuOTQ5OTEyIEw3Ni41MjU3NzYzLDEzNC41MDQ3MTQgTDkuNjUwNDc2ODQsMTY2LjU0ODEwNCBDNS40MTEyOTA0LDE2OC41OTMyMTEgMC4wMDA1Nzg1MzEwNzMsMTY1LjUwMzg1NSAwLjAwMDU3ODUzMTA3MywxNjAuNzk0NjEyIEwwLjAwMDU3ODUzMTA3Myw3MS43MjEwNzU3IEMwLjAwMDU3ODUzMTA3Myw3MC4wMTczMDE3IDAuODc0MTYwNDUyLDY4LjU0NjM4NjQgMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbD0iI0VEMzA0OSI%2BIDwvcGF0aD4gPHBhdGggZD0iTTExMS40MjI3NzEsMTE3LjY1MzU1IEw3OS43NDI0MDksMTMyLjk0OTkxMiBMMi4wNDU2ODU4OCw2Ny40Mzg0OTk0IEMyLjUzNDU0NDYzLDY2Ljk0ODE5NDQgMy4wODg0ODgxNCw2Ni41NDQ2Njg5IDMuNjY0MTI2NTUsNjYuMjI1MDMwNSBDNS4yNjIzMTg2NCw2NS4yNjYxMTUzIDcuNTQxNzMxMDcsNjUuMDEwMTE1MyA5LjQ3OTgxMDE3LDY1Ljc3NjY2ODkgTDExMC44OTA1MjIsMTA1Ljk1NzA5OCBDMTE2LjA0NTIzNCwxMDguMDAyMjA2IDExNi40NTAyMDYsMTE1LjIyNTE2NiAxMTEuNDIyNzcxLDExNy42NTM1NSIgZmlsbC1vcGFjaXR5PSIwLjI1IiBmaWxsPSIjMDAwMDAwIj4gPC9wYXRoPiA8L2c%2BIDwvZz4KDTwvc3ZnPg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1166%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1167%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1168%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1161%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1169%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1170%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1171%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1176%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1175%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1172%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1173%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1174%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1178%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1177%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A7--%3E%3Cg%20model-id%3D%22196bfe41-967b-473c-9292-bc8e0f4eaf3d%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_37%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(320%2C-848)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1180%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1181%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2264.78125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C1.6%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1182%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EBeforeAll%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1183%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAACgklEQVR4nO3bTW4TMRgG4LfsQOUglNI78XMyfi7QbrkHcIwumi7LgiCq0iYzzrgeO88jvRtUEY9jje34cwIAAAAAAAAAHKuzJFdJbra52v4bR%2BAsyXWSuwfZJPmQ5KRd03gOV%2Fn%2Fy7%2Bfz0lOm7WO6m6yewDcJfmR5LxVA6lrygCoPSWcJbncfsaUthxzNtu%2BWmyNtm8KqD0lPLUGkd25zkKDoOQLWHJKuJz52fIvlwX9%2Fajz%2FPlS53z4UlOC1355NgX9%2FaTTJF8KGnHolNC6E3vPok6SfExyO7MRh0wJrTuw91TxLsnPmQ0pnRJad2DvqeY0ydeCBs2dElp3YO%2Bp6pAp4e3Ez2j6gB1YRf9cJPk1oTH3c53kzYT%2FexUPuGKr6Z%2FXSb5NaND9TNmnruYBV2pV%2FXOS5FOmTwlT9qmresAVOqh%2FXlRokOPhI2UKaGMV%2FWMR2E7T%2Fpk75%2F%2BNbeBymvWPH4L6SBUXKfsp%2BH38FNz1ADjkle8wqPMB4Di4zyziPM%2F3yn9IQUh5FikIURLWbxYpCVMU2mcWKwqdUxa%2BxCv%2FMcrCp2fxsnAXQ46cq2FHbtfl0FqvfFbG9XAAAAAAnoXDoIaHQa05Di7LYsfBrSkIKc%2FegpAeDnI2SV62bkSnbpO82vUHNe4G0pEeBsD31g3o2BB9ZxFYlmEWgYlt4JwMtw0EAAAAAAAAAMakIOSIC0KUhJVlmJIw9wLK417AkXMvgN16GABD1LY3MkTfWQSWZZhFYGIbOCfDbQMBAAAAAAAAgDGNVBCiYGOmUUvChirZqmnkewF76%2FZrcy%2Bgrb11%2B7X1UBZORT0MgCFq258w8rMtxiIQ20AAAAAAAAAAgKl%2BA0o61YoZmOw3AAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1184%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1185%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1186%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1179%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1187%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1188%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1189%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1194%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1193%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1190%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1191%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1192%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1196%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1195%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A8--%3E%3Cg%20model-id%3D%2231509eb7-a775-461b-84e8-85fa9decac1e%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_38%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(1056%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1198%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1199%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2253.515625%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7.2%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1200%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAfterAll%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1201%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAACe0lEQVR4nO3bS3LTQBQF0AtDwkIwIYviszE%2BG0jGrANYRgaYKQwSqlIUsaWO2v3xOVV35rJbzyq1WnqdAAAAAAAAAAC0sUtynWSf5LcczP6%2BVruiSndol%2BQ27Qs7Wm4zyUlwnfbFHDXXx4r77NgHOrBP8qL1IAb1K8nFoQ88P9FA6NQIJ8DX1gMY2BS1cxNYlmluAhPLwDWZbhkIAAAAAAAAAMxJQ8gZN4RoCSvLNC1h9gWUx76AM2dfAIeNcAJM0dveyBS1cxNYlmluAhPLwDWZbhkIAAAAAAAAAMxppoYQDRsrzdoSNlXLVk0z7ws42rdfm30BbR3t269thLZwKhrhBJiit%2F0RMx%2FbZtwEYhkIAAAAcCq7JDdJft7nJh5knI3HHsXuk7xrOC5O5CaHH21%2BTONXmtT1M8efb39LctlqgNS15ASoPSXM9DJouJdNx6aA2lPCrK%2BDa2ez180lf8CWU8LMPYG1s1nP4WXu%2FtQ1P77VlOCyX559Qb0fdZHkU8EgnjoltC7i6Nnc%2B9x1s64ZxFOmhNYFHD1VvEnyfeVASqeE1gUcPdVcJPlcMKC1U0LrAo6e6kqnhNcLv7%2F5AXaui%2FpcJfmxYDAPc5vk1YLv7uIAO9ZNfV4m%2BbJgQA%2BzZJ3azQF2qrv6fMjyKWHJOrW7A%2BzMk%2BpTY2vYCBtOqcAU0EYX9XET2E7z%2BqyZ8%2F%2FGMnA7zerjQdAYqeIqZY%2BC3xb8VusCjp7NlV7yvQwa%2FATwOnjMbOIyp7vk%2F0tDSHk2aQjREjZuNmkJ0xQ6ZjZrCl3TFr7FJf9%2FtIUvz%2BZt4TaGnDlbw87coc2htS75dMb2cAAAAAAAAACAQfwBzqrUt3ZEKhIAAAAASUVORK5CYII%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1202%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1203%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1204%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1197%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1205%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1206%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1207%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1212%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1211%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-1208%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1209%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-1210%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1214%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1213%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A9--%3E%3Cg%20model-id%3D%2258fa73be-cff8-414d-9185-dbc34104f7aa%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_39%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(1168%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-1216%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-1217%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22136.8125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-34.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-1218%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EProcess%C2%A0E2E%C2%A0Results%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-1219%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-1220%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-1221%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-1222%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-1215%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-1223%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-1224%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-1225%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-1227%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2213%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-1226%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A10--%3E%3Cg%20model-id%3D%221dbccfda-2dae-4781-90fd-d1a167d07684%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_47%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(464%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-7235%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-7236%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22142.828125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-37.4%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-7237%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0updated%C2%A0record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-7238%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-7239%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-7240%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-7241%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-7234%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-7244%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-7245%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-7246%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-7251%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-7250%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-7247%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-7248%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-7249%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-7253%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-7252%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A11--%3E%3Cg%20model-id%3D%221b41466e-fe9f-47f2-903d-759abc46bdaa%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_55%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20magnet%3D%22false%22%20transform%3D%22translate(720%2C-592)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-20048%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-20049%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%22138.328125%22%20height%3D%2217%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-35.2%2C75.8)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-20050%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EAssert%C2%A0deleted%C2%A0record%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-20051%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAFL0lEQVR42u2b4XHbMAxGkQ3SDTRCRnA3SCaoMkGTCepOkHSCuhM0G1TdoCN4hGzQCkfzzueGsQgCFGh%2B7453%2BSGZkPhIgqRyRaBrrhR%2F6%2B%2FaD9MpRW0IAdoHAnQOBOgcCNA5EKBzIEDnQIDOgQCdAwE6pwkBNOvpEbN3CwHaAAJ0DgToHAjQORCgcyBA50CAzoEAnQMBOgcCdE4XAqx1ltCCnBDAEAjgJEgIkAYCGAIBnAQJAdJAAEMggJMgIUAaCGAIBHASJARIAwEMgQBOgoQAaSCAIRDASZAQIA0EMAQCOAkSAqSBAIZAACdBQoA0EMAQCOAkSAiQBgIYAgGcBAkB0kAAQyCAkyAhQBoIYAgEcBIkBEgDAQyBAE6ChABpIIAhEMBJkBAgDQQwBAI4CRICpIEAhkAAJ0FCgDQQwBAI4CRICJAGAhgCAZwECQHSQABDIID3IAEEsMb76AMBjIEACkCAfCCAEyCAAhAgHwjgBAigAATIBwI4AQIoAAHygQBOgAAKQIB8IIATIIACECAfCOAECKAABMgHAjgBAigAAfKBAE6AAApAgHwggBMggAIQIB8I4AQIoAAEyAcCOGENAXZzuVeIDwIYx27B81weleKDAMaxa8O9fqcYHwQwjl2LVwqN%2F6IcHwQwjl0DbvyPc%2FljEB8EMI69FG50bvxXo%2FiaEGA%2FlzuS9wBrrATYUUj2pI2%2FncuXM9c0IQBR%2BTBoiYUAXyk0oJTvcxkXXNeMABFJFmyNpgAs%2BmPBM17P5edcNguvb04Ahl%2FQs2LdNWN%2Fjz2VTXXc%2BL%2FmcpNxT5MCMDtavhNmjYYAE4XGl8733Ojc%2BNcZ93BdH0qC1hRgpDBv5TBR2UvTolSA3J29U24pvLucxtdYXagvz8a5PAkehCXYK8eSg1SAks2dyEj5HUel8RmL9bl0KFtzhSARgGO9L4x5aaZ%2FzI4Up06rDZqbw8PlJDNE660QJPlLyfo%2BN9OPlE41%2F2G5QyfJaJnS9bOEpQJoDPmuOkeNLVrJMPdyeOBayeESAaZDTPuCejYUen7u9Hh3qF%2BdWnv0Wzq%2FpXlKzeTwnAAao9JI%2Bcnenoy30Gse0khegKn9R6QE4HpLez2RbBRUy%2FTfo%2FYpnWSFwFjvHJ4KULqdG5HmQTsqSzIXs8Yx7UBhHvT0UqIA%2FNvfKMhWWo9U9qpJ8Frn9NJlkFVewEP0b9LLskeSTXcao04Wa3%2BoIZkbNZZiVrDYT8JnWmUjbG0BmJHyewuzxn7Be0jX91WSvRQeBGCk8%2BVEPg6TRso%2FA2F2VCnZS%2BFFAGYgWXJYa6n4FtIhn3HxTYQnAZiSF1p7SpAO%2Ba5yGG8CRB4oiJBLrd3DkvhKTxBV8SoAs6H8fXOGexiPBhbD60Ch128E99Y%2B31iEZwGYgWR5ATORzjZuhHs9n2fkCsm4mO%2FfwrsAEcl%2BARN39rYFdQ8k7%2FVrJqiLaEUAZiTZUovhOZd74ZRxD9cTe72EVdf3S2lJAEaaeUcmWjYtjCSXjVH%2FcseK1gRgSpaKkYnC1HC8FBsOv%2Fnp8LcEV0u8JbQoQGSksl4amSg0%2BKDwO5pJZxVaFoApnRK08HYusZjWBYhsSZ6slbAn3%2F%2F1fJZLEYDZUBgNhkr1caLHPd91ln%2BOSxKA4XyAR4IHwzr2FOb6ae2H1eDSBIhsyGY0uIhef8ylChDZzuUzla8UJBtJTXDpAjADheXireDeVb7Tq0kPAkQ2FPKDzYJrNb8Odk1PAkR4z4CnBR4RTqcGHup%2FUOjxF93wkX8pFNGQT2soYQAAAABJRU5ErkJggg%3D%3D%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-20052%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-20053%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-20054%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-20047%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-20057%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-20058%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-20059%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-20064%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-24.1%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-20063%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-20060%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-20061%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-20062%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-20066%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.999999046325684%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C5.8)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-20065%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A12--%3E%3C%2Fg%3E%3Cg%20class%3D%22joint-labels-layer%20joint-viewport%22%2F%3E%3Cg%20class%3D%22joint-front-layer%22%2F%3E%3Cg%20class%3D%22joint-tools-layer%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E", - "wizard": { - "fields": [ - { - "type": "inspectorFieldset", - "label": "New field", - "tooltip": "", - "source": "13012bb6-facb-4194-bccf-812f67edad95.config.transform.in.1f0396b0-22cc-405b-a032-e34bcc2e9eeb.out", - "attrs": {} - } - ] - } -} From 02d478a2376cf46bcaceb1f7836951bf5932493a Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Thu, 23 Nov 2023 16:57:13 +0100 Subject: [PATCH 04/58] jQuery removal --- packages/joint-core/src/dia/CellView.mjs | 2 +- packages/joint-core/src/dia/LinkView.mjs | 9 +- packages/joint-core/src/dia/Paper.mjs | 8 +- .../joint-core/src/dia/attributes/index.mjs | 2 +- .../joint-core/src/linkTools/HoverConnect.mjs | 2 +- packages/joint-core/src/mvc/Dom.mjs | 5426 +++++++++++++++++ packages/joint-core/src/mvc/View.mjs | 208 +- packages/joint-core/src/mvc/ViewBase.mjs | 12 +- packages/joint-core/src/mvc/index.mjs | 1 + packages/joint-core/src/util/util.mjs | 2 +- packages/joint-core/test/jointjs/core/util.js | 8 +- packages/joint-core/test/jointjs/index.html | 3 +- .../joint-core/test/jointjs/mvc.viewBase.js | 164 +- packages/joint-core/test/jointjs/paper.js | 3 +- packages/joint-core/test/utils.js | 6 +- 15 files changed, 5749 insertions(+), 107 deletions(-) create mode 100644 packages/joint-core/src/mvc/Dom.mjs diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index c6da18946..97a062d0c 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -19,7 +19,7 @@ import { } from '../util/index.mjs'; import { Point, Rect } from '../g/index.mjs'; import V from '../V/index.mjs'; -import $ from 'jquery'; +import $ from '../mvc/Dom.mjs'; import { HighlighterView } from './HighlighterView.mjs'; const HighlightingTypes = { diff --git a/packages/joint-core/src/dia/LinkView.mjs b/packages/joint-core/src/dia/LinkView.mjs index aad57cc15..e41412f18 100644 --- a/packages/joint-core/src/dia/LinkView.mjs +++ b/packages/joint-core/src/dia/LinkView.mjs @@ -1,11 +1,12 @@ import { CellView } from './CellView.mjs'; import { Link } from './Link.mjs'; import V from '../V/index.mjs'; -import { addClassNamePrefix, removeClassNamePrefix, merge, template, assign, toArray, isObject, isFunction, clone, isPercentage, result, isEqual } from '../util/index.mjs'; +import { addClassNamePrefix, removeClassNamePrefix, merge, template, assign, toArray, isObject, isFunction, clone, isPercentage, result, isEqual, camelCase } from '../util/index.mjs'; import { Point, Line, Path, normalizeAngle, Rect, Polyline } from '../g/index.mjs'; import * as routers from '../routers/index.mjs'; import * as connectors from '../connectors/index.mjs'; -import $ from 'jquery'; +import $ from '../mvc/Dom.mjs'; + const Flags = { TOOLS: CellView.Flags.TOOLS, @@ -285,7 +286,7 @@ export const LinkView = CellView.extend({ if (className) { // Strip the joint class name prefix, if there is one. className = removeClassNamePrefix(className); - cache[$.camelCase(className)] = child; + cache[camelCase(className)] = child; } } // partial rendering @@ -1133,7 +1134,7 @@ export const LinkView = CellView.extend({ if (!this._V.markerArrowheads) return this; // getting bbox of an element with `display="none"` in IE9 ends up with access violation - if ($.css(this._V.markerArrowheads.node, 'display') === 'none') return this; + // if ($.css(this._V.markerArrowheads.node, 'display') === 'none') return this; var sx = this.getConnectionLength() < this.options.shortLinkLength ? .5 : 1; this._V.sourceArrowhead.scale(sx); diff --git a/packages/joint-core/src/dia/Paper.mjs b/packages/joint-core/src/dia/Paper.mjs index 90c202b50..45deb759f 100644 --- a/packages/joint-core/src/dia/Paper.mjs +++ b/packages/joint-core/src/dia/Paper.mjs @@ -46,7 +46,7 @@ import * as linkAnchors from '../linkAnchors/index.mjs'; import * as connectionPoints from '../connectionPoints/index.mjs'; import * as anchors from '../anchors/index.mjs'; -import $ from 'jquery'; +import $ from '../mvc/Dom.mjs'; const sortingTypes = { NONE: 'sorting-none', @@ -1283,8 +1283,8 @@ export const Paper = View.extend({ const { options } = this; let w = options.width; let h = options.height; - if (isNumber(w)) w = Math.round(w); - if (isNumber(h)) h = Math.round(h); + if (isNumber(w)) w = `${Math.round(w)}px`; + if (isNumber(h)) h = `${Math.round(h)}px`; this.$el.css({ width: (w === null) ? '' : w, height: (h === null) ? '' : h @@ -1671,6 +1671,8 @@ export const Paper = View.extend({ sortViewsExact: function() { + // TODO: remove + // Run insertion sort algorithm in order to efficiently sort DOM elements according to their // associated model `z` attribute. diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index e94664be8..695c136f9 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -2,7 +2,7 @@ import { Point, Path, Polyline } from '../../g/index.mjs'; import { assign, isPlainObject, isObject, isPercentage, breakText } from '../../util/util.mjs'; import { isCalcAttribute, evalCalcAttribute } from './calc.mjs'; import props from './props.mjs'; -import $ from 'jquery'; +import $ from '../../mvc/Dom.mjs'; import V from '../../V/index.mjs'; function setWrapper(attrName, dimension) { diff --git a/packages/joint-core/src/linkTools/HoverConnect.mjs b/packages/joint-core/src/linkTools/HoverConnect.mjs index bb39544c0..edf02b8d0 100644 --- a/packages/joint-core/src/linkTools/HoverConnect.mjs +++ b/packages/joint-core/src/linkTools/HoverConnect.mjs @@ -1,6 +1,6 @@ import { Connect } from '../linkTools/Connect.mjs'; import V from '../V/index.mjs'; -import $ from 'jquery'; +import $ from '../mvc/Dom.mjs'; import * as util from '../util/index.mjs'; import * as g from '../g/index.mjs'; diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs new file mode 100644 index 000000000..97866fe1d --- /dev/null +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -0,0 +1,5426 @@ +/*! + * jQuery JavaScript Library v4.0.0-pre+c98597ea.dirty + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-11-23T13:32Z + */ + +'use strict'; + +if ( !window.document ) { + throw new Error( 'jQuery requires a window with a document' ); +} + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +// Support: IE 11+ +// IE doesn't have Array#flat; provide a fallback. +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + +var push = arr.push; + +var indexOf = arr.indexOf; + +// [[Class]] -> type pairs +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +// All support tests are defined in their respective modules. +var support = {}; + +function toType( obj ) { + if ( obj == null ) { + return obj + ''; + } + + return typeof obj === 'object' ? + class2type[ toString.call( obj ) ] || 'object' : + typeof obj; +} + +function isWindow( obj ) { + return obj != null && obj === obj.window; +} + +function isArrayLike( obj ) { + + var length = !!obj && obj.length, + type = toType( obj ); + + if ( typeof obj === 'function' || isWindow( obj ) ) { + return false; + } + + return type === 'array' || length === 0 || + typeof length === 'number' && length > 0 && ( length - 1 ) in obj; +} + +var document = window.document; + +var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true +}; + +function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, + script = doc.createElement( 'script' ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + if ( node[ i ] ) { + script[ i ] = node[ i ]; + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); +} + +var version = '4.0.0-pre+c98597ea.dirty', + + rhtmlSuffix = /HTML$/i, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // CUSTOM DOM + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + } +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === 'boolean' ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== 'object' && typeof target !== 'function' ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === '__proto__' || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: 'jQuery' + ( version + Math.random() ).replace( /\D/g, '' ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== '[object Object]' ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, 'constructor' ) && proto.constructor; + return typeof Ctor === 'function' && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = '', + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === 'string' ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || 'HTML' ); + }, + + // Note: an element does not contain itself + contains: function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === 'function' ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( ' ' ), + function( _i, name ) { + class2type[ '[object ' + name + ']' ] = name.toLowerCase(); + } ); + +var documentElement = document.documentElement; + +// Only count HTML whitespace +// Other whitespace should count in values +// https://infra.spec.whatwg.org/#ascii-whitespace +var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; + +var rcheckableType = /^(?:checkbox|radio)$/i; + +var isIE = document.documentMode; + +/** + * Determines whether an object can have data + */ +function acceptData( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +} + +// Matches dashed string for camelizing +var rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase +function camelCase( string ) { + return string.replace( rdashAlpha, fcamelCase ); +} + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = Object.create( null ); + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see trac-8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === 'string' ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === 'string' ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45+ + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; + +var dataPriv = new Data(); + +function nodeName( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); +} + +// rsingleTag matches a string consisting of a single HTML element with no attributes +// and captures the element's name +var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; + +function isObviousHtml( input ) { + return input[ 0 ] === '<' && + input[ input.length - 1 ] === '>' && + input.length >= 3; +} + +var pop = arr.pop; + +// https://www.w3.org/TR/css3-selectors/#whitespace +var whitespace = '[\\x20\\t\\r\\n\\f]'; + +// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only +// Make sure the `:has()` argument is parsed unforgivingly. +// We include `*` in the test to detect buggy implementations that are +// _selectively_ forgiving (specifically when the list includes at least +// one valid selector). +// Note that we treat complete lack of support for `:has()` as if it were +// spec-compliant support, which is fine because use of `:has()` in such +// environments will fail in the qSA path and fall back to jQuery traversal +// anyway. +try { + document.querySelector( ':has(*,:jqfake)' ); + support.cssHas = false; +} catch ( e ) { + support.cssHas = true; +} + +// Build QSA regex. +// Regex strategy adopted from Diego Perini. +var rbuggyQSA = []; + +if ( isIE ) { + rbuggyQSA.push( + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + ':enabled', + ':disabled', + + // Support: IE 11+ + // IE 11 doesn't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + '\\[' + whitespace + '*name' + whitespace + '*=' + + whitespace + '*(?:\'\'|"")' + ); +} + +if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ':has' ); +} + +rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( '|' ) ); + +var rtrimCSS = new RegExp( + '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', + 'g' +); + +// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram +var identifier = '(?:\\\\[\\da-fA-F]{1,6}' + whitespace + + '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; + +var booleans = 'checked|selected|async|autofocus|autoplay|controls|' + + 'defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped'; + +var rleadingCombinator = new RegExp( '^' + whitespace + '*([>+~]|' + + whitespace + ')' + whitespace + '*' ); + +var rdescend = new RegExp( whitespace + '|>' ); + +var rsibling = /[+~]/; + +// Support: IE 9 - 11+ +// IE requires a prefix. +var matches = documentElement.matches || documentElement.msMatchesSelector; + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + ' ' ) > jQuery.expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + ' ' ] = value ); + } + return cache; +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== 'undefined' && context; +} + +// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors +var attributes = '\\[' + whitespace + '*(' + identifier + ')(?:' + whitespace + + + // Operator (capture 2) + '*([*^$|!~]?=)' + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + identifier + '))|)' + + whitespace + '*\\]'; + +var pseudos = ':(' + identifier + ')(?:\\((' + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + '(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' + + + // 2. simple (capture 6) + '((?:\\\\.|[^\\\\()[\\]]|' + attributes + ')*)|' + + + // 3. anything else (capture 2) + '.*' + + ')\\)|)'; + +var filterMatchExpr = { + ID: new RegExp( '^#(' + identifier + ')' ), + CLASS: new RegExp( '^\\.(' + identifier + ')' ), + TAG: new RegExp( '^(' + identifier + '|[*])' ), + ATTR: new RegExp( '^' + attributes ), + PSEUDO: new RegExp( '^' + pseudos ), + CHILD: new RegExp( + '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + + whitespace + '*(even|odd|(([+-]|)(\\d*)n|)' + whitespace + '*(?:([+-]|)' + + whitespace + '*(\\d+)|))' + whitespace + '*\\)|)', 'i' ) +}; + +var rpseudo = new RegExp( pseudos ); + +// CSS escapes + +var runescape = new RegExp( '\\\\[\\da-fA-F]{1,6}' + whitespace + + '?|\\\\([^\\r\\n\\f])', 'g' ), + funescape = function( escape, nonHex ) { + var high = '0x' + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }; + +function unescapeSelector( sel ) { + return sel.replace( runescape, funescape ); +} + +function selectorError( msg ) { + jQuery.error( 'Syntax error, unrecognized expression: ' + msg ); +} + +var rcomma = new RegExp( '^' + whitespace + '*,' + whitespace + '*' ); + +var tokenCache = createCache(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + ' ' ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = jQuery.expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, ' ' ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in filterMatchExpr ) { + if ( ( match = jQuery.expr.match[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + selectorError( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +var preFilter = { + ATTR: function( match ) { + match[ 1 ] = unescapeSelector( match[ 1 ] ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = unescapeSelector( match[ 3 ] || match[ 4 ] || match[ 5 ] || '' ); + + if ( match[ 2 ] === '~=' ) { + match[ 3 ] = ' ' + match[ 3 ] + ' '; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from filterMatchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === 'nth' ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + selectorError( match[ 0 ] ); + } + + // numeric x and y parameters for jQuery.expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === 'even' || match[ 3 ] === 'odd' ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === 'odd' ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + selectorError( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( filterMatchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ''; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ')', unquoted.length - excess ) - + unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ''; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === '\0' ) { + return '\uFFFD'; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + '\\' + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + ' '; + } + + // Other potentially-special ASCII characters get backslash-escaped + return '\\' + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + '' ).replace( rcssescape, fcssescape ); +}; + +var sort = arr.sort; + +var splice = arr.splice; + +var hasDuplicate; + +// Document order sorting +function sortOrder( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 ) { + + // Choose the first element that is related to the document + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == document && + jQuery.contains( document, a ) ) { + return -1; + } + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == document && + jQuery.contains( document, b ) ) { + return 1; + } + + // Maintain original order + return 0; + } + + return compare & 4 ? -1 : 1; +} + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + hasDuplicate = false; + + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +var i, + outermostContext, + + // Local document vars + document$1, + documentElement$1, + documentIsHTML, + + // Instance-specific data + dirruns = 0, + done = 0, + classCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + + // Regular expressions + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + '+', 'g' ), + + ridentifier = new RegExp( '^' + identifier + '$' ), + + matchExpr = jQuery.extend( { + bool: new RegExp( '^(?:' + booleans + ')$', 'i' ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( '^' + whitespace + + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + whitespace + + '*((?:-\\d)?\\d*)' + whitespace + '*\\)|)(?=[^-]|$)', 'i' ) + }, filterMatchExpr ), + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, 'fieldset' ); + }, + { dir: 'parentNode', next: 'legend' } + ); + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== 'string' || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document$1; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + push.call( results, elem ); + } + return results; + + // Element context + } else { + if ( newContext && ( elem = newContext.getElementById( m ) ) && + jQuery.contains( context, elem ) ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + ' ' ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && + testContext( context.parentNode ) || + context; + + // Outside of IE, if we're not changing the context we can + // use :scope instead of an ID. + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || isIE ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( 'id' ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( 'id', ( nid = jQuery.expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? '#' + nid : ':scope' ) + ' ' + + toSelector( groups[ i ] ); + } + newSelector = groups.join( ',' ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === jQuery.expando ) { + context.removeAttribute( 'id' ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, '$1' ), context, results, seed ); +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ jQuery.expando ] = true; + return fn; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, 'input' ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, 'input' ) || nodeName( elem, 'button' ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( 'form' in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( 'label' in elem ) { + if ( 'label' in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( 'label' in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : document; + + // Return early if doc is invalid or already selected + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document$1 || doc.nodeType !== 9 ) { + return; + } + + // Update global variables + document$1 = doc; + documentElement$1 = document$1.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document$1 ); + + // Support: IE 9 - 11+ + // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( isIE && document != document$1 && + ( subWindow = document$1.defaultView ) && subWindow.top !== subWindow ) { + subWindow.addEventListener( 'unload', unloadHandler ); + } +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + ' ' ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + return matches.call( elem, expr ); + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document$1, null, [ elem ] ).length > 0; +}; + +jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + find: { + ID: function( id, context ) { + if ( typeof context.getElementById !== 'undefined' && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }, + + TAG: function( tag, context ) { + if ( typeof context.getElementsByTagName !== 'undefined' ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }, + + CLASS: function( className, context ) { + if ( typeof context.getElementsByClassName !== 'undefined' && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + } + }, + + relative: { + '>': { dir: 'parentNode', first: true }, + ' ': { dir: 'parentNode' }, + '+': { dir: 'previousSibling', first: true }, + '~': { dir: 'previousSibling' } + }, + + preFilter: preFilter, + + filter: { + ID: function( id ) { + var attrId = unescapeSelector( id ); + return function( elem ) { + return elem.getAttribute( 'id' ) === attrId; + }; + }, + + TAG: function( nodeNameSelector ) { + var expectedNodeName = unescapeSelector( nodeNameSelector ).toLowerCase(); + return nodeNameSelector === '*' ? + + function() { + return true; + } : + + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + ' ' ]; + + return pattern || + ( pattern = new RegExp( '(^|' + whitespace + ')' + className + + '(' + whitespace + '|$)' ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === 'string' && elem.className || + typeof elem.getAttribute !== 'undefined' && + elem.getAttribute( 'class' ) || + '' + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = jQuery.attr( elem, name ); + + if ( result == null ) { + return operator === '!='; + } + if ( !operator ) { + return true; + } + + result += ''; + + if ( operator === '=' ) { + return result === check; + } + if ( operator === '!=' ) { + return result !== check; + } + if ( operator === '^=' ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === '*=' ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === '$=' ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === '~=' ) { + return ( ' ' + result.replace( rwhitespace, ' ' ) + ' ' ) + .indexOf( check ) > -1; + } + if ( operator === '|=' ) { + return result === check || result.slice( 0, check.length + 1 ) === check + '-'; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== 'nth', + forward = type.slice( -4 ) !== 'last', + ofType = what === 'of-type'; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? 'nextSibling' : 'previousSibling', + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === 'only' && !start && 'nextSibling'; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ jQuery.expando ] || + ( parent[ jQuery.expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ jQuery.expando ] || + ( elem[ jQuery.expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ jQuery.expando ] || + ( node[ jQuery.expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var fn = jQuery.expr.pseudos[ pseudo ] || + jQuery.expr.setFilters[ pseudo.toLowerCase() ] || + selectorError( 'unsupported pseudo: ' + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ jQuery.expando ] ) { + return fn( argument ); + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, '$1' ) ); + + return matcher[ jQuery.expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = unescapeSelector( text ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || '' ) ) { + selectorError( 'unsupported lang: ' + lang ); + } + lang = unescapeSelector( lang ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( 'xml:lang' ) || elem.getAttribute( 'lang' ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + '-' ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement$1; + }, + + focus: function( elem ) { + return elem === document$1.activeElement && + document$1.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, 'input' ) && !!elem.checked ) || + ( nodeName( elem, 'option' ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( isIE && elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !jQuery.expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, 'input' ) && elem.type === 'button' || + nodeName( elem, 'button' ); + }, + + text: function( elem ) { + return nodeName( elem, 'input' ) && elem.type === 'text'; + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +jQuery.expr.pseudos.nth = jQuery.expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + jQuery.expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + jQuery.expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = jQuery.expr.filters = jQuery.expr.pseudos; +jQuery.expr.setFilters = new setFilters(); + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === 'parentNode', + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ jQuery.expando ] || ( elem[ jQuery.expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ jQuery.expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ jQuery.expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || '*', + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = jQuery.expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || jQuery.expr.relative[ ' ' ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = jQuery.expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = jQuery.expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ jQuery.expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( jQuery.expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === ' ' ? '*' : '' } ) + ).replace( rtrimCSS, '$1' ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = '0', + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && jQuery.expr.find.TAG( '*', outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ); + + if ( outermost ) { + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document$1 || context || outermost; + } + + // Add elements passing elementMatchers directly to results + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document$1 ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document$1, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + ' ' ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ jQuery.expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === 'function' && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === 'ID' && + context.nodeType === 9 && documentIsHTML && + jQuery.expr.relative[ tokens[ 1 ].type ] ) { + + context = ( jQuery.expr.find.ID( + unescapeSelector( token.matches[ 0 ] ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( jQuery.expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = jQuery.expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + unescapeSelector( token.matches[ 0 ] ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// Initialize against the default document +setDocument(); + +jQuery.find = find; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +var rneedsContext = jQuery.expr.match.needsContext; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( typeof qualifier === 'function' ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== 'string' ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ':not(' + expr + ')'; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== 'string' ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === 'string' && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + +// Initialize a jQuery object + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr$1 = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // HANDLE: $(DOMElement) + if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( typeof selector === 'function' ) { + return rootjQuery.ready !== undefined ? + rootjQuery.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + + } else { + + // Handle obvious HTML strings + match = selector + ''; + if ( isObviousHtml( match ) ) { + + // Assume that strings that start and end with <> are HTML and skip + // the regex check. This also handles browser-supported HTML wrappers + // like TrustedHTML. + match = [ null, selector, null ]; + + // Handle HTML strings or selectors + } else if ( typeof selector === 'string' ) { + match = rquickExpr$1.exec( selector ); + } else { + return jQuery.makeArray( selector, this ); + } + + // Match html or make sure no context is specified for #id + // Note: match[1] may be a string or a TrustedHTML wrapper + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( typeof this[ match ] === 'function' ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr) & $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + } + + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === 'object' ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== 'string' ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === 'string' ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== 'undefined' && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || '' ).match( rnothtmlwhite ) || [ '' ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || '' ).split( '.' ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( '.' ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || '' ).match( rnothtmlwhite ) || [ '' ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || '' ).split( '.' ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( '(^|\\.)' + namespaces.join( '\\.(?:.*\\.|)' ) + '(\\.|$)' ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === '**' && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, 'handle events' ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, 'events' ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: Firefox <=42 - 66+ + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11+ + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === 'click' && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( cur.nodeType === 1 && !( event.type === 'click' && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + ' '; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: typeof hook === 'function' ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: jQuery.extend( Object.create( null ), { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, 'input' ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, 'click', true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, 'input' ) ) { + + leverageNative( el, 'click' ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, 'input' ) && + dataPriv.get( target, 'click' ) || + nodeName( target, 'a' ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Chrome <=73+ + // Chrome doesn't alert on `event.preventDefault()` + // as the standard mandates. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } ) +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented ? + returnTrue : + returnFalse; + + // Create target properties + this.target = src.target; + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + 'char': true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: 'focusin', blur: 'focusout' }, function( type, delegateType ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants focus/blur. + // This is because the former are synchronous in IE while the latter are async. In other + // browsers, all those handlers are invoked synchronously. + function focusMappedHandler( nativeEvent ) { + + // `eventHandle` would already wrap the event, but we need to change the `type` here. + var event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === 'focusin' ? 'focus' : 'blur'; + event.isSimulated = true; + + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + dataPriv.get( this, 'handle' )( event ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( isIE ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + if ( isIE ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +jQuery.each( { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + pointerenter: 'pointerover', + pointerleave: 'pointerout' +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + '.' + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === 'object' ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === 'function' ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + +var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }, + composed = { composed: true }; + +// Support: IE 9 - 11+ +// Check attachment across shadow DOM boundaries when possible (gh-3504). +// Provide a fallback for browsers without Shadow DOM v1 support. +if ( !documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }; +} + +// rtagName captures the name from the first start tag in a string of HTML +// https://html.spec.whatwg.org/multipage/syntax.html#tag-open-state +// https://html.spec.whatwg.org/multipage/syntax.html#tag-name-state +var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; + +var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; + +var wrapMap = { + + // Table parts need to be wrapped with `` or they're + // stripped to their contents when put in a div. + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do, so we cannot shorten + // this by omitting or other required elements. + thead: [ 'table' ], + col: [ 'colgroup', 'table' ], + tr: [ 'tbody', 'table' ], + td: [ 'tr', 'tbody', 'table' ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +function getAll( context, tag ) { + + // Support: IE <=9 - 11+ + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) + var ret; + + if ( typeof context.getElementsByTagName !== 'undefined' ) { + ret = context.getElementsByTagName( tag || '*' ); + + } else if ( typeof context.querySelectorAll !== 'undefined' ) { + ret = context.querySelectorAll( tag || '*' ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + 'globalEval', + !refElements || dataPriv.get( refElements[ i ], 'globalEval' ) + ); + } +} + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === 'object' && ( elem.nodeType || isArrayLike( elem ) ) ) { + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( 'div' ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ '', '' ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || arr; + + // Create wrappers & descend into them. + j = wrap.length; + while ( --j > -1 ) { + tmp = tmp.appendChild( context.createElement( wrap[ j ] ) ); + } + + tmp.innerHTML = jQuery.htmlPrefilter( elem ); + + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (trac-12392) + tmp.textContent = ''; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ''; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), 'script' ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || '' ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + +// Argument "data" should be string of html or a TrustedHTML wrapper of obvious HTML +// context (optional): If specified, the fragment will be created in this context, +// defaults to document +// keepScripts (optional): If true, will include scripts passed in the html string +jQuery.parseHTML = function( data, context, keepScripts ) { + if ( typeof data !== 'string' && !isObviousHtml( data + '' ) ) { + return []; + } + if ( typeof context === 'boolean' ) { + keepScripts = context; + context = false; + } + + var base, parsed, scripts; + + if ( !context ) { + + // Stop scripts or inline event handlers from being executed immediately + // by using document.implementation + context = document.implementation.createHTMLDocument( '' ); + + // Set the base href for the created document + // so any parsed elements with URLs + // are based on the document's URL (gh-2965) + base = context.createElement( 'base' ); + base.href = document.location.href; + context.head.appendChild( base ); + } + + parsed = rsingleTag.exec( data ); + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[ 1 ] ) ]; + } + + parsed = buildFragment( [ data ], context, scripts ); + + if ( scripts && scripts.length ) { + jQuery( scripts ).remove(); + } + + return jQuery.merge( [], parsed.childNodes ); +}; + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +function access( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === 'object' ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( typeof value !== 'function' ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +} + +var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; + +var rcssNum = new RegExp( '^(?:([+-])=|)(' + pnum + ')([a-z%]*)$', 'i' ); + +var rnumnonpx = new RegExp( '^(' + pnum + ')(?!px)[a-z%]+$', 'i' ); + +var rcustomProp = /^--/; + +var cssExpand = [ 'Top', 'Right', 'Bottom', 'Left' ]; + +var ralphaStart = /^[a-z]/, + + // The regex visualized: + // + // /----------\ + // | | /-------\ + // | / Top \ | | | + // /--- Border ---+-| Right |-+---+- Width -+---\ + // | | Bottom | | + // | \ Left / | + // | | + // | /----------\ | + // | /-------------\ | | |- END + // | | | | / Top \ | | + // | | / Margin \ | | | Right | | | + // |---------+-| |-+---+-| Bottom |-+----| + // | \ Padding / \ Left / | + // BEGIN -| | + // | /---------\ | + // | | | | + // | | / Min \ | / Width \ | + // \--------------+-| |-+---| |---/ + // \ Max / \ Height / + rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; + +function isAutoPx( prop ) { + + // The first test is used to ensure that: + // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex). + // 2. The prop is not empty. + return ralphaStart.test( prop ) && + rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) ); +} + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/; + +// Convert dashed to camelCase, handle vendor prefixes. +// Used by the css & effects modules. +// Support: IE <=9 - 11+ +// Microsoft forgot to hump their vendor prefix (trac-9572) +function cssCamelCase( string ) { + return camelCase( string.replace( rmsPrefix, 'ms-' ) ); +} + +function getStyles( elem ) { + + // Support: IE <=11+ (trac-14150) + // In IE popup's `window` is the opener window which makes `window.getComputedStyle( elem )` + // break. Using `elem.ownerDocument.defaultView` avoids the issue. + var view = elem.ownerDocument.defaultView; + + // `document.implementation.createHTMLDocument( "" )` has a `null` `defaultView` + // property; check `defaultView` truthiness to fallback to window in such a case. + if ( !view ) { + view = window; + } + + return view.getComputedStyle( elem ); +} + +// A method for quickly swapping in/out CSS properties to get correct calculations. +function swap( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +} + +function curCSS( elem, name, computed ) { + var ret, + isCustomProp = rcustomProp.test( name ); + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for `.css('--customProperty')` (gh-3144) + if ( computed ) { + + // A fallback to direct property access is needed as `computed`, being + // the output of `getComputedStyle`, contains camelCased keys and + // `getPropertyValue` requires kebab-case ones. + // + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, '$1' ) || undefined; + } + + if ( ret === '' && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11+ + // IE returns zIndex value as an integer. + ret + '' : + ret; +} + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, '' ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( isAutoPx( prop ) ? 'px' : '' ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( !isAutoPx( prop ) || unit !== 'px' && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 - 66+ + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + +var cssPrefixes = [ 'Webkit', 'Moz', 'ms' ], + emptyStyle = document.createElement( 'div' ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped vendor prefixed property +function finalPropName( name ) { + var final = vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + +( function() { + + var reliableTrDimensionsVal, + div = document.createElement( 'div' ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE 10 - 11+ + // IE misreports `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + support.reliableTrDimensions = function() { + var table, tr, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( 'table' ); + tr = document.createElement( 'tr' ); + + table.style.cssText = 'position:absolute;left:-11111px;border-collapse:separate'; + tr.style.cssText = 'box-sizing:content-box;border:1px solid'; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = '1px'; + div.style.height = '9px'; + + // Support: Android Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android Chrome, but + // not consistently across all devices. + // Ensuring the div is `display: block` + // gets around this issue. + div.style.display = 'block'; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( div ); + + // Don't run until window is visible + if ( table.offsetWidth === 0 ) { + documentElement.removeChild( table ); + return; + } + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + }; +} )(); + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === 'string' ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ''; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( typeof arg === 'function' ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== 'string' ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ''; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ''; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && typeof( method = value.promise ) === 'function' ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && typeof( method = value.then ) === 'function' ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + reject( value ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ 'notify', 'progress', jQuery.Callbacks( 'memory' ), + jQuery.Callbacks( 'memory' ), 2 ], + [ 'resolve', 'done', jQuery.Callbacks( 'once memory' ), + jQuery.Callbacks( 'once memory' ), 0, 'resolved' ], + [ 'reject', 'fail', jQuery.Callbacks( 'once memory' ), + jQuery.Callbacks( 'once memory' ), 1, 'rejected' ] + ], + state = 'pending', + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + catch: function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = typeof fns[ tuple[ 4 ] ] === 'function' && + fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && typeof returned.promise === 'function' ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + 'With' ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( 'Thenable self-resolution' ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === 'object' || + typeof returned === 'function' ) && + returned.then; + + // Handle a returned thenable + if ( typeof then === 'function' ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.error ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onProgress === 'function' ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onFulfilled === 'function' ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + typeof onRejected === 'function' ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + 'With' ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + 'With' ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === 'pending' || + typeof( resolveValues[ i ] && resolveValues[ i ].then ) === 'function' ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( 'DOMContentLoaded', completed ); + window.removeEventListener( 'load', completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +if ( document.readyState !== 'loading' ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( 'DOMContentLoaded', completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( 'load', completed ); +} + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' }, + cssNormalTransform = { + letterSpacing: '0', + fontWeight: '400' + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || 'px' ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === 'width' ? 1 : 0, + extra = 0, + delta = 0, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? 'border' : 'content' ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === 'margin' ) { + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, 'padding' + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== 'padding' ) { + delta += jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === 'content' ) { + delta -= jQuery.css( elem, 'padding' + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== 'margin' ) { + delta -= jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ 'offset' + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = isIE || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box', + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = 'offset' + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = 'auto'; + } + + + if ( ( + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === 'auto' || + + // Support: IE 9 - 11+ + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + ( isIE && isBorderBox ) || + + // Support: IE 10 - 11+ + // IE misreports `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Support: Firefox 70+ + // Firefox includes border widths + // in computed dimensions for table rows. (gh-4529) + ( !support.reliableTrDimensions() && nodeName( elem, 'tr' ) ) ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box'; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? 'border' : 'content' ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + 'px'; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = cssCamelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (trac-7345) + if ( type === 'string' && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = 'number'; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If the value is a number, add `px` for certain CSS properties + if ( type === 'number' ) { + value += ret && ret[ 3 ] || ( isAutoPx( origName ) ? 'px' : '' ); + } + + // Support: IE <=9 - 11+ + // background-* props of a cloned element affect the source element (trac-8908) + if ( isIE && value === '' && name.indexOf( 'background' ) === 0 ) { + style[ name ] = 'inherit'; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( 'set' in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && 'get' in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = cssCamelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && 'get' in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === 'normal' && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === '' || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ 'height', 'width' ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, 'display' ) ) && + + // Support: Safari <=8 - 12+, Chrome <=73+ + // Table columns in WebKit/Blink have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11+ + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + isBorderBox = extra && + jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box', + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || 'px' ) !== 'px' ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: '', + padding: '', + border: 'Width' +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === 'string' ? value.split( ' ' ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== 'margin' ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + +jQuery.offset = { + setOffset: function( elem, options, i ) { + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, + position = jQuery.css( elem, 'position' ), + curElem = jQuery( elem ), + props = {}; + + // Set position first, in-case top/left are set even on static elem + if ( position === 'static' ) { + elem.style.position = 'relative'; + } + + curOffset = curElem.offset(); + curCSSTop = jQuery.css( elem, 'top' ); + curCSSLeft = jQuery.css( elem, 'left' ); + calculatePosition = ( position === 'absolute' || position === 'fixed' ) && + ( curCSSTop + curCSSLeft ).indexOf( 'auto' ) > -1; + + // Need to be able to calculate position if either + // top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( typeof options === 'function' ) { + + // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) + options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( 'using' in options ) { + options.using.call( elem, props ); + + } else { + curElem.css( props ); + } + } +}; + +jQuery.fn.extend( { + + // offset() relates an element's border box to the document origin + offset: function( options ) { + + // Preserve chaining for setter + if ( arguments.length ) { + return options === undefined ? + this : + this.each( function( i ) { + jQuery.offset.setOffset( this, options, i ); + } ); + } + + var rect, win, + elem = this[ 0 ]; + + if ( !elem ) { + return; + } + + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) + // Support: IE <=11+ + // Running getBoundingClientRect on a + // disconnected node in IE throws an error + if ( !elem.getClientRects().length ) { + return { top: 0, left: 0 }; + } + + // Get document-relative position by adding viewport scroll to viewport-relative gBCR + rect = elem.getBoundingClientRect(); + win = elem.ownerDocument.defaultView; + return { + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset + }; + }, + + // position() relates an element's margin box to its offset parent's padding box + // This corresponds to the behavior of CSS absolute positioning + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, doc, + elem = this[ 0 ], + parentOffset = { top: 0, left: 0 }; + + // position:fixed elements are offset from the viewport, which itself always has zero offset + if ( jQuery.css( elem, 'position' ) === 'fixed' ) { + + // Assume position:fixed implies availability of getBoundingClientRect + offset = elem.getBoundingClientRect(); + + } else { + offset = this.offset(); + + // Account for the *real* offset parent, which can be the document or its root element + // when a statically positioned element is identified + doc = elem.ownerDocument; + offsetParent = elem.offsetParent || doc.documentElement; + while ( offsetParent && + ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + jQuery.css( offsetParent, 'position' ) === 'static' ) { + + offsetParent = offsetParent.parentNode; + } + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { + + // Incorporate borders into its offset, since they are outside its content origin + parentOffset = jQuery( offsetParent ).offset(); + parentOffset.top += jQuery.css( offsetParent, 'borderTopWidth', true ); + parentOffset.left += jQuery.css( offsetParent, 'borderLeftWidth', true ); + } + } + + // Subtract parent offsets and element margins + return { + top: offset.top - parentOffset.top - jQuery.css( elem, 'marginTop', true ), + left: offset.left - parentOffset.left - jQuery.css( elem, 'marginLeft', true ) + }; + }, + + // This method will return documentElement in the following cases: + // 1) For the element inside the iframe without offsetParent, this method will return + // documentElement of the parent window + // 2) For the hidden or detached element + // 3) For body or html element, i.e. in case of the html node - it will return itself + // + // but those exceptions were never presented as a real life use-cases + // and might be considered as more preferable results. + // + // This logic, however, is not guaranteed and can change at any point in the future + offsetParent: function() { + return this.map( function() { + var offsetParent = this.offsetParent; + + while ( offsetParent && jQuery.css( offsetParent, 'position' ) === 'static' ) { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || documentElement; + } ); + } +} ); + +// Create scrollLeft and scrollTop methods +jQuery.each( { scrollLeft: 'pageXOffset', scrollTop: 'pageYOffset' }, function( method, prop ) { + var top = 'pageYOffset' === prop; + + jQuery.fn[ method ] = function( val ) { + return access( this, function( elem, method, val ) { + + // Coalesce documents and windows + var win; + if ( isWindow( elem ) ) { + win = elem; + } else if ( elem.nodeType === 9 ) { + win = elem.defaultView; + } + + if ( val === undefined ) { + return win ? win[ prop ] : elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : win.pageXOffset, + top ? val : win.pageYOffset + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length ); + }; +} ); + +export { jQuery as default }; diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index b1fef1211..885abe6ce 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -1,4 +1,5 @@ -import $ from 'jquery'; +import $ from './Dom.mjs'; + import * as util from '../util/index.mjs'; import V from '../V/index.mjs'; import { ViewBase } from './ViewBase.mjs'; @@ -344,3 +345,208 @@ if ($.event && !(DoubleTapEventName in $.event.special)) { } }; } + +$.fn.removeClass = function() { + if (!this[0]) return this; + V.prototype.removeClass.apply({ node: this[0] }, arguments); + return this; +}; + +$.fn.addClass = function() { + if (!this[0]) return this; + V.prototype.addClass.apply({ node: this[0] }, arguments); + return this; +}; + +$.fn.hasClass = function() { + if (!this[0]) return false; + return V.prototype.hasClass.apply({ node: this[0] }, arguments); +}; + +$.fn.attr = function(name, value) { + if (!this[0]) return ''; + if (typeof name === 'string' && value === undefined) { + return this[0].getAttribute(name); + } + if (typeof name === 'string') { + this[0].setAttribute(name, value); + return this; + } + Object.keys(name).forEach(key => { + this[0].setAttribute(key, name[key]); + }); + return this; +}; + +$.fn.empty = function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + // jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ''; + } + } + + return this; +}; + +$.fn.append = function(...nodes) { + if (!this[0]) return this; + nodes.forEach(node => { + if (typeof node === 'string') { + node = $.parseHTML(node); + } + this[0].appendChild(node[0] || node); + }); + return this; +}; + +$.fn.appendTo = function(parent) { + if (!this[0]) return this; + $(parent).append(this); + return this; +}; + +$.fn.css = function(styles) { + if (!this[0]) return this; + if (typeof styles === 'string' && arguments.length === 1) { + return this[0].style[styles]; + } + if (typeof styles === 'string' && arguments.length === 2) { + this[0].style[styles] = arguments[1]; + return this; + } + + Object.keys(styles).forEach(key => { + this[0].style[key] = styles[key]; + }); + return this; +}; + +$.fn.remove = function() { + if (!this[0]) return this; + const nodes = [this[0], ...Array.from(this[0].getElementsByTagName('*'))]; + for (let i = 0; i < nodes.length; i++) { + $.event.remove(nodes[i]); + } + this[0].remove(); + return this; +}; + +$.fn.children = function(selector) { + if (!this[0]) return $(); + const el = this[0]; + const children = Array.from(el.children); + if (selector) { + return $(children.filter(child => child.matches(selector))); + } + return $(children); +}; + +$.fn.data = function() { return this; }; + + +$.data = function() { return this; }; + + +$.attr = function(el, name) { + if (!el) return ''; + return el.getAttribute(name); +}; + +$.htmlPrefilter = function(html) { return html; }; + +// From test + +$.fn.has = function(e) { + return this.find(e).length > 0; +}; + +$.fn.trigger = function(name, data) { + if (!this[0]) return this; + if (name === 'click') { + this[0].click(); + } else if (name === 'contextmenu') { + this[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + } else { + + let event; + // Native + if (window.CustomEvent) { + event = new CustomEvent(name, { detail: data }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(name, true, true, data); + } + + this[0].dispatchEvent(event); + } + + return this; +}; + +$.fn.click = function() { this.trigger('click'); }; + + +// Native (optional filter function) +function getPreviousSiblings(elem, filter) { + var sibs = []; + while (elem = elem.previousElementSibling) { + if (!filter || filter(elem)) sibs.push(elem); + } + return sibs; +} + +$.fn.prevAll = function() { + return $(getPreviousSiblings(this[0])); +}; + + +$.fn.index = function() { + return this.prevAll().length; +}; + +$.fn.nextAll = function() { + var sibs = []; + var elem = this[0]; + while (elem = elem.nextElementSibling) { + sibs.push(elem); + } + return $(sibs); +}; + +$.fn.prev = function() { + if (!this[0]) return $(); + return $(this[0].previousElementSibling); +}; + +$.fn.text = function() { + if (!this[0]) return ''; + return this[0].textContent; +}; + +$.fn.prop = function(name) { + if (!this[0]) return ''; + return this[0][name]; +}; + +$.fn.parent = function(i) { + if (!this[0]) return $(); + return $(this[0].parentNode); +}; + +$.fn.width = function() { + if (!this[0]) return 0; + return this[0].getBoundingClientRect().width; +}; + +$.fn.height = function() { + if (!this[0]) return 0; + return this[0].getBoundingClientRect().height; +}; diff --git a/packages/joint-core/src/mvc/ViewBase.mjs b/packages/joint-core/src/mvc/ViewBase.mjs index 2a4024b77..da25e4856 100644 --- a/packages/joint-core/src/mvc/ViewBase.mjs +++ b/packages/joint-core/src/mvc/ViewBase.mjs @@ -1,13 +1,13 @@ -import $ from 'jquery'; +import $ from './Dom.mjs'; import { Events } from './Events.mjs'; import { extend } from './mvcUtils.mjs'; -import { +import { assign, - isFunction, - pick, - result, - uniqueId + isFunction, + pick, + result, + uniqueId } from '../util/util.mjs'; // ViewBase diff --git a/packages/joint-core/src/mvc/index.mjs b/packages/joint-core/src/mvc/index.mjs index 778a84f8c..03729d45d 100644 --- a/packages/joint-core/src/mvc/index.mjs +++ b/packages/joint-core/src/mvc/index.mjs @@ -5,3 +5,4 @@ export * from './Collection.mjs'; export * from './Model.mjs'; export * from './ViewBase.mjs'; export * from './mvcUtils.mjs'; +export { default as $ } from './Dom.mjs'; diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index fe369310a..3af16c312 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -1,4 +1,4 @@ -import $ from 'jquery'; +import $ from '../mvc/Dom.mjs'; import V from '../V/index.mjs'; import { config } from '../config/index.mjs'; import { diff --git a/packages/joint-core/test/jointjs/core/util.js b/packages/joint-core/test/jointjs/core/util.js index 79461bdf1..d1728c856 100644 --- a/packages/joint-core/test/jointjs/core/util.js +++ b/packages/joint-core/test/jointjs/core/util.js @@ -1102,10 +1102,10 @@ QUnit.module('util', function(hooks) { hooks.beforeEach(function() { $htmlElement = $('
').css({ position: 'absolute', - top: 10, - left: 20, - width: 50, - height: 60 + top: '10px', + left: '20px', + width: '50px', + height: '60px' }); $htmlElement.appendTo(document.body); diff --git a/packages/joint-core/test/jointjs/index.html b/packages/joint-core/test/jointjs/index.html index 7d9bd48a5..da564d31f 100644 --- a/packages/joint-core/test/jointjs/index.html +++ b/packages/joint-core/test/jointjs/index.html @@ -1,6 +1,7 @@ + JointJS test suite @@ -10,7 +11,7 @@
- + diff --git a/packages/joint-core/test/jointjs/mvc.viewBase.js b/packages/joint-core/test/jointjs/mvc.viewBase.js index 9c2e5b2cb..5923c15b2 100644 --- a/packages/joint-core/test/jointjs/mvc.viewBase.js +++ b/packages/joint-core/test/jointjs/mvc.viewBase.js @@ -3,28 +3,28 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { var view; - + QUnit.module('mvc.ViewBase', { - + beforeEach: function() { $('#qunit-fixture').append( '

Test

' ); - + view = new joint.mvc.ViewBase({ id: 'test-view', className: 'test-view', other: 'non-special-option' }); }, - + afterEach: function() { $('#testElement').remove(); $('#test-view').remove(); } - + }); - + QUnit.test('constructor', function(assert) { assert.expect(3); assert.equal(view.el.id, 'test-view'); @@ -37,12 +37,12 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { var myView = new joint.mvc.ViewBase; myView.setElement('

test

'); var result = myView.$('a b'); - + assert.strictEqual(result[0].innerHTML, 'test'); assert.ok(result.length === +result.length); }); - + QUnit.test('$el', function(assert) { assert.expect(2); var myView = new joint.mvc.ViewBase; @@ -51,7 +51,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { assert.strictEqual(myView.$el[0], myView.el); }); - + QUnit.test('initialize', function(assert) { assert.expect(1); var View = joint.mvc.View.extend({ @@ -59,7 +59,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { this.one = 1; } }); - + assert.strictEqual(new View().one, 1); }); @@ -70,7 +70,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { this.one = 1; } }); - + assert.strictEqual(new View().one, 1); }); @@ -84,7 +84,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { var _view = new View({}); assert.notEqual(_view.el, undefined); }); - + QUnit.test('render', function(assert) { assert.expect(1); var myView = new joint.mvc.ViewBase; @@ -94,22 +94,22 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { QUnit.test('delegateEvents', function(assert) { assert.expect(6); var counter1 = 0, counter2 = 0; - + var myView = new joint.mvc.ViewBase({ el: '#testElement' }); myView.increment = function() { counter1++; }; myView.$el.on('click', function() { counter2++; }); - + var events = { 'click h1': 'increment' }; - + myView.delegateEvents(events); myView.$('h1').trigger('click'); assert.equal(counter1, 1); assert.equal(counter2, 1); - + myView.$('h1').trigger('click'); assert.equal(counter1, 2); assert.equal(counter2, 2); - + myView.delegateEvents(events); myView.$('h1').trigger('click'); assert.equal(counter1, 3); @@ -126,82 +126,82 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { assert.ok(true); }); myView.$('h1').trigger('click'); - + assert.equal(myView.delegate(), myView, '#delegate returns the view instance'); }); - + QUnit.test('delegateEvents allows functions for callbacks', function(assert) { assert.expect(3); var myView = new joint.mvc.ViewBase({ el: '

' }); myView.counter = 0; - + var events = { click: function() { this.counter++; } }; - + myView.delegateEvents(events); myView.$el.trigger('click'); assert.equal(myView.counter, 1); - + myView.$el.trigger('click'); assert.equal(myView.counter, 2); - + myView.delegateEvents(events); myView.$el.trigger('click'); assert.equal(myView.counter, 3); }); - + QUnit.test('delegateEvents ignore undefined methods', function(assert) { assert.expect(0); var myView = new joint.mvc.ViewBase({ el: '

' }); myView.delegateEvents({ click: 'undefinedMethod' }); myView.$el.trigger('click'); }); - + QUnit.test('undelegateEvents', function(assert) { assert.expect(7); var counter1 = 0, counter2 = 0; - + var myView = new joint.mvc.ViewBase({ el: '#testElement' }); myView.increment = function() { counter1++; }; myView.$el.on('click', function() { counter2++; }); - + var events = { 'click h1': 'increment' }; - + myView.delegateEvents(events); myView.$('h1').trigger('click'); assert.equal(counter1, 1); assert.equal(counter2, 1); - + myView.undelegateEvents(); myView.$('h1').trigger('click'); assert.equal(counter1, 1); assert.equal(counter2, 2); - + myView.delegateEvents(events); myView.$('h1').trigger('click'); assert.equal(counter1, 2); assert.equal(counter2, 3); - + assert.equal(myView.undelegateEvents(), myView, '#undelegateEvents returns the view instance'); }); - + QUnit.test('undelegate', function(assert) { assert.expect(1); var myView = new joint.mvc.ViewBase({ el: '#testElement' }); myView.delegate('click', function() { assert.ok(false); }); myView.delegate('click', 'h1', function() { assert.ok(false); }); - + myView.undelegate('click'); - + myView.$('h1').trigger('click'); myView.$el.trigger('click'); - + assert.equal(myView.undelegate(), myView, '#undelegate returns the view instance'); }); - + QUnit.test('undelegate with passed handler', function(assert) { assert.expect(1); var myView = new joint.mvc.ViewBase({ el: '#testElement' }); @@ -221,7 +221,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { myView.$('h1').trigger('click'); myView.$el.trigger('click'); }); - + QUnit.test('undelegate with handler and selector', function(assert) { assert.expect(2); var myView = new joint.mvc.ViewBase({ el: '#testElement' }); @@ -238,10 +238,10 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { var View = joint.mvc.ViewBase.extend({ tagName: 'span' }); - + assert.equal(new View().el.tagName, 'SPAN'); }); - + QUnit.test('tagName can be provided as a function', function(assert) { assert.expect(1); var View = joint.mvc.ViewBase.extend({ @@ -249,37 +249,37 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { return 'p'; } }); - + assert.ok(new View().$el.is('p')); }); - + QUnit.test('_ensureElement with DOM node el', function(assert) { assert.expect(1); var View = joint.mvc.ViewBase.extend({ el: document.body }); - + assert.equal(new View().el, document.body); }); - + QUnit.test('_ensureElement with string el', function(assert) { assert.expect(3); var View = joint.mvc.ViewBase.extend({ el: 'body' }); assert.strictEqual(new View().el, document.body); - + View = joint.mvc.ViewBase.extend({ el: '#testElement > h1' }); assert.strictEqual(new View().el, $('#testElement > h1').get(0)); - + View = joint.mvc.ViewBase.extend({ el: '#nonexistent' }); assert.ok(!new View().el); }); - + QUnit.test('with className and id functions', function(assert) { assert.expect(2); var View = joint.mvc.ViewBase.extend({ @@ -290,12 +290,12 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { return 'id'; } }); - + assert.strictEqual(new View().el.className, 'className'); assert.strictEqual(new View().el.id, 'id'); }); - + QUnit.test('with attributes', function(assert) { assert.expect(2); var View = joint.mvc.ViewBase.extend({ @@ -304,11 +304,11 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { 'class': 'class' } }); - + assert.strictEqual(new View().el.className, 'class'); assert.strictEqual(new View().el.id, 'id'); }); - + QUnit.test('with attributes as a function', function(assert) { assert.expect(1); var View = joint.mvc.ViewBase.extend({ @@ -316,7 +316,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { return { 'class': 'dynamic' }; } }); - + assert.strictEqual(new View().el.className, 'dynamic'); }); @@ -330,19 +330,19 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { 'id': 'attributeId' } }); - + var myView = new View; assert.strictEqual(myView.el.className, 'jointClass'); assert.strictEqual(myView.el.id, 'jointId'); assert.strictEqual(myView.$el.attr('class'), 'jointClass'); assert.strictEqual(myView.$el.attr('id'), 'jointId'); }); - + QUnit.test('multiple views per element', function(assert) { assert.expect(3); var count = 0; var $el = $('

'); - + var View = joint.mvc.ViewBase.extend({ el: $el, events: { @@ -351,15 +351,15 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { } } }); - + var view1 = new View; $el.trigger('click'); assert.equal(1, count); - + var view2 = new View; $el.trigger('click'); assert.equal(3, count); - + view1.delegateEvents(); $el.trigger('click'); assert.equal(5, count); @@ -373,21 +373,21 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { fake$event: function() { assert.ok(true); } } }); - + var myView = new View; $('body').trigger('fake$event').trigger('fake$event'); - + $('body').off('fake$event'); $('body').trigger('fake$event'); }); - + QUnit.test('#1048 - setElement uses provided object.', function(assert) { assert.expect(2); var $el = $('body'); - + var myView = new joint.mvc.ViewBase({ el: $el }); assert.ok(myView.$el === $el); - + myView.setElement($el = $($el)); assert.ok(myView.$el === $el); }); @@ -396,7 +396,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { assert.expect(1); var button1 = $(''); var button2 = $(''); - + var View = joint.mvc.ViewBase.extend({ events: { click: function(e) { @@ -404,23 +404,23 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { } } }); - + var myView = new View({ el: button1 }); myView.setElement(button2); - + button1.trigger('click'); button2.trigger('click'); }); - + QUnit.test('#1172 - Clone attributes object', function(assert) { assert.expect(2); var View = joint.mvc.ViewBase.extend({ attributes: { foo: 'bar' } }); - + var view1 = new View({ id: 'foo' }); assert.strictEqual(view1.el.id, 'foo'); - + var view2 = new View(); assert.ok(!view2.el.id); }); @@ -433,17 +433,17 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { this.listenTo(this.collection, 'all x', function() { assert.ok(false); }); } }); - + var myView = new View({ model: new joint.mvc.Model, collection: new joint.mvc.Collection }); - + myView.stopListening(); myView.model.trigger('x'); myView.collection.trigger('x'); }); - + QUnit.test('Provide function for el.', function(assert) { assert.expect(2); var View = joint.mvc.ViewBase.extend({ @@ -451,7 +451,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { return '

'; } }); - + var myView = new View; assert.ok(myView.$el.is('p')); assert.ok(myView.$el.has('a')); @@ -460,36 +460,36 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { QUnit.test('events passed in options', function(assert) { assert.expect(1); var counter = 0; - + var View = joint.mvc.ViewBase.extend({ el: '#testElement', increment: function() { counter++; } }); - + var myView = new View({ events: { 'click h1': 'increment' } }); - + myView.$('h1').trigger('click').trigger('click'); assert.equal(counter, 2); }); - + QUnit.test('remove', function(assert) { assert.expect(2); var myView = new joint.mvc.ViewBase; document.body.appendChild(view.el); - + myView.delegate('click', function() { assert.ok(false); }); myView.listenTo(myView, 'all x', function() { assert.ok(false); }); - + assert.equal(myView.remove(), myView, '#remove returns the view instance'); myView.$el.trigger('click'); myView.trigger('x'); - + // In IE8 and below, parentNode still exists but is not document.body. assert.notEqual(myView.el.parentNode, document.body); }); @@ -506,12 +506,12 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { }; var oldEl = myView.el; var $oldEl = myView.$el; - + myView.setElement(document.createElement('div')); - + $oldEl.click(); myView.$el.click(); - + assert.notEqual(oldEl, myView.el); assert.notEqual($oldEl, myView.$el); }); diff --git a/packages/joint-core/test/jointjs/paper.js b/packages/joint-core/test/jointjs/paper.js index 0faf6410f..bfb3683bf 100644 --- a/packages/joint-core/test/jointjs/paper.js +++ b/packages/joint-core/test/jointjs/paper.js @@ -57,7 +57,8 @@ QUnit.module('paper', function(hooks) { var WIDTH = '100%'; var HEIGHT = '50%'; var paper = this.paper; - $container.css({ width: 100, height: 200 }); + // TODO + $container.css({ width: '100px', height: '200px' }); paper.setDimensions(WIDTH, HEIGHT); assert.equal(paper.options.width, WIDTH); assert.equal(paper.options.height, HEIGHT); diff --git a/packages/joint-core/test/utils.js b/packages/joint-core/test/utils.js index 60c465a0c..2c41d5582 100644 --- a/packages/joint-core/test/utils.js +++ b/packages/joint-core/test/utils.js @@ -88,7 +88,7 @@ function normalizeCssAttr(name, value) { - var $tmpEl = $('
').appendTo($('body')); + var $tmpEl = joint.mvc.$('
').appendTo($('body')); var normalizedValue = $tmpEl.css(name, value).css(name); $tmpEl.remove(); return normalizedValue; @@ -96,6 +96,10 @@ })(QUnit.assert); +// Dom manipulation helpers. + +window.$ = joint.mvc.$; + // Simulate user events. // --------------------- From c0529294e6cede6457d8f84967199b549a9f4bb6 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Thu, 23 Nov 2023 17:39:50 +0100 Subject: [PATCH 05/58] update --- packages/joint-core/demo/links/index.html | 4 -- packages/joint-core/package.json | 4 +- packages/joint-core/rollup.config.js | 2 - packages/joint-core/rollup.resources.js | 66 ++--------------------- 4 files changed, 6 insertions(+), 70 deletions(-) diff --git a/packages/joint-core/demo/links/index.html b/packages/joint-core/demo/links/index.html index 47ec6cf08..3635597ca 100644 --- a/packages/joint-core/demo/links/index.html +++ b/packages/joint-core/demo/links/index.html @@ -13,11 +13,7 @@
- - - - diff --git a/packages/joint-core/package.json b/packages/joint-core/package.json index a1675e2d0..c6a72ffeb 100644 --- a/packages/joint-core/package.json +++ b/packages/joint-core/package.json @@ -67,8 +67,7 @@ ], "dependencies": { "dagre": "~0.8.5", - "graphlib": "~2.1.8", - "jquery": "~3.7.1" + "graphlib": "~2.1.8" }, "devDependencies": { "@types/dagre": "~0.7.50", @@ -104,6 +103,7 @@ "grunt-webpack": "6.0.0", "handlebars": "4.7.7", "jit-grunt": "0.10.0", + "jquery": "~3.7.1", "karma": "3.1.4", "karma-chrome-launcher": "2.2.0", "karma-coverage": "1.1.2", diff --git a/packages/joint-core/rollup.config.js b/packages/joint-core/rollup.config.js index 728831120..1f4c48eaa 100644 --- a/packages/joint-core/rollup.config.js +++ b/packages/joint-core/rollup.config.js @@ -6,8 +6,6 @@ const JOINT = [ ]; const LIBS_ESM = [ - modules.jquery, - modules.lodash, modules.dagre ]; diff --git a/packages/joint-core/rollup.resources.js b/packages/joint-core/rollup.resources.js index 577b66b9f..b2764b61a 100644 --- a/packages/joint-core/rollup.resources.js +++ b/packages/joint-core/rollup.resources.js @@ -71,30 +71,18 @@ export const vectorizer = { export const joint = { input: modules.joint.src, - external: [ - 'jquery', - 'lodash' - ], output: [{ file: modules.joint.umd, format: 'umd', name: 'joint', freeze: false, footer: JOINT_FOOTER, - globals: { - 'jquery': '$', - 'lodash': '_' - } }, { file: modules.joint.iife, format: 'iife', name: 'joint', freeze: false, footer: JOINT_FOOTER, - globals: { - 'jquery': '$', - 'lodash': '_' - } }], plugins: plugins, treeshake: false @@ -102,40 +90,26 @@ export const joint = { export const jointNoDependencies = { input: modules.joint.src, - external: [ - 'jquery', - 'lodash' - ].concat(Object.keys(G_REF)).concat(Object.keys(V_REF)), + external: [].concat(Object.keys(G_REF)).concat(Object.keys(V_REF)), output: [{ file: modules.joint.noDependencies, format: 'iife', name: 'joint', footer: JOINT_FOOTER, freeze: false, - globals: Object.assign({ - 'jquery': '$', - 'lodash': '_' - }, G_REF, V_REF) + globals: Object.assign({}, G_REF, V_REF) }], plugins: plugins }; export const jointCore = { input: modules.jointCore.src, - external: [ - 'jquery', - 'lodash' - ], output: [{ file: modules.jointCore.umd, format: 'umd', name: 'joint', freeze: false, footer: JOINT_FOOTER, - globals: { - 'jquery': '$', - 'lodash': '_' - } }], plugins: plugins }; @@ -158,19 +132,13 @@ export const jointPlugins = Object.keys(modules.plugins).reduce((res, namespace) res.push({ input: item.src, - external: [ - 'jquery', - 'lodash', - ].concat(Object.keys(LOCAL_EXTERNALS)), + external: [].concat(Object.keys(LOCAL_EXTERNALS)), output: [{ file: `build/${namespace}.js`, format: 'iife', extend: true, name: namespace, - globals: Object.assign({ - 'jquery': '$', - 'lodash': '_', - }, LOCAL_EXTERNALS) + globals: Object.assign({}, LOCAL_EXTERNALS) }], plugins: plugins }); @@ -196,29 +164,3 @@ export const dagre = { commonjs() ] }; - -export const jquery = { - input: 'node_modules/jquery/dist/jquery.js', - output: [{ - file: 'build/esm/jquery.mjs', - format: 'esm', - freeze: false - }], - plugins: [ - commonjs(), - resolve() - ] -}; - -export const lodash = { - input: 'node_modules/lodash/index.js', - output: [{ - file: 'build/esm/lodash.mjs', - format: 'esm', - freeze: false - }], - plugins: [ - commonjs(), - resolve() - ] -}; From cf35f20b6802b0bc45aad97dc2567680d5a7175b Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Thu, 23 Nov 2023 20:06:16 +0100 Subject: [PATCH 06/58] update --- packages/joint-core/src/mvc/View.mjs | 46 +++++++++++++++++++++------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 885abe6ce..13a2f58db 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -107,7 +107,10 @@ export const View = ViewBase.extend({ }, _setStyle: function(style) { - this.$el.css(style); + if (!style) return; + for (var name in style) { + this.el.style[name] = style[name]; + } }, _createElement: function(tagName) { @@ -407,6 +410,15 @@ $.fn.append = function(...nodes) { return this; }; +$.fn.html = function(html) { + if (!this[0]) return ''; + if (html === undefined) { + return this[0].innerHTML; + } + this[0].innerHTML = html; + return this; +}; + $.fn.appendTo = function(parent) { if (!this[0]) return this; $(parent).append(this); @@ -439,16 +451,6 @@ $.fn.remove = function() { return this; }; -$.fn.children = function(selector) { - if (!this[0]) return $(); - const el = this[0]; - const children = Array.from(el.children); - if (selector) { - return $(children.filter(child => child.matches(selector))); - } - return $(children); -}; - $.fn.data = function() { return this; }; @@ -550,3 +552,25 @@ $.fn.height = function() { if (!this[0]) return 0; return this[0].getBoundingClientRect().height; }; + +// JJ+ is using it as a setter +$.fn.offset = function() { + if (!this[0]) return { top: 0, left: 0 }; + const box = this[0].getBoundingClientRect(); + return { + top: box.top + window.pageYOffset - document.documentElement.clientTop, + left: box.left + window.pageXOffset - document.documentElement.clientLeft + }; +}; + + +// For test only (verified) + +$.fn.children = function(selector) { + const [el] = this; + if (!el) return $(); + if (selector) { + return $(Array.from(el.children).filter(child => child.matches(selector))); + } + return $(el.children); +}; From f58d74d1eebe31314fd967fb8dae74f55e2ed950 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 24 Nov 2023 09:35:02 +0100 Subject: [PATCH 07/58] update --- packages/joint-core/src/mvc/Dom.mjs | 5078 ++++++++------------- packages/joint-core/test/jointjs/basic.js | 26 +- 2 files changed, 1803 insertions(+), 3301 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index 97866fe1d..c3361c472 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -6,13 +6,13 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2023-11-23T13:32Z + * Date: 2023-11-23T16:43Z */ 'use strict'; -if ( !window.document ) { - throw new Error( 'jQuery requires a window with a document' ); +if (!window.document) { + throw new Error('jQuery requires a window with a document'); } var arr = []; @@ -23,11 +23,13 @@ var slice = arr.slice; // Support: IE 11+ // IE doesn't have Array#flat; provide a fallback. -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; +var flat = arr.flat + ? function(array) { + return arr.flat.call(array); + } + : function(array) { + return arr.concat.apply([], array); + }; var push = arr.push; @@ -42,36 +44,38 @@ var hasOwn = class2type.hasOwnProperty; var fnToString = hasOwn.toString; -var ObjectFunctionString = fnToString.call( Object ); +var ObjectFunctionString = fnToString.call(Object); // All support tests are defined in their respective modules. var support = {}; -function toType( obj ) { - if ( obj == null ) { +function toType(obj) { + if (obj == null) { return obj + ''; } - return typeof obj === 'object' ? - class2type[ toString.call( obj ) ] || 'object' : - typeof obj; + return typeof obj === 'object' + ? class2type[toString.call(obj)] || 'object' + : typeof obj; } -function isWindow( obj ) { +function isWindow(obj) { return obj != null && obj === obj.window; } -function isArrayLike( obj ) { - +function isArrayLike(obj) { var length = !!obj && obj.length, - type = toType( obj ); + type = toType(obj); - if ( typeof obj === 'function' || isWindow( obj ) ) { + if (typeof obj === 'function' || isWindow(obj)) { return false; } - return type === 'array' || length === 0 || - typeof length === 'number' && length > 0 && ( length - 1 ) in obj; + return ( + type === 'array' || + length === 0 || + (typeof length === 'number' && length > 0 && length - 1 in obj) + ); } var document = window.document; @@ -80,42 +84,36 @@ var preservedScriptAttributes = { type: true, src: true, nonce: true, - noModule: true + noModule: true, }; -function DOMEval( code, node, doc ) { +function DOMEval(code, node, doc) { doc = doc || document; var i, - script = doc.createElement( 'script' ); + script = doc.createElement('script'); script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - if ( node[ i ] ) { - script[ i ] = node[ i ]; + if (node) { + for (i in preservedScriptAttributes) { + if (node[i]) { + script[i] = node[i]; } } } - doc.head.appendChild( script ).parentNode.removeChild( script ); + doc.head.appendChild(script).parentNode.removeChild(script); } var version = '4.0.0-pre+c98597ea.dirty', - rhtmlSuffix = /HTML$/i, - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // CUSTOM DOM - + jQuery = function(selector, context) { // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); + return new jQuery.fn.init(selector, context); }; jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used jquery: version, @@ -125,28 +123,26 @@ jQuery.fn = jQuery.prototype = { length: 0, toArray: function() { - return slice.call( this ); + return slice.call(this); }, // Get the Nth element in the matched element set OR // Get the whole matched element set as a clean array - get: function( num ) { - + get: function(num) { // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); + if (num == null) { + return slice.call(this); } // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; + return num < 0 ? this[num + this.length] : this[num]; }, // Take an array of elements and push it onto the stack // (returning the new matched element set) - pushStack: function( elems ) { - + pushStack: function(elems) { // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); + var ret = jQuery.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference) ret.prevObject = this; @@ -156,162 +152,98 @@ jQuery.fn = jQuery.prototype = { }, // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); + each: function(callback) { + return jQuery.each(this, callback); }, - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); + map: function(callback) { + return this.pushStack( + jQuery.map(this, function(elem, i) { + return callback.call(elem, i, elem); + }) + ); }, slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); + return this.pushStack(slice.apply(this, arguments)); }, first: function() { - return this.eq( 0 ); + return this.eq(0); }, last: function() { - return this.eq( -1 ); + return this.eq(-1); }, even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); + return this.pushStack( + jQuery.grep(this, function(_elem, i) { + return (i + 1) % 2; + }) + ); }, odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); + return this.pushStack( + jQuery.grep(this, function(_elem, i) { + return i % 2; + }) + ); }, - eq: function( i ) { + eq: function(i) { var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + j = +i + (i < 0 ? len : 0); + return this.pushStack(j >= 0 && j < len ? [this[j]] : []); }, end: function() { return this.prevObject || this.constructor(); - } -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === 'boolean' ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== 'object' && typeof target !== 'function' ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === '__proto__' || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; + }, }; -jQuery.extend( { - +Object.assign(jQuery, { // Unique for each copy of jQuery on the page - expando: 'jQuery' + ( version + Math.random() ).replace( /\D/g, '' ), + expando: 'jQuery' + (version + Math.random()).replace(/\D/g, ''), // Assume jQuery is ready without the ready module isReady: true, - error: function( msg ) { - throw new Error( msg ); + error: function(msg) { + throw new Error(msg); }, noop: function() {}, - isPlainObject: function( obj ) { + isPlainObject: function(obj) { var proto, Ctor; // Detect obvious negatives // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== '[object Object]' ) { + if (!obj || toString.call(obj) !== '[object Object]') { return false; } - proto = getProto( obj ); + proto = getProto(obj); // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { + if (!proto) { return true; } // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, 'constructor' ) && proto.constructor; - return typeof Ctor === 'function' && fnToString.call( Ctor ) === ObjectFunctionString; + Ctor = hasOwn.call(proto, 'constructor') && proto.constructor; + return ( + typeof Ctor === 'function' && + fnToString.call(Ctor) === ObjectFunctionString + ); }, - isEmptyObject: function( obj ) { + isEmptyObject: function(obj) { var name; - for ( name in obj ) { + for (name in obj) { return false; } return true; @@ -319,23 +251,24 @@ jQuery.extend( { // Evaluates a script in a provided context; falls back to the global one // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); + globalEval: function(code, options, doc) { + DOMEval(code, { nonce: options && options.nonce }, doc); }, - each: function( obj, callback ) { - var length, i = 0; + each: function(obj, callback) { + var length, + i = 0; - if ( isArrayLike( obj ) ) { + if (isArrayLike(obj)) { length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + for (; i < length; i++) { + if (callback.call(obj[i], i, obj[i]) === false) { break; } } } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + for (i in obj) { + if (callback.call(obj[i], i, obj[i]) === false) { break; } } @@ -344,30 +277,27 @@ jQuery.extend( { return obj; }, - // Retrieve the text value of an array of DOM nodes - text: function( elem ) { + text: function(elem) { var node, ret = '', i = 0, nodeType = elem.nodeType; - if ( !nodeType ) { - + if (!nodeType) { // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - + while ((node = elem[i++])) { // Do not traverse comment nodes - ret += jQuery.text( node ); + ret += jQuery.text(node); } } - if ( nodeType === 1 || nodeType === 11 ) { + if (nodeType === 1 || nodeType === 11) { return elem.textContent; } - if ( nodeType === 9 ) { + if (nodeType === 9) { return elem.documentElement.textContent; } - if ( nodeType === 3 || nodeType === 4 ) { + if (nodeType === 3 || nodeType === 4) { return elem.nodeValue; } @@ -376,59 +306,62 @@ jQuery.extend( { return ret; }, - // results is for internal usage only - makeArray: function( arr, results ) { + makeArray: function(arr, results) { var ret = results || []; - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === 'string' ? - [ arr ] : arr - ); + if (arr != null) { + if (isArrayLike(Object(arr))) { + jQuery.merge(ret, typeof arr === 'string' ? [arr] : arr); } else { - push.call( ret, arr ); + push.call(ret, arr); } } return ret; }, - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); + inArray: function(elem, arr, i) { + return arr == null ? -1 : indexOf.call(arr, elem, i); }, - isXMLDoc: function( elem ) { + isXMLDoc: function(elem) { var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; + docElem = elem && (elem.ownerDocument || elem).documentElement; // Assume HTML when documentElement doesn't yet exist, such as inside // document fragments. - return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || 'HTML' ); + return !rhtmlSuffix.test( + namespace || (docElem && docElem.nodeName) || 'HTML' + ); }, // Note: an element does not contain itself - contains: function( a, b ) { + contains: function(a, b) { var bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - a.contains ? - a.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); + return ( + a === bup || + !!( + bup && + bup.nodeType === 1 && + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + (a.contains + ? a.contains(bup) + : a.compareDocumentPosition && + a.compareDocumentPosition(bup) & 16) + ) + ); }, - merge: function( first, second ) { + merge: function(first, second) { var len = +second.length, j = 0, i = first.length; - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; + for (; j < len; j++) { + first[i++] = second[j]; } first.length = i; @@ -436,7 +369,7 @@ jQuery.extend( { return first; }, - grep: function( elems, callback, invert ) { + grep: function(elems, callback, invert) { var callbackInverse, matches = [], i = 0, @@ -445,10 +378,10 @@ jQuery.extend( { // Go through the array, only saving the items // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); + for (; i < length; i++) { + callbackInverse = !callback(elems[i], i); + if (callbackInverse !== callbackExpect) { + matches.push(elems[i]); } } @@ -456,35 +389,36 @@ jQuery.extend( { }, // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, + map: function(elems, callback, arg) { + var length, + value, i = 0, ret = []; // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { + if (isArrayLike(elems)) { length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); + for (; i < length; i++) { + value = callback(elems[i], i, arg); - if ( value != null ) { - ret.push( value ); + if (value != null) { + ret.push(value); } } // Go through every key on the object, } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); + for (i in elems) { + value = callback(elems[i], i, arg); - if ( value != null ) { - ret.push( value ); + if (value != null) { + ret.push(value); } } } // Flatten any nested arrays - return flat( ret ); + return flat(ret); }, // A global GUID counter for objects @@ -492,18 +426,22 @@ jQuery.extend( { // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. - support: support -} ); + support: support, +}); -if ( typeof Symbol === 'function' ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +if (typeof Symbol === 'function') { + jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; } // Populate the class2type map -jQuery.each( 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( ' ' ), - function( _i, name ) { - class2type[ '[object ' + name + ']' ] = name.toLowerCase(); - } ); +jQuery.each( + 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( + ' ' + ), + function(_i, name) { + class2type['[object ' + name + ']'] = name.toLowerCase(); + } +); var documentElement = document.documentElement; @@ -519,28 +457,27 @@ var isIE = document.documentMode; /** * Determines whether an object can have data */ -function acceptData( owner ) { - +function acceptData(owner) { // Accepts only: // - Node // - Node.ELEMENT_NODE // - Node.DOCUMENT_NODE // - Object // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); + return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; } // Matches dashed string for camelizing var rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { +function fcamelCase(_all, letter) { return letter.toUpperCase(); } // Convert dashed to camelCase -function camelCase( string ) { - return string.replace( rdashAlpha, fcamelCase ); +function camelCase(string) { + return string.replace(rdashAlpha, fcamelCase); } function Data() { @@ -550,68 +487,62 @@ function Data() { Data.uid = 1; Data.prototype = { - - cache: function( owner ) { - + cache: function(owner) { // Check if the owner object already has a cache - var value = owner[ this.expando ]; + var value = owner[this.expando]; // If not, create one - if ( !value ) { - value = Object.create( null ); + if (!value) { + value = Object.create(null); // We can accept data for non-element nodes in modern browsers, // but we should not, see trac-8335. // Always return an empty object. - if ( acceptData( owner ) ) { - + if (acceptData(owner)) { // If it is a node unlikely to be stringify-ed or looped over // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; + if (owner.nodeType) { + owner[this.expando] = value; // Otherwise secure it in a non-enumerable property // configurable must be true to allow the property to be // deleted when data is removed } else { - Object.defineProperty( owner, this.expando, { + Object.defineProperty(owner, this.expando, { value: value, - configurable: true - } ); + configurable: true, + }); } } } return value; }, - set: function( owner, data, value ) { + set: function(owner, data, value) { var prop, - cache = this.cache( owner ); + cache = this.cache(owner); // Handle: [ owner, key, value ] args // Always use camelCase key (gh-2257) - if ( typeof data === 'string' ) { - cache[ camelCase( data ) ] = value; + if (typeof data === 'string') { + cache[camelCase(data)] = value; // Handle: [ owner, { properties } ] args } else { - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; + for (prop in data) { + cache[camelCase(prop)] = data[prop]; } } return cache; }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + get: function(owner, key) { + return key === undefined + ? this.cache(owner) + : // Always use camelCase key (gh-2257) + owner[this.expando] && owner[this.expando][camelCase(key)]; }, - access: function( owner, key, value ) { - + access: function(owner, key, value) { // In cases where either: // // 1. No key was specified @@ -623,10 +554,11 @@ Data.prototype = { // 1. The entire cache object // 2. The data stored at the key // - if ( key === undefined || - ( ( key && typeof key === 'string' ) && value === undefined ) ) { - - return this.get( owner, key ); + if ( + key === undefined || + (key && typeof key === 'string' && value === undefined) + ) { + return this.get(owner, key); } // When the key is not a string, or both a key and value @@ -635,79 +567,75 @@ Data.prototype = { // 1. An object of properties // 2. A key and value // - this.set( owner, key, value ); + this.set(owner, key, value); // Since the "set" path can have two possible entry points // return the expected data based on which path was taken[*] return value !== undefined ? value : key; }, - remove: function( owner, key ) { + remove: function(owner, key) { var i, - cache = owner[ this.expando ]; + cache = owner[this.expando]; - if ( cache === undefined ) { + if (cache === undefined) { return; } - if ( key !== undefined ) { - + if (key !== undefined) { // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - + if (Array.isArray(key)) { // If key is an array of keys... // We always set camelCase keys, so remove that. - key = key.map( camelCase ); + key = key.map(camelCase); } else { - key = camelCase( key ); + key = camelCase(key); // If a key with the spaces exists, use it. // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); + key = key in cache ? [key] : key.match(rnothtmlwhite) || []; } i = key.length; - while ( i-- ) { - delete cache[ key[ i ] ]; + while (i--) { + delete cache[key[i]]; } } // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - + if (key === undefined || jQuery.isEmptyObject(cache)) { // Support: Chrome <=35 - 45+ // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; + if (owner.nodeType) { + owner[this.expando] = undefined; } else { - delete owner[ this.expando ]; + delete owner[this.expando]; } } }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } + hasData: function(owner) { + var cache = owner[this.expando]; + return cache !== undefined && !jQuery.isEmptyObject(cache); + }, }; var dataPriv = new Data(); -function nodeName( elem, name ) { +function nodeName(elem, name) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); } // rsingleTag matches a string consisting of a single HTML element with no attributes // and captures the element's name -var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; +var rsingleTag = + /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; -function isObviousHtml( input ) { - return input[ 0 ] === '<' && - input[ input.length - 1 ] === '>' && - input.length >= 3; +function isObviousHtml(input) { + return ( + input[0] === '<' && input[input.length - 1] === '>' && input.length >= 3 + ); } var pop = arr.pop; @@ -725,9 +653,9 @@ var whitespace = '[\\x20\\t\\r\\n\\f]'; // environments will fail in the qSA path and fall back to jQuery traversal // anyway. try { - document.querySelector( ':has(*,:jqfake)' ); + document.querySelector(':has(*,:jqfake)'); support.cssHas = false; -} catch ( e ) { +} catch (e) { support.cssHas = true; } @@ -735,9 +663,8 @@ try { // Regex strategy adopted from Diego Perini. var rbuggyQSA = []; -if ( isIE ) { +if (isIE) { rbuggyQSA.push( - // Support: IE 9 - 11+ // IE's :disabled selector does not pick up the children of disabled fieldsets ':enabled', @@ -747,23 +674,27 @@ if ( isIE ) { // IE 11 doesn't find elements on a `[name='']` query in some cases. // Adding a temporary attribute to the document before the selection works // around the issue. - '\\[' + whitespace + '*name' + whitespace + '*=' + - whitespace + '*(?:\'\'|"")' + '\\[' + + whitespace + + '*name' + + whitespace + + '*=' + + whitespace + + '*(?:\'\'|"")' ); } -if ( !support.cssHas ) { - +if (!support.cssHas) { // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ // Our regular `try-catch` mechanism fails to detect natively-unsupported // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) // in browsers that parse the `:has()` argument as a forgiving selector list. // https://drafts.csswg.org/selectors/#relational now requires the argument // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push( ':has' ); + rbuggyQSA.push(':has'); } -rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( '|' ) ); +rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|')); var rtrimCSS = new RegExp( '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', @@ -771,16 +702,20 @@ var rtrimCSS = new RegExp( ); // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram -var identifier = '(?:\\\\[\\da-fA-F]{1,6}' + whitespace + - '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; +var identifier = + '(?:\\\\[\\da-fA-F]{1,6}' + + whitespace + + '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; -var booleans = 'checked|selected|async|autofocus|autoplay|controls|' + - 'defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped'; +var booleans = + 'checked|selected|async|autofocus|autoplay|controls|' + + 'defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped'; -var rleadingCombinator = new RegExp( '^' + whitespace + '*([>+~]|' + - whitespace + ')' + whitespace + '*' ); +var rleadingCombinator = new RegExp( + '^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*' +); -var rdescend = new RegExp( whitespace + '|>' ); +var rdescend = new RegExp(whitespace + '|>'); var rsibling = /[+~]/; @@ -797,16 +732,14 @@ var matches = documentElement.matches || documentElement.msMatchesSelector; function createCache() { var keys = []; - function cache( key, value ) { - + function cache(key, value) { // Use (key + " ") to avoid collision with native prototype properties // (see https://github.com/jquery/sizzle/issues/157) - if ( keys.push( key + ' ' ) > jQuery.expr.cacheLength ) { - + if (keys.push(key + ' ') > jQuery.expr.cacheLength) { // Only keep the most recent entries - delete cache[ keys.shift() ]; + delete cache[keys.shift()]; } - return ( cache[ key + ' ' ] = value ); + return (cache[key + ' '] = value); } return cache; } @@ -816,56 +749,79 @@ function createCache() { * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== 'undefined' && context; +function testContext(context) { + return ( + context && + typeof context.getElementsByTagName !== 'undefined' && + context + ); } // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors -var attributes = '\\[' + whitespace + '*(' + identifier + ')(?:' + whitespace + - - // Operator (capture 2) - '*([*^$|!~]?=)' + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + identifier + '))|)' + - whitespace + '*\\]'; - -var pseudos = ':(' + identifier + ')(?:\\((' + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - '(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' + - - // 2. simple (capture 6) - '((?:\\\\.|[^\\\\()[\\]]|' + attributes + ')*)|' + - - // 3. anything else (capture 2) - '.*' + - ')\\)|)'; +var attributes = + '\\[' + + whitespace + + '*(' + + identifier + + ')(?:' + + whitespace + + // Operator (capture 2) + '*([*^$|!~]?=)' + + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + + identifier + + '))|)' + + whitespace + + '*\\]'; + +var pseudos = + ':(' + + identifier + + ')(?:\\((' + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + '(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' + + // 2. simple (capture 6) + '((?:\\\\.|[^\\\\()[\\]]|' + + attributes + + ')*)|' + + // 3. anything else (capture 2) + '.*' + + ')\\)|)'; var filterMatchExpr = { - ID: new RegExp( '^#(' + identifier + ')' ), - CLASS: new RegExp( '^\\.(' + identifier + ')' ), - TAG: new RegExp( '^(' + identifier + '|[*])' ), - ATTR: new RegExp( '^' + attributes ), - PSEUDO: new RegExp( '^' + pseudos ), + ID: new RegExp('^#(' + identifier + ')'), + CLASS: new RegExp('^\\.(' + identifier + ')'), + TAG: new RegExp('^(' + identifier + '|[*])'), + ATTR: new RegExp('^' + attributes), + PSEUDO: new RegExp('^' + pseudos), CHILD: new RegExp( '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + - whitespace + '*(even|odd|(([+-]|)(\\d*)n|)' + whitespace + '*(?:([+-]|)' + - whitespace + '*(\\d+)|))' + whitespace + '*\\)|)', 'i' ) + whitespace + + '*(even|odd|(([+-]|)(\\d*)n|)' + + whitespace + + '*(?:([+-]|)' + + whitespace + + '*(\\d+)|))' + + whitespace + + '*\\)|)', + 'i' + ), }; -var rpseudo = new RegExp( pseudos ); +var rpseudo = new RegExp(pseudos); // CSS escapes -var runescape = new RegExp( '\\\\[\\da-fA-F]{1,6}' + whitespace + - '?|\\\\([^\\r\\n\\f])', 'g' ), - funescape = function( escape, nonHex ) { - var high = '0x' + escape.slice( 1 ) - 0x10000; - - if ( nonHex ) { +var runescape = new RegExp( + '\\\\[\\da-fA-F]{1,6}' + whitespace + '?|\\\\([^\\r\\n\\f])', + 'g' + ), + funescape = function(escape, nonHex) { + var high = '0x' + escape.slice(1) - 0x10000; + if (nonHex) { // Strip the backslash prefix from a non-hex escape sequence return nonHex; } @@ -874,77 +830,85 @@ var runescape = new RegExp( '\\\\[\\da-fA-F]{1,6}' + whitespace + // Support: IE <=11+ // For values outside the Basic Multilingual Plane (BMP), manually construct a // surrogate pair - return high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + return high < 0 + ? String.fromCharCode(high + 0x10000) + : String.fromCharCode( + (high >> 10) | 0xd800, + (high & 0x3ff) | 0xdc00 + ); }; -function unescapeSelector( sel ) { - return sel.replace( runescape, funescape ); +function unescapeSelector(sel) { + return sel.replace(runescape, funescape); } -function selectorError( msg ) { - jQuery.error( 'Syntax error, unrecognized expression: ' + msg ); +function selectorError(msg) { + jQuery.error('Syntax error, unrecognized expression: ' + msg); } -var rcomma = new RegExp( '^' + whitespace + '*,' + whitespace + '*' ); +var rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'); var tokenCache = createCache(); -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + ' ' ]; +function tokenize(selector, parseOnly) { + var matched, + match, + tokens, + type, + soFar, + groups, + preFilters, + cached = tokenCache[selector + ' ']; - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); + if (cached) { + return parseOnly ? 0 : cached.slice(0); } soFar = selector; groups = []; preFilters = jQuery.expr.preFilter; - while ( soFar ) { - + while (soFar) { // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - + if (!matched || (match = rcomma.exec(soFar))) { + if (match) { // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; + soFar = soFar.slice(match[0].length) || soFar; } - groups.push( ( tokens = [] ) ); + groups.push((tokens = [])); } matched = false; // Combinators - if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + if ((match = rleadingCombinator.exec(soFar))) { matched = match.shift(); - tokens.push( { + tokens.push({ value: matched, // Cast descendant combinators to space - type: match[ 0 ].replace( rtrimCSS, ' ' ) - } ); - soFar = soFar.slice( matched.length ); + type: match[0].replace(rtrimCSS, ' '), + }); + soFar = soFar.slice(matched.length); } // Filters - for ( type in filterMatchExpr ) { - if ( ( match = jQuery.expr.match[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { + for (type in filterMatchExpr) { + if ( + (match = jQuery.expr.match[type].exec(soFar)) && + (!preFilters[type] || (match = preFilters[type](match))) + ) { matched = match.shift(); - tokens.push( { + tokens.push({ value: matched, type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); + matches: match, + }); + soFar = soFar.slice(matched.length); } } - if ( !matched ) { + if (!matched) { break; } } @@ -952,33 +916,31 @@ function tokenize( selector, parseOnly ) { // Return the length of the invalid excess // if we're just parsing // Otherwise, throw an error or return tokens - if ( parseOnly ) { + if (parseOnly) { return soFar.length; } - return soFar ? - selectorError( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); + return soFar + ? selectorError(selector) + : // Cache the tokens + tokenCache(selector, groups).slice(0); } var preFilter = { - ATTR: function( match ) { - match[ 1 ] = unescapeSelector( match[ 1 ] ); + ATTR: function(match) { + match[1] = unescapeSelector(match[1]); // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = unescapeSelector( match[ 3 ] || match[ 4 ] || match[ 5 ] || '' ); + match[3] = unescapeSelector(match[3] || match[4] || match[5] || ''); - if ( match[ 2 ] === '~=' ) { - match[ 3 ] = ' ' + match[ 3 ] + ' '; + if (match[2] === '~=') { + match[3] = ' ' + match[3] + ' '; } - return match.slice( 0, 4 ); + return match.slice(0, 4); }, - CHILD: function( match ) { - + CHILD: function(match) { /* matches from filterMatchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) @@ -989,69 +951,68 @@ var preFilter = { 7 sign of y-component 8 y of y-component */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === 'nth' ) { + match[1] = match[1].toLowerCase(); + if (match[1].slice(0, 3) === 'nth') { // nth-* requires argument - if ( !match[ 3 ] ) { - selectorError( match[ 0 ] ); + if (!match[3]) { + selectorError(match[0]); } // numeric x and y parameters for jQuery.expr.filter.CHILD // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === 'even' || match[ 3 ] === 'odd' ) - ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === 'odd' ); + match[4] = +(match[4] + ? match[5] + (match[6] || 1) + : 2 * (match[3] === 'even' || match[3] === 'odd')); + match[5] = +(match[7] + match[8] || match[3] === 'odd'); // other types prohibit arguments - } else if ( match[ 3 ] ) { - selectorError( match[ 0 ] ); + } else if (match[3]) { + selectorError(match[0]); } return match; }, - PSEUDO: function( match ) { + PSEUDO: function(match) { var excess, - unquoted = !match[ 6 ] && match[ 2 ]; + unquoted = !match[6] && match[2]; - if ( filterMatchExpr.CHILD.test( match[ 0 ] ) ) { + if (filterMatchExpr.CHILD.test(match[0])) { return null; } // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ''; + if (match[3]) { + match[2] = match[4] || match[5] || ''; // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ')', unquoted.length - excess ) - - unquoted.length ) ) { - + } else if ( + unquoted && + rpseudo.test(unquoted) && + // Get excess from tokenize (recursively) + (excess = tokenize(unquoted, true)) && + // advance to the next closing parenthesis + (excess = + unquoted.indexOf(')', unquoted.length - excess) - + unquoted.length) + ) { // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); + match[0] = match[0].slice(0, excess); + match[2] = unquoted.slice(0, excess); } // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } + return match.slice(0, 3); + }, }; -function toSelector( tokens ) { +function toSelector(tokens) { var i = 0, len = tokens.length, selector = ''; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; + for (; i < len; i++) { + selector += tokens[i].value; } return selector; } @@ -1060,24 +1021,28 @@ function toSelector( tokens ) { // https://drafts.csswg.org/cssom/#common-serializing-idioms var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; -function fcssescape( ch, asCodePoint ) { - if ( asCodePoint ) { - +function fcssescape(ch, asCodePoint) { + if (asCodePoint) { // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === '\0' ) { + if (ch === '\0') { return '\uFFFD'; } // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + '\\' + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + ' '; + return ( + ch.slice(0, -1) + + '\\' + + ch.charCodeAt(ch.length - 1).toString(16) + + ' ' + ); } // Other potentially-special ASCII characters get backslash-escaped return '\\' + ch; } -jQuery.escapeSelector = function( sel ) { - return ( sel + '' ).replace( rcssescape, fcssescape ); +jQuery.escapeSelector = function(sel) { + return (sel + '').replace(rcssescape, fcssescape); }; var sort = arr.sort; @@ -1087,17 +1052,16 @@ var splice = arr.splice; var hasDuplicate; // Document order sorting -function sortOrder( a, b ) { - +function sortOrder(a, b) { // Flag for duplicate removal - if ( a === b ) { + if (a === b) { hasDuplicate = true; return 0; } // Sort on method existence if only one input has compareDocumentPosition var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { + if (compare) { return compare; } @@ -1106,22 +1070,23 @@ function sortOrder( a, b ) { // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; + compare = + (a.ownerDocument || a) == (b.ownerDocument || b) + ? a.compareDocumentPosition(b) + : // Otherwise we know they are disconnected + 1; // Disconnected nodes - if ( compare & 1 ) { - + if (compare & 1) { // Choose the first element that is related to the document // Support: IE 11+ // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == document && - jQuery.contains( document, a ) ) { + if ( + a == document || + (a.ownerDocument == document && jQuery.contains(document, a)) + ) { return -1; } @@ -1129,8 +1094,10 @@ function sortOrder( a, b ) { // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == document && - jQuery.contains( document, b ) ) { + if ( + b == document || + (b.ownerDocument == document && jQuery.contains(document, b)) + ) { return 1; } @@ -1145,7 +1112,7 @@ function sortOrder( a, b ) { * Document sorting and removing duplicates * @param {ArrayLike} results */ -jQuery.uniqueSort = function( results ) { +jQuery.uniqueSort = function(results) { var elem, duplicates = [], j = 0, @@ -1153,16 +1120,16 @@ jQuery.uniqueSort = function( results ) { hasDuplicate = false; - sort.call( results, sortOrder ); + sort.call(results, sortOrder); - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); + if (hasDuplicate) { + while ((elem = results[i++])) { + if (elem === results[i]) { + j = duplicates.push(i); } } - while ( j-- ) { - splice.call( results, duplicates[ j ], 1 ); + while (j--) { + splice.call(results, duplicates[j], 1); } } @@ -1170,47 +1137,49 @@ jQuery.uniqueSort = function( results ) { }; jQuery.fn.uniqueSort = function() { - return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); + return this.pushStack(jQuery.uniqueSort(slice.apply(this))); }; var i, outermostContext, - // Local document vars document$1, documentElement$1, documentIsHTML, - // Instance-specific data dirruns = 0, done = 0, classCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), - // Regular expressions // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + '+', 'g' ), - - ridentifier = new RegExp( '^' + identifier + '$' ), - - matchExpr = jQuery.extend( { - bool: new RegExp( '^(?:' + booleans + ')$', 'i' ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( '^' + whitespace + - '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + whitespace + - '*((?:-\\d)?\\d*)' + whitespace + '*\\)|)(?=[^-]|$)', 'i' ) - }, filterMatchExpr ), - + rwhitespace = new RegExp(whitespace + '+', 'g'), + ridentifier = new RegExp('^' + identifier + '$'), + matchExpr = Object.assign( + { + bool: new RegExp('^(?:' + booleans + ')$', 'i'), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( + '^' + + whitespace + + '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + + whitespace + + '*((?:-\\d)?\\d*)' + + whitespace + + '*\\)|)(?=[^-]|$)', + 'i' + ), + }, + filterMatchExpr + ), rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - // Used for iframes; see `setDocument`. // Support: IE 9 - 11+ // Removing the function wrapper causes a "Permission Denied" @@ -1218,77 +1187,83 @@ var i, unloadHandler = function() { setDocument(); }, - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && nodeName( elem, 'fieldset' ); + function(elem) { + return elem.disabled === true && nodeName(elem, 'fieldset'); }, { dir: 'parentNode', next: 'legend' } ); -function find( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, +function find(selector, context, results, seed) { + var m, + i, + elem, + nid, + match, + groups, + newSelector, newContext = context && context.ownerDocument, - // nodeType defaults to 9, since context defaults to document nodeType = context ? context.nodeType : 9; results = results || []; // Return early from calls with invalid selector or context - if ( typeof selector !== 'string' || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - + if ( + typeof selector !== 'string' || + !selector || + (nodeType !== 1 && nodeType !== 9 && nodeType !== 11) + ) { return results; } // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); + if (!seed) { + setDocument(context); context = context || document$1; - if ( documentIsHTML ) { - + if (documentIsHTML) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - + if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { // ID selector - if ( ( m = match[ 1 ] ) ) { - + if ((m = match[1])) { // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - push.call( results, elem ); + if (nodeType === 9) { + if ((elem = context.getElementById(m))) { + push.call(results, elem); } return results; // Element context } else { - if ( newContext && ( elem = newContext.getElementById( m ) ) && - jQuery.contains( context, elem ) ) { - - push.call( results, elem ); + if ( + newContext && + (elem = newContext.getElementById(m)) && + jQuery.contains(context, elem) + ) { + push.call(results, elem); return results; } } // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); + } else if (match[2]) { + push.apply(results, context.getElementsByTagName(selector)); return results; // Class selector - } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); + } else if ((m = match[3]) && context.getElementsByClassName) { + push.apply(results, context.getElementsByClassName(m)); return results; } } // Take advantage of querySelectorAll - if ( !nonnativeSelectorCache[ selector + ' ' ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { - + if ( + !nonnativeSelectorCache[selector + ' '] && + (!rbuggyQSA || !rbuggyQSA.test(selector)) + ) { newSelector = selector; newContext = context; @@ -1299,13 +1274,16 @@ function find( selector, context, results, seed ) { // The technique has to be used as well when a leading combinator is used // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { - + if ( + nodeType === 1 && + (rdescend.test(selector) || + rleadingCombinator.test(selector)) + ) { // Expand context for sibling selectors - newContext = rsibling.test( selector ) && - testContext( context.parentNode ) || - context; + newContext = + (rsibling.test(selector) && + testContext(context.parentNode)) || + context; // Outside of IE, if we're not changing the context we can // use :scope instead of an ID. @@ -1313,36 +1291,38 @@ function find( selector, context, results, seed ) { // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( newContext != context || isIE ) { - + if (newContext != context || isIE) { // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( 'id' ) ) ) { - nid = jQuery.escapeSelector( nid ); + if ((nid = context.getAttribute('id'))) { + nid = jQuery.escapeSelector(nid); } else { - context.setAttribute( 'id', ( nid = jQuery.expando ) ); + context.setAttribute('id', (nid = jQuery.expando)); } } // Prefix every selector in the list - groups = tokenize( selector ); + groups = tokenize(selector); i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? '#' + nid : ':scope' ) + ' ' + - toSelector( groups[ i ] ); + while (i--) { + groups[i] = + (nid ? '#' + nid : ':scope') + + ' ' + + toSelector(groups[i]); } - newSelector = groups.join( ',' ); + newSelector = groups.join(','); } try { - push.apply( results, - newContext.querySelectorAll( newSelector ) + push.apply( + results, + newContext.querySelectorAll(newSelector) ); return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); + } catch (qsaError) { + nonnativeSelectorCache(selector, true); } finally { - if ( nid === jQuery.expando ) { - context.removeAttribute( 'id' ); + if (nid === jQuery.expando) { + context.removeAttribute('id'); } } } @@ -1350,15 +1330,15 @@ function find( selector, context, results, seed ) { } // All others - return select( selector.replace( rtrimCSS, '$1' ), context, results, seed ); + return select(selector.replace(rtrimCSS, '$1'), context, results, seed); } /** * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ -function markFunction( fn ) { - fn[ jQuery.expando ] = true; +function markFunction(fn) { + fn[jQuery.expando] = true; return fn; } @@ -1366,9 +1346,9 @@ function markFunction( fn ) { * Returns a function to use in pseudos for input types * @param {String} type */ -function createInputPseudo( type ) { - return function( elem ) { - return nodeName( elem, 'input' ) && elem.type === type; +function createInputPseudo(type) { + return function(elem) { + return nodeName(elem, 'input') && elem.type === type; }; } @@ -1376,10 +1356,12 @@ function createInputPseudo( type ) { * Returns a function to use in pseudos for buttons * @param {String} type */ -function createButtonPseudo( type ) { - return function( elem ) { - return ( nodeName( elem, 'input' ) || nodeName( elem, 'button' ) ) && - elem.type === type; +function createButtonPseudo(type) { + return function(elem) { + return ( + (nodeName(elem, 'input') || nodeName(elem, 'button')) && + elem.type === type + ); }; } @@ -1387,16 +1369,13 @@ function createButtonPseudo( type ) { * Returns a function to use in pseudos for :enabled/:disabled * @param {Boolean} disabled true for :disabled; false for :enabled */ -function createDisabledPseudo( disabled ) { - +function createDisabledPseudo(disabled) { // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - + return function(elem) { // Only certain elements can match :enabled or :disabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( 'form' in elem ) { - + if ('form' in elem) { // Check for inherited disabledness on relevant non-disabled elements: // * listed form-associated elements in a disabled fieldset // https://html.spec.whatwg.org/multipage/forms.html#category-listed @@ -1404,11 +1383,10 @@ function createDisabledPseudo( disabled ) { // * option elements in a disabled optgroup // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - + if (elem.parentNode && elem.disabled === false) { // Option elements defer to a parent optgroup if present - if ( 'label' in elem ) { - if ( 'label' in elem.parentNode ) { + if ('label' in elem) { + if ('label' in elem.parentNode) { return elem.parentNode.disabled === disabled; } else { return elem.disabled === disabled; @@ -1417,11 +1395,12 @@ function createDisabledPseudo( disabled ) { // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + return ( + elem.isDisabled === disabled || + // Where there is no isDisabled, check manually + (elem.isDisabled !== !disabled && + inDisabledFieldset(elem) === disabled) + ); } return elem.disabled === disabled; @@ -1429,7 +1408,7 @@ function createDisabledPseudo( disabled ) { // Try to winnow out elements that can't be disabled before trusting the disabled property. // Some victims get caught in our net (label, legend, menu, track), but it shouldn't // even exist on them, let alone have a boolean value. - } else if ( 'label' in elem ) { + } else if ('label' in elem) { return elem.disabled === disabled; } @@ -1442,29 +1421,29 @@ function createDisabledPseudo( disabled ) { * Returns a function to use in pseudos for positionals * @param {Function} fn */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { +function createPositionalPseudo(fn) { + return markFunction(function(argument) { argument = +argument; - return markFunction( function( seed, matches ) { + return markFunction(function(seed, matches) { var j, - matchIndexes = fn( [], seed.length, argument ), + matchIndexes = fn([], seed.length, argument), i = matchIndexes.length; // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); + while (i--) { + if (seed[(j = matchIndexes[i])]) { + seed[j] = !(matches[j] = seed[j]); } } - } ); - } ); + }); + }); } /** * Sets document-related variables once based on the current document * @param {Element|Object} [node] An element or document object to use to set the document */ -function setDocument( node ) { +function setDocument(node) { var subWindow, doc = node ? node.ownerDocument || node : document; @@ -1473,14 +1452,14 @@ function setDocument( node ) { // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( doc == document$1 || doc.nodeType !== 9 ) { + if (doc == document$1 || doc.nodeType !== 9) { return; } // Update global variables document$1 = doc; documentElement$1 = document$1.documentElement; - documentIsHTML = !jQuery.isXMLDoc( document$1 ); + documentIsHTML = !jQuery.isXMLDoc(document$1); // Support: IE 9 - 11+ // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) @@ -1488,35 +1467,39 @@ function setDocument( node ) { // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( isIE && document != document$1 && - ( subWindow = document$1.defaultView ) && subWindow.top !== subWindow ) { - subWindow.addEventListener( 'unload', unloadHandler ); + if ( + isIE && + document != document$1 && + (subWindow = document$1.defaultView) && + subWindow.top !== subWindow + ) { + subWindow.addEventListener('unload', unloadHandler); } } -find.matches = function( expr, elements ) { - return find( expr, null, null, elements ); +find.matches = function(expr, elements) { + return find(expr, null, null, elements); }; -find.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( documentIsHTML && - !nonnativeSelectorCache[ expr + ' ' ] && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { +find.matchesSelector = function(elem, expr) { + setDocument(elem); + if ( + documentIsHTML && + !nonnativeSelectorCache[expr + ' '] && + (!rbuggyQSA || !rbuggyQSA.test(expr)) + ) { try { - return matches.call( elem, expr ); - } catch ( e ) { - nonnativeSelectorCache( expr, true ); + return matches.call(elem, expr); + } catch (e) { + nonnativeSelectorCache(expr, true); } } - return find( expr, document$1, null, [ elem ] ).length > 0; + return find(expr, document$1, null, [elem]).length > 0; }; jQuery.expr = { - // Can be adjusted by the user cacheLength: 50, @@ -1525,214 +1508,261 @@ jQuery.expr = { match: matchExpr, find: { - ID: function( id, context ) { - if ( typeof context.getElementById !== 'undefined' && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; + ID: function(id, context) { + if ( + typeof context.getElementById !== 'undefined' && + documentIsHTML + ) { + var elem = context.getElementById(id); + return elem ? [elem] : []; } }, - TAG: function( tag, context ) { - if ( typeof context.getElementsByTagName !== 'undefined' ) { - return context.getElementsByTagName( tag ); + TAG: function(tag, context) { + if (typeof context.getElementsByTagName !== 'undefined') { + return context.getElementsByTagName(tag); // DocumentFragment nodes don't have gEBTN } else { - return context.querySelectorAll( tag ); + return context.querySelectorAll(tag); } }, - CLASS: function( className, context ) { - if ( typeof context.getElementsByClassName !== 'undefined' && documentIsHTML ) { - return context.getElementsByClassName( className ); + CLASS: function(className, context) { + if ( + typeof context.getElementsByClassName !== 'undefined' && + documentIsHTML + ) { + return context.getElementsByClassName(className); } - } + }, }, relative: { '>': { dir: 'parentNode', first: true }, ' ': { dir: 'parentNode' }, '+': { dir: 'previousSibling', first: true }, - '~': { dir: 'previousSibling' } + '~': { dir: 'previousSibling' }, }, preFilter: preFilter, filter: { - ID: function( id ) { - var attrId = unescapeSelector( id ); - return function( elem ) { - return elem.getAttribute( 'id' ) === attrId; + ID: function(id) { + var attrId = unescapeSelector(id); + return function(elem) { + return elem.getAttribute('id') === attrId; }; }, - TAG: function( nodeNameSelector ) { - var expectedNodeName = unescapeSelector( nodeNameSelector ).toLowerCase(); - return nodeNameSelector === '*' ? - - function() { + TAG: function(nodeNameSelector) { + var expectedNodeName = + unescapeSelector(nodeNameSelector).toLowerCase(); + return nodeNameSelector === '*' + ? function() { return true; - } : - - function( elem ) { - return nodeName( elem, expectedNodeName ); + } + : function(elem) { + return nodeName(elem, expectedNodeName); }; }, - CLASS: function( className ) { - var pattern = classCache[ className + ' ' ]; - - return pattern || - ( pattern = new RegExp( '(^|' + whitespace + ')' + className + - '(' + whitespace + '|$)' ) ) && - classCache( className, function( elem ) { - return pattern.test( - typeof elem.className === 'string' && elem.className || - typeof elem.getAttribute !== 'undefined' && - elem.getAttribute( 'class' ) || - '' - ); - } ); + CLASS: function(className) { + var pattern = classCache[className + ' ']; + + return ( + pattern || + ((pattern = new RegExp( + '(^|' + + whitespace + + ')' + + className + + '(' + + whitespace + + '|$)' + )) && + classCache(className, function(elem) { + return pattern.test( + (typeof elem.className === 'string' && + elem.className) || + (typeof elem.getAttribute !== 'undefined' && + elem.getAttribute('class')) || + '' + ); + })) + ); }, - ATTR: function( name, operator, check ) { - return function( elem ) { - var result = jQuery.attr( elem, name ); + ATTR: function(name, operator, check) { + return function(elem) { + var result = jQuery.attr(elem, name); - if ( result == null ) { + if (result == null) { return operator === '!='; } - if ( !operator ) { + if (!operator) { return true; } result += ''; - if ( operator === '=' ) { + if (operator === '=') { return result === check; } - if ( operator === '!=' ) { + if (operator === '!=') { return result !== check; } - if ( operator === '^=' ) { - return check && result.indexOf( check ) === 0; + if (operator === '^=') { + return check && result.indexOf(check) === 0; } - if ( operator === '*=' ) { - return check && result.indexOf( check ) > -1; + if (operator === '*=') { + return check && result.indexOf(check) > -1; } - if ( operator === '$=' ) { - return check && result.slice( -check.length ) === check; + if (operator === '$=') { + return check && result.slice(-check.length) === check; } - if ( operator === '~=' ) { - return ( ' ' + result.replace( rwhitespace, ' ' ) + ' ' ) - .indexOf( check ) > -1; + if (operator === '~=') { + return ( + (' ' + result.replace(rwhitespace, ' ') + ' ').indexOf( + check + ) > -1 + ); } - if ( operator === '|=' ) { - return result === check || result.slice( 0, check.length + 1 ) === check + '-'; + if (operator === '|=') { + return ( + result === check || + result.slice(0, check.length + 1) === check + '-' + ); } return false; }; }, - CHILD: function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== 'nth', - forward = type.slice( -4 ) !== 'last', + CHILD: function(type, what, _argument, first, last) { + var simple = type.slice(0, 3) !== 'nth', + forward = type.slice(-4) !== 'last', ofType = what === 'of-type'; - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { + return first === 1 && last === 0 + ? // Shortcut for :nth-*(n) + function(elem) { return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? 'nextSibling' : 'previousSibling', + } + : function(elem, _context, xml) { + var cache, + outerCache, + node, + nodeIndex, + start, + dir = + simple !== forward + ? 'nextSibling' + : 'previousSibling', parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false; - if ( parent ) { - + if (parent) { // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { + if (simple) { + while (dir) { node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) { - + while ((node = node[dir])) { + if ( + ofType + ? nodeName(node, name) + : node.nodeType === 1 + ) { return false; } } // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === 'only' && !start && 'nextSibling'; + start = dir = + type === 'only' && + !start && + 'nextSibling'; } return true; } - start = [ forward ? parent.firstChild : parent.lastChild ]; + start = [ + forward ? parent.firstChild : parent.lastChild, + ]; // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - + if (forward && useCache) { // Seek `elem` from a previously-cached index - outerCache = parent[ jQuery.expando ] || - ( parent[ jQuery.expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - + outerCache = + parent[jQuery.expando] || + (parent[jQuery.expando] = {}); + cache = outerCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = nodeIndex && cache[2]; + node = nodeIndex && parent.childNodes[nodeIndex]; + + while ( + (node = + (++nodeIndex && node && node[dir]) || + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || + start.pop()) + ) { // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + if ( + node.nodeType === 1 && + ++diff && + node === elem + ) { + outerCache[type] = [ + dirruns, + nodeIndex, + diff, + ]; break; } } - } else { - // Use previously-cached element index if available - if ( useCache ) { - outerCache = elem[ jQuery.expando ] || - ( elem[ jQuery.expando ] = {} ); - cache = outerCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + if (useCache) { + outerCache = + elem[jQuery.expando] || + (elem[jQuery.expando] = {}); + cache = outerCache[type] || []; + nodeIndex = cache[0] === dirruns && cache[1]; diff = nodeIndex; } // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - + if (diff === false) { // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - nodeName( node, name ) : - node.nodeType === 1 ) && - ++diff ) { - + while ( + (node = + (++nodeIndex && node && node[dir]) || + (diff = nodeIndex = 0) || + start.pop()) + ) { + if ( + (ofType + ? nodeName(node, name) + : node.nodeType === 1) && + ++diff + ) { // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ jQuery.expando ] || - ( node[ jQuery.expando ] = {} ); - outerCache[ type ] = [ dirruns, diff ]; + if (useCache) { + outerCache = + node[jQuery.expando] || + (node[jQuery.expando] = {}); + outerCache[type] = [ + dirruns, + diff, + ]; } - if ( node === elem ) { + if (node === elem) { break; } } @@ -1742,80 +1772,83 @@ jQuery.expr = { // Incorporate the offset, then check against cycle size diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); + return ( + diff === first || + (diff % first === 0 && diff / first >= 0) + ); } }; }, - PSEUDO: function( pseudo, argument ) { - + PSEUDO: function(pseudo, argument) { // pseudo-class names are case-insensitive // https://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters // Remember that setFilters inherits from pseudos - var fn = jQuery.expr.pseudos[ pseudo ] || - jQuery.expr.setFilters[ pseudo.toLowerCase() ] || - selectorError( 'unsupported pseudo: ' + pseudo ); + var fn = + jQuery.expr.pseudos[pseudo] || + jQuery.expr.setFilters[pseudo.toLowerCase()] || + selectorError('unsupported pseudo: ' + pseudo); // The user may use createPseudo to indicate that // arguments are needed to create the filter function // just as jQuery does - if ( fn[ jQuery.expando ] ) { - return fn( argument ); + if (fn[jQuery.expando]) { + return fn(argument); } return fn; - } + }, }, pseudos: { - // Potentially complex pseudos - not: markFunction( function( selector ) { - + not: markFunction(function(selector) { // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators var input = [], results = [], - matcher = compile( selector.replace( rtrimCSS, '$1' ) ); + matcher = compile(selector.replace(rtrimCSS, '$1')); - return matcher[ jQuery.expando ] ? - markFunction( function( seed, matches, _context, xml ) { + return matcher[jQuery.expando] + ? markFunction(function(seed, matches, _context, xml) { var elem, - unmatched = matcher( seed, null, xml, [] ), + unmatched = matcher(seed, null, xml, []), i = seed.length; // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); + while (i--) { + if ((elem = unmatched[i])) { + seed[i] = !(matches[i] = elem); } } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); + }) + : function(elem, _context, xml) { + input[0] = elem; + matcher(input, null, xml, results); // Don't keep the element // (see https://github.com/jquery/sizzle/issues/299) - input[ 0 ] = null; + input[0] = null; return !results.pop(); }; - } ), + }), - has: markFunction( function( selector ) { - return function( elem ) { - return find( selector, elem ).length > 0; + has: markFunction(function(selector) { + return function(elem) { + return find(selector, elem).length > 0; }; - } ), + }), - contains: markFunction( function( text ) { - text = unescapeSelector( text ); - return function( elem ) { - return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + contains: markFunction(function(text) { + text = unescapeSelector(text); + return function(elem) { + return ( + (elem.textContent || jQuery.text(elem)).indexOf(text) > -1 + ); }; - } ), + }), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value @@ -1824,63 +1857,69 @@ jQuery.expr = { // The matching of C against the element's language value is performed case-insensitively. // The identifier C does not have to be a valid language name." // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction( function( lang ) { - + lang: markFunction(function(lang) { // lang value must be a valid identifier - if ( !ridentifier.test( lang || '' ) ) { - selectorError( 'unsupported lang: ' + lang ); + if (!ridentifier.test(lang || '')) { + selectorError('unsupported lang: ' + lang); } - lang = unescapeSelector( lang ).toLowerCase(); - return function( elem ) { + lang = unescapeSelector(lang).toLowerCase(); + return function(elem) { var elemLang; do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( 'xml:lang' ) || elem.getAttribute( 'lang' ) ) ) { - + if ( + (elemLang = documentIsHTML + ? elem.lang + : elem.getAttribute('xml:lang') || + elem.getAttribute('lang')) + ) { elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + '-' ) === 0; + return ( + elemLang === lang || + elemLang.indexOf(lang + '-') === 0 + ); } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + } while ((elem = elem.parentNode) && elem.nodeType === 1); return false; }; - } ), + }), // Miscellaneous - target: function( elem ) { + target: function(elem) { var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; + return hash && hash.slice(1) === elem.id; }, - root: function( elem ) { + root: function(elem) { return elem === documentElement$1; }, - focus: function( elem ) { - return elem === document$1.activeElement && - document$1.hasFocus() && - !!( elem.type || elem.href || ~elem.tabIndex ); + focus: function(elem) { + return ( + elem === document$1.activeElement && + document$1.hasFocus() && + !!(elem.type || elem.href || ~elem.tabIndex) + ); }, // Boolean properties - enabled: createDisabledPseudo( false ), - disabled: createDisabledPseudo( true ), - - checked: function( elem ) { + enabled: createDisabledPseudo(false), + disabled: createDisabledPseudo(true), + checked: function(elem) { // In CSS3, :checked should return both checked and selected elements // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( nodeName( elem, 'input' ) && !!elem.checked ) || - ( nodeName( elem, 'option' ) && !!elem.selected ); + return ( + (nodeName(elem, 'input') && !!elem.checked) || + (nodeName(elem, 'option') && !!elem.selected) + ); }, - selected: function( elem ) { - + selected: function(elem) { // Support: IE <=11+ // Accessing the selectedIndex property // forces the browser to treat the default option as // selected when in an optgroup. - if ( isIE && elem.parentNode ) { + if (isIE && elem.parentNode) { // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } @@ -1889,106 +1928,113 @@ jQuery.expr = { }, // Contents - empty: function( elem ) { - + empty: function(elem) { // https://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { + for (elem = elem.firstChild; elem; elem = elem.nextSibling) { + if (elem.nodeType < 6) { return false; } } return true; }, - parent: function( elem ) { - return !jQuery.expr.pseudos.empty( elem ); + parent: function(elem) { + return !jQuery.expr.pseudos.empty(elem); }, // Element/input types - header: function( elem ) { - return rheader.test( elem.nodeName ); + header: function(elem) { + return rheader.test(elem.nodeName); }, - input: function( elem ) { - return rinputs.test( elem.nodeName ); + input: function(elem) { + return rinputs.test(elem.nodeName); }, - button: function( elem ) { - return nodeName( elem, 'input' ) && elem.type === 'button' || - nodeName( elem, 'button' ); + button: function(elem) { + return ( + (nodeName(elem, 'input') && elem.type === 'button') || + nodeName(elem, 'button') + ); }, - text: function( elem ) { - return nodeName( elem, 'input' ) && elem.type === 'text'; + text: function(elem) { + return nodeName(elem, 'input') && elem.type === 'text'; }, // Position-in-collection - first: createPositionalPseudo( function() { - return [ 0 ]; - } ), + first: createPositionalPseudo(function() { + return [0]; + }), - last: createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), + last: createPositionalPseudo(function(_matchIndexes, length) { + return [length - 1]; + }), - eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), + eq: createPositionalPseudo(function(_matchIndexes, length, argument) { + return [argument < 0 ? argument + length : argument]; + }), - even: createPositionalPseudo( function( matchIndexes, length ) { + even: createPositionalPseudo(function(matchIndexes, length) { var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); + for (; i < length; i += 2) { + matchIndexes.push(i); } return matchIndexes; - } ), + }), - odd: createPositionalPseudo( function( matchIndexes, length ) { + odd: createPositionalPseudo(function(matchIndexes, length) { var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); + for (; i < length; i += 2) { + matchIndexes.push(i); } return matchIndexes; - } ), + }), - lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + lt: createPositionalPseudo(function(matchIndexes, length, argument) { var i; - if ( argument < 0 ) { + if (argument < 0) { i = argument + length; - } else if ( argument > length ) { + } else if (argument > length) { i = length; } else { i = argument; } - for ( ; --i >= 0; ) { - matchIndexes.push( i ); + for (; --i >= 0; ) { + matchIndexes.push(i); } return matchIndexes; - } ), + }), - gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + gt: createPositionalPseudo(function(matchIndexes, length, argument) { var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); + for (; ++i < length; ) { + matchIndexes.push(i); } return matchIndexes; - } ) - } + }), + }, }; jQuery.expr.pseudos.nth = jQuery.expr.pseudos.eq; // Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - jQuery.expr.pseudos[ i ] = createInputPseudo( i ); +for (i in { + radio: true, + checkbox: true, + file: true, + password: true, + image: true, +}) { + jQuery.expr.pseudos[i] = createInputPseudo(i); } -for ( i in { submit: true, reset: true } ) { - jQuery.expr.pseudos[ i ] = createButtonPseudo( i ); +for (i in { submit: true, reset: true }) { + jQuery.expr.pseudos[i] = createButtonPseudo(i); } // Easy API for creating new setFilters @@ -1996,58 +2042,60 @@ function setFilters() {} setFilters.prototype = jQuery.expr.filters = jQuery.expr.pseudos; jQuery.expr.setFilters = new setFilters(); -function addCombinator( matcher, combinator, base ) { +function addCombinator(matcher, combinator, base) { var dir = combinator.dir, skip = combinator.next, key = skip || dir, checkNonElements = base && key === 'parentNode', doneName = done++; - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); + return combinator.first + ? // Check against closest ancestor/preceding element + function(elem, context, xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + return matcher(elem, context, xml); } } return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; + } + : // Check against all ancestor/preceding elements + function(elem, context, xml) { + var oldCache, + outerCache, + newCache = [dirruns, doneName]; // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { + if (xml) { + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + if (matcher(elem, context, xml)) { return true; } } } } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ jQuery.expando ] || ( elem[ jQuery.expando ] = {} ); - - if ( skip && nodeName( elem, skip ) ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = outerCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - + while ((elem = elem[dir])) { + if (elem.nodeType === 1 || checkNonElements) { + outerCache = + elem[jQuery.expando] || + (elem[jQuery.expando] = {}); + + if (skip && nodeName(elem, skip)) { + elem = elem[dir] || elem; + } else if ( + (oldCache = outerCache[key]) && + oldCache[0] === dirruns && + oldCache[1] === doneName + ) { // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); + return (newCache[2] = oldCache[2]); } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ key ] = newCache; + outerCache[key] = newCache; // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + if ((newCache[2] = matcher(elem, context, xml))) { return true; } } @@ -2058,42 +2106,42 @@ function addCombinator( matcher, combinator, base ) { }; } -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { +function elementMatcher(matchers) { + return matchers.length > 1 + ? function(elem, context, xml) { var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { + while (i--) { + if (!matchers[i](elem, context, xml)) { return false; } } return true; - } : - matchers[ 0 ]; + } + : matchers[0]; } -function multipleContexts( selector, contexts, results ) { +function multipleContexts(selector, contexts, results) { var i = 0, len = contexts.length; - for ( ; i < len; i++ ) { - find( selector, contexts[ i ], results ); + for (; i < len; i++) { + find(selector, contexts[i], results); } return results; } -function condense( unmatched, map, filter, context, xml ) { +function condense(unmatched, map, filter, context, xml) { var elem, newUnmatched = [], i = 0, len = unmatched.length, mapped = map != null; - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); + for (; i < len; i++) { + if ((elem = unmatched[i])) { + if (!filter || filter(elem, context, xml)) { + newUnmatched.push(elem); + if (mapped) { + map.push(i); } } } @@ -2102,85 +2150,97 @@ function condense( unmatched, map, filter, context, xml ) { return newUnmatched; } -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ jQuery.expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ jQuery.expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, matcherOut, +function setMatcher( + preFilter, + selector, + matcher, + postFilter, + postFinder, + postSelector +) { + if (postFilter && !postFilter[jQuery.expando]) { + postFilter = setMatcher(postFilter); + } + if (postFinder && !postFinder[jQuery.expando]) { + postFinder = setMatcher(postFinder, postSelector); + } + return markFunction(function(seed, results, context, xml) { + var temp, + i, + elem, + matcherOut, preMap = [], postMap = [], preexisting = results.length, - // Get initial elements from seed or context - elems = seed || - multipleContexts( selector || '*', - context.nodeType ? [ context ] : context, [] ), - + elems = + seed || + multipleContexts( + selector || '*', + context.nodeType ? [context] : context, + [] + ), // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems; - - if ( matcher ) { + matcherIn = + preFilter && (seed || !selector) + ? condense(elems, preMap, preFilter, context, xml) + : elems; + if (matcher) { // If we have a postFinder, or filtered seed, or non-seed postFilter // or preexisting results, - matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results; + matcherOut = + postFinder || (seed ? preFilter : preexisting || postFilter) + ? // ...intermediate processing is necessary + [] + : // ...otherwise use results directly + results; // Find primary matches - matcher( matcherIn, matcherOut, context, xml ); + matcher(matcherIn, matcherOut, context, xml); } else { matcherOut = matcherIn; } // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); + if (postFilter) { + temp = condense(matcherOut, postMap); + postFilter(temp, [], context, xml); // Un-match failing elements by moving them back to matcherIn i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + while (i--) { + if ((elem = temp[i])) { + matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); } } } - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - + if (seed) { + if (postFinder || preFilter) { + if (postFinder) { // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - + while (i--) { + if ((elem = matcherOut[i])) { // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); + temp.push((matcherIn[i] = elem)); } } - postFinder( null, ( matcherOut = [] ), temp, xml ); + postFinder(null, (matcherOut = []), temp, xml); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); + while (i--) { + if ( + (elem = matcherOut[i]) && + (temp = postFinder + ? indexOf.call(seed, elem) + : preMap[i]) > -1 + ) { + seed[temp] = !(results[temp] = elem); } } } @@ -2188,148 +2248,164 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS // Add elements to results, through postFinder if defined } else { matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut + matcherOut === results + ? matcherOut.splice(preexisting, matcherOut.length) + : matcherOut ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); + if (postFinder) { + postFinder(null, results, matcherOut, xml); } else { - push.apply( results, matcherOut ); + push.apply(results, matcherOut); } } - } ); + }); } -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, +function matcherFromTokens(tokens) { + var checkContext, + matcher, + j, len = tokens.length, - leadingRelative = jQuery.expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || jQuery.expr.relative[ ' ' ], + leadingRelative = jQuery.expr.relative[tokens[0].type], + implicitRelative = leadingRelative || jQuery.expr.relative[' '], i = leadingRelative ? 1 : 0, - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { + matchContext = addCombinator( + function(elem) { + return elem === checkContext; + }, + implicitRelative, + true + ), + matchAnyContext = addCombinator( + function(elem) { + return indexOf.call(checkContext, elem) > -1; + }, + implicitRelative, + true + ), + matchers = [ + function(elem, context, xml) { + // Support: IE 11+ + // IE sometimes throws a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = + (!leadingRelative && + (xml || context != outermostContext)) || + ((checkContext = context).nodeType + ? matchContext(elem, context, xml) + : matchAnyContext(elem, context, xml)); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + }, + ]; - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = jQuery.expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + for (; i < len; i++) { + if ((matcher = jQuery.expr.relative[tokens[i].type])) { + matchers = [addCombinator(elementMatcher(matchers), matcher)]; } else { - matcher = jQuery.expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + matcher = jQuery.expr.filter[tokens[i].type].apply( + null, + tokens[i].matches + ); // Return special upon seeing a positional matcher - if ( matcher[ jQuery.expando ] ) { - + if (matcher[jQuery.expando]) { // Find the next relative operator (if any) for proper handling j = ++i; - for ( ; j < len; j++ ) { - if ( jQuery.expr.relative[ tokens[ j ].type ] ) { + for (; j < len; j++) { + if (jQuery.expr.relative[tokens[j].type]) { break; } } return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === ' ' ? '*' : '' } ) - ).replace( rtrimCSS, '$1' ), + i > 1 && elementMatcher(matchers), + i > 1 && + toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice(0, i - 1).concat({ + value: tokens[i - 2].type === ' ' ? '*' : '', + }) + ).replace(rtrimCSS, '$1'), matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) + i < j && matcherFromTokens(tokens.slice(i, j)), + j < len && matcherFromTokens((tokens = tokens.slice(j))), + j < len && toSelector(tokens) ); } - matchers.push( matcher ); + matchers.push(matcher); } } - return elementMatcher( matchers ); + return elementMatcher(matchers); } -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { +function matcherFromGroupMatchers(elementMatchers, setMatchers) { var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, + superMatcher = function(seed, context, xml, results, outermost) { + var elem, + j, + matcher, matchedCount = 0, i = '0', unmatched = seed && [], setMatched = [], contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && jQuery.expr.find.TAG( '*', outermost ), - + elems = + seed || (byElement && jQuery.expr.find.TAG('*', outermost)), // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ); - - if ( outermost ) { + dirrunsUnique = (dirruns += + contextBackup == null ? 1 : Math.random() || 0.1); + if (outermost) { // Support: IE 11+ // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - outermostContext = context == document$1 || context || outermost; + outermostContext = + context == document$1 || context || outermost; } // Add elements passing elementMatchers directly to results - for ( ; ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { + for (; (elem = elems[i]) != null; i++) { + if (byElement && elem) { j = 0; // Support: IE 11+ // IE sometimes throws a "Permission denied" error when strict-comparing // two documents; shallow comparisons work. // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document$1 ) { - setDocument( elem ); + if (!context && elem.ownerDocument != document$1) { + setDocument(elem); xml = !documentIsHTML; } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document$1, xml ) ) { - push.call( results, elem ); + while ((matcher = elementMatchers[j++])) { + if (matcher(elem, context || document$1, xml)) { + push.call(results, elem); break; } } - if ( outermost ) { + if (outermost) { dirruns = dirrunsUnique; } } // Track unmatched elements for set filters - if ( bySet ) { - + if (bySet) { // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { + if ((elem = !matcher && elem)) { matchedCount--; } // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); + if (seed) { + unmatched.push(elem); } } } @@ -2345,40 +2421,42 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that // case, which will result in a "00" `matchedCount` that differs from `i` but is also // numerically zero. - if ( bySet && i !== matchedCount ) { + if (bySet && i !== matchedCount) { j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); + while ((matcher = setMatchers[j++])) { + matcher(unmatched, setMatched, context, xml); } - if ( seed ) { - + if (seed) { // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); + if (matchedCount > 0) { + while (i--) { + if (!(unmatched[i] || setMatched[i])) { + setMatched[i] = pop.call(results); } } } // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); + setMatched = condense(setMatched); } // Add matches to results - push.apply( results, setMatched ); + push.apply(results, setMatched); // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - jQuery.uniqueSort( results ); + if ( + outermost && + !seed && + setMatched.length > 0 && + matchedCount + setMatchers.length > 1 + ) { + jQuery.uniqueSort(results); } } // Override manipulation of globals by nested matchers - if ( outermost ) { + if (outermost) { dirruns = dirrunsUnique; outermostContext = contextBackup; } @@ -2386,36 +2464,35 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { return unmatched; }; - return bySet ? - markFunction( superMatcher ) : - superMatcher; + return bySet ? markFunction(superMatcher) : superMatcher; } -function compile( selector, match /* Internal Use Only */ ) { +function compile(selector, match /* Internal Use Only */) { var i, setMatchers = [], elementMatchers = [], - cached = compilerCache[ selector + ' ' ]; - - if ( !cached ) { + cached = compilerCache[selector + ' ']; + if (!cached) { // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); + if (!match) { + match = tokenize(selector); } i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ jQuery.expando ] ) { - setMatchers.push( cached ); + while (i--) { + cached = matcherFromTokens(match[i]); + if (cached[jQuery.expando]) { + setMatchers.push(cached); } else { - elementMatchers.push( cached ); + elementMatchers.push(cached); } } // Cache the compiled function - cached = compilerCache( selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + cached = compilerCache( + selector, + matcherFromGroupMatchers(elementMatchers, setMatchers) + ); // Save selector and tokenization cached.selector = selector; @@ -2432,61 +2509,68 @@ function compile( selector, match /* Internal Use Only */ ) { * @param {Array} [results] * @param {Array} [seed] A set of elements to match against */ -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, +function select(selector, context, results, seed) { + var i, + tokens, + token, + type, + find, compiled = typeof selector === 'function' && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + match = !seed && tokenize((selector = compiled.selector || selector)); results = results || []; // Try to minimize operations if there is only one selector in the list and no seed // (the latter of which guarantees us context) - if ( match.length === 1 ) { - + if (match.length === 1) { // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === 'ID' && - context.nodeType === 9 && documentIsHTML && - jQuery.expr.relative[ tokens[ 1 ].type ] ) { - - context = ( jQuery.expr.find.ID( - unescapeSelector( token.matches[ 0 ] ), + tokens = match[0] = match[0].slice(0); + if ( + tokens.length > 2 && + (token = tokens[0]).type === 'ID' && + context.nodeType === 9 && + documentIsHTML && + jQuery.expr.relative[tokens[1].type] + ) { + context = (jQuery.expr.find.ID( + unescapeSelector(token.matches[0]), context - ) || [] )[ 0 ]; - if ( !context ) { + ) || [])[0]; + if (!context) { return results; // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { + } else if (compiled) { context = context.parentNode; } - selector = selector.slice( tokens.shift().value.length ); + selector = selector.slice(tokens.shift().value.length); } // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; + i = matchExpr.needsContext.test(selector) ? 0 : tokens.length; + while (i--) { + token = tokens[i]; // Abort if we hit a combinator - if ( jQuery.expr.relative[ ( type = token.type ) ] ) { + if (jQuery.expr.relative[(type = token.type)]) { break; } - if ( ( find = jQuery.expr.find[ type ] ) ) { - + if ((find = jQuery.expr.find[type])) { // Search, expanding context for leading sibling combinators - if ( ( seed = find( - unescapeSelector( token.matches[ 0 ] ), - rsibling.test( tokens[ 0 ].type ) && - testContext( context.parentNode ) || context - ) ) ) { - + if ( + (seed = find( + unescapeSelector(token.matches[0]), + (rsibling.test(tokens[0].type) && + testContext(context.parentNode)) || + context + )) + ) { // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); + tokens.splice(i, 1); + selector = seed.length && toSelector(tokens); + if (!selector) { + push.apply(results, seed); return results; } @@ -2498,12 +2582,14 @@ function select( selector, context, results, seed ) { // Compile and execute a filtering function if one is not provided // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( + (compiled || compile(selector, match))( seed, context, !documentIsHTML, results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + !context || + (rsibling.test(selector) && testContext(context.parentNode)) || + context ); return results; } @@ -2523,170 +2609,176 @@ find.tokenize = tokenize; var rneedsContext = jQuery.expr.match.needsContext; // Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( typeof qualifier === 'function' ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); +function winnow(elements, qualifier, not) { + if (typeof qualifier === 'function') { + return jQuery.grep(elements, function(elem, i) { + return !!qualifier.call(elem, i, elem) !== not; + }); } // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); + if (qualifier.nodeType) { + return jQuery.grep(elements, function(elem) { + return (elem === qualifier) !== not; + }); } // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== 'string' ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); + if (typeof qualifier !== 'string') { + return jQuery.grep(elements, function(elem) { + return indexOf.call(qualifier, elem) > -1 !== not; + }); } // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); + return jQuery.filter(qualifier, elements, not); } -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; +jQuery.filter = function(expr, elems, not) { + var elem = elems[0]; - if ( not ) { + if (not) { expr = ':not(' + expr + ')'; } - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + if (elems.length === 1 && elem.nodeType === 1) { + return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; } - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); + return jQuery.find.matches( + expr, + jQuery.grep(elems, function(elem) { + return elem.nodeType === 1; + }) + ); }; -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, +Object.assign(jQuery.fn, { + find: function(selector) { + var i, + ret, len = this.length, self = this; - if ( typeof selector !== 'string' ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; + if (typeof selector !== 'string') { + return this.pushStack( + jQuery(selector).filter(function() { + for (i = 0; i < len; i++) { + if (jQuery.contains(self[i], this)) { + return true; + } } - } - } ) ); + }) + ); } - ret = this.pushStack( [] ); + ret = this.pushStack([]); - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); + for (i = 0; i < len; i++) { + jQuery.find(selector, self[i], ret); } - return len > 1 ? jQuery.uniqueSort( ret ) : ret; + return len > 1 ? jQuery.uniqueSort(ret) : ret; }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); + filter: function(selector) { + return this.pushStack(winnow(this, selector || [], false)); }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); + not: function(selector) { + return this.pushStack(winnow(this, selector || [], true)); }, - is: function( selector ) { + is: function(selector) { return !!winnow( this, // If this is a positional/relative selector, check membership in the returned set // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === 'string' && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], + typeof selector === 'string' && rneedsContext.test(selector) + ? jQuery(selector) + : selector || [], false ).length; - } -} ); + }, +}); // Initialize a jQuery object // A central reference to the root jQuery(document) var rootjQuery, - // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (trac-9521) // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed rquickExpr$1 = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context ) { + init = (jQuery.fn.init = function(selector, context) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { + if (!selector) { return this; } // HANDLE: $(DOMElement) - if ( selector.nodeType ) { - this[ 0 ] = selector; + if (selector.nodeType) { + this[0] = selector; this.length = 1; return this; // HANDLE: $(function) // Shortcut for document ready - } else if ( typeof selector === 'function' ) { - return rootjQuery.ready !== undefined ? - rootjQuery.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - + } else if (typeof selector === 'function') { + return rootjQuery.ready !== undefined + ? rootjQuery.ready(selector) + : // Execute immediately if ready is not present + selector(jQuery); } else { - // Handle obvious HTML strings match = selector + ''; - if ( isObviousHtml( match ) ) { - + if (isObviousHtml(match)) { // Assume that strings that start and end with <> are HTML and skip // the regex check. This also handles browser-supported HTML wrappers // like TrustedHTML. - match = [ null, selector, null ]; + match = [null, selector, null]; // Handle HTML strings or selectors - } else if ( typeof selector === 'string' ) { - match = rquickExpr$1.exec( selector ); + } else if (typeof selector === 'string') { + match = rquickExpr$1.exec(selector); } else { - return jQuery.makeArray( selector, this ); + return jQuery.makeArray(selector, this); } // Match html or make sure no context is specified for #id // Note: match[1] may be a string or a TrustedHTML wrapper - if ( match && ( match[ 1 ] || !context ) ) { - + if (match && (match[1] || !context)) { // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; + if (match[1]) { + context = context instanceof jQuery ? context[0] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); + jQuery.merge( + this, + jQuery.parseHTML( + match[1], + context && context.nodeType + ? context.ownerDocument || context + : document, + true + ) + ); // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - + if ( + rsingleTag.test(match[1]) && + jQuery.isPlainObject(context) + ) { + for (match in context) { // Properties of context are called as methods if possible - if ( typeof this[ match ] === 'function' ) { - this[ match ]( context[ match ] ); + if (typeof this[match] === 'function') { + this[match](context[match]); // ...and otherwise set as attributes } else { - this.attr( match, context[ match ] ); + this.attr(match, context[match]); } } } @@ -2695,35 +2787,33 @@ var rootjQuery, // HANDLE: $(#id) } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { + elem = document.getElementById(match[2]); + if (elem) { // Inject the element directly into the jQuery object - this[ 0 ] = elem; + this[0] = elem; this.length = 1; } return this; } // HANDLE: $(expr) & $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); + } else if (!context || context.jquery) { + return (context || rootjQuery).find(selector); // HANDLE: $(expr, context) // (which is just equivalent to: $(context).find(expr) } else { - return this.constructor( context ).find( selector ); + return this.constructor(context).find(selector); } } - - }; + }); // Give the init function the jQuery prototype for later instantiation init.prototype = jQuery.fn; // Initialize central reference -rootjQuery = jQuery( document ); +rootjQuery = jQuery(document); var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; @@ -2735,65 +2825,59 @@ function returnFalse() { return false; } -function on( elem, types, selector, data, fn, one ) { +function on(elem, types, selector, data, fn, one) { var origFn, type; // Types can be a map of types/handlers - if ( typeof types === 'object' ) { - + if (typeof types === 'object') { // ( types-Object, selector, data ) - if ( typeof selector !== 'string' ) { - + if (typeof selector !== 'string') { // ( types-Object, data ) data = data || selector; selector = undefined; } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); + for (type in types) { + on(elem, type, selector, data, types[type], one); } return elem; } - if ( data == null && fn == null ) { - + if (data == null && fn == null) { // ( types, fn ) fn = selector; data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === 'string' ) { - + } else if (fn == null) { + if (typeof selector === 'string') { // ( types, selector, fn ) fn = data; data = undefined; } else { - // ( types, data, fn ) fn = data; data = selector; selector = undefined; } } - if ( fn === false ) { + if (fn === false) { fn = returnFalse; - } else if ( !fn ) { + } else if (!fn) { return elem; } - if ( one === 1 ) { + if (one === 1) { origFn = fn; - fn = function( event ) { - + fn = function(event) { // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); + jQuery().off(event); + return origFn.apply(this, arguments); }; // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); + return elem.each(function() { + jQuery.event.add(this, types, fn, data, selector); + }); } /* @@ -2801,21 +2885,27 @@ function on( elem, types, selector, data, fn, one ) { * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); + add: function(elem, types, handler, data, selector) { + var handleObjIn, + eventHandle, + tmp, + events, + t, + handleObj, + special, + handlers, + type, + namespaces, + origType, + elemData = dataPriv.get(elem); // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { + if (!acceptData(elem)) { return; } // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { + if (handler.handler) { handleObjIn = handler; handler = handleObjIn.handler; selector = handleObjIn.selector; @@ -2823,222 +2913,261 @@ jQuery.event = { // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); + if (selector) { + jQuery.find.matchesSelector(documentElement, selector); } // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { + if (!handler.guid) { handler.guid = jQuery.guid++; } // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); + if (!(events = elemData.events)) { + events = elemData.events = Object.create(null); } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function(e) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded - return typeof jQuery !== 'undefined' && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; + return typeof jQuery !== 'undefined' && + jQuery.event.triggered !== e.type + ? jQuery.event.dispatch.apply(elem, arguments) + : undefined; }; } // Handle multiple events separated by a space - types = ( types || '' ).match( rnothtmlwhite ) || [ '' ]; + types = (types || '').match(rnothtmlwhite) || ['']; t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || '' ).split( '.' ).sort(); + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || '').split('.').sort(); // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { + if (!type) { continue; } // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; + special = jQuery.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; + type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; + special = jQuery.event.special[type] || {}; // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( '.' ) - }, handleObjIn ); + handleObj = Object.assign( + { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: + selector && + jQuery.expr.match.needsContext.test(selector), + namespace: namespaces.join('.'), + }, + handleObjIn + ); // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; + if (!(handlers = events[type])) { + handlers = events[type] = []; handlers.delegateCount = 0; // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); + if ( + !special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === + false + ) { + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle); } } } - if ( special.add ) { - special.add.call( elem, handleObj ); + if (special.add) { + special.add.call(elem, handleObj); - if ( !handleObj.handler.guid ) { + if (!handleObj.handler.guid) { handleObj.handler.guid = handler.guid; } } // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); } else { - handlers.push( handleObj ); + handlers.push(handleObj); } } - }, // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { + remove: function(elem, types, handler, selector, mappedTypes) { + var j, + origCount, + tmp, + events, + t, + handleObj, + special, + handlers, + type, + namespaces, + origType, + elemData = dataPriv.hasData(elem) && dataPriv.get(elem); + + if (!elemData || !(events = elemData.events)) { return; } // Once for each type.namespace in types; type may be omitted - types = ( types || '' ).match( rnothtmlwhite ) || [ '' ]; + types = (types || '').match(rnothtmlwhite) || ['']; t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || '' ).split( '.' ).sort(); + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || '').split('.').sort(); // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + if (!type) { + for (type in events) { + jQuery.event.remove( + elem, + type + types[t], + handler, + selector, + true + ); } continue; } - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( '(^|\\.)' + namespaces.join( '\\.(?:.*\\.|)' ) + '(\\.|$)' ); + special = jQuery.event.special[type] || {}; + type = (selector ? special.delegateType : special.bindType) || type; + handlers = events[type] || []; + tmp = + tmp[2] && + new RegExp( + '(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)' + ); // Remove matching events origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === '**' && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { + while (j--) { + handleObj = handlers[j]; + + if ( + (mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!tmp || tmp.test(handleObj.namespace)) && + (!selector || + selector === handleObj.selector || + (selector === '**' && handleObj.selector)) + ) { + handlers.splice(j, 1); + + if (handleObj.selector) { handlers.delegateCount--; } - if ( special.remove ) { - special.remove.call( elem, handleObj ); + if (special.remove) { + special.remove.call(elem, handleObj); } } } // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); + if (origCount && !handlers.length) { + if ( + !special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === + false + ) { + jQuery.removeEvent(elem, type, elemData.handle); } - delete events[ type ]; + delete events[type]; } } // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, 'handle events' ); + if (jQuery.isEmptyObject(events)) { + dataPriv.remove(elem, 'handle events'); } }, - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - + dispatch: function(nativeEvent) { + var i, + j, + ret, + matched, + handleObj, + handlerQueue, + args = new Array(arguments.length), // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, 'events' ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; + event = jQuery.event.fix(nativeEvent), + handlers = + (dataPriv.get(this, 'events') || Object.create(null))[ + event.type + ] || [], + special = jQuery.event.special[event.type] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; + args[0] = event; - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; + for (i = 1; i < arguments.length; i++) { + args[i] = arguments[i]; } event.delegateTarget = this; // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + if ( + special.preDispatch && + special.preDispatch.call(this, event) === false + ) { return; } // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + handlerQueue = jQuery.event.handlers.call(this, event, handlers); // Run delegates first; they may want to stop propagation beneath us i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { event.currentTarget = matched.elem; j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - + while ( + (handleObj = matched.handlers[j++]) && + !event.isImmediatePropagationStopped() + ) { // If the event is namespaced, then each handler is only invoked if it is // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - + if ( + !event.rnamespace || + handleObj.namespace === false || + event.rnamespace.test(handleObj.namespace) + ) { event.handleObj = handleObj; event.data = handleObj.data; - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); + ret = ( + (jQuery.event.special[handleObj.origType] || {}) + .handle || handleObj.handler + ).apply(matched.elem, args); - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { + if (ret !== undefined) { + if ((event.result = ret) === false) { event.preventDefault(); event.stopPropagation(); } @@ -3048,53 +3177,70 @@ jQuery.event = { } // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); + if (special.postDispatch) { + special.postDispatch.call(this, event); } return event.result; }, - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlers: function(event, handlers) { + var i, + handleObj, + sel, + matchedHandlers, + matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; // Find delegate handlers - if ( delegateCount && - - // Support: Firefox <=42 - 66+ - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11+ - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === 'click' && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - + if ( + delegateCount && + // Support: Firefox <=42 - 66+ + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11+ + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !(event.type === 'click' && event.button >= 1) + ) { + for (; cur !== this; cur = cur.parentNode || this) { // Don't check non-elements (trac-13208) // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( cur.nodeType === 1 && !( event.type === 'click' && cur.disabled === true ) ) { + if ( + cur.nodeType === 1 && + !(event.type === 'click' && cur.disabled === true) + ) { matchedHandlers = []; matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; + for (i = 0; i < delegateCount; i++) { + handleObj = handlers[i]; // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + ' '; - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; + if (matchedSelectors[sel] === undefined) { + // matchedSelectors[sel] = handleObj.needsContext + // ? jQuery(sel, this).index(cur) > -1 + // : jQuery.find(sel, this, null, [cur]).length; + + // matchedSelectors[sel] = handleObj.needsContext + // ? !!this.querySelector(sel) + // : this.querySelectorAll(sel).length; + + matchedSelectors[sel] = handleObj.needsContext + ? jQuery(sel, this).index(cur) > -1 + : Array.from(this.querySelectorAll(sel)).includes(cur); } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); + if (matchedSelectors[sel]) { + matchedHandlers.push(handleObj); } } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + if (matchedHandlers.length) { + handlerQueue.push({ + elem: cur, + handlers: matchedHandlers, + }); } } } @@ -3102,84 +3248,88 @@ jQuery.event = { // Add the remaining (directly-bound) handlers cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + if (delegateCount < handlers.length) { + handlerQueue.push({ + elem: cur, + handlers: handlers.slice(delegateCount), + }); } return handlerQueue; }, - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { + addProp: function(name, hook) { + Object.defineProperty(jQuery.Event.prototype, name, { enumerable: true, configurable: true, - get: typeof hook === 'function' ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; + get: + typeof hook === 'function' + ? function() { + if (this.originalEvent) { + return hook(this.originalEvent); + } } - }, + : function() { + if (this.originalEvent) { + return this.originalEvent[name]; + } + }, - set: function( value ) { - Object.defineProperty( this, name, { + set: function(value) { + Object.defineProperty(this, name, { enumerable: true, configurable: true, writable: true, - value: value - } ); - } - } ); + value: value, + }); + }, + }); }, - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); + fix: function(originalEvent) { + return originalEvent[jQuery.expando] + ? originalEvent + : new jQuery.Event(originalEvent); }, - special: jQuery.extend( Object.create( null ), { + special: Object.assign(Object.create(null), { load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true + noBubble: true, }, click: { - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - + setup: function(data) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, 'input' ) ) { - + if ( + rcheckableType.test(el.type) && + el.click && + nodeName(el, 'input') + ) { // dataPriv.set( el, "click", ... ) - leverageNative( el, 'click', true ); + leverageNative(el, 'click', true); } // Return false to allow normal processing in the caller return false; }, - trigger: function( data ) { - + trigger: function(data) { // For mutual compressibility with _default, replace `this` access with a local var. // `|| data` is dead code meant only to preserve the variable through minification. var el = this || data; // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, 'input' ) ) { - - leverageNative( el, 'click' ); + if ( + rcheckableType.test(el.type) && + el.click && + nodeName(el, 'input') + ) { + leverageNative(el, 'click'); } // Return non-false to allow normal event-path propagation @@ -3188,69 +3338,67 @@ jQuery.event = { // For cross-browser consistency, suppress native .click() on links // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { + _default: function(event) { var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, 'input' ) && - dataPriv.get( target, 'click' ) || - nodeName( target, 'a' ); - } + return ( + (rcheckableType.test(target.type) && + target.click && + nodeName(target, 'input') && + dataPriv.get(target, 'click')) || + nodeName(target, 'a') + ); + }, }, beforeunload: { - postDispatch: function( event ) { - + postDispatch: function(event) { // Support: Chrome <=73+ // Chrome doesn't alert on `event.preventDefault()` // as the standard mandates. - if ( event.result !== undefined && event.originalEvent ) { + if (event.result !== undefined && event.originalEvent) { event.originalEvent.returnValue = event.result; } - } - } - } ) + }, + }, + }), }; // Ensure the presence of an event listener that handles manually-triggered // synthetic events by interrupting progress until reinvoked in response to // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. -function leverageNative( el, type, isSetup ) { - +function leverageNative(el, type, isSetup) { // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add - if ( !isSetup ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); + if (!isSetup) { + if (dataPriv.get(el, type) === undefined) { + jQuery.event.add(el, type, returnTrue); } return; } // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { + dataPriv.set(el, type, false); + jQuery.event.add(el, type, { namespace: false, - handler: function( event ) { + handler: function(event) { var result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { + saved = dataPriv.get(this, type); + if (event.isTrigger & 1 && this[type]) { // Interrupt processing of the outer synthetic .trigger()ed event - if ( !saved ) { - + if (!saved) { // Store arguments for use when handling the inner native event // There will always be at least one argument (an event object), so this array // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); + saved = slice.call(arguments); + dataPriv.set(this, type, saved); // Trigger the native event and capture its result - this[ type ](); - result = dataPriv.get( this, type ); - dataPriv.set( this, type, false ); - - if ( saved !== result ) { + this[type](); + result = dataPriv.get(this, type); + dataPriv.set(this, type, false); + if (saved !== result) { // Cancel the outer synthetic event event.stopImmediatePropagation(); event.preventDefault(); @@ -3264,20 +3412,19 @@ function leverageNative( el, type, isSetup ) { // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + } else if ((jQuery.event.special[type] || {}).delegateType) { event.stopPropagation(); } // If this is a native event triggered above, everything is now in order // Fire an inner synthetic event with the original arguments - } else if ( saved ) { - + } else if (saved) { // ...and capture the result - dataPriv.set( this, type, jQuery.event.trigger( - saved[ 0 ], - saved.slice( 1 ), - this - ) ); + dataPriv.set( + this, + type, + jQuery.event.trigger(saved[0], saved.slice(1), this) + ); // Abort handling of the native event by all jQuery handlers while allowing // native handlers on the same element to run. On target, this is achieved @@ -3290,35 +3437,33 @@ function leverageNative( el, type, isSetup ) { event.stopPropagation(); event.isImmediatePropagationStopped = returnTrue; } - } - } ); + }, + }); } -jQuery.removeEvent = function( elem, type, handle ) { - +jQuery.removeEvent = function(elem, type, handle) { // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); + if (elem.removeEventListener) { + elem.removeEventListener(type, handle); } }; -jQuery.Event = function( src, props ) { - +jQuery.Event = function(src, props) { // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); + if (!(this instanceof jQuery.Event)) { + return new jQuery.Event(src, props); } // Event object - if ( src && src.type ) { + if (src && src.type) { this.originalEvent = src; this.type = src.type; // Events bubbling up the document may have been marked as prevented // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented ? - returnTrue : - returnFalse; + this.isDefaultPrevented = src.defaultPrevented + ? returnTrue + : returnFalse; // Create target properties this.target = src.target; @@ -3331,15 +3476,15 @@ jQuery.Event = function( src, props ) { } // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); + if (props) { + Object.assign(this, props); } // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); + this.timeStamp = (src && src.timeStamp) || Date.now(); // Mark it as fixed - this[ jQuery.expando ] = true; + this[jQuery.expando] = true; }; // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding @@ -3356,7 +3501,7 @@ jQuery.Event.prototype = { this.isDefaultPrevented = returnTrue; - if ( e && !this.isSimulated ) { + if (e && !this.isSimulated) { e.preventDefault(); } }, @@ -3365,7 +3510,7 @@ jQuery.Event.prototype = { this.isPropagationStopped = returnTrue; - if ( e && !this.isSimulated ) { + if (e && !this.isSimulated) { e.stopPropagation(); } }, @@ -3374,209 +3519,211 @@ jQuery.Event.prototype = { this.isImmediatePropagationStopped = returnTrue; - if ( e && !this.isSimulated ) { + if (e && !this.isSimulated) { e.stopImmediatePropagation(); } this.stopPropagation(); - } + }, }; // Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - 'char': true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true -}, jQuery.event.addProp ); - -jQuery.each( { focus: 'focusin', blur: 'focusout' }, function( type, delegateType ) { - - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants focus/blur. - // This is because the former are synchronous in IE while the latter are async. In other - // browsers, all those handlers are invoked synchronously. - function focusMappedHandler( nativeEvent ) { - - // `eventHandle` would already wrap the event, but we need to change the `type` here. - var event = jQuery.event.fix( nativeEvent ); - event.type = nativeEvent.type === 'focusin' ? 'focus' : 'blur'; - event.isSimulated = true; - - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if ( event.target === event.currentTarget ) { - - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - dataPriv.get( this, 'handle' )( event ); - } - } - - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, true ); - - if ( isIE ) { - this.addEventListener( delegateType, focusMappedHandler ); - } else { - - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { +jQuery.each( + { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + char: true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true, + }, + jQuery.event.addProp +); - // Force setup before trigger - leverageNative( this, type ); +jQuery.each( + { focus: 'focusin', blur: 'focusout' }, + function(type, delegateType) { + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants focus/blur. + // This is because the former are synchronous in IE while the latter are async. In other + // browsers, all those handlers are invoked synchronously. + function focusMappedHandler(nativeEvent) { + // `eventHandle` would already wrap the event, but we need to change the `type` here. + var event = jQuery.event.fix(nativeEvent); + event.type = nativeEvent.type === 'focusin' ? 'focus' : 'blur'; + event.isSimulated = true; + + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if (event.target === event.currentTarget) { + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + dataPriv.get(this, 'handle')(event); + } + } + + jQuery.event.special[type] = { + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative(this, type, true); - // Return non-false to allow normal event-path propagation - return true; - }, + if (isIE) { + this.addEventListener(delegateType, focusMappedHandler); + } else { + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + // Force setup before trigger + leverageNative(this, type); - teardown: function() { - if ( isIE ) { - this.removeEventListener( delegateType, focusMappedHandler ); - } else { + // Return non-false to allow normal event-path propagation + return true; + }, - // Return false to indicate standard teardown should be applied - return false; - } - }, + teardown: function() { + if (isIE) { + this.removeEventListener(delegateType, focusMappedHandler); + } else { + // Return false to indicate standard teardown should be applied + return false; + } + }, - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function( event ) { - return dataPriv.get( event.target, type ); - }, + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function(event) { + return dataPriv.get(event.target, type); + }, - delegateType: delegateType - }; -} ); + delegateType: delegateType, + }; + } +); // Create mouseenter/leave events using mouseover/out and event-time checks // so that event delegation works in jQuery. // Do the same for pointerenter/pointerleave and pointerover/pointerout -jQuery.each( { - mouseenter: 'mouseover', - mouseleave: 'mouseout', - pointerenter: 'pointerover', - pointerleave: 'pointerout' -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { +jQuery.each( + { + mouseenter: 'mouseover', + mouseleave: 'mouseout', + pointerenter: 'pointerover', + pointerleave: 'pointerout', + }, + function(orig, fix) { + jQuery.event.special[orig] = { + delegateType: fix, + bindType: fix, + + handle: function(event) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( + !related || + (related !== target && !jQuery.contains(target, related)) + ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; + } + return ret; + }, + }; + } +); - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); +Object.assign(jQuery.fn, { + on: function(types, selector, data, fn) { + return on(this, types, selector, data, fn); }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); + one: function(types, selector, data, fn) { + return on(this, types, selector, data, fn, 1); }, - off: function( types, selector, fn ) { + off: function(types, selector, fn) { var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - + if (types && types.preventDefault && types.handleObj) { // ( event ) dispatched jQuery.Event handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + '.' + handleObj.namespace : - handleObj.origType, + jQuery(types.delegateTarget).off( + handleObj.namespace + ? handleObj.origType + '.' + handleObj.namespace + : handleObj.origType, handleObj.selector, handleObj.handler ); return this; } - if ( typeof types === 'object' ) { - + if (typeof types === 'object') { // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); + for (type in types) { + this.off(type, selector, types[type]); } return this; } - if ( selector === false || typeof selector === 'function' ) { - + if (selector === false || typeof selector === 'function') { // ( types [, fn] ) fn = selector; selector = undefined; } - if ( fn === false ) { + if (fn === false) { fn = returnFalse; } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); + return this.each(function() { + jQuery.event.remove(this, types, fn, selector); + }); + }, +}); -var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; +var isAttached = function(elem) { + return ( + jQuery.contains(elem.ownerDocument, elem) || + elem.getRootNode(composed) === elem.ownerDocument + ); }, composed = { composed: true }; // Support: IE 9 - 11+ // Check attachment across shadow DOM boundaries when possible (gh-3504). // Provide a fallback for browsers without Shadow DOM v1 support. -if ( !documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); +if (!documentElement.getRootNode) { + isAttached = function(elem) { + return jQuery.contains(elem.ownerDocument, elem); }; } @@ -3588,97 +3735,104 @@ var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; var wrapMap = { - // Table parts need to be wrapped with `
` or they're // stripped to their contents when put in a div. // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do, so we cannot shorten // this by omitting or other required elements. - thead: [ 'table' ], - col: [ 'colgroup', 'table' ], - tr: [ 'tbody', 'table' ], - td: [ 'tr', 'tbody', 'table' ] + thead: ['table'], + col: ['colgroup', 'table'], + tr: ['tbody', 'table'], + td: ['tr', 'tbody', 'table'], }; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.tbody = + wrapMap.tfoot = + wrapMap.colgroup = + wrapMap.caption = + wrapMap.thead; wrapMap.th = wrapMap.td; -function getAll( context, tag ) { - +function getAll(context, tag) { // Support: IE <=9 - 11+ // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) var ret; - if ( typeof context.getElementsByTagName !== 'undefined' ) { - ret = context.getElementsByTagName( tag || '*' ); - - } else if ( typeof context.querySelectorAll !== 'undefined' ) { - ret = context.querySelectorAll( tag || '*' ); - + if (typeof context.getElementsByTagName !== 'undefined') { + ret = context.getElementsByTagName(tag || '*'); + } else if (typeof context.querySelectorAll !== 'undefined') { + ret = context.querySelectorAll(tag || '*'); } else { ret = []; } - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); + if (tag === undefined || (tag && nodeName(context, tag))) { + return jQuery.merge([context], ret); } return ret; } // Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { +function setGlobalEval(elems, refElements) { var i = 0, l = elems.length; - for ( ; i < l; i++ ) { + for (; i < l; i++) { dataPriv.set( - elems[ i ], + elems[i], 'globalEval', - !refElements || dataPriv.get( refElements[ i ], 'globalEval' ) + !refElements || dataPriv.get(refElements[i], 'globalEval') ); } } var rhtml = /<|&#?\w+;/; -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, +function buildFragment(elems, context, scripts, selection, ignored) { + var elem, + tmp, + tag, + wrap, + attached, + j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length; - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { + for (; i < l; i++) { + elem = elems[i]; + if (elem || elem === 0) { // Add nodes directly - if ( toType( elem ) === 'object' && ( elem.nodeType || isArrayLike( elem ) ) ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + if ( + toType(elem) === 'object' && + (elem.nodeType || isArrayLike(elem)) + ) { + jQuery.merge(nodes, elem.nodeType ? [elem] : elem); // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); + } else if (!rhtml.test(elem)) { + nodes.push(context.createTextNode(elem)); // Convert html into DOM nodes } else { - tmp = tmp || fragment.appendChild( context.createElement( 'div' ) ); + tmp = tmp || fragment.appendChild(context.createElement('div')); // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ '', '' ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || arr; + tag = (rtagName.exec(elem) || ['', ''])[1].toLowerCase(); + wrap = wrapMap[tag] || arr; // Create wrappers & descend into them. j = wrap.length; - while ( --j > -1 ) { - tmp = tmp.appendChild( context.createElement( wrap[ j ] ) ); + while (--j > -1) { + tmp = tmp.appendChild(context.createElement(wrap[j])); } - tmp.innerHTML = jQuery.htmlPrefilter( elem ); + tmp.innerHTML = jQuery.htmlPrefilter(elem); - jQuery.merge( nodes, tmp.childNodes ); + jQuery.merge(nodes, tmp.childNodes); // Remember the top-level container tmp = fragment.firstChild; @@ -3693,32 +3847,31 @@ function buildFragment( elems, context, scripts, selection, ignored ) { fragment.textContent = ''; i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - + while ((elem = nodes[i++])) { // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); + if (selection && jQuery.inArray(elem, selection) > -1) { + if (ignored) { + ignored.push(elem); } continue; } - attached = isAttached( elem ); + attached = isAttached(elem); // Append to fragment - tmp = getAll( fragment.appendChild( elem ), 'script' ); + tmp = getAll(fragment.appendChild(elem), 'script'); // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); + if (attached) { + setGlobalEval(tmp); } // Capture executables - if ( scripts ) { + if (scripts) { j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || '' ) ) { - scripts.push( elem ); + while ((elem = tmp[j++])) { + if (rscriptType.test(elem.type || '')) { + scripts.push(elem); } } } @@ -3731,1696 +3884,45 @@ function buildFragment( elems, context, scripts, selection, ignored ) { // context (optional): If specified, the fragment will be created in this context, // defaults to document // keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function( data, context, keepScripts ) { - if ( typeof data !== 'string' && !isObviousHtml( data + '' ) ) { +jQuery.parseHTML = function(data, context, keepScripts) { + if (typeof data !== 'string' && !isObviousHtml(data + '')) { return []; } - if ( typeof context === 'boolean' ) { + if (typeof context === 'boolean') { keepScripts = context; context = false; } var base, parsed, scripts; - if ( !context ) { - + if (!context) { // Stop scripts or inline event handlers from being executed immediately // by using document.implementation - context = document.implementation.createHTMLDocument( '' ); + context = document.implementation.createHTMLDocument(''); // Set the base href for the created document // so any parsed elements with URLs // are based on the document's URL (gh-2965) - base = context.createElement( 'base' ); + base = context.createElement('base'); base.href = document.location.href; - context.head.appendChild( base ); + context.head.appendChild(base); } - parsed = rsingleTag.exec( data ); + parsed = rsingleTag.exec(data); scripts = !keepScripts && []; // Single tag - if ( parsed ) { - return [ context.createElement( parsed[ 1 ] ) ]; - } - - parsed = buildFragment( [ data ], context, scripts ); - - if ( scripts && scripts.length ) { - jQuery( scripts ).remove(); - } - - return jQuery.merge( [], parsed.childNodes ); -}; - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -function access( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === 'object' ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( typeof value !== 'function' ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -} - -var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; - -var rcssNum = new RegExp( '^(?:([+-])=|)(' + pnum + ')([a-z%]*)$', 'i' ); - -var rnumnonpx = new RegExp( '^(' + pnum + ')(?!px)[a-z%]+$', 'i' ); - -var rcustomProp = /^--/; - -var cssExpand = [ 'Top', 'Right', 'Bottom', 'Left' ]; - -var ralphaStart = /^[a-z]/, - - // The regex visualized: - // - // /----------\ - // | | /-------\ - // | / Top \ | | | - // /--- Border ---+-| Right |-+---+- Width -+---\ - // | | Bottom | | - // | \ Left / | - // | | - // | /----------\ | - // | /-------------\ | | |- END - // | | | | / Top \ | | - // | | / Margin \ | | | Right | | | - // |---------+-| |-+---+-| Bottom |-+----| - // | \ Padding / \ Left / | - // BEGIN -| | - // | /---------\ | - // | | | | - // | | / Min \ | / Width \ | - // \--------------+-| |-+---| |---/ - // \ Max / \ Height / - rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; - -function isAutoPx( prop ) { - - // The first test is used to ensure that: - // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex). - // 2. The prop is not empty. - return ralphaStart.test( prop ) && - rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) ); -} - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/; - -// Convert dashed to camelCase, handle vendor prefixes. -// Used by the css & effects modules. -// Support: IE <=9 - 11+ -// Microsoft forgot to hump their vendor prefix (trac-9572) -function cssCamelCase( string ) { - return camelCase( string.replace( rmsPrefix, 'ms-' ) ); -} - -function getStyles( elem ) { - - // Support: IE <=11+ (trac-14150) - // In IE popup's `window` is the opener window which makes `window.getComputedStyle( elem )` - // break. Using `elem.ownerDocument.defaultView` avoids the issue. - var view = elem.ownerDocument.defaultView; - - // `document.implementation.createHTMLDocument( "" )` has a `null` `defaultView` - // property; check `defaultView` truthiness to fallback to window in such a case. - if ( !view ) { - view = window; - } - - return view.getComputedStyle( elem ); -} - -// A method for quickly swapping in/out CSS properties to get correct calculations. -function swap( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -} - -function curCSS( elem, name, computed ) { - var ret, - isCustomProp = rcustomProp.test( name ); - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for `.css('--customProperty')` (gh-3144) - if ( computed ) { - - // A fallback to direct property access is needed as `computed`, being - // the output of `getComputedStyle`, contains camelCased keys and - // `getPropertyValue` requires kebab-case ones. - // - // Support: IE <=9 - 11+ - // IE only supports `"float"` in `getPropertyValue`; in computed styles - // it's only available as `"cssFloat"`. We no longer modify properties - // sent to `.css()` apart from camelCasing, so we need to check both. - // Normally, this would create difference in behavior: if - // `getPropertyValue` returns an empty string, the value returned - // by `.css()` would be `undefined`. This is usually the case for - // disconnected elements. However, in IE even disconnected elements - // with no styles return `"none"` for `getPropertyValue( "float" )` - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( isCustomProp && ret ) { - - // Support: Firefox 105+, Chrome <=105+ - // Spec requires trimming whitespace for custom properties (gh-4926). - // Firefox only trims leading whitespace. Chrome just collapses - // both leading & trailing whitespace to a single space. - // - // Fall back to `undefined` if empty string returned. - // This collapses a missing definition with property defined - // and set to an empty string but there's no standard API - // allowing us to differentiate them without a performance penalty - // and returning `undefined` aligns with older jQuery. - // - // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED - // as whitespace while CSS does not, but this is not a problem - // because CSS preprocessing replaces them with U+000A LINE FEED - // (which *is* CSS whitespace) - // https://www.w3.org/TR/css-syntax-3/#input-preprocessing - ret = ret.replace( rtrimCSS, '$1' ) || undefined; - } - - if ( ret === '' && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11+ - // IE returns zIndex value as an integer. - ret + '' : - ret; -} - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, '' ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( isAutoPx( prop ) ? 'px' : '' ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( !isAutoPx( prop ) || unit !== 'px' && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - 66+ - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - -var cssPrefixes = [ 'Webkit', 'Moz', 'ms' ], - emptyStyle = document.createElement( 'div' ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } + if (parsed) { + return [context.createElement(parsed[1])]; } -} - -// Return a potentially-mapped vendor prefixed property -function finalPropName( name ) { - var final = vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} -( function() { + parsed = buildFragment([data], context, scripts); - var reliableTrDimensionsVal, - div = document.createElement( 'div' ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; + if (scripts && scripts.length) { + jQuery(scripts).remove(); } - // Support: IE 10 - 11+ - // IE misreports `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Support: Firefox 70+ - // Only Firefox includes border widths - // in computed dimensions. (gh-4529) - support.reliableTrDimensions = function() { - var table, tr, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( 'table' ); - tr = document.createElement( 'tr' ); - - table.style.cssText = 'position:absolute;left:-11111px;border-collapse:separate'; - tr.style.cssText = 'box-sizing:content-box;border:1px solid'; - - // Support: Chrome 86+ - // Height set through cssText does not get applied. - // Computed height then comes back as 0. - tr.style.height = '1px'; - div.style.height = '9px'; - - // Support: Android Chrome 86+ - // In our bodyBackground.html iframe, - // display for all div elements is set to "inline", - // which causes a problem only in Android Chrome, but - // not consistently across all devices. - // Ensuring the div is `display: block` - // gets around this issue. - div.style.display = 'block'; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( div ); - - // Don't run until window is visible - if ( table.offsetWidth === 0 ) { - documentElement.removeChild( table ); - return; - } - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + - parseInt( trStyle.borderTopWidth, 10 ) + - parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - }; -} )(); - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); + return jQuery.merge([], parsed.childNodes); }; -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === 'string' ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ''; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( typeof arg === 'function' ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== 'string' ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ''; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ''; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && typeof( method = value.promise ) === 'function' ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && typeof( method = value.then ) === 'function' ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - reject( value ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ 'notify', 'progress', jQuery.Callbacks( 'memory' ), - jQuery.Callbacks( 'memory' ), 2 ], - [ 'resolve', 'done', jQuery.Callbacks( 'once memory' ), - jQuery.Callbacks( 'once memory' ), 0, 'resolved' ], - [ 'reject', 'fail', jQuery.Callbacks( 'once memory' ), - jQuery.Callbacks( 'once memory' ), 1, 'rejected' ] - ], - state = 'pending', - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - catch: function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = typeof fns[ tuple[ 4 ] ] === 'function' && - fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && typeof returned.promise === 'function' ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + 'With' ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( 'Thenable self-resolution' ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === 'object' || - typeof returned === 'function' ) && - returned.then; - - // Handle a returned thenable - if ( typeof then === 'function' ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.error ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the error, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getErrorHook ) { - process.error = jQuery.Deferred.getErrorHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - typeof onProgress === 'function' ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - typeof onFulfilled === 'function' ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - typeof onRejected === 'function' ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + 'With' ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + 'With' ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the primary Deferred - primary = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - primary.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( primary.state() === 'pending' || - typeof( resolveValues[ i ] && resolveValues[ i ].then ) === 'function' ) { - - return primary.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); - } - - return primary.promise(); - } -} ); - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See trac-6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( 'DOMContentLoaded', completed ); - window.removeEventListener( 'load', completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -if ( document.readyState !== 'loading' ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( 'DOMContentLoaded', completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( 'load', completed ); -} - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - cssShow = { position: 'absolute', visibility: 'hidden', display: 'block' }, - cssNormalTransform = { - letterSpacing: '0', - fontWeight: '400' - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || 'px' ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === 'width' ? 1 : 0, - extra = 0, - delta = 0, - marginDelta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? 'border' : 'content' ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - // Count margin delta separately to only add it after scroll gutter adjustment. - // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). - if ( box === 'margin' ) { - marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, 'padding' + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== 'padding' ) { - delta += jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === 'content' ) { - delta -= jQuery.css( elem, 'padding' + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== 'margin' ) { - delta -= jQuery.css( elem, 'border' + cssExpand[ i ] + 'Width', true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ 'offset' + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta + marginDelta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = isIE || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box', - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = 'offset' + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = 'auto'; - } - - - if ( ( - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === 'auto' || - - // Support: IE 9 - 11+ - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - ( isIE && isBorderBox ) || - - // Support: IE 10 - 11+ - // IE misreports `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Support: Firefox 70+ - // Firefox includes border widths - // in computed dimensions for table rows. (gh-4529) - ( !support.reliableTrDimensions() && nodeName( elem, 'tr' ) ) ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box'; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? 'border' : 'content' ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + 'px'; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = cssCamelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (trac-7345) - if ( type === 'string' && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug trac-9237 - type = 'number'; - } - - // Make sure that null and NaN values aren't set (trac-7116) - if ( value == null || value !== value ) { - return; - } - - // If the value is a number, add `px` for certain CSS properties - if ( type === 'number' ) { - value += ret && ret[ 3 ] || ( isAutoPx( origName ) ? 'px' : '' ); - } - - // Support: IE <=9 - 11+ - // background-* props of a cloned element affect the source element (trac-8908) - if ( isIE && value === '' && name.indexOf( 'background' ) === 0 ) { - style[ name ] = 'inherit'; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( 'set' in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && 'get' in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = cssCamelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && 'get' in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === 'normal' && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === '' || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ 'height', 'width' ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, 'display' ) ) && - - // Support: Safari <=8 - 12+, Chrome <=73+ - // Table columns in WebKit/Blink have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11+ - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - isBorderBox = extra && - jQuery.css( elem, 'boxSizing', false, styles ) === 'border-box', - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || 'px' ) !== 'px' ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: '', - padding: '', - border: 'Width' -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === 'string' ? value.split( ' ' ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== 'margin' ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - -jQuery.offset = { - setOffset: function( elem, options, i ) { - var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, - position = jQuery.css( elem, 'position' ), - curElem = jQuery( elem ), - props = {}; - - // Set position first, in-case top/left are set even on static elem - if ( position === 'static' ) { - elem.style.position = 'relative'; - } - - curOffset = curElem.offset(); - curCSSTop = jQuery.css( elem, 'top' ); - curCSSLeft = jQuery.css( elem, 'left' ); - calculatePosition = ( position === 'absolute' || position === 'fixed' ) && - ( curCSSTop + curCSSLeft ).indexOf( 'auto' ) > -1; - - // Need to be able to calculate position if either - // top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( typeof options === 'function' ) { - - // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) - options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( 'using' in options ) { - options.using.call( elem, props ); - - } else { - curElem.css( props ); - } - } -}; - -jQuery.fn.extend( { - - // offset() relates an element's border box to the document origin - offset: function( options ) { - - // Preserve chaining for setter - if ( arguments.length ) { - return options === undefined ? - this : - this.each( function( i ) { - jQuery.offset.setOffset( this, options, i ); - } ); - } - - var rect, win, - elem = this[ 0 ]; - - if ( !elem ) { - return; - } - - // Return zeros for disconnected and hidden (display: none) elements (gh-2310) - // Support: IE <=11+ - // Running getBoundingClientRect on a - // disconnected node in IE throws an error - if ( !elem.getClientRects().length ) { - return { top: 0, left: 0 }; - } - - // Get document-relative position by adding viewport scroll to viewport-relative gBCR - rect = elem.getBoundingClientRect(); - win = elem.ownerDocument.defaultView; - return { - top: rect.top + win.pageYOffset, - left: rect.left + win.pageXOffset - }; - }, - - // position() relates an element's margin box to its offset parent's padding box - // This corresponds to the behavior of CSS absolute positioning - position: function() { - if ( !this[ 0 ] ) { - return; - } - - var offsetParent, offset, doc, - elem = this[ 0 ], - parentOffset = { top: 0, left: 0 }; - - // position:fixed elements are offset from the viewport, which itself always has zero offset - if ( jQuery.css( elem, 'position' ) === 'fixed' ) { - - // Assume position:fixed implies availability of getBoundingClientRect - offset = elem.getBoundingClientRect(); - - } else { - offset = this.offset(); - - // Account for the *real* offset parent, which can be the document or its root element - // when a statically positioned element is identified - doc = elem.ownerDocument; - offsetParent = elem.offsetParent || doc.documentElement; - while ( offsetParent && - ( offsetParent === doc.body || offsetParent === doc.documentElement ) && - jQuery.css( offsetParent, 'position' ) === 'static' ) { - - offsetParent = offsetParent.parentNode; - } - if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { - - // Incorporate borders into its offset, since they are outside its content origin - parentOffset = jQuery( offsetParent ).offset(); - parentOffset.top += jQuery.css( offsetParent, 'borderTopWidth', true ); - parentOffset.left += jQuery.css( offsetParent, 'borderLeftWidth', true ); - } - } - - // Subtract parent offsets and element margins - return { - top: offset.top - parentOffset.top - jQuery.css( elem, 'marginTop', true ), - left: offset.left - parentOffset.left - jQuery.css( elem, 'marginLeft', true ) - }; - }, - - // This method will return documentElement in the following cases: - // 1) For the element inside the iframe without offsetParent, this method will return - // documentElement of the parent window - // 2) For the hidden or detached element - // 3) For body or html element, i.e. in case of the html node - it will return itself - // - // but those exceptions were never presented as a real life use-cases - // and might be considered as more preferable results. - // - // This logic, however, is not guaranteed and can change at any point in the future - offsetParent: function() { - return this.map( function() { - var offsetParent = this.offsetParent; - - while ( offsetParent && jQuery.css( offsetParent, 'position' ) === 'static' ) { - offsetParent = offsetParent.offsetParent; - } - - return offsetParent || documentElement; - } ); - } -} ); - -// Create scrollLeft and scrollTop methods -jQuery.each( { scrollLeft: 'pageXOffset', scrollTop: 'pageYOffset' }, function( method, prop ) { - var top = 'pageYOffset' === prop; - - jQuery.fn[ method ] = function( val ) { - return access( this, function( elem, method, val ) { - - // Coalesce documents and windows - var win; - if ( isWindow( elem ) ) { - win = elem; - } else if ( elem.nodeType === 9 ) { - win = elem.defaultView; - } - - if ( val === undefined ) { - return win ? win[ prop ] : elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : win.pageXOffset, - top ? val : win.pageYOffset - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length ); - }; -} ); - export { jQuery as default }; diff --git a/packages/joint-core/test/jointjs/basic.js b/packages/joint-core/test/jointjs/basic.js index e8aba7b16..2bbe31c6d 100644 --- a/packages/joint-core/test/jointjs/basic.js +++ b/packages/joint-core/test/jointjs/basic.js @@ -1672,7 +1672,7 @@ QUnit.module('basic', function(hooks) { var elView = this.paper.findViewByModel(el); var defs = this.paper.svg.querySelector('defs'); - var defsChildrenCount = $(defs).children().length; + var defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 0, 'there is no element in the by default.'); el.attr('rect/fill', { @@ -1685,10 +1685,10 @@ QUnit.module('basic', function(hooks) { // PhantomJS fails to lookup linearGradient with `querySelectorAll()` (also with jQuery). // Therefore, we use the following trick to check whether the element is in DOM. - defsChildrenCount = $(defs).children().length; + defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 1, 'one element got created in .'); - var linearGradient = $(defs).children()[0]; + var linearGradient = defs.firstElementChild; assert.equal(linearGradient.tagName.toLowerCase(), 'lineargradient', 'one element got created in .'); assert.equal('url(#' + linearGradient.id + ')', elView.$('rect').attr('fill'), 'fill attribute pointing to the newly created gradient with url()'); @@ -1701,11 +1701,11 @@ QUnit.module('basic', function(hooks) { ] }); - defsChildrenCount = $(defs).children().length; + defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 1, 'one element is in .'); - linearGradient = $(defs).children()[0]; + linearGradient = defs.firstElementChild; assert.equal(linearGradient.tagName.toLowerCase(), 'lineargradient', 'still only one element is in .'); assert.equal('url(#' + linearGradient.id + ')', elView.$('rect').attr('stroke'), 'stroke attribute pointing to the correct gradient with url()'); @@ -1723,7 +1723,7 @@ QUnit.module('basic', function(hooks) { var defs = this.paper.svg.querySelector('defs'); - var defsChildrenCount = $(defs).children().length; + var defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 0, 'there is no element in the by default.'); el.attr('rect/filter', { name: 'dropShadow', args: { dx: 2, dy: 2, blur: 3 }}); @@ -1731,30 +1731,30 @@ QUnit.module('basic', function(hooks) { // PhantomJS fails to lookup linearGradient with `querySelectorAll()` (also with jQuery). // Therefore, we use the following trick to check whether the element is in DOM. - defsChildrenCount = $(defs).children().length; + defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 1, 'one element got created in .'); - var filter = $(defs).children()[0]; + var filter = defs.firstElementChild; assert.equal(filter.tagName.toLowerCase(), 'filter', 'one element got created in .'); assert.checkSvgAttr('filter', elView.$('rect'), 'url(#' + filter.id + ')', 'filter attribute pointing to the newly created filter with url()'); el2.attr('rect/filter', { name: 'dropShadow', args: { dx: 2, dy: 2, blur: 3 }}); - defsChildrenCount = $(defs).children().length; + defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 1, 'one element still in .'); - filter = $(defs).children()[0]; + filter = defs.firstElementChild; assert.equal(filter.tagName.toLowerCase(), 'filter', 'still only one element is in .'); assert.checkSvgAttr('filter', el2View.$('rect'), 'url(#' + filter.id + ')', 'filter attribute pointing to the correct gradient with url()'); el.attr('rect/filter', { name: 'blur', args: { x: 5 }}); - defsChildrenCount = $(defs).children().length; + defsChildrenCount = defs.children.length; assert.equal(defsChildrenCount, 2, 'now two elements are in .'); - var filter0 = $(defs).children()[0]; - var filter1 = $(defs).children()[1]; + var filter0 = defs.children[0]; + var filter1 = defs.children[1]; assert.deepEqual([filter0.tagName.toLowerCase(), filter1.tagName.toLowerCase()], ['filter', 'filter'], 'both elements in are elements.'); assert.notEqual(filter0.id, filter1.id, 'both elements have different IDs'); From 458f2d5c699cd7a450996fa44729f1711dbacf59 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 24 Nov 2023 17:05:48 +0100 Subject: [PATCH 08/58] update --- packages/joint-core/src/mvc/Dom.mjs | 2969 +++--------------- packages/joint-core/src/mvc/View.mjs | 15 + packages/joint-core/src/util/util.mjs | 3 +- packages/joint-core/src/util/utilHelpers.mjs | 2 +- 4 files changed, 531 insertions(+), 2458 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index c3361c472..fbd2ac80c 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -1,3 +1,4 @@ +import { isPlainObject, isArrayLike, camelCase, isEmpty } from '../util/utilHelpers.mjs'; /*! * jQuery JavaScript Library v4.0.0-pre+c98597ea.dirty * https://jquery.com/ @@ -6,120 +7,40 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2023-11-23T16:43Z + * Date: 2023-11-24T14:04Z */ - -'use strict'; +('use strict'); if (!window.document) { - throw new Error('jQuery requires a window with a document'); + throw new Error('$ requires a window with a document'); } var arr = []; -var getProto = Object.getPrototypeOf; - var slice = arr.slice; -// Support: IE 11+ -// IE doesn't have Array#flat; provide a fallback. -var flat = arr.flat - ? function(array) { - return arr.flat.call(array); - } - : function(array) { - return arr.concat.apply([], array); - }; - var push = arr.push; var indexOf = arr.indexOf; -// [[Class]] -> type pairs -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call(Object); - -// All support tests are defined in their respective modules. -var support = {}; - -function toType(obj) { - if (obj == null) { - return obj + ''; - } - - return typeof obj === 'object' - ? class2type[toString.call(obj)] || 'object' - : typeof obj; -} - -function isWindow(obj) { - return obj != null && obj === obj.window; -} - -function isArrayLike(obj) { - var length = !!obj && obj.length, - type = toType(obj); - - if (typeof obj === 'function' || isWindow(obj)) { - return false; - } - - return ( - type === 'array' || - length === 0 || - (typeof length === 'number' && length > 0 && length - 1 in obj) - ); -} - var document = window.document; -var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true, -}; - -function DOMEval(code, node, doc) { - doc = doc || document; - - var i, - script = doc.createElement('script'); - - script.text = code; - if (node) { - for (i in preservedScriptAttributes) { - if (node[i]) { - script[i] = node[i]; - } - } - } - doc.head.appendChild(script).parentNode.removeChild(script); -} +const version = '4.0.0-pre+c98597ea.dirty'; -var version = '4.0.0-pre+c98597ea.dirty', - rhtmlSuffix = /HTML$/i, - // Define a local copy of jQuery - jQuery = function(selector, context) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init(selector, context); - }; +// Define a local copy of $ +const $ = function(selector, context) { + // The $ object is actually just the init constructor 'enhanced' + // Need init if $ is called (just allow error to be thrown if not included) + return new $.fn.init(selector, context); +}; -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used +$.fn = $.prototype = { + // The current version of $ being used jquery: version, - constructor: jQuery, + constructor: $, - // The default length of a jQuery object is 0 + // The default length of a $ object is 0 length: 0, toArray: function() { @@ -141,8 +62,8 @@ jQuery.fn = jQuery.prototype = { // Take an array of elements and push it onto the stack // (returning the new matched element set) pushStack: function(elems) { - // Build a new jQuery matched element set - var ret = jQuery.merge(this.constructor(), elems); + // Build a new $ matched element set + var ret = $.merge(this.constructor(), elems); // Add the old object onto the stack (as a reference) ret.prevObject = this; @@ -153,15 +74,7 @@ jQuery.fn = jQuery.prototype = { // Execute a callback for every element in the matched set. each: function(callback) { - return jQuery.each(this, callback); - }, - - map: function(callback) { - return this.pushStack( - jQuery.map(this, function(elem, i) { - return callback.call(elem, i, elem); - }) - ); + return $.each(this, callback); }, slice: function() { @@ -178,7 +91,7 @@ jQuery.fn = jQuery.prototype = { even: function() { return this.pushStack( - jQuery.grep(this, function(_elem, i) { + $.grep(this, function(_elem, i) { return (i + 1) % 2; }) ); @@ -186,7 +99,7 @@ jQuery.fn = jQuery.prototype = { odd: function() { return this.pushStack( - jQuery.grep(this, function(_elem, i) { + $.grep(this, function(_elem, i) { return i % 2; }) ); @@ -203,58 +116,18 @@ jQuery.fn = jQuery.prototype = { }, }; -Object.assign(jQuery, { - // Unique for each copy of jQuery on the page - expando: 'jQuery' + (version + Math.random()).replace(/\D/g, ''), +// Unique for each copy of $ on the page +$.expando = '$' + (version + Math.random()).replace(/\D/g, ''); + +// Assume $ is ready without the ready module +$.isReady = true; - // Assume jQuery is ready without the ready module - isReady: true, +Object.assign($, { error: function(msg) { throw new Error(msg); }, - noop: function() {}, - - isPlainObject: function(obj) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if (!obj || toString.call(obj) !== '[object Object]') { - return false; - } - - proto = getProto(obj); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if (!proto) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call(proto, 'constructor') && proto.constructor; - return ( - typeof Ctor === 'function' && - fnToString.call(Ctor) === ObjectFunctionString - ); - }, - - isEmptyObject: function(obj) { - var name; - - for (name in obj) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function(code, options, doc) { - DOMEval(code, { nonce: options && options.nonce }, doc); - }, - each: function(obj, callback) { var length, i = 0; @@ -277,42 +150,13 @@ Object.assign(jQuery, { return obj; }, - // Retrieve the text value of an array of DOM nodes - text: function(elem) { - var node, - ret = '', - i = 0, - nodeType = elem.nodeType; - - if (!nodeType) { - // If no nodeType, this is expected to be an array - while ((node = elem[i++])) { - // Do not traverse comment nodes - ret += jQuery.text(node); - } - } - if (nodeType === 1 || nodeType === 11) { - return elem.textContent; - } - if (nodeType === 9) { - return elem.documentElement.textContent; - } - if (nodeType === 3 || nodeType === 4) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; - }, - // results is for internal usage only makeArray: function(arr, results) { var ret = results || []; if (arr != null) { if (isArrayLike(Object(arr))) { - jQuery.merge(ret, typeof arr === 'string' ? [arr] : arr); + $.merge(ret, typeof arr === 'string' ? [arr] : arr); } else { push.call(ret, arr); } @@ -321,21 +165,6 @@ Object.assign(jQuery, { return ret; }, - inArray: function(elem, arr, i) { - return arr == null ? -1 : indexOf.call(arr, elem, i); - }, - - isXMLDoc: function(elem) { - var namespace = elem && elem.namespaceURI, - docElem = elem && (elem.ownerDocument || elem).documentElement; - - // Assume HTML when documentElement doesn't yet exist, such as inside - // document fragments. - return !rhtmlSuffix.test( - namespace || (docElem && docElem.nodeName) || 'HTML' - ); - }, - // Note: an element does not contain itself contains: function(a, b) { var bup = b && b.parentNode; @@ -388,61 +217,14 @@ Object.assign(jQuery, { return matches; }, - // arg is for internal usage only - map: function(elems, callback, arg) { - var length, - value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if (isArrayLike(elems)) { - length = elems.length; - for (; i < length; i++) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret.push(value); - } - } - - // Go through every key on the object, - } else { - for (i in elems) { - value = callback(elems[i], i, arg); - - if (value != null) { - ret.push(value); - } - } - } - - // Flatten any nested arrays - return flat(ret); - }, - // A global GUID counter for objects guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support, }); if (typeof Symbol === 'function') { - jQuery.fn[Symbol.iterator] = arr[Symbol.iterator]; + $.fn[Symbol.iterator] = arr[Symbol.iterator]; } -// Populate the class2type map -jQuery.each( - 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( - ' ' - ), - function(_i, name) { - class2type['[object ' + name + ']'] = name.toLowerCase(); - } -); - var documentElement = document.documentElement; // Only count HTML whitespace @@ -467,21 +249,8 @@ function acceptData(owner) { return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; } -// Matches dashed string for camelizing -var rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase(_all, letter) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase -function camelCase(string) { - return string.replace(rdashAlpha, fcamelCase); -} - function Data() { - this.expando = jQuery.expando + Data.uid++; + this.expando = $.expando + Data.uid++; } Data.uid = 1; @@ -603,7 +372,7 @@ Data.prototype = { } // Remove the expando if there's no more data - if (key === undefined || jQuery.isEmptyObject(cache)) { + if (key === undefined || isEmpty(cache)) { // Support: Chrome <=35 - 45+ // Webkit & Blink performance suffers when deleting properties // from DOM nodes, so set to undefined instead @@ -617,7 +386,7 @@ Data.prototype = { }, hasData: function(owner) { var cache = owner[this.expando]; - return cache !== undefined && !jQuery.isEmptyObject(cache); + return cache !== undefined && !isEmpty(cache); }, }; @@ -638,75 +407,9 @@ function isObviousHtml(input) { ); } -var pop = arr.pop; - // https://www.w3.org/TR/css3-selectors/#whitespace var whitespace = '[\\x20\\t\\r\\n\\f]'; -// Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only -// Make sure the `:has()` argument is parsed unforgivingly. -// We include `*` in the test to detect buggy implementations that are -// _selectively_ forgiving (specifically when the list includes at least -// one valid selector). -// Note that we treat complete lack of support for `:has()` as if it were -// spec-compliant support, which is fine because use of `:has()` in such -// environments will fail in the qSA path and fall back to jQuery traversal -// anyway. -try { - document.querySelector(':has(*,:jqfake)'); - support.cssHas = false; -} catch (e) { - support.cssHas = true; -} - -// Build QSA regex. -// Regex strategy adopted from Diego Perini. -var rbuggyQSA = []; - -if (isIE) { - rbuggyQSA.push( - // Support: IE 9 - 11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - ':enabled', - ':disabled', - - // Support: IE 11+ - // IE 11 doesn't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - '\\[' + - whitespace + - '*name' + - whitespace + - '*=' + - whitespace + - '*(?:\'\'|"")' - ); -} - -if (!support.cssHas) { - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Our regular `try-catch` mechanism fails to detect natively-unsupported - // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) - // in browsers that parse the `:has()` argument as a forgiving selector list. - // https://drafts.csswg.org/selectors/#relational now requires the argument - // to be parsed unforgivingly, but browsers have not yet fully adjusted. - rbuggyQSA.push(':has'); -} - -rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join('|')); - -var rtrimCSS = new RegExp( - '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', - 'g' -); - -// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram -var identifier = - '(?:\\\\[\\da-fA-F]{1,6}' + - whitespace + - '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; - var booleans = 'checked|selected|async|autofocus|autoplay|controls|' + 'defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped'; @@ -719,33 +422,8 @@ var rdescend = new RegExp(whitespace + '|>'); var rsibling = /[+~]/; -// Support: IE 9 - 11+ -// IE requires a prefix. -var matches = documentElement.matches || documentElement.msMatchesSelector; - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache(key, value) { - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if (keys.push(key + ' ') > jQuery.expr.cacheLength) { - // Only keep the most recent entries - delete cache[keys.shift()]; - } - return (cache[key + ' '] = value); - } - return cache; -} - /** - * Checks a node for validity as a jQuery selector context + * Checks a node for validity as a $ selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -757,6 +435,12 @@ function testContext(context) { ); } +// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram +var identifier = + '(?:\\\\[\\da-fA-F]{1,6}' + + whitespace + + '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors var attributes = '\\[' + @@ -843,11 +527,37 @@ function unescapeSelector(sel) { } function selectorError(msg) { - jQuery.error('Syntax error, unrecognized expression: ' + msg); + $.error('Syntax error, unrecognized expression: ' + msg); } var rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'); +var rtrimCSS = new RegExp( + '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', + 'g' +); + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache(key, value) { + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if (keys.push(key + ' ') > $.expr.cacheLength) { + // Only keep the most recent entries + delete cache[keys.shift()]; + } + return (cache[key + ' '] = value); + } + return cache; +} + var tokenCache = createCache(); function tokenize(selector, parseOnly) { @@ -866,7 +576,7 @@ function tokenize(selector, parseOnly) { soFar = selector; groups = []; - preFilters = jQuery.expr.preFilter; + preFilters = $.expr.preFilter; while (soFar) { // Comma and first run @@ -895,7 +605,7 @@ function tokenize(selector, parseOnly) { // Filters for (type in filterMatchExpr) { if ( - (match = jQuery.expr.match[type].exec(soFar)) && + (match = $.expr.match[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match))) ) { matched = match.shift(); @@ -959,7 +669,7 @@ var preFilter = { selectorError(match[0]); } - // numeric x and y parameters for jQuery.expr.filter.CHILD + // numeric x and y parameters for $.expr.filter.CHILD // remember that false/true cast respectively to 0/1 match[4] = +(match[4] ? match[5] + (match[6] || 1) @@ -1041,7 +751,7 @@ function fcssescape(ch, asCodePoint) { return '\\' + ch; } -jQuery.escapeSelector = function(sel) { +$.escapeSelector = function(sel) { return (sel + '').replace(rcssescape, fcssescape); }; @@ -1085,7 +795,7 @@ function sortOrder(a, b) { // eslint-disable-next-line eqeqeq if ( a == document || - (a.ownerDocument == document && jQuery.contains(document, a)) + (a.ownerDocument == document && $.contains(document, a)) ) { return -1; } @@ -1096,7 +806,7 @@ function sortOrder(a, b) { // eslint-disable-next-line eqeqeq if ( b == document || - (b.ownerDocument == document && jQuery.contains(document, b)) + (b.ownerDocument == document && $.contains(document, b)) ) { return 1; } @@ -1112,7 +822,7 @@ function sortOrder(a, b) { * Document sorting and removing duplicates * @param {ArrayLike} results */ -jQuery.uniqueSort = function(results) { +$.uniqueSort = function(results) { var elem, duplicates = [], j = 0, @@ -1136,1505 +846,162 @@ jQuery.uniqueSort = function(results) { return results; }; -jQuery.fn.uniqueSort = function() { - return this.pushStack(jQuery.uniqueSort(slice.apply(this))); +$.fn.uniqueSort = function() { + return this.pushStack($.uniqueSort(slice.apply(this))); }; -var i, - outermostContext, - // Local document vars - document$1, - documentElement$1, - documentIsHTML, - // Instance-specific data - dirruns = 0, - done = 0, - classCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - // Regular expressions - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp(whitespace + '+', 'g'), - ridentifier = new RegExp('^' + identifier + '$'), - matchExpr = Object.assign( - { - bool: new RegExp('^(?:' + booleans + ')$', 'i'), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - needsContext: new RegExp( - '^' + - whitespace + - '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + - whitespace + - '*((?:-\\d)?\\d*)' + - whitespace + - '*\\)|)(?=[^-]|$)', - 'i' - ), - }, - filterMatchExpr - ), - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - // Used for iframes; see `setDocument`. - // Support: IE 9 - 11+ - // Removing the function wrapper causes a "Permission Denied" - // error in IE. - unloadHandler = function() { - setDocument(); - }, - inDisabledFieldset = addCombinator( - function(elem) { - return elem.disabled === true && nodeName(elem, 'fieldset'); - }, - { dir: 'parentNode', next: 'legend' } - ); +/* + * Optional limited selector module for custom builds. + * + * Note that this DOES NOT SUPPORT many documented jQuery + * features in exchange for its smaller size: + * + * * Attribute not equal selector (!=) + * * Positional selectors (:first; :eq(n); :odd; etc.) + * * Type selectors (:input; :checkbox; :button; etc.) + * * State-based selectors (:animated; :visible; :hidden; etc.) + * * :has(selector) in browsers without native support + * * :not(complex selector) in IE + * * custom selectors via jQuery extensions + * * Reliable functionality on XML fragments + * * Matching against non-elements + * * Reliable sorting of disconnected nodes + * * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) + * + * If any of these are unacceptable tradeoffs, either use the full + * selector engine or customize this stub for the project's specific + * needs. + */ + +const matchExpr = { + bool: new RegExp('^(?:' + booleans + ')$', 'i'), + needsContext: new RegExp('^' + whitespace + '*[>+~]'), +}; + +Object.assign(matchExpr, filterMatchExpr); -function find(selector, context, results, seed) { - var m, - i, - elem, +$.find = function(selector, context, results, seed) { + var elem, nid, - match, groups, newSelector, newContext = context && context.ownerDocument, // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; + nodeType = context ? context.nodeType : 9, + i = 0; results = results || []; + context = context || document; - // Return early from calls with invalid selector or context - if ( - typeof selector !== 'string' || - !selector || - (nodeType !== 1 && nodeType !== 9 && nodeType !== 11) - ) { + // Same basic safeguard as in the full selector module + if (!selector || typeof selector !== 'string') { return results; } - // Try to shortcut find operations (as opposed to filters) in HTML documents - if (!seed) { - setDocument(context); - context = context || document$1; - - if (documentIsHTML) { - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { - // ID selector - if ((m = match[1])) { - // Document context - if (nodeType === 9) { - if ((elem = context.getElementById(m))) { - push.call(results, elem); - } - return results; - - // Element context - } else { - if ( - newContext && - (elem = newContext.getElementById(m)) && - jQuery.contains(context, elem) - ) { - push.call(results, elem); - return results; - } - } - - // Type selector - } else if (match[2]) { - push.apply(results, context.getElementsByTagName(selector)); - return results; + // Early return if context is not an element, document or document fragment + if (nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { + return []; + } - // Class selector - } else if ((m = match[3]) && context.getElementsByClassName) { - push.apply(results, context.getElementsByClassName(m)); - return results; + if (seed) { + while ((elem = seed[i++])) { + if (elem.matches(selector)) { + results.push(elem); + } + } + } else { + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( + nodeType === 1 && + (rdescend.test(selector) || rleadingCombinator.test(selector)) + ) { + // Expand context for sibling selectors + newContext = + (rsibling.test(selector) && + testContext(context.parentNode)) || + context; + + // Outside of IE, if we're not changing the context we can + // use :scope instead of an ID. + if (newContext !== context || isIE) { + // Capture the context ID, setting it first if necessary + if ((nid = context.getAttribute('id'))) { + nid = $.escapeSelector(nid); + } else { + context.setAttribute('id', (nid = $.expando)); } } - // Take advantage of querySelectorAll - if ( - !nonnativeSelectorCache[selector + ' '] && - (!rbuggyQSA || !rbuggyQSA.test(selector)) - ) { - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( - nodeType === 1 && - (rdescend.test(selector) || - rleadingCombinator.test(selector)) - ) { - // Expand context for sibling selectors - newContext = - (rsibling.test(selector) && - testContext(context.parentNode)) || - context; - - // Outside of IE, if we're not changing the context we can - // use :scope instead of an ID. - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if (newContext != context || isIE) { - // Capture the context ID, setting it first if necessary - if ((nid = context.getAttribute('id'))) { - nid = jQuery.escapeSelector(nid); - } else { - context.setAttribute('id', (nid = jQuery.expando)); - } - } - - // Prefix every selector in the list - groups = tokenize(selector); - i = groups.length; - while (i--) { - groups[i] = - (nid ? '#' + nid : ':scope') + - ' ' + - toSelector(groups[i]); - } - newSelector = groups.join(','); - } + // Prefix every selector in the list + groups = tokenize(selector); + i = groups.length; + while (i--) { + groups[i] = + (nid ? '#' + nid : ':scope') + + ' ' + + toSelector(groups[i]); + } + newSelector = groups.join(','); + } - try { - push.apply( - results, - newContext.querySelectorAll(newSelector) - ); - return results; - } catch (qsaError) { - nonnativeSelectorCache(selector, true); - } finally { - if (nid === jQuery.expando) { - context.removeAttribute('id'); - } - } + try { + $.merge(results, newContext.querySelectorAll(newSelector)); + } finally { + if (nid === $.expando) { + context.removeAttribute('id'); } } } - // All others - return select(selector.replace(rtrimCSS, '$1'), context, results, seed); -} - -/** - * Mark a function for special use by jQuery selector module - * @param {Function} fn The function to mark - */ -function markFunction(fn) { - fn[jQuery.expando] = true; - return fn; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo(type) { - return function(elem) { - return nodeName(elem, 'input') && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo(type) { - return function(elem) { - return ( - (nodeName(elem, 'input') || nodeName(elem, 'button')) && - elem.type === type - ); - }; -} + return results; +}; -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo(disabled) { - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function(elem) { - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ('form' in elem) { - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if (elem.parentNode && elem.disabled === false) { - // Option elements defer to a parent optgroup if present - if ('label' in elem) { - if ('label' in elem.parentNode) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } +$.expr = { + // Can be adjusted by the user + cacheLength: 50, - // Support: IE 6 - 11+ - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return ( - elem.isDisabled === disabled || - // Where there is no isDisabled, check manually - (elem.isDisabled !== !disabled && - inDisabledFieldset(elem) === disabled) - ); - } + match: matchExpr, + preFilter: preFilter, +}; - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ('label' in elem) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo(fn) { - return markFunction(function(argument) { - argument = +argument; - return markFunction(function(seed, matches) { - var j, - matchIndexes = fn([], seed.length, argument), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while (i--) { - if (seed[(j = matchIndexes[i])]) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [node] An element or document object to use to set the document - */ -function setDocument(node) { - var subWindow, - doc = node ? node.ownerDocument || node : document; - - // Return early if doc is invalid or already selected - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if (doc == document$1 || doc.nodeType !== 9) { - return; - } - - // Update global variables - document$1 = doc; - documentElement$1 = document$1.documentElement; - documentIsHTML = !jQuery.isXMLDoc(document$1); - - // Support: IE 9 - 11+ - // Accessing iframe documents after unload throws "permission denied" errors (see trac-13936) - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( - isIE && - document != document$1 && - (subWindow = document$1.defaultView) && - subWindow.top !== subWindow - ) { - subWindow.addEventListener('unload', unloadHandler); - } -} - -find.matches = function(expr, elements) { - return find(expr, null, null, elements); -}; - -find.matchesSelector = function(elem, expr) { - setDocument(elem); - - if ( - documentIsHTML && - !nonnativeSelectorCache[expr + ' '] && - (!rbuggyQSA || !rbuggyQSA.test(expr)) - ) { - try { - return matches.call(elem, expr); - } catch (e) { - nonnativeSelectorCache(expr, true); - } - } - - return find(expr, document$1, null, [elem]).length > 0; -}; - -jQuery.expr = { - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - find: { - ID: function(id, context) { - if ( - typeof context.getElementById !== 'undefined' && - documentIsHTML - ) { - var elem = context.getElementById(id); - return elem ? [elem] : []; - } - }, - - TAG: function(tag, context) { - if (typeof context.getElementsByTagName !== 'undefined') { - return context.getElementsByTagName(tag); - - // DocumentFragment nodes don't have gEBTN - } else { - return context.querySelectorAll(tag); - } - }, - - CLASS: function(className, context) { - if ( - typeof context.getElementsByClassName !== 'undefined' && - documentIsHTML - ) { - return context.getElementsByClassName(className); - } - }, - }, - - relative: { - '>': { dir: 'parentNode', first: true }, - ' ': { dir: 'parentNode' }, - '+': { dir: 'previousSibling', first: true }, - '~': { dir: 'previousSibling' }, - }, - - preFilter: preFilter, - - filter: { - ID: function(id) { - var attrId = unescapeSelector(id); - return function(elem) { - return elem.getAttribute('id') === attrId; - }; - }, - - TAG: function(nodeNameSelector) { - var expectedNodeName = - unescapeSelector(nodeNameSelector).toLowerCase(); - return nodeNameSelector === '*' - ? function() { - return true; - } - : function(elem) { - return nodeName(elem, expectedNodeName); - }; - }, - - CLASS: function(className) { - var pattern = classCache[className + ' ']; - - return ( - pattern || - ((pattern = new RegExp( - '(^|' + - whitespace + - ')' + - className + - '(' + - whitespace + - '|$)' - )) && - classCache(className, function(elem) { - return pattern.test( - (typeof elem.className === 'string' && - elem.className) || - (typeof elem.getAttribute !== 'undefined' && - elem.getAttribute('class')) || - '' - ); - })) - ); - }, - - ATTR: function(name, operator, check) { - return function(elem) { - var result = jQuery.attr(elem, name); - - if (result == null) { - return operator === '!='; - } - if (!operator) { - return true; - } - - result += ''; - - if (operator === '=') { - return result === check; - } - if (operator === '!=') { - return result !== check; - } - if (operator === '^=') { - return check && result.indexOf(check) === 0; - } - if (operator === '*=') { - return check && result.indexOf(check) > -1; - } - if (operator === '$=') { - return check && result.slice(-check.length) === check; - } - if (operator === '~=') { - return ( - (' ' + result.replace(rwhitespace, ' ') + ' ').indexOf( - check - ) > -1 - ); - } - if (operator === '|=') { - return ( - result === check || - result.slice(0, check.length + 1) === check + '-' - ); - } - - return false; - }; - }, - - CHILD: function(type, what, _argument, first, last) { - var simple = type.slice(0, 3) !== 'nth', - forward = type.slice(-4) !== 'last', - ofType = what === 'of-type'; - - return first === 1 && last === 0 - ? // Shortcut for :nth-*(n) - function(elem) { - return !!elem.parentNode; - } - : function(elem, _context, xml) { - var cache, - outerCache, - node, - nodeIndex, - start, - dir = - simple !== forward - ? 'nextSibling' - : 'previousSibling', - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if (parent) { - // :(first|last|only)-(child|of-type) - if (simple) { - while (dir) { - node = elem; - while ((node = node[dir])) { - if ( - ofType - ? nodeName(node, name) - : node.nodeType === 1 - ) { - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = - type === 'only' && - !start && - 'nextSibling'; - } - return true; - } - - start = [ - forward ? parent.firstChild : parent.lastChild, - ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if (forward && useCache) { - // Seek `elem` from a previously-cached index - outerCache = - parent[jQuery.expando] || - (parent[jQuery.expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = nodeIndex && cache[2]; - node = nodeIndex && parent.childNodes[nodeIndex]; - - while ( - (node = - (++nodeIndex && node && node[dir]) || - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || - start.pop()) - ) { - // When found, cache indexes on `parent` and break - if ( - node.nodeType === 1 && - ++diff && - node === elem - ) { - outerCache[type] = [ - dirruns, - nodeIndex, - diff, - ]; - break; - } - } - } else { - // Use previously-cached element index if available - if (useCache) { - outerCache = - elem[jQuery.expando] || - (elem[jQuery.expando] = {}); - cache = outerCache[type] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if (diff === false) { - // Use the same loop as above to seek `elem` from the start - while ( - (node = - (++nodeIndex && node && node[dir]) || - (diff = nodeIndex = 0) || - start.pop()) - ) { - if ( - (ofType - ? nodeName(node, name) - : node.nodeType === 1) && - ++diff - ) { - // Cache the index of each encountered element - if (useCache) { - outerCache = - node[jQuery.expando] || - (node[jQuery.expando] = {}); - outerCache[type] = [ - dirruns, - diff, - ]; - } - - if (node === elem) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return ( - diff === first || - (diff % first === 0 && diff / first >= 0) - ); - } - }; - }, - - PSEUDO: function(pseudo, argument) { - // pseudo-class names are case-insensitive - // https://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var fn = - jQuery.expr.pseudos[pseudo] || - jQuery.expr.setFilters[pseudo.toLowerCase()] || - selectorError('unsupported pseudo: ' + pseudo); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as jQuery does - if (fn[jQuery.expando]) { - return fn(argument); - } - - return fn; - }, - }, - - pseudos: { - // Potentially complex pseudos - not: markFunction(function(selector) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile(selector.replace(rtrimCSS, '$1')); - - return matcher[jQuery.expando] - ? markFunction(function(seed, matches, _context, xml) { - var elem, - unmatched = matcher(seed, null, xml, []), - i = seed.length; - - // Match elements unmatched by `matcher` - while (i--) { - if ((elem = unmatched[i])) { - seed[i] = !(matches[i] = elem); - } - } - }) - : function(elem, _context, xml) { - input[0] = elem; - matcher(input, null, xml, results); - - // Don't keep the element - // (see https://github.com/jquery/sizzle/issues/299) - input[0] = null; - return !results.pop(); - }; - }), - - has: markFunction(function(selector) { - return function(elem) { - return find(selector, elem).length > 0; - }; - }), - - contains: markFunction(function(text) { - text = unescapeSelector(text); - return function(elem) { - return ( - (elem.textContent || jQuery.text(elem)).indexOf(text) > -1 - ); - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // https://www.w3.org/TR/selectors/#lang-pseudo - lang: markFunction(function(lang) { - // lang value must be a valid identifier - if (!ridentifier.test(lang || '')) { - selectorError('unsupported lang: ' + lang); - } - lang = unescapeSelector(lang).toLowerCase(); - return function(elem) { - var elemLang; - do { - if ( - (elemLang = documentIsHTML - ? elem.lang - : elem.getAttribute('xml:lang') || - elem.getAttribute('lang')) - ) { - elemLang = elemLang.toLowerCase(); - return ( - elemLang === lang || - elemLang.indexOf(lang + '-') === 0 - ); - } - } while ((elem = elem.parentNode) && elem.nodeType === 1); - return false; - }; - }), - - // Miscellaneous - target: function(elem) { - var hash = window.location && window.location.hash; - return hash && hash.slice(1) === elem.id; - }, - - root: function(elem) { - return elem === documentElement$1; - }, - - focus: function(elem) { - return ( - elem === document$1.activeElement && - document$1.hasFocus() && - !!(elem.type || elem.href || ~elem.tabIndex) - ); - }, - - // Boolean properties - enabled: createDisabledPseudo(false), - disabled: createDisabledPseudo(true), - - checked: function(elem) { - // In CSS3, :checked should return both checked and selected elements - // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - return ( - (nodeName(elem, 'input') && !!elem.checked) || - (nodeName(elem, 'option') && !!elem.selected) - ); - }, - - selected: function(elem) { - // Support: IE <=11+ - // Accessing the selectedIndex property - // forces the browser to treat the default option as - // selected when in an optgroup. - if (isIE && elem.parentNode) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - empty: function(elem) { - // https://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for (elem = elem.firstChild; elem; elem = elem.nextSibling) { - if (elem.nodeType < 6) { - return false; - } - } - return true; - }, - - parent: function(elem) { - return !jQuery.expr.pseudos.empty(elem); - }, - - // Element/input types - header: function(elem) { - return rheader.test(elem.nodeName); - }, - - input: function(elem) { - return rinputs.test(elem.nodeName); - }, - - button: function(elem) { - return ( - (nodeName(elem, 'input') && elem.type === 'button') || - nodeName(elem, 'button') - ); - }, - - text: function(elem) { - return nodeName(elem, 'input') && elem.type === 'text'; - }, - - // Position-in-collection - first: createPositionalPseudo(function() { - return [0]; - }), - - last: createPositionalPseudo(function(_matchIndexes, length) { - return [length - 1]; - }), - - eq: createPositionalPseudo(function(_matchIndexes, length, argument) { - return [argument < 0 ? argument + length : argument]; - }), - - even: createPositionalPseudo(function(matchIndexes, length) { - var i = 0; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - odd: createPositionalPseudo(function(matchIndexes, length) { - var i = 1; - for (; i < length; i += 2) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - lt: createPositionalPseudo(function(matchIndexes, length, argument) { - var i; - - if (argument < 0) { - i = argument + length; - } else if (argument > length) { - i = length; - } else { - i = argument; - } - - for (; --i >= 0; ) { - matchIndexes.push(i); - } - return matchIndexes; - }), - - gt: createPositionalPseudo(function(matchIndexes, length, argument) { - var i = argument < 0 ? argument + length : argument; - for (; ++i < length; ) { - matchIndexes.push(i); - } - return matchIndexes; - }), - }, -}; - -jQuery.expr.pseudos.nth = jQuery.expr.pseudos.eq; - -// Add button/input type pseudos -for (i in { - radio: true, - checkbox: true, - file: true, - password: true, - image: true, -}) { - jQuery.expr.pseudos[i] = createInputPseudo(i); -} -for (i in { submit: true, reset: true }) { - jQuery.expr.pseudos[i] = createButtonPseudo(i); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = jQuery.expr.filters = jQuery.expr.pseudos; -jQuery.expr.setFilters = new setFilters(); - -function addCombinator(matcher, combinator, base) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === 'parentNode', - doneName = done++; - - return combinator.first - ? // Check against closest ancestor/preceding element - function(elem, context, xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - return matcher(elem, context, xml); - } - } - return false; - } - : // Check against all ancestor/preceding elements - function(elem, context, xml) { - var oldCache, - outerCache, - newCache = [dirruns, doneName]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if (xml) { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - if (matcher(elem, context, xml)) { - return true; - } - } - } - } else { - while ((elem = elem[dir])) { - if (elem.nodeType === 1 || checkNonElements) { - outerCache = - elem[jQuery.expando] || - (elem[jQuery.expando] = {}); - - if (skip && nodeName(elem, skip)) { - elem = elem[dir] || elem; - } else if ( - (oldCache = outerCache[key]) && - oldCache[0] === dirruns && - oldCache[1] === doneName - ) { - // Assign to newCache so results back-propagate to previous elements - return (newCache[2] = oldCache[2]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[key] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ((newCache[2] = matcher(elem, context, xml))) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher(matchers) { - return matchers.length > 1 - ? function(elem, context, xml) { - var i = matchers.length; - while (i--) { - if (!matchers[i](elem, context, xml)) { - return false; - } - } - return true; - } - : matchers[0]; -} - -function multipleContexts(selector, contexts, results) { - var i = 0, - len = contexts.length; - for (; i < len; i++) { - find(selector, contexts[i], results); - } - return results; -} - -function condense(unmatched, map, filter, context, xml) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for (; i < len; i++) { - if ((elem = unmatched[i])) { - if (!filter || filter(elem, context, xml)) { - newUnmatched.push(elem); - if (mapped) { - map.push(i); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( - preFilter, - selector, - matcher, - postFilter, - postFinder, - postSelector -) { - if (postFilter && !postFilter[jQuery.expando]) { - postFilter = setMatcher(postFilter); - } - if (postFinder && !postFinder[jQuery.expando]) { - postFinder = setMatcher(postFinder, postSelector); - } - return markFunction(function(seed, results, context, xml) { - var temp, - i, - elem, - matcherOut, - preMap = [], - postMap = [], - preexisting = results.length, - // Get initial elements from seed or context - elems = - seed || - multipleContexts( - selector || '*', - context.nodeType ? [context] : context, - [] - ), - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = - preFilter && (seed || !selector) - ? condense(elems, preMap, preFilter, context, xml) - : elems; - - if (matcher) { - // If we have a postFinder, or filtered seed, or non-seed postFilter - // or preexisting results, - matcherOut = - postFinder || (seed ? preFilter : preexisting || postFilter) - ? // ...intermediate processing is necessary - [] - : // ...otherwise use results directly - results; - - // Find primary matches - matcher(matcherIn, matcherOut, context, xml); - } else { - matcherOut = matcherIn; - } - - // Apply postFilter - if (postFilter) { - temp = condense(matcherOut, postMap); - postFilter(temp, [], context, xml); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while (i--) { - if ((elem = temp[i])) { - matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); - } - } - } - - if (seed) { - if (postFinder || preFilter) { - if (postFinder) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while (i--) { - if ((elem = matcherOut[i])) { - // Restore matcherIn since elem is not yet a final match - temp.push((matcherIn[i] = elem)); - } - } - postFinder(null, (matcherOut = []), temp, xml); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while (i--) { - if ( - (elem = matcherOut[i]) && - (temp = postFinder - ? indexOf.call(seed, elem) - : preMap[i]) > -1 - ) { - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results - ? matcherOut.splice(preexisting, matcherOut.length) - : matcherOut - ); - if (postFinder) { - postFinder(null, results, matcherOut, xml); - } else { - push.apply(results, matcherOut); - } - } - }); -} - -function matcherFromTokens(tokens) { - var checkContext, - matcher, - j, - len = tokens.length, - leadingRelative = jQuery.expr.relative[tokens[0].type], - implicitRelative = leadingRelative || jQuery.expr.relative[' '], - i = leadingRelative ? 1 : 0, - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( - function(elem) { - return elem === checkContext; - }, - implicitRelative, - true - ), - matchAnyContext = addCombinator( - function(elem) { - return indexOf.call(checkContext, elem) > -1; - }, - implicitRelative, - true - ), - matchers = [ - function(elem, context, xml) { - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - var ret = - (!leadingRelative && - (xml || context != outermostContext)) || - ((checkContext = context).nodeType - ? matchContext(elem, context, xml) - : matchAnyContext(elem, context, xml)); - - // Avoid hanging onto element - // (see https://github.com/jquery/sizzle/issues/299) - checkContext = null; - return ret; - }, - ]; - - for (; i < len; i++) { - if ((matcher = jQuery.expr.relative[tokens[i].type])) { - matchers = [addCombinator(elementMatcher(matchers), matcher)]; - } else { - matcher = jQuery.expr.filter[tokens[i].type].apply( - null, - tokens[i].matches - ); - - // Return special upon seeing a positional matcher - if (matcher[jQuery.expando]) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for (; j < len; j++) { - if (jQuery.expr.relative[tokens[j].type]) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher(matchers), - i > 1 && - toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice(0, i - 1).concat({ - value: tokens[i - 2].type === ' ' ? '*' : '', - }) - ).replace(rtrimCSS, '$1'), - matcher, - i < j && matcherFromTokens(tokens.slice(i, j)), - j < len && matcherFromTokens((tokens = tokens.slice(j))), - j < len && toSelector(tokens) - ); - } - matchers.push(matcher); - } - } - - return elementMatcher(matchers); -} - -function matcherFromGroupMatchers(elementMatchers, setMatchers) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function(seed, context, xml, results, outermost) { - var elem, - j, - matcher, - matchedCount = 0, - i = '0', - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = - seed || (byElement && jQuery.expr.find.TAG('*', outermost)), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += - contextBackup == null ? 1 : Math.random() || 0.1); - - if (outermost) { - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = - context == document$1 || context || outermost; - } - - // Add elements passing elementMatchers directly to results - for (; (elem = elems[i]) != null; i++) { - if (byElement && elem) { - j = 0; - - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if (!context && elem.ownerDocument != document$1) { - setDocument(elem); - xml = !documentIsHTML; - } - while ((matcher = elementMatchers[j++])) { - if (matcher(elem, context || document$1, xml)) { - push.call(results, elem); - break; - } - } - if (outermost) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if (bySet) { - // They will have gone through all possible matchers - if ((elem = !matcher && elem)) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if (seed) { - unmatched.push(elem); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if (bySet && i !== matchedCount) { - j = 0; - while ((matcher = setMatchers[j++])) { - matcher(unmatched, setMatched, context, xml); - } - - if (seed) { - // Reintegrate element matches to eliminate the need for sorting - if (matchedCount > 0) { - while (i--) { - if (!(unmatched[i] || setMatched[i])) { - setMatched[i] = pop.call(results); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense(setMatched); - } - - // Add matches to results - push.apply(results, setMatched); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( - outermost && - !seed && - setMatched.length > 0 && - matchedCount + setMatchers.length > 1 - ) { - jQuery.uniqueSort(results); - } - } - - // Override manipulation of globals by nested matchers - if (outermost) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? markFunction(superMatcher) : superMatcher; -} - -function compile(selector, match /* Internal Use Only */) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[selector + ' ']; - - if (!cached) { - // Generate a function of recursive functions that can be used to check each element - if (!match) { - match = tokenize(selector); - } - i = match.length; - while (i--) { - cached = matcherFromTokens(match[i]); - if (cached[jQuery.expando]) { - setMatchers.push(cached); - } else { - elementMatchers.push(cached); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers(elementMatchers, setMatchers) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -} - -/** - * A low-level selection function that works with jQuery's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with jQuery selector compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -function select(selector, context, results, seed) { - var i, - tokens, - token, - type, - find, - compiled = typeof selector === 'function' && selector, - match = !seed && tokenize((selector = compiled.selector || selector)); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if (match.length === 1) { - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice(0); - if ( - tokens.length > 2 && - (token = tokens[0]).type === 'ID' && - context.nodeType === 9 && - documentIsHTML && - jQuery.expr.relative[tokens[1].type] - ) { - context = (jQuery.expr.find.ID( - unescapeSelector(token.matches[0]), - context - ) || [])[0]; - if (!context) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if (compiled) { - context = context.parentNode; - } - - selector = selector.slice(tokens.shift().value.length); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr.needsContext.test(selector) ? 0 : tokens.length; - while (i--) { - token = tokens[i]; - - // Abort if we hit a combinator - if (jQuery.expr.relative[(type = token.type)]) { - break; - } - if ((find = jQuery.expr.find[type])) { - // Search, expanding context for leading sibling combinators - if ( - (seed = find( - unescapeSelector(token.matches[0]), - (rsibling.test(tokens[0].type) && - testContext(context.parentNode)) || - context - )) - ) { - // If seed is empty or no tokens remain, we can return early - tokens.splice(i, 1); - selector = seed.length && toSelector(tokens); - if (!selector) { - push.apply(results, seed); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - (compiled || compile(selector, match))( - seed, - context, - !documentIsHTML, - results, - !context || - (rsibling.test(selector) && testContext(context.parentNode)) || - context - ); - return results; -} - -// Initialize against the default document -setDocument(); - -jQuery.find = find; - -// These have always been private, but they used to be documented as part of -// Sizzle so let's maintain them for now for backwards compatibility purposes. -find.compile = compile; -find.select = select; -find.setDocument = setDocument; -find.tokenize = tokenize; - -var rneedsContext = jQuery.expr.match.needsContext; +var rneedsContext = $.expr.match.needsContext; // Implement the identical functionality for filter and not function winnow(elements, qualifier, not) { if (typeof qualifier === 'function') { - return jQuery.grep(elements, function(elem, i) { + return $.grep(elements, function(elem, i) { return !!qualifier.call(elem, i, elem) !== not; }); } // Single element if (qualifier.nodeType) { - return jQuery.grep(elements, function(elem) { + return $.grep(elements, function(elem) { return (elem === qualifier) !== not; }); } - // Arraylike of elements (jQuery, arguments, Array) + // Arraylike of elements ($, arguments, Array) if (typeof qualifier !== 'string') { - return jQuery.grep(elements, function(elem) { + return $.grep(elements, function(elem) { return indexOf.call(qualifier, elem) > -1 !== not; }); } // Filtered directly for both simple and complex selectors - return jQuery.filter(qualifier, elements, not); + return $.filter(qualifier, elements, not); } -jQuery.filter = function(expr, elems, not) { +$.filter = function(expr, elems, not) { var elem = elems[0]; if (not) { @@ -2642,178 +1009,169 @@ jQuery.filter = function(expr, elems, not) { } if (elems.length === 1 && elem.nodeType === 1) { - return jQuery.find.matchesSelector(elem, expr) ? [elem] : []; + return elem.matches(expr) ? [elem] : []; } - return jQuery.find.matches( - expr, - jQuery.grep(elems, function(elem) { - return elem.nodeType === 1; - }) - ); + return $.find(expr, null, null, $.grep(elems, (elem) => elem.nodeType === 1)); }; -Object.assign(jQuery.fn, { - find: function(selector) { - var i, - ret, - len = this.length, - self = this; +$.fn.find = function(selector) { + var i, + ret, + len = this.length, + self = this; - if (typeof selector !== 'string') { - return this.pushStack( - jQuery(selector).filter(function() { - for (i = 0; i < len; i++) { - if (jQuery.contains(self[i], this)) { - return true; - } + if (typeof selector !== 'string') { + return this.pushStack( + $(selector).filter(function() { + for (i = 0; i < len; i++) { + if ($.contains(self[i], this)) { + return true; } - }) - ); - } + } + }) + ); + } - ret = this.pushStack([]); + ret = this.pushStack([]); - for (i = 0; i < len; i++) { - jQuery.find(selector, self[i], ret); - } + for (i = 0; i < len; i++) { + $.find(selector, self[i], ret); + } - return len > 1 ? jQuery.uniqueSort(ret) : ret; - }, - filter: function(selector) { - return this.pushStack(winnow(this, selector || [], false)); - }, - not: function(selector) { - return this.pushStack(winnow(this, selector || [], true)); - }, - is: function(selector) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === 'string' && rneedsContext.test(selector) - ? jQuery(selector) - : selector || [], - false - ).length; - }, -}); + return len > 1 ? $.uniqueSort(ret) : ret; +}; -// Initialize a jQuery object - -// A central reference to the root jQuery(document) -var rootjQuery, - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (trac-9521) - // Strict HTML recognition (trac-11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr$1 = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - init = (jQuery.fn.init = function(selector, context) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if (!selector) { - return this; - } +$.fn.filter = function(selector) { + return this.pushStack(winnow(this, selector || [], false)); +}; - // HANDLE: $(DOMElement) - if (selector.nodeType) { - this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if (typeof selector === 'function') { - return rootjQuery.ready !== undefined - ? rootjQuery.ready(selector) - : // Execute immediately if ready is not present - selector(jQuery); - } else { - // Handle obvious HTML strings - match = selector + ''; - if (isObviousHtml(match)) { - // Assume that strings that start and end with <> are HTML and skip - // the regex check. This also handles browser-supported HTML wrappers - // like TrustedHTML. - match = [null, selector, null]; - - // Handle HTML strings or selectors - } else if (typeof selector === 'string') { - match = rquickExpr$1.exec(selector); - } else { - return jQuery.makeArray(selector, this); - } +$.fn.is = function(selector) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === 'string' && rneedsContext.test(selector) + ? $(selector) + : selector || [], + false + ).length; +}; - // Match html or make sure no context is specified for #id - // Note: match[1] may be a string or a TrustedHTML wrapper - if (match && (match[1] || !context)) { - // HANDLE: $(html) -> $(array) - if (match[1]) { - context = context instanceof jQuery ? context[0] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( - this, - jQuery.parseHTML( - match[1], - context && context.nodeType - ? context.ownerDocument || context - : document, - true - ) - ); +// Initialize a $ object - // HANDLE: $(html, props) - if ( - rsingleTag.test(match[1]) && - jQuery.isPlainObject(context) - ) { - for (match in context) { - // Properties of context are called as methods if possible - if (typeof this[match] === 'function') { - this[match](context[match]); - - // ...and otherwise set as attributes - } else { - this.attr(match, context[match]); - } - } - } +// A central reference to the root $(document) +let root$; - return this; +// A simple way to check for HTML strings +// Prioritize #id over to avoid XSS via location.hash (trac-9521) +// Strict HTML recognition (trac-11290: must start with <) +// Shortcut simple #id case for speed +const rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; - // HANDLE: $(#id) - } else { - elem = document.getElementById(match[2]); +const init = ($.fn.init = function(selector, context) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if (!selector) { + return this; + } + + // HANDLE: $(DOMElement) + if (selector.nodeType) { + this[0] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if (typeof selector === 'function') { + return root$.ready !== undefined + ? root$.ready(selector) + : // Execute immediately if ready is not present + selector($); + } else { + // Handle obvious HTML strings + match = selector + ''; + if (isObviousHtml(match)) { + // Assume that strings that start and end with <> are HTML and skip + // the regex check. This also handles browser-supported HTML wrappers + // like TrustedHTML. + match = [null, selector, null]; + + // Handle HTML strings or selectors + } else if (typeof selector === 'string') { + match = rquickExpr.exec(selector); + } else { + return $.makeArray(selector, this); + } + + // Match html or make sure no context is specified for #id + // Note: match[1] may be a string or a TrustedHTML wrapper + if (match && (match[1] || !context)) { + // HANDLE: $(html) -> $(array) + if (match[1]) { + context = context instanceof $ ? context[0] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + $.merge( + this, + $.parseHTML( + match[1], + context && context.nodeType + ? context.ownerDocument || context + : document, + true + ) + ); + + // HANDLE: $(html, props) + if (rsingleTag.test(match[1]) && isPlainObject(context)) { + for (match in context) { + // Properties of context are called as methods if possible + if (typeof this[match] === 'function') { + this[match](context[match]); - if (elem) { - // Inject the element directly into the jQuery object - this[0] = elem; - this.length = 1; + // ...and otherwise set as attributes + } else { + this.attr(match, context[match]); + } } - return this; } - // HANDLE: $(expr) & $(expr, $(...)) - } else if (!context || context.jquery) { - return (context || rootjQuery).find(selector); + return this; - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) + // HANDLE: $(#id) } else { - return this.constructor(context).find(selector); + elem = document.getElementById(match[2]); + + if (elem) { + // Inject the element directly into the $ object + this[0] = elem; + this.length = 1; + } + return this; } + + // HANDLE: $(expr) & $(expr, $(...)) + } else if (!context || context.jquery) { + return (context || root$).find(selector); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor(context).find(selector); } - }); + } +}); -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; +// Give the init function the $ prototype for later instantiation +init.prototype = $.fn; // Initialize central reference -rootjQuery = jQuery(document); +root$ = $(document); var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; @@ -2868,15 +1226,15 @@ function on(elem, types, selector, data, fn, one) { origFn = fn; fn = function(event) { // Can use an empty set, since event contains the info - jQuery().off(event); + $().off(event); return origFn.apply(this, arguments); }; // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); + fn.guid = origFn.guid || (origFn.guid = $.guid++); } return elem.each(function() { - jQuery.event.add(this, types, fn, data, selector); + $.event.add(this, types, fn, data, selector); }); } @@ -2884,7 +1242,7 @@ function on(elem, types, selector, data, fn, one) { * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ -jQuery.event = { +$.event = { add: function(elem, types, handler, data, selector) { var handleObjIn, eventHandle, @@ -2914,12 +1272,12 @@ jQuery.event = { // Ensure that invalid selectors throw exceptions at attach time // Evaluate against documentElement in case elem is a non-element node (e.g., document) if (selector) { - jQuery.find.matchesSelector(documentElement, selector); + documentElement.matches(selector); } // Make sure that the handler has a unique ID, used to find/remove it later if (!handler.guid) { - handler.guid = jQuery.guid++; + handler.guid = $.guid++; } // Init the element's event structure and main handler, if this is the first @@ -2928,11 +1286,11 @@ jQuery.event = { } if (!(eventHandle = elemData.handle)) { eventHandle = elemData.handle = function(e) { - // Discard the second event of a jQuery.event.trigger() and + // Discard the second event of a $.event.trigger() and // when an event is called after a page has unloaded - return typeof jQuery !== 'undefined' && - jQuery.event.triggered !== e.type - ? jQuery.event.dispatch.apply(elem, arguments) + return typeof $ !== 'undefined' && + $.event.triggered !== e.type + ? $.event.dispatch.apply(elem, arguments) : undefined; }; } @@ -2951,13 +1309,13 @@ jQuery.event = { } // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[type] || {}; + special = $.event.special[type] || {}; // If selector defined, determine special event api type, otherwise given type type = (selector ? special.delegateType : special.bindType) || type; // Update special based on newly reset type - special = jQuery.event.special[type] || {}; + special = $.event.special[type] || {}; // handleObj is passed to all event handlers handleObj = Object.assign( @@ -2970,7 +1328,7 @@ jQuery.event = { selector: selector, needsContext: selector && - jQuery.expr.match.needsContext.test(selector), + $.expr.match.needsContext.test(selector), namespace: namespaces.join('.'), }, handleObjIn @@ -3040,7 +1398,7 @@ jQuery.event = { // Unbind all events (on this namespace, if provided) for the element if (!type) { for (type in events) { - jQuery.event.remove( + $.event.remove( elem, type + types[t], handler, @@ -3051,7 +1409,7 @@ jQuery.event = { continue; } - special = jQuery.event.special[type] || {}; + special = $.event.special[type] || {}; type = (selector ? special.delegateType : special.bindType) || type; handlers = events[type] || []; tmp = @@ -3092,7 +1450,7 @@ jQuery.event = { special.teardown.call(elem, namespaces, elemData.handle) === false ) { - jQuery.removeEvent(elem, type, elemData.handle); + $.removeEvent(elem, type, elemData.handle); } delete events[type]; @@ -3100,7 +1458,7 @@ jQuery.event = { } // Remove data and the expando if it's no longer used - if (jQuery.isEmptyObject(events)) { + if (isEmpty(events)) { dataPriv.remove(elem, 'handle events'); } }, @@ -3113,15 +1471,15 @@ jQuery.event = { handleObj, handlerQueue, args = new Array(arguments.length), - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix(nativeEvent), + // Make a writable $.Event from the native event object + event = $.event.fix(nativeEvent), handlers = (dataPriv.get(this, 'events') || Object.create(null))[ event.type ] || [], - special = jQuery.event.special[event.type] || {}; + special = $.event.special[event.type] || {}; - // Use the fix-ed jQuery.Event rather than the (read-only) native event + // Use the fix-ed $.Event rather than the (read-only) native event args[0] = event; for (i = 1; i < arguments.length; i++) { @@ -3139,7 +1497,7 @@ jQuery.event = { } // Determine handlers - handlerQueue = jQuery.event.handlers.call(this, event, handlers); + handlerQueue = $.event.handlers.call(this, event, handlers); // Run delegates first; they may want to stop propagation beneath us i = 0; @@ -3162,7 +1520,7 @@ jQuery.event = { event.data = handleObj.data; ret = ( - (jQuery.event.special[handleObj.origType] || {}) + ($.event.special[handleObj.origType] || {}) .handle || handleObj.handler ).apply(matched.elem, args); @@ -3220,17 +1578,9 @@ jQuery.event = { sel = handleObj.selector + ' '; if (matchedSelectors[sel] === undefined) { - // matchedSelectors[sel] = handleObj.needsContext - // ? jQuery(sel, this).index(cur) > -1 - // : jQuery.find(sel, this, null, [cur]).length; - - // matchedSelectors[sel] = handleObj.needsContext - // ? !!this.querySelector(sel) - // : this.querySelectorAll(sel).length; - matchedSelectors[sel] = handleObj.needsContext - ? jQuery(sel, this).index(cur) > -1 - : Array.from(this.querySelectorAll(sel)).includes(cur); + ? $(sel, this).index(cur) > -1 + : $.find(sel, this, null, [cur]).length; } if (matchedSelectors[sel]) { matchedHandlers.push(handleObj); @@ -3259,7 +1609,7 @@ jQuery.event = { }, addProp: function(name, hook) { - Object.defineProperty(jQuery.Event.prototype, name, { + Object.defineProperty($.Event.prototype, name, { enumerable: true, configurable: true, @@ -3288,79 +1638,73 @@ jQuery.event = { }, fix: function(originalEvent) { - return originalEvent[jQuery.expando] + return originalEvent[$.expando] ? originalEvent - : new jQuery.Event(originalEvent); + : new $.Event(originalEvent); }, +}; - special: Object.assign(Object.create(null), { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true, - }, - click: { - // Utilize native event to ensure correct state for checkable inputs - setup: function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( - rcheckableType.test(el.type) && - el.click && - nodeName(el, 'input') - ) { - // dataPriv.set( el, "click", ... ) - leverageNative(el, 'click', true); - } +$.event.special = Object.create(null); - // Return false to allow normal processing in the caller - return false; - }, - trigger: function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; +$.event.special.load = { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true, +}; - // Force setup before triggering a click - if ( - rcheckableType.test(el.type) && - el.click && - nodeName(el, 'input') - ) { - leverageNative(el, 'click'); - } +$.event.special.click = { + // Utilize native event to ensure correct state for checkable inputs + setup: function(data) { + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; - // Return non-false to allow normal event-path propagation - return true; - }, + // Claim the first handler + if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { + // dataPriv.set( el, "click", ... ) + leverageNative(el, 'click', true); + } - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function(event) { - var target = event.target; - return ( - (rcheckableType.test(target.type) && - target.click && - nodeName(target, 'input') && - dataPriv.get(target, 'click')) || - nodeName(target, 'a') - ); - }, - }, + // Return false to allow normal processing in the caller + return false; + }, +}; - beforeunload: { - postDispatch: function(event) { - // Support: Chrome <=73+ - // Chrome doesn't alert on `event.preventDefault()` - // as the standard mandates. - if (event.result !== undefined && event.originalEvent) { - event.originalEvent.returnValue = event.result; - } - }, - }, - }), +$.event.special.trigger = function(data) { + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { + leverageNative(el, 'click'); + } + + // Return non-false to allow normal event-path propagation + return true; +}; + +// For cross-browser consistency, suppress native .click() on links +// Also prevent it if we're currently inside a leveraged native-event stack +$.event.special._default = function(event) { + var target = event.target; + return ( + (rcheckableType.test(target.type) && + target.click && + nodeName(target, 'input') && + dataPriv.get(target, 'click')) || + nodeName(target, 'a') + ); +}; + +$.event.special.beforeunload = { + postDispatch: function(event) { + // Support: Chrome <=73+ + // Chrome doesn't alert on `event.preventDefault()` + // as the standard mandates. + if (event.result !== undefined && event.originalEvent) { + event.originalEvent.returnValue = event.result; + } + }, }; // Ensure the presence of an event listener that handles manually-triggered @@ -3368,17 +1712,17 @@ jQuery.event = { // *native* events that it fires directly, ensuring that state changes have // already occurred before other listeners are invoked. function leverageNative(el, type, isSetup) { - // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + // Missing `isSetup` indicates a trigger call, which must force setup through $.event.add if (!isSetup) { if (dataPriv.get(el, type) === undefined) { - jQuery.event.add(el, type, returnTrue); + $.event.add(el, type, returnTrue); } return; } // Register the controller as a special universal handler for all event namespaces dataPriv.set(el, type, false); - jQuery.event.add(el, type, { + $.event.add(el, type, { namespace: false, handler: function(event) { var result, @@ -3412,7 +1756,7 @@ function leverageNative(el, type, isSetup) { // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the // bubbling surrogate propagates *after* the non-bubbling base), but that seems // less bad than duplication. - } else if ((jQuery.event.special[type] || {}).delegateType) { + } else if (($.event.special[type] || {}).delegateType) { event.stopPropagation(); } @@ -3423,14 +1767,14 @@ function leverageNative(el, type, isSetup) { dataPriv.set( this, type, - jQuery.event.trigger(saved[0], saved.slice(1), this) + $.event.trigger(saved[0], saved.slice(1), this) ); - // Abort handling of the native event by all jQuery handlers while allowing + // Abort handling of the native event by all $ handlers while allowing // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the jQuery event. However, - // the native event is re-wrapped by a jQuery one on each level of the - // propagation so the only way to stop it for jQuery is to stop it for + // by stopping immediate propagation just on the $ event. However, + // the native event is re-wrapped by a $ one on each level of the + // propagation so the only way to stop it for $ is to stop it for // everyone via native `stopPropagation()`. This is not a problem for // focus/blur which don't bubble, but it does also stop click on checkboxes // and radios. We accept this limitation. @@ -3441,17 +1785,17 @@ function leverageNative(el, type, isSetup) { }); } -jQuery.removeEvent = function(elem, type, handle) { +$.removeEvent = function(elem, type, handle) { // This "if" is needed for plain objects if (elem.removeEventListener) { elem.removeEventListener(type, handle); } }; -jQuery.Event = function(src, props) { +$.Event = function(src, props) { // Allow instantiation without the 'new' keyword - if (!(this instanceof jQuery.Event)) { - return new jQuery.Event(src, props); + if (!(this instanceof $.Event)) { + return new $.Event(src, props); } // Event object @@ -3484,13 +1828,13 @@ jQuery.Event = function(src, props) { this.timeStamp = (src && src.timeStamp) || Date.now(); // Mark it as fixed - this[jQuery.expando] = true; + this[$.expando] = true; }; -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, +$.Event.prototype = { + constructor: $.Event, isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, @@ -3528,401 +1872,116 @@ jQuery.Event.prototype = { }; // Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( - { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - char: true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - which: true, - }, - jQuery.event.addProp -); - -jQuery.each( - { focus: 'focusin', blur: 'focusout' }, - function(type, delegateType) { - // Support: IE 11+ - // Attach a single focusin/focusout handler on the document while someone wants focus/blur. - // This is because the former are synchronous in IE while the latter are async. In other - // browsers, all those handlers are invoked synchronously. - function focusMappedHandler(nativeEvent) { - // `eventHandle` would already wrap the event, but we need to change the `type` here. - var event = jQuery.event.fix(nativeEvent); - event.type = nativeEvent.type === 'focusin' ? 'focus' : 'blur'; - event.isSimulated = true; - - // focus/blur don't bubble while focusin/focusout do; simulate the former by only - // invoking the handler at the lower level. - if (event.target === event.currentTarget) { - // The setup part calls `leverageNative`, which, in turn, calls - // `jQuery.event.add`, so event handle will already have been set - // by this point. - dataPriv.get(this, 'handle')(event); - } - } - - jQuery.event.special[type] = { - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative(this, type, true); - - if (isIE) { - this.addEventListener(delegateType, focusMappedHandler); - } else { - // Return false to allow normal processing in the caller - return false; - } - }, - trigger: function() { - // Force setup before trigger - leverageNative(this, type); - - // Return non-false to allow normal event-path propagation - return true; - }, - - teardown: function() { - if (isIE) { - this.removeEventListener(delegateType, focusMappedHandler); - } else { - // Return false to indicate standard teardown should be applied - return false; - } - }, - - // Suppress native focus or blur if we're currently inside - // a leveraged native-event stack - _default: function(event) { - return dataPriv.get(event.target, type); - }, - - delegateType: delegateType, - }; - } -); +[ + 'altKey', + 'bubbles', + 'cancelable', + 'changedTouches', + 'ctrlKey', + 'detail', + 'eventPhase', + 'metaKey', + 'pageX', + 'pageY', + 'shiftKey', + 'view', + 'char', + 'code', + 'charCode', + 'key', + 'keyCode', + 'button', + 'buttons', + 'clientX', + 'clientY', + 'offsetX', + 'offsetY', + 'pointerId', + 'pointerType', + 'screenX', + 'screenY', + 'targetTouches', + 'toElement', + 'touches', + 'which', +].forEach((name) => $.event.addProp(name)); // Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. +// so that event delegation works in $. // Do the same for pointerenter/pointerleave and pointerover/pointerout -jQuery.each( - { - mouseenter: 'mouseover', - mouseleave: 'mouseout', - pointerenter: 'pointerover', - pointerleave: 'pointerout', - }, - function(orig, fix) { - jQuery.event.special[orig] = { - delegateType: fix, - bindType: fix, - - handle: function(event) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( - !related || - (related !== target && !jQuery.contains(target, related)) - ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); - event.type = fix; - } - return ret; - }, - }; - } -); - -Object.assign(jQuery.fn, { - on: function(types, selector, data, fn) { - return on(this, types, selector, data, fn); - }, - one: function(types, selector, data, fn) { - return on(this, types, selector, data, fn, 1); - }, - off: function(types, selector, fn) { - var handleObj, type; - if (types && types.preventDefault && types.handleObj) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery(types.delegateTarget).off( - handleObj.namespace - ? handleObj.origType + '.' + handleObj.namespace - : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === 'object') { - // ( types-object [, selector] ) - for (type in types) { - this.off(type, selector, types[type]); +[ + ['mouseenter', 'mouseover'], + ['mouseleave', 'mouseout'], + ['pointerenter', 'pointerover'], + ['pointerleave', 'pointerout'], +].forEach(([orig, fix]) => { + $.event.special[orig] = { + delegateType: fix, + bindType: fix, + handle: function(event) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( + !related || + (related !== target && !$.contains(target, related)) + ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; } - return this; - } - if (selector === false || typeof selector === 'function') { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if (fn === false) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove(this, types, fn, selector); - }); - }, -}); - -var isAttached = function(elem) { - return ( - jQuery.contains(elem.ownerDocument, elem) || - elem.getRootNode(composed) === elem.ownerDocument - ); - }, - composed = { composed: true }; - -// Support: IE 9 - 11+ -// Check attachment across shadow DOM boundaries when possible (gh-3504). -// Provide a fallback for browsers without Shadow DOM v1 support. -if (!documentElement.getRootNode) { - isAttached = function(elem) { - return jQuery.contains(elem.ownerDocument, elem); + return ret; + }, }; -} +}); -// rtagName captures the name from the first start tag in a string of HTML -// https://html.spec.whatwg.org/multipage/syntax.html#tag-open-state -// https://html.spec.whatwg.org/multipage/syntax.html#tag-name-state -var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i; - -var rscriptType = /^$|^module$|\/(?:java|ecma)script/i; - -var wrapMap = { - // Table parts need to be wrapped with `
` or they're - // stripped to their contents when put in a div. - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do, so we cannot shorten - // this by omitting or other required elements. - thead: ['table'], - col: ['colgroup', 'table'], - tr: ['tbody', 'table'], - td: ['tr', 'tbody', 'table'], +$.fn.on = function(types, selector, data, fn) { + return on(this, types, selector, data, fn); }; -wrapMap.tbody = - wrapMap.tfoot = - wrapMap.colgroup = - wrapMap.caption = - wrapMap.thead; -wrapMap.th = wrapMap.td; - -function getAll(context, tag) { - // Support: IE <=9 - 11+ - // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) - var ret; - - if (typeof context.getElementsByTagName !== 'undefined') { - ret = context.getElementsByTagName(tag || '*'); - } else if (typeof context.querySelectorAll !== 'undefined') { - ret = context.querySelectorAll(tag || '*'); - } else { - ret = []; - } - - if (tag === undefined || (tag && nodeName(context, tag))) { - return jQuery.merge([context], ret); - } - - return ret; -} - -// Mark scripts as having already been evaluated -function setGlobalEval(elems, refElements) { - var i = 0, - l = elems.length; +$.fn.one = function(types, selector, data, fn) { + return on(this, types, selector, data, fn, 1); +}; - for (; i < l; i++) { - dataPriv.set( - elems[i], - 'globalEval', - !refElements || dataPriv.get(refElements[i], 'globalEval') +$.fn.off = function(types, selector, fn) { + var handleObj, type; + if (types && types.preventDefault && types.handleObj) { + // ( event ) dispatched $.Event + handleObj = types.handleObj; + $(types.delegateTarget).off( + handleObj.namespace + ? handleObj.origType + '.' + handleObj.namespace + : handleObj.origType, + handleObj.selector, + handleObj.handler ); + return this; } -} - -var rhtml = /<|&#?\w+;/; - -function buildFragment(elems, context, scripts, selection, ignored) { - var elem, - tmp, - tag, - wrap, - attached, - j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for (; i < l; i++) { - elem = elems[i]; - - if (elem || elem === 0) { - // Add nodes directly - if ( - toType(elem) === 'object' && - (elem.nodeType || isArrayLike(elem)) - ) { - jQuery.merge(nodes, elem.nodeType ? [elem] : elem); - - // Convert non-html into a text node - } else if (!rhtml.test(elem)) { - nodes.push(context.createTextNode(elem)); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild(context.createElement('div')); - - // Deserialize a standard representation - tag = (rtagName.exec(elem) || ['', ''])[1].toLowerCase(); - wrap = wrapMap[tag] || arr; - - // Create wrappers & descend into them. - j = wrap.length; - while (--j > -1) { - tmp = tmp.appendChild(context.createElement(wrap[j])); - } - - tmp.innerHTML = jQuery.htmlPrefilter(elem); - - jQuery.merge(nodes, tmp.childNodes); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (trac-12392) - tmp.textContent = ''; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ''; - - i = 0; - while ((elem = nodes[i++])) { - // Skip elements already in the context collection (trac-4087) - if (selection && jQuery.inArray(elem, selection) > -1) { - if (ignored) { - ignored.push(elem); - } - continue; - } - - attached = isAttached(elem); - - // Append to fragment - tmp = getAll(fragment.appendChild(elem), 'script'); - - // Preserve script evaluation history - if (attached) { - setGlobalEval(tmp); - } - - // Capture executables - if (scripts) { - j = 0; - while ((elem = tmp[j++])) { - if (rscriptType.test(elem.type || '')) { - scripts.push(elem); - } - } + if (typeof types === 'object') { + // ( types-object [, selector] ) + for (type in types) { + this.off(type, selector, types[type]); } + return this; } - - return fragment; -} - -// Argument "data" should be string of html or a TrustedHTML wrapper of obvious HTML -// context (optional): If specified, the fragment will be created in this context, -// defaults to document -// keepScripts (optional): If true, will include scripts passed in the html string -jQuery.parseHTML = function(data, context, keepScripts) { - if (typeof data !== 'string' && !isObviousHtml(data + '')) { - return []; - } - if (typeof context === 'boolean') { - keepScripts = context; - context = false; - } - - var base, parsed, scripts; - - if (!context) { - // Stop scripts or inline event handlers from being executed immediately - // by using document.implementation - context = document.implementation.createHTMLDocument(''); - - // Set the base href for the created document - // so any parsed elements with URLs - // are based on the document's URL (gh-2965) - base = context.createElement('base'); - base.href = document.location.href; - context.head.appendChild(base); + if (selector === false || typeof selector === 'function') { + // ( types [, fn] ) + fn = selector; + selector = undefined; } - - parsed = rsingleTag.exec(data); - scripts = !keepScripts && []; - - // Single tag - if (parsed) { - return [context.createElement(parsed[1])]; + if (fn === false) { + fn = returnFalse; } + return this.each(function() { + $.event.remove(this, types, fn, selector); + }); +}; - parsed = buildFragment([data], context, scripts); - - if (scripts && scripts.length) { - jQuery(scripts).remove(); - } +export { $ as default }; +// 2397 - return jQuery.merge([], parsed.childNodes); -}; -export { jQuery as default }; diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 13a2f58db..65c9dcefc 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -349,6 +349,19 @@ if ($.event && !(DoubleTapEventName in $.event.special)) { }; } + +$.parseHTML = function(string) { + const context = document.implementation.createHTMLDocument(); + // Set the base href for the created document so any parsed elements with URLs + // are based on the document's URL + const base = context.createElement('base'); + base.href = document.location.href; + context.head.appendChild(base); + + context.body.innerHTML = string; + return $(context.body.children); +}; + $.fn.removeClass = function() { if (!this[0]) return this; V.prototype.removeClass.apply({ node: this[0] }, arguments); @@ -574,3 +587,5 @@ $.fn.children = function(selector) { } return $(el.children); }; + + diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index 3af16c312..3c6301f96 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -1087,9 +1087,8 @@ export const getElementBBox = function(el) { export const sortElements = function(elements, comparator) { var $elements = $(elements); - var placements = $elements.map(function() { + var placements = $elements.toArray().map(function(sortElement) { - var sortElement = this; var parentNode = sortElement.parentNode; // Since the element itself will change position, we have // to have some way of storing it's original position in diff --git a/packages/joint-core/src/util/utilHelpers.mjs b/packages/joint-core/src/util/utilHelpers.mjs index 70e0bceaa..ed7a1d8fc 100644 --- a/packages/joint-core/src/util/utilHelpers.mjs +++ b/packages/joint-core/src/util/utilHelpers.mjs @@ -301,7 +301,7 @@ const copyObject = (source, props, object) => { return object; }; -const isArrayLike = (value) => { +export const isArrayLike = (value) => { return value != null && typeof value !== 'function' && typeof value.length === 'number' && value.length > -1 && value.length % 1 === 0; }; From 849862a2817a81c26857571e5c61572305777eb0 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 24 Nov 2023 17:32:38 +0100 Subject: [PATCH 09/58] update --- packages/joint-core/src/mvc/Dom.mjs | 3 +- packages/joint-core/src/mvc/View.mjs | 241 --------------------- packages/joint-core/src/mvc/dom/methods.js | 240 ++++++++++++++++++++ packages/joint-core/src/mvc/index.mjs | 2 + 4 files changed, 243 insertions(+), 243 deletions(-) create mode 100644 packages/joint-core/src/mvc/dom/methods.js diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index fbd2ac80c..d69384a03 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -398,8 +398,7 @@ function nodeName(elem, name) { // rsingleTag matches a string consisting of a single HTML element with no attributes // and captures the element's name -var rsingleTag = - /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; +const rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function isObviousHtml(input) { return ( diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 65c9dcefc..1f8816fbb 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -348,244 +348,3 @@ if ($.event && !(DoubleTapEventName in $.event.special)) { } }; } - - -$.parseHTML = function(string) { - const context = document.implementation.createHTMLDocument(); - // Set the base href for the created document so any parsed elements with URLs - // are based on the document's URL - const base = context.createElement('base'); - base.href = document.location.href; - context.head.appendChild(base); - - context.body.innerHTML = string; - return $(context.body.children); -}; - -$.fn.removeClass = function() { - if (!this[0]) return this; - V.prototype.removeClass.apply({ node: this[0] }, arguments); - return this; -}; - -$.fn.addClass = function() { - if (!this[0]) return this; - V.prototype.addClass.apply({ node: this[0] }, arguments); - return this; -}; - -$.fn.hasClass = function() { - if (!this[0]) return false; - return V.prototype.hasClass.apply({ node: this[0] }, arguments); -}; - -$.fn.attr = function(name, value) { - if (!this[0]) return ''; - if (typeof name === 'string' && value === undefined) { - return this[0].getAttribute(name); - } - if (typeof name === 'string') { - this[0].setAttribute(name, value); - return this; - } - Object.keys(name).forEach(key => { - this[0].setAttribute(key, name[key]); - }); - return this; -}; - -$.fn.empty = function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - // jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ''; - } - } - - return this; -}; - -$.fn.append = function(...nodes) { - if (!this[0]) return this; - nodes.forEach(node => { - if (typeof node === 'string') { - node = $.parseHTML(node); - } - this[0].appendChild(node[0] || node); - }); - return this; -}; - -$.fn.html = function(html) { - if (!this[0]) return ''; - if (html === undefined) { - return this[0].innerHTML; - } - this[0].innerHTML = html; - return this; -}; - -$.fn.appendTo = function(parent) { - if (!this[0]) return this; - $(parent).append(this); - return this; -}; - -$.fn.css = function(styles) { - if (!this[0]) return this; - if (typeof styles === 'string' && arguments.length === 1) { - return this[0].style[styles]; - } - if (typeof styles === 'string' && arguments.length === 2) { - this[0].style[styles] = arguments[1]; - return this; - } - - Object.keys(styles).forEach(key => { - this[0].style[key] = styles[key]; - }); - return this; -}; - -$.fn.remove = function() { - if (!this[0]) return this; - const nodes = [this[0], ...Array.from(this[0].getElementsByTagName('*'))]; - for (let i = 0; i < nodes.length; i++) { - $.event.remove(nodes[i]); - } - this[0].remove(); - return this; -}; - -$.fn.data = function() { return this; }; - - -$.data = function() { return this; }; - - -$.attr = function(el, name) { - if (!el) return ''; - return el.getAttribute(name); -}; - -$.htmlPrefilter = function(html) { return html; }; - -// From test - -$.fn.has = function(e) { - return this.find(e).length > 0; -}; - -$.fn.trigger = function(name, data) { - if (!this[0]) return this; - if (name === 'click') { - this[0].click(); - } else if (name === 'contextmenu') { - this[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); - } else { - - let event; - // Native - if (window.CustomEvent) { - event = new CustomEvent(name, { detail: data }); - } else { - event = document.createEvent('CustomEvent'); - event.initCustomEvent(name, true, true, data); - } - - this[0].dispatchEvent(event); - } - - return this; -}; - -$.fn.click = function() { this.trigger('click'); }; - - -// Native (optional filter function) -function getPreviousSiblings(elem, filter) { - var sibs = []; - while (elem = elem.previousElementSibling) { - if (!filter || filter(elem)) sibs.push(elem); - } - return sibs; -} - -$.fn.prevAll = function() { - return $(getPreviousSiblings(this[0])); -}; - - -$.fn.index = function() { - return this.prevAll().length; -}; - -$.fn.nextAll = function() { - var sibs = []; - var elem = this[0]; - while (elem = elem.nextElementSibling) { - sibs.push(elem); - } - return $(sibs); -}; - -$.fn.prev = function() { - if (!this[0]) return $(); - return $(this[0].previousElementSibling); -}; - -$.fn.text = function() { - if (!this[0]) return ''; - return this[0].textContent; -}; - -$.fn.prop = function(name) { - if (!this[0]) return ''; - return this[0][name]; -}; - -$.fn.parent = function(i) { - if (!this[0]) return $(); - return $(this[0].parentNode); -}; - -$.fn.width = function() { - if (!this[0]) return 0; - return this[0].getBoundingClientRect().width; -}; - -$.fn.height = function() { - if (!this[0]) return 0; - return this[0].getBoundingClientRect().height; -}; - -// JJ+ is using it as a setter -$.fn.offset = function() { - if (!this[0]) return { top: 0, left: 0 }; - const box = this[0].getBoundingClientRect(); - return { - top: box.top + window.pageYOffset - document.documentElement.clientTop, - left: box.left + window.pageXOffset - document.documentElement.clientLeft - }; -}; - - -// For test only (verified) - -$.fn.children = function(selector) { - const [el] = this; - if (!el) return $(); - if (selector) { - return $(Array.from(el.children).filter(child => child.matches(selector))); - } - return $(el.children); -}; - - diff --git a/packages/joint-core/src/mvc/dom/methods.js b/packages/joint-core/src/mvc/dom/methods.js new file mode 100644 index 000000000..6fa387d46 --- /dev/null +++ b/packages/joint-core/src/mvc/dom/methods.js @@ -0,0 +1,240 @@ +import $ from '../Dom.mjs'; +import V from '../../V/index.mjs'; + +$.parseHTML = function(string) { + const context = document.implementation.createHTMLDocument(); + // Set the base href for the created document so any parsed elements with URLs + // are based on the document's URL + const base = context.createElement('base'); + base.href = document.location.href; + context.head.appendChild(base); + + context.body.innerHTML = string; + return $(context.body.children); +}; + +$.fn.removeClass = function() { + if (!this[0]) return this; + V.prototype.removeClass.apply({ node: this[0] }, arguments); + return this; +}; + +$.fn.addClass = function() { + if (!this[0]) return this; + V.prototype.addClass.apply({ node: this[0] }, arguments); + return this; +}; + +$.fn.hasClass = function() { + if (!this[0]) return false; + return V.prototype.hasClass.apply({ node: this[0] }, arguments); +}; + +$.fn.attr = function(name, value) { + if (!this[0]) return ''; + if (typeof name === 'string' && value === undefined) { + return this[0].getAttribute(name); + } + if (typeof name === 'string') { + this[0].setAttribute(name, value); + return this; + } + Object.keys(name).forEach(key => { + this[0].setAttribute(key, name[key]); + }); + return this; +}; + +$.fn.empty = function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + // jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ''; + } + } + + return this; +}; + +$.fn.append = function(...nodes) { + if (!this[0]) return this; + nodes.forEach(node => { + if (typeof node === 'string') { + node = $.parseHTML(node); + } + this[0].appendChild(node[0] || node); + }); + return this; +}; + +$.fn.html = function(html) { + if (!this[0]) return ''; + if (html === undefined) { + return this[0].innerHTML; + } + this[0].innerHTML = html; + return this; +}; + +$.fn.appendTo = function(parent) { + if (!this[0]) return this; + $(parent).append(this); + return this; +}; + +$.fn.css = function(styles) { + if (!this[0]) return this; + if (typeof styles === 'string' && arguments.length === 1) { + return this[0].style[styles]; + } + if (typeof styles === 'string' && arguments.length === 2) { + this[0].style[styles] = arguments[1]; + return this; + } + + Object.keys(styles).forEach(key => { + this[0].style[key] = styles[key]; + }); + return this; +}; + +$.fn.remove = function() { + if (!this[0]) return this; + const nodes = [this[0], ...Array.from(this[0].getElementsByTagName('*'))]; + for (let i = 0; i < nodes.length; i++) { + $.event.remove(nodes[i]); + } + this[0].remove(); + return this; +}; + +$.fn.data = function() { return this; }; + + +$.data = function() { return this; }; + + +$.attr = function(el, name) { + if (!el) return ''; + return el.getAttribute(name); +}; + +// From test + +$.fn.has = function(e) { + return this.find(e).length > 0; +}; + +$.fn.trigger = function(name, data) { + if (!this[0]) return this; + if (name === 'click') { + this[0].click(); + } else if (name === 'contextmenu') { + this[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + } else { + + let event; + // Native + if (window.CustomEvent) { + event = new CustomEvent(name, { detail: data }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(name, true, true, data); + } + + this[0].dispatchEvent(event); + } + + return this; +}; + +$.fn.click = function() { this.trigger('click'); }; + + +// Native (optional filter function) +function getPreviousSiblings(elem, filter) { + var sibs = []; + while ((elem = elem.previousElementSibling)) { + if (!filter || filter(elem)) sibs.push(elem); + } + return sibs; +} + +$.fn.prevAll = function() { + return $(getPreviousSiblings(this[0])); +}; + + +$.fn.index = function() { + return this.prevAll().length; +}; + +$.fn.nextAll = function() { + var sibs = []; + var elem = this[0]; + while ((elem = elem.nextElementSibling)) { + sibs.push(elem); + } + return $(sibs); +}; + +$.fn.prev = function() { + if (!this[0]) return $(); + return $(this[0].previousElementSibling); +}; + +$.fn.text = function() { + if (!this[0]) return ''; + return this[0].textContent; +}; + +$.fn.prop = function(name) { + if (!this[0]) return ''; + return this[0][name]; +}; + +$.fn.parent = function(i) { + if (!this[0]) return $(); + return $(this[0].parentNode); +}; + +$.fn.width = function() { + if (!this[0]) return 0; + return this[0].getBoundingClientRect().width; +}; + +$.fn.height = function() { + if (!this[0]) return 0; + return this[0].getBoundingClientRect().height; +}; + +// JJ+ is using it as a setter +$.fn.offset = function() { + if (!this[0]) return { top: 0, left: 0 }; + const box = this[0].getBoundingClientRect(); + return { + top: box.top + window.pageYOffset - document.documentElement.clientTop, + left: box.left + window.pageXOffset - document.documentElement.clientLeft + }; +}; + + +// For test only (verified) + +$.fn.children = function(selector) { + const [el] = this; + if (!el) return $(); + if (selector) { + return $(Array.from(el.children).filter(child => child.matches(selector))); + } + return $(el.children); +}; + + diff --git a/packages/joint-core/src/mvc/index.mjs b/packages/joint-core/src/mvc/index.mjs index 03729d45d..a523d9d38 100644 --- a/packages/joint-core/src/mvc/index.mjs +++ b/packages/joint-core/src/mvc/index.mjs @@ -6,3 +6,5 @@ export * from './Model.mjs'; export * from './ViewBase.mjs'; export * from './mvcUtils.mjs'; export { default as $ } from './Dom.mjs'; + +import './dom/methods.js'; From b14b47686c5f537c50681490fd2f1979f5ba85f6 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sat, 25 Nov 2023 15:11:29 +0100 Subject: [PATCH 10/58] update --- packages/joint-core/src/dia/CellView.mjs | 5 +- packages/joint-core/src/dia/Paper.mjs | 6 +- .../joint-core/src/dia/attributes/index.mjs | 17 +- packages/joint-core/src/mvc/Data.mjs | 45 + packages/joint-core/src/mvc/Dom.mjs | 1056 +---------------- packages/joint-core/src/mvc/View.mjs | 28 +- packages/joint-core/src/mvc/ViewBase.mjs | 2 +- packages/joint-core/src/mvc/dom/dom-data.js | 12 + packages/joint-core/src/mvc/dom/dom-events.js | 835 +++++++++++++ .../joint-core/src/mvc/dom/dom-gestures.js | 26 + .../joint-core/src/mvc/dom/dom-methods.js | 119 ++ packages/joint-core/src/mvc/dom/methods.js | 240 ---- packages/joint-core/src/mvc/index.mjs | 7 +- packages/joint-core/src/util/util.mjs | 13 +- 14 files changed, 1080 insertions(+), 1331 deletions(-) create mode 100644 packages/joint-core/src/mvc/Data.mjs create mode 100644 packages/joint-core/src/mvc/dom/dom-data.js create mode 100644 packages/joint-core/src/mvc/dom/dom-events.js create mode 100644 packages/joint-core/src/mvc/dom/dom-gestures.js create mode 100644 packages/joint-core/src/mvc/dom/dom-methods.js delete mode 100644 packages/joint-core/src/mvc/dom/methods.js diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index 97a062d0c..c7272ba46 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -147,9 +147,6 @@ export const CellView = View.extend({ this.cleanNodesCache(); - // Store reference to this to the DOM element so that the view is accessible through the DOM tree. - this.$el.data('view', this); - this.startListening(); }, @@ -532,7 +529,7 @@ export const CellView = View.extend({ if (node instanceof SVGElement) { V(node).attr(attrs); } else { - $(node).attr(attrs); + Object.keys(attrs).forEach(key => node.setAttribute(key, attrs[key])); } } }, diff --git a/packages/joint-core/src/dia/Paper.mjs b/packages/joint-core/src/dia/Paper.mjs index 45deb759f..b96a96431 100644 --- a/packages/joint-core/src/dia/Paper.mjs +++ b/packages/joint-core/src/dia/Paper.mjs @@ -1671,15 +1671,13 @@ export const Paper = View.extend({ sortViewsExact: function() { - // TODO: remove - // Run insertion sort algorithm in order to efficiently sort DOM elements according to their // associated model `z` attribute. - var $cells = $(this.cells).children('[model-id]'); + var cellNodes = Array.from(this.cells.childNodes).filter(node => node.getAttribute('model-id')); var cells = this.model.get('cells'); - sortElements($cells, function(a, b) { + sortElements(cellNodes, function(a, b) { var cellA = cells.get(a.getAttribute('model-id')); var cellB = cells.get(b.getAttribute('model-id')); var zA = cellA.attributes.z || 0; diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index 695c136f9..c21a229c4 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -75,8 +75,7 @@ function shapeWrapper(shapeConstructor, opt) { var cacheName = 'joint-shape'; var resetOffset = opt && opt.resetOffset; return function(value, refBBox, node) { - var $node = $(node); - var cache = $node.data(cacheName); + var cache = $.data.read(node, cacheName); if (!cache || cache.value !== value) { // only recalculate if value has changed var cachedShape = shapeConstructor(value); @@ -85,7 +84,7 @@ function shapeWrapper(shapeConstructor, opt) { shape: cachedShape, shapeBBox: cachedShape.bbox() }; - $node.data(cacheName, cache); + $.data.set(node, cacheName, cache); } var shape = cache.shape.clone(); @@ -311,9 +310,8 @@ const attributesNS = { return !attrs.textWrap || !isPlainObject(attrs.textWrap); }, set: function(text, refBBox, node, attrs) { - const $node = $(node); const cacheName = 'joint-text'; - const cache = $node.data(cacheName); + const cache = $.data.read(node, cacheName); const { lineHeight, annotations, @@ -359,7 +357,7 @@ const attributesNS = { eol, displayEmpty }); - $node.data(cacheName, textHash); + $.data.set(node, cacheName, textHash); } } }, @@ -436,11 +434,10 @@ const attributesNS = { return node instanceof SVGElement; }, set: function(title, refBBox, node) { - var $node = $(node); var cacheName = 'joint-title'; - var cache = $node.data(cacheName); + var cache = $.data.read(node, cacheName); if (cache === undefined || cache !== title) { - $node.data(cacheName, title); + $.data.set(node, cacheName, title); if (node.tagName === 'title') { // The target node is a element. node.textContent = title; @@ -502,7 +499,7 @@ const attributesNS = { html: { set: function(html, refBBox, node) { - $(node).html(html + ''); + node.innerHTML = html + ''; } }, diff --git a/packages/joint-core/src/mvc/Data.mjs b/packages/joint-core/src/mvc/Data.mjs new file mode 100644 index 000000000..6e47ba0bb --- /dev/null +++ b/packages/joint-core/src/mvc/Data.mjs @@ -0,0 +1,45 @@ +class Data { + + constructor() { + this.map = new WeakMap(); + } + + has(obj, key) { + if (key === undefined) return this.map.has(obj); + return key in this.map.get(obj); + } + + read(obj, key) { + if (!this.has(obj)) return null; + const data = this.map.get(obj); + if (key === undefined) return data; + return data[key]; + } + + get(obj, key) { + if (!this.has(obj)) this.map.set(obj, Object.create(null)); + return this.read(obj, key); + } + + set(obj, key, value) { + const data = this.get(obj); + if (key === undefined) { + if (value === undefined) return; + Object.assign(data, value); + } else { + data[key] = value; + } + } + + remove(obj, key) { + if (!this.has(obj)) return; + if (key === undefined) { + this.map.delete(obj); + } else { + const data = this.map.get(obj); + delete data[key]; + } + } +} + +export default Data; diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index d69384a03..16254a60c 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -1,4 +1,4 @@ -import { isPlainObject, isArrayLike, camelCase, isEmpty } from '../util/utilHelpers.mjs'; +import { isPlainObject, isArrayLike } from '../util/utilHelpers.mjs'; /*! * jQuery JavaScript Library v4.0.0-pre+c98597ea.dirty * https://jquery.com/ @@ -9,7 +9,6 @@ import { isPlainObject, isArrayLike, camelCase, isEmpty } from '../util/utilHelp * * Date: 2023-11-24T14:04Z */ -('use strict'); if (!window.document) { throw new Error('$ requires a window with a document'); @@ -17,8 +16,6 @@ if (!window.document) { var arr = []; -var slice = arr.slice; - var push = arr.push; var indexOf = arr.indexOf; @@ -44,7 +41,7 @@ $.fn = $.prototype = { length: 0, toArray: function() { - return slice.call(this); + return Array.from(this); }, // Get the Nth element in the matched element set OR @@ -52,7 +49,7 @@ $.fn = $.prototype = { get: function(num) { // Return all the elements in a clean array if (num == null) { - return slice.call(this); + return Array.from(this); } // Return just the one element from the set @@ -77,53 +74,17 @@ $.fn = $.prototype = { return $.each(this, callback); }, - slice: function() { - return this.pushStack(slice.apply(this, arguments)); - }, - - first: function() { - return this.eq(0); - }, - - last: function() { - return this.eq(-1); - }, - - even: function() { - return this.pushStack( - $.grep(this, function(_elem, i) { - return (i + 1) % 2; - }) - ); - }, - - odd: function() { - return this.pushStack( - $.grep(this, function(_elem, i) { - return i % 2; - }) - ); - }, - eq: function(i) { var len = this.length, j = +i + (i < 0 ? len : 0); return this.pushStack(j >= 0 && j < len ? [this[j]] : []); }, - - end: function() { - return this.prevObject || this.constructor(); - }, }; // Unique for each copy of $ on the page -$.expando = '$' + (version + Math.random()).replace(/\D/g, ''); - -// Assume $ is ready without the ready module -$.isReady = true; +$.expando = 'DOM' + (version + Math.random()).replace(/\D/g, ''); Object.assign($, { - error: function(msg) { throw new Error(msg); }, @@ -225,180 +186,12 @@ if (typeof Symbol === 'function') { $.fn[Symbol.iterator] = arr[Symbol.iterator]; } -var documentElement = document.documentElement; - -// Only count HTML whitespace -// Other whitespace should count in values -// https://infra.spec.whatwg.org/#ascii-whitespace -var rnothtmlwhite = /[^\x20\t\r\n\f]+/g; - -var rcheckableType = /^(?:checkbox|radio)$/i; - var isIE = document.documentMode; -/** - * Determines whether an object can have data - */ -function acceptData(owner) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; -} - -function Data() { - this.expando = $.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - cache: function(owner) { - // Check if the owner object already has a cache - var value = owner[this.expando]; - - // If not, create one - if (!value) { - value = Object.create(null); - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see trac-8335. - // Always return an empty object. - if (acceptData(owner)) { - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if (owner.nodeType) { - owner[this.expando] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty(owner, this.expando, { - value: value, - configurable: true, - }); - } - } - } - - return value; - }, - set: function(owner, data, value) { - var prop, - cache = this.cache(owner); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if (typeof data === 'string') { - cache[camelCase(data)] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Copy the properties one-by-one to the cache object - for (prop in data) { - cache[camelCase(prop)] = data[prop]; - } - } - return cache; - }, - get: function(owner, key) { - return key === undefined - ? this.cache(owner) - : // Always use camelCase key (gh-2257) - owner[this.expando] && owner[this.expando][camelCase(key)]; - }, - access: function(owner, key, value) { - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( - key === undefined || - (key && typeof key === 'string' && value === undefined) - ) { - return this.get(owner, key); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set(owner, key, value); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function(owner, key) { - var i, - cache = owner[this.expando]; - - if (cache === undefined) { - return; - } - - if (key !== undefined) { - // Support array or space separated string of keys - if (Array.isArray(key)) { - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map(camelCase); - } else { - key = camelCase(key); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? [key] : key.match(rnothtmlwhite) || []; - } - - i = key.length; - - while (i--) { - delete cache[key[i]]; - } - } - - // Remove the expando if there's no more data - if (key === undefined || isEmpty(cache)) { - // Support: Chrome <=35 - 45+ - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if (owner.nodeType) { - owner[this.expando] = undefined; - } else { - delete owner[this.expando]; - } - } - }, - hasData: function(owner) { - var cache = owner[this.expando]; - return cache !== undefined && !isEmpty(cache); - }, -}; - -var dataPriv = new Data(); - -function nodeName(elem, name) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); -} - // rsingleTag matches a string consisting of a single HTML element with no attributes // and captures the element's name -const rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; +const rsingleTag = + /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; function isObviousHtml(input) { return ( @@ -728,7 +521,7 @@ function toSelector(tokens) { // CSS string/identifier serialization // https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; +var rcssescape = /([\0-\x1F\x7F]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; function fcssescape(ch, asCodePoint) { if (asCodePoint) { @@ -846,7 +639,7 @@ $.uniqueSort = function(results) { }; $.fn.uniqueSort = function() { - return this.pushStack($.uniqueSort(slice.apply(this))); + return this.pushStack($.uniqueSort(Array.from(this))); }; /* @@ -921,13 +714,12 @@ $.find = function(selector, context, results, seed) { // Thanks to Andrew Dupont for this technique. if ( nodeType === 1 && - (rdescend.test(selector) || rleadingCombinator.test(selector)) + (rdescend.test(selector) || rleadingCombinator.test(selector)) ) { // Expand context for sibling selectors newContext = - (rsibling.test(selector) && - testContext(context.parentNode)) || - context; + (rsibling.test(selector) && testContext(context.parentNode)) || + context; // Outside of IE, if we're not changing the context we can // use :scope instead of an ID. @@ -945,9 +737,7 @@ $.find = function(selector, context, results, seed) { i = groups.length; while (i--) { groups[i] = - (nid ? '#' + nid : ':scope') + - ' ' + - toSelector(groups[i]); + (nid ? '#' + nid : ':scope') + ' ' + toSelector(groups[i]); } newSelector = groups.join(','); } @@ -964,7 +754,7 @@ $.find = function(selector, context, results, seed) { return results; }; -$.expr = { +$.expr = { // Can be adjusted by the user cacheLength: 50, @@ -1011,7 +801,12 @@ $.filter = function(expr, elems, not) { return elem.matches(expr) ? [elem] : []; } - return $.find(expr, null, null, $.grep(elems, (elem) => elem.nodeType === 1)); + return $.find( + expr, + null, + null, + $.grep(elems, (elem) => elem.nodeType === 1) + ); }; $.fn.find = function(selector) { @@ -1041,7 +836,7 @@ $.fn.find = function(selector) { return len > 1 ? $.uniqueSort(ret) : ret; }; -$.fn.filter = function(selector) { +$.fn.filter = function(selector) { return this.pushStack(winnow(this, selector || [], false)); }; @@ -1172,815 +967,4 @@ init.prototype = $.fn; // Initialize central reference root$ = $(document); -var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on(elem, types, selector, data, fn, one) { - var origFn, type; - - // Types can be a map of types/handlers - if (typeof types === 'object') { - // ( types-Object, selector, data ) - if (typeof selector !== 'string') { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for (type in types) { - on(elem, type, selector, data, types[type], one); - } - return elem; - } - - if (data == null && fn == null) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if (fn == null) { - if (typeof selector === 'string') { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if (fn === false) { - fn = returnFalse; - } else if (!fn) { - return elem; - } - - if (one === 1) { - origFn = fn; - fn = function(event) { - // Can use an empty set, since event contains the info - $().off(event); - return origFn.apply(this, arguments); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || (origFn.guid = $.guid++); - } - return elem.each(function() { - $.event.add(this, types, fn, data, selector); - }); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -$.event = { - add: function(elem, types, handler, data, selector) { - var handleObjIn, - eventHandle, - tmp, - events, - t, - handleObj, - special, - handlers, - type, - namespaces, - origType, - elemData = dataPriv.get(elem); - - // Only attach events to objects that accept data - if (!acceptData(elem)) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if (selector) { - documentElement.matches(selector); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if (!handler.guid) { - handler.guid = $.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if (!(events = elemData.events)) { - events = elemData.events = Object.create(null); - } - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function(e) { - // Discard the second event of a $.event.trigger() and - // when an event is called after a page has unloaded - return typeof $ !== 'undefined' && - $.event.triggered !== e.type - ? $.event.dispatch.apply(elem, arguments) - : undefined; - }; - } - - // Handle multiple events separated by a space - types = (types || '').match(rnothtmlwhite) || ['']; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || '').split('.').sort(); - - // There *must* be a type, no attaching namespace-only handlers - if (!type) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = $.event.special[type] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = (selector ? special.delegateType : special.bindType) || type; - - // Update special based on newly reset type - special = $.event.special[type] || {}; - - // handleObj is passed to all event handlers - handleObj = Object.assign( - { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: - selector && - $.expr.match.needsContext.test(selector), - namespace: namespaces.join('.'), - }, - handleObjIn - ); - - // Init the event handler queue if we're the first - if (!(handlers = events[type])) { - handlers = events[type] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( - !special.setup || - special.setup.call(elem, data, namespaces, eventHandle) === - false - ) { - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle); - } - } - } - - if (special.add) { - special.add.call(elem, handleObj); - - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if (selector) { - handlers.splice(handlers.delegateCount++, 0, handleObj); - } else { - handlers.push(handleObj); - } - } - }, - - // Detach an event or set of events from an element - remove: function(elem, types, handler, selector, mappedTypes) { - var j, - origCount, - tmp, - events, - t, - handleObj, - special, - handlers, - type, - namespaces, - origType, - elemData = dataPriv.hasData(elem) && dataPriv.get(elem); - - if (!elemData || !(events = elemData.events)) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = (types || '').match(rnothtmlwhite) || ['']; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || '').split('.').sort(); - - // Unbind all events (on this namespace, if provided) for the element - if (!type) { - for (type in events) { - $.event.remove( - elem, - type + types[t], - handler, - selector, - true - ); - } - continue; - } - - special = $.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - handlers = events[type] || []; - tmp = - tmp[2] && - new RegExp( - '(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)' - ); - - // Remove matching events - origCount = j = handlers.length; - while (j--) { - handleObj = handlers[j]; - - if ( - (mappedTypes || origType === handleObj.origType) && - (!handler || handler.guid === handleObj.guid) && - (!tmp || tmp.test(handleObj.namespace)) && - (!selector || - selector === handleObj.selector || - (selector === '**' && handleObj.selector)) - ) { - handlers.splice(j, 1); - - if (handleObj.selector) { - handlers.delegateCount--; - } - if (special.remove) { - special.remove.call(elem, handleObj); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if (origCount && !handlers.length) { - if ( - !special.teardown || - special.teardown.call(elem, namespaces, elemData.handle) === - false - ) { - $.removeEvent(elem, type, elemData.handle); - } - - delete events[type]; - } - } - - // Remove data and the expando if it's no longer used - if (isEmpty(events)) { - dataPriv.remove(elem, 'handle events'); - } - }, - - dispatch: function(nativeEvent) { - var i, - j, - ret, - matched, - handleObj, - handlerQueue, - args = new Array(arguments.length), - // Make a writable $.Event from the native event object - event = $.event.fix(nativeEvent), - handlers = - (dataPriv.get(this, 'events') || Object.create(null))[ - event.type - ] || [], - special = $.event.special[event.type] || {}; - - // Use the fix-ed $.Event rather than the (read-only) native event - args[0] = event; - - for (i = 1; i < arguments.length; i++) { - args[i] = arguments[i]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( - special.preDispatch && - special.preDispatch.call(this, event) === false - ) { - return; - } - - // Determine handlers - handlerQueue = $.event.handlers.call(this, event, handlers); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { - event.currentTarget = matched.elem; - - j = 0; - while ( - (handleObj = matched.handlers[j++]) && - !event.isImmediatePropagationStopped() - ) { - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( - !event.rnamespace || - handleObj.namespace === false || - event.rnamespace.test(handleObj.namespace) - ) { - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( - ($.event.special[handleObj.origType] || {}) - .handle || handleObj.handler - ).apply(matched.elem, args); - - if (ret !== undefined) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if (special.postDispatch) { - special.postDispatch.call(this, event); - } - - return event.result; - }, - - handlers: function(event, handlers) { - var i, - handleObj, - sel, - matchedHandlers, - matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( - delegateCount && - // Support: Firefox <=42 - 66+ - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11+ - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !(event.type === 'click' && event.button >= 1) - ) { - for (; cur !== this; cur = cur.parentNode || this) { - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( - cur.nodeType === 1 && - !(event.type === 'click' && cur.disabled === true) - ) { - matchedHandlers = []; - matchedSelectors = {}; - for (i = 0; i < delegateCount; i++) { - handleObj = handlers[i]; - - // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + ' '; - - if (matchedSelectors[sel] === undefined) { - matchedSelectors[sel] = handleObj.needsContext - ? $(sel, this).index(cur) > -1 - : $.find(sel, this, null, [cur]).length; - } - if (matchedSelectors[sel]) { - matchedHandlers.push(handleObj); - } - } - if (matchedHandlers.length) { - handlerQueue.push({ - elem: cur, - handlers: matchedHandlers, - }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if (delegateCount < handlers.length) { - handlerQueue.push({ - elem: cur, - handlers: handlers.slice(delegateCount), - }); - } - - return handlerQueue; - }, - - addProp: function(name, hook) { - Object.defineProperty($.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: - typeof hook === 'function' - ? function() { - if (this.originalEvent) { - return hook(this.originalEvent); - } - } - : function() { - if (this.originalEvent) { - return this.originalEvent[name]; - } - }, - - set: function(value) { - Object.defineProperty(this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value, - }); - }, - }); - }, - - fix: function(originalEvent) { - return originalEvent[$.expando] - ? originalEvent - : new $.Event(originalEvent); - }, -}; - -$.event.special = Object.create(null); - -$.event.special.load = { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true, -}; - -$.event.special.click = { - // Utilize native event to ensure correct state for checkable inputs - setup: function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { - // dataPriv.set( el, "click", ... ) - leverageNative(el, 'click', true); - } - - // Return false to allow normal processing in the caller - return false; - }, -}; - -$.event.special.trigger = function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { - leverageNative(el, 'click'); - } - - // Return non-false to allow normal event-path propagation - return true; -}; - -// For cross-browser consistency, suppress native .click() on links -// Also prevent it if we're currently inside a leveraged native-event stack -$.event.special._default = function(event) { - var target = event.target; - return ( - (rcheckableType.test(target.type) && - target.click && - nodeName(target, 'input') && - dataPriv.get(target, 'click')) || - nodeName(target, 'a') - ); -}; - -$.event.special.beforeunload = { - postDispatch: function(event) { - // Support: Chrome <=73+ - // Chrome doesn't alert on `event.preventDefault()` - // as the standard mandates. - if (event.result !== undefined && event.originalEvent) { - event.originalEvent.returnValue = event.result; - } - }, -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative(el, type, isSetup) { - // Missing `isSetup` indicates a trigger call, which must force setup through $.event.add - if (!isSetup) { - if (dataPriv.get(el, type) === undefined) { - $.event.add(el, type, returnTrue); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set(el, type, false); - $.event.add(el, type, { - namespace: false, - handler: function(event) { - var result, - saved = dataPriv.get(this, type); - - if (event.isTrigger & 1 && this[type]) { - // Interrupt processing of the outer synthetic .trigger()ed event - if (!saved) { - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call(arguments); - dataPriv.set(this, type, saved); - - // Trigger the native event and capture its result - this[type](); - result = dataPriv.get(this, type); - dataPriv.set(this, type, false); - - if (saved !== result) { - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if (($.event.special[type] || {}).delegateType) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if (saved) { - // ...and capture the result - dataPriv.set( - this, - type, - $.event.trigger(saved[0], saved.slice(1), this) - ); - - // Abort handling of the native event by all $ handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the $ event. However, - // the native event is re-wrapped by a $ one on each level of the - // propagation so the only way to stop it for $ is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - }, - }); -} - -$.removeEvent = function(elem, type, handle) { - // This "if" is needed for plain objects - if (elem.removeEventListener) { - elem.removeEventListener(type, handle); - } -}; - -$.Event = function(src, props) { - // Allow instantiation without the 'new' keyword - if (!(this instanceof $.Event)) { - return new $.Event(src, props); - } - - // Event object - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented - ? returnTrue - : returnFalse; - - // Create target properties - this.target = src.target; - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if (props) { - Object.assign(this, props); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = (src && src.timeStamp) || Date.now(); - - // Mark it as fixed - this[$.expando] = true; -}; - -// $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -$.Event.prototype = { - constructor: $.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if (e && !this.isSimulated) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if (e && !this.isSimulated) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if (e && !this.isSimulated) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - }, -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -[ - 'altKey', - 'bubbles', - 'cancelable', - 'changedTouches', - 'ctrlKey', - 'detail', - 'eventPhase', - 'metaKey', - 'pageX', - 'pageY', - 'shiftKey', - 'view', - 'char', - 'code', - 'charCode', - 'key', - 'keyCode', - 'button', - 'buttons', - 'clientX', - 'clientY', - 'offsetX', - 'offsetY', - 'pointerId', - 'pointerType', - 'screenX', - 'screenY', - 'targetTouches', - 'toElement', - 'touches', - 'which', -].forEach((name) => $.event.addProp(name)); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in $. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -[ - ['mouseenter', 'mouseover'], - ['mouseleave', 'mouseout'], - ['pointerenter', 'pointerover'], - ['pointerleave', 'pointerout'], -].forEach(([orig, fix]) => { - $.event.special[orig] = { - delegateType: fix, - bindType: fix, - handle: function(event) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( - !related || - (related !== target && !$.contains(target, related)) - ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); - event.type = fix; - } - return ret; - }, - }; -}); - -$.fn.on = function(types, selector, data, fn) { - return on(this, types, selector, data, fn); -}; - -$.fn.one = function(types, selector, data, fn) { - return on(this, types, selector, data, fn, 1); -}; - -$.fn.off = function(types, selector, fn) { - var handleObj, type; - if (types && types.preventDefault && types.handleObj) { - // ( event ) dispatched $.Event - handleObj = types.handleObj; - $(types.delegateTarget).off( - handleObj.namespace - ? handleObj.origType + '.' + handleObj.namespace - : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === 'object') { - // ( types-object [, selector] ) - for (type in types) { - this.off(type, selector, types[type]); - } - return this; - } - if (selector === false || typeof selector === 'function') { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if (fn === false) { - fn = returnFalse; - } - return this.each(function() { - $.event.remove(this, types, fn, selector); - }); -}; - export { $ as default }; -// 2397 - - diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 1f8816fbb..4eaa13ba5 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -102,7 +102,7 @@ export const View = ViewBase.extend({ if (this.svgElement) { this.vel.attr(attrs); } else { - this.$el.attr(attrs); + Object.keys(attrs).forEach(key => this.el.setAttribute(key, attrs[key])); } }, @@ -137,6 +137,8 @@ export const View = ViewBase.extend({ if (this.svgElement) { this.vel.removeClass(className).addClass(prefixedClassName); } else { + // V.prototype.removeClass.call({ node: this.el }, className); + // V.prototype.addClass.call({ node: this.el }, prefixedClassName); this.$el.removeClass(className).addClass(prefixedClassName); } }, @@ -324,27 +326,3 @@ export const View = ViewBase.extend({ return ViewBase.extend.call(this, protoProps, staticProps); } }); - -const DoubleTapEventName = 'dbltap'; -if ($.event && !(DoubleTapEventName in $.event.special)) { - const maxDelay = config.doubleTapInterval; - const minDelay = 30; - $.event.special[DoubleTapEventName] = { - bindType: 'touchend', - delegateType: 'touchend', - handle: function(event, ...args) { - const { handleObj, target } = event; - const targetData = $.data(target); - const now = new Date().getTime(); - const delta = 'lastTouch' in targetData ? now - targetData.lastTouch : 0; - if (delta < maxDelay && delta > minDelay) { - targetData.lastTouch = null; - event.type = handleObj.origType; - // let jQuery handle the triggering of "dbltap" event handlers - handleObj.handler.call(this, event, ...args); - } else { - targetData.lastTouch = now; - } - } - }; -} diff --git a/packages/joint-core/src/mvc/ViewBase.mjs b/packages/joint-core/src/mvc/ViewBase.mjs index da25e4856..b44cb186a 100644 --- a/packages/joint-core/src/mvc/ViewBase.mjs +++ b/packages/joint-core/src/mvc/ViewBase.mjs @@ -173,7 +173,7 @@ assign(ViewBase.prototype, Events, { // Set attributes from a hash on this view's element. Exposed for // subclasses using an alternative DOM manipulation API. _setAttributes: function(attributes) { - this.$el.attr(attributes); + Object.keys(attributes).forEach(key => this.el.setAttribute(key, attributes[key])); } }); diff --git a/packages/joint-core/src/mvc/dom/dom-data.js b/packages/joint-core/src/mvc/dom/dom-data.js new file mode 100644 index 000000000..dad70e941 --- /dev/null +++ b/packages/joint-core/src/mvc/dom/dom-data.js @@ -0,0 +1,12 @@ +import Data from '../Data.mjs'; + +export const dataPriv = new Data(); + +export const dataUser = new Data(); + +export function cleanNodesData(data, nodes) { + let i = nodes.length; + while (i--) { + data.remove(nodes[i]); + } +} diff --git a/packages/joint-core/src/mvc/dom/dom-events.js b/packages/joint-core/src/mvc/dom/dom-events.js new file mode 100644 index 000000000..710720754 --- /dev/null +++ b/packages/joint-core/src/mvc/dom/dom-events.js @@ -0,0 +1,835 @@ +import { isEmpty } from '../../util/utilHelpers.mjs'; +import $ from '../Dom.mjs'; +import { dataPriv } from './dom-data.js'; + +const rtypenamespace = /^([^.]*)(?:\.(.+)|)/; +const rcheckableType = /^(?:checkbox|radio)$/i; +const documentElement = document.documentElement; +// Only count HTML whitespace +// Other whitespace should count in values +// https://infra.spec.whatwg.org/#ascii-whitespace +const rnothtmlwhite = /[^\x20\t\r\n\f]+/g; + + +function nodeName(elem, name) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); +} + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on(elem, types, selector, data, fn, one) { + var origFn, type; + + // Types can be a map of types/handlers + if (typeof types === 'object') { + // ( types-Object, selector, data ) + if (typeof selector !== 'string') { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for (type in types) { + on(elem, type, selector, data, types[type], one); + } + return elem; + } + + if (data == null && fn == null) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if (fn == null) { + if (typeof selector === 'string') { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if (fn === false) { + fn = returnFalse; + } else if (!fn) { + return elem; + } + + if (one === 1) { + origFn = fn; + fn = function(event) { + // Can use an empty set, since event contains the info + $().off(event); + return origFn.apply(this, arguments); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || (origFn.guid = $.guid++); + } + return elem.each(function() { + $.event.add(this, types, fn, data, selector); + }); +} + +/** + * Determines whether an object can have data + */ +function acceptData(owner) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +$.event = { + add: function(elem, types, handler, data, selector) { + var handleObjIn, + eventHandle, + tmp, + events, + t, + handleObj, + special, + handlers, + type, + namespaces, + origType, + elemData = dataPriv.get(elem); + + // Only attach events to objects that accept data + if (!acceptData(elem)) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if (selector) { + documentElement.matches(selector); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if (!handler.guid) { + handler.guid = $.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if (!(events = elemData.events)) { + events = elemData.events = Object.create(null); + } + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function(e) { + // Discard the second event of a $.event.trigger() and + // when an event is called after a page has unloaded + return typeof $ !== 'undefined' && + $.event.triggered !== e.type + ? $.event.dispatch.apply(elem, arguments) + : undefined; + }; + } + + // Handle multiple events separated by a space + types = (types || '').match(rnothtmlwhite) || ['']; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || '').split('.').sort(); + + // There *must* be a type, no attaching namespace-only handlers + if (!type) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = $.event.special[type] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = (selector ? special.delegateType : special.bindType) || type; + + // Update special based on newly reset type + special = $.event.special[type] || {}; + + // handleObj is passed to all event handlers + handleObj = Object.assign( + { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: + selector && + $.expr.match.needsContext.test(selector), + namespace: namespaces.join('.'), + }, + handleObjIn + ); + + // Init the event handler queue if we're the first + if (!(handlers = events[type])) { + handlers = events[type] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( + !special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === + false + ) { + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle); + } + } + } + + if (special.add) { + special.add.call(elem, handleObj); + + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); + } + } + }, + + // Detach an event or set of events from an element + remove: function(elem, types, handler, selector, mappedTypes) { + var j, + origCount, + tmp, + events, + t, + handleObj, + special, + handlers, + type, + namespaces, + origType, + elemData = dataPriv.read(elem); + + if (!elemData || !(events = elemData.events)) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = (types || '').match(rnothtmlwhite) || ['']; + t = types.length; + while (t--) { + tmp = rtypenamespace.exec(types[t]) || []; + type = origType = tmp[1]; + namespaces = (tmp[2] || '').split('.').sort(); + + // Unbind all events (on this namespace, if provided) for the element + if (!type) { + for (type in events) { + $.event.remove( + elem, + type + types[t], + handler, + selector, + true + ); + } + continue; + } + + special = $.event.special[type] || {}; + type = (selector ? special.delegateType : special.bindType) || type; + handlers = events[type] || []; + tmp = + tmp[2] && + new RegExp( + '(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)' + ); + + // Remove matching events + origCount = j = handlers.length; + while (j--) { + handleObj = handlers[j]; + + if ( + (mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!tmp || tmp.test(handleObj.namespace)) && + (!selector || + selector === handleObj.selector || + (selector === '**' && handleObj.selector)) + ) { + handlers.splice(j, 1); + + if (handleObj.selector) { + handlers.delegateCount--; + } + if (special.remove) { + special.remove.call(elem, handleObj); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if (origCount && !handlers.length) { + if ( + !special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === + false + ) { + $.removeEvent(elem, type, elemData.handle); + } + + delete events[type]; + } + } + + // Remove data if it's no longer used + if (isEmpty(events)) { + dataPriv.remove(elem, 'handle events'); + } + }, + + dispatch: function(nativeEvent) { + var i, + j, + ret, + matched, + handleObj, + handlerQueue, + args = new Array(arguments.length), + // Make a writable $.Event from the native event object + event = $.event.fix(nativeEvent), + handlers = + (dataPriv.get(this, 'events') || Object.create(null))[ + event.type + ] || [], + special = $.event.special[event.type] || {}; + + // Use the fix-ed $.Event rather than the (read-only) native event + args[0] = event; + + for (i = 1; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( + special.preDispatch && + special.preDispatch.call(this, event) === false + ) { + return; + } + + // Determine handlers + handlerQueue = $.event.handlers.call(this, event, handlers); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { + event.currentTarget = matched.elem; + + j = 0; + while ( + (handleObj = matched.handlers[j++]) && + !event.isImmediatePropagationStopped() + ) { + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( + !event.rnamespace || + handleObj.namespace === false || + event.rnamespace.test(handleObj.namespace) + ) { + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( + ($.event.special[handleObj.origType] || {}) + .handle || handleObj.handler + ).apply(matched.elem, args); + + if (ret !== undefined) { + if ((event.result = ret) === false) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if (special.postDispatch) { + special.postDispatch.call(this, event); + } + + return event.result; + }, + + handlers: function(event, handlers) { + var i, + handleObj, + sel, + matchedHandlers, + matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( + delegateCount && + // Support: Firefox <=42 - 66+ + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11+ + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !(event.type === 'click' && event.button >= 1) + ) { + for (; cur !== this; cur = cur.parentNode || this) { + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( + cur.nodeType === 1 && + !(event.type === 'click' && cur.disabled === true) + ) { + matchedHandlers = []; + matchedSelectors = {}; + for (i = 0; i < delegateCount; i++) { + handleObj = handlers[i]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + ' '; + + if (matchedSelectors[sel] === undefined) { + matchedSelectors[sel] = handleObj.needsContext + ? $(sel, this).index(cur) > -1 + : $.find(sel, this, null, [cur]).length; + } + if (matchedSelectors[sel]) { + matchedHandlers.push(handleObj); + } + } + if (matchedHandlers.length) { + handlerQueue.push({ + elem: cur, + handlers: matchedHandlers, + }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if (delegateCount < handlers.length) { + handlerQueue.push({ + elem: cur, + handlers: handlers.slice(delegateCount), + }); + } + + return handlerQueue; + }, + + addProp: function(name, hook) { + Object.defineProperty($.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: + typeof hook === 'function' + ? function() { + if (this.originalEvent) { + return hook(this.originalEvent); + } + } + : function() { + if (this.originalEvent) { + return this.originalEvent[name]; + } + }, + + set: function(value) { + Object.defineProperty(this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value, + }); + }, + }); + }, + + fix: function(originalEvent) { + return originalEvent[$.expando] + ? originalEvent + : new $.Event(originalEvent); + }, +}; + +$.event.special = Object.create(null); + +$.event.special.load = { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true, +}; + +$.event.special.click = { + // Utilize native event to ensure correct state for checkable inputs + setup: function(data) { + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { + // dataPriv.set( el, "click", ... ) + leverageNative(el, 'click', true); + } + + // Return false to allow normal processing in the caller + return false; + }, +}; + +$.event.special.trigger = function(data) { + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { + leverageNative(el, 'click'); + } + + // Return non-false to allow normal event-path propagation + return true; +}; + +// For cross-browser consistency, suppress native .click() on links +// Also prevent it if we're currently inside a leveraged native-event stack +$.event.special._default = function(event) { + var target = event.target; + return ( + (rcheckableType.test(target.type) && + target.click && + nodeName(target, 'input') && + dataPriv.get(target, 'click')) || + nodeName(target, 'a') + ); +}; + +$.event.special.beforeunload = { + postDispatch: function(event) { + // Support: Chrome <=73+ + // Chrome doesn't alert on `event.preventDefault()` + // as the standard mandates. + if (event.result !== undefined && event.originalEvent) { + event.originalEvent.returnValue = event.result; + } + }, +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative(el, type, isSetup) { + // Missing `isSetup` indicates a trigger call, which must force setup through $.event.add + if (!isSetup) { + if (dataPriv.get(el, type) === undefined) { + $.event.add(el, type, returnTrue); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set(el, type, false); + $.event.add(el, type, { + namespace: false, + handler: function(event) { + var result, + saved = dataPriv.get(this, type); + + if (event.isTrigger & 1 && this[type]) { + // Interrupt processing of the outer synthetic .trigger()ed event + if (!saved) { + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = Array.from(arguments); + dataPriv.set(this, type, saved); + + // Trigger the native event and capture its result + this[type](); + result = dataPriv.get(this, type); + dataPriv.set(this, type, false); + + if (saved !== result) { + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if (($.event.special[type] || {}).delegateType) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if (saved) { + // ...and capture the result + dataPriv.set( + this, + type, + $.event.trigger(saved[0], saved.slice(1), this) + ); + + // Abort handling of the native event by all $ handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the $ event. However, + // the native event is re-wrapped by a $ one on each level of the + // propagation so the only way to stop it for $ is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + }, + }); +} + +$.removeEvent = function(elem, type, handle) { + // This "if" is needed for plain objects + if (elem.removeEventListener) { + elem.removeEventListener(type, handle); + } +}; + +$.Event = function(src, props) { + // Allow instantiation without the 'new' keyword + if (!(this instanceof $.Event)) { + return new $.Event(src, props); + } + + // Event object + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented + ? returnTrue + : returnFalse; + + // Create target properties + this.target = src.target; + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if (props) { + Object.assign(this, props); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = (src && src.timeStamp) || Date.now(); + + // Mark it as fixed + this[$.expando] = true; +}; + +// $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +$.Event.prototype = { + constructor: $.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if (e && !this.isSimulated) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if (e && !this.isSimulated) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if (e && !this.isSimulated) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + }, +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +[ + 'altKey', + 'bubbles', + 'cancelable', + 'changedTouches', + 'ctrlKey', + 'detail', + 'eventPhase', + 'metaKey', + 'pageX', + 'pageY', + 'shiftKey', + 'view', + 'char', + 'code', + 'charCode', + 'key', + 'keyCode', + 'button', + 'buttons', + 'clientX', + 'clientY', + 'offsetX', + 'offsetY', + 'pointerId', + 'pointerType', + 'screenX', + 'screenY', + 'targetTouches', + 'toElement', + 'touches', + 'which', +].forEach((name) => $.event.addProp(name)); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in $. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +[ + ['mouseenter', 'mouseover'], + ['mouseleave', 'mouseout'], + ['pointerenter', 'pointerover'], + ['pointerleave', 'pointerout'], +].forEach(([orig, fix]) => { + $.event.special[orig] = { + delegateType: fix, + bindType: fix, + handle: function(event) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( + !related || + (related !== target && !$.contains(target, related)) + ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(this, arguments); + event.type = fix; + } + return ret; + }, + }; +}); + +$.fn.on = function(types, selector, data, fn) { + return on(this, types, selector, data, fn); +}; + +$.fn.one = function(types, selector, data, fn) { + return on(this, types, selector, data, fn, 1); +}; + +$.fn.off = function(types, selector, fn) { + var handleObj, type; + if (types && types.preventDefault && types.handleObj) { + // ( event ) dispatched $.Event + handleObj = types.handleObj; + $(types.delegateTarget).off( + handleObj.namespace + ? handleObj.origType + '.' + handleObj.namespace + : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === 'object') { + // ( types-object [, selector] ) + for (type in types) { + this.off(type, selector, types[type]); + } + return this; + } + if (selector === false || typeof selector === 'function') { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if (fn === false) { + fn = returnFalse; + } + return this.each(function() { + $.event.remove(this, types, fn, selector); + }); +}; diff --git a/packages/joint-core/src/mvc/dom/dom-gestures.js b/packages/joint-core/src/mvc/dom/dom-gestures.js new file mode 100644 index 000000000..a7636f182 --- /dev/null +++ b/packages/joint-core/src/mvc/dom/dom-gestures.js @@ -0,0 +1,26 @@ +import { config } from '../../config/index.mjs'; +import $ from '../Dom.mjs'; + +const DoubleTapEventName = 'dbltap'; +if ($.event && !(DoubleTapEventName in $.event.special)) { + const maxDelay = config.doubleTapInterval; + const minDelay = 30; + $.event.special[DoubleTapEventName] = { + bindType: 'touchend', + delegateType: 'touchend', + handle: function(event, ...args) { + const { handleObj, target } = event; + const targetData = $.data.get(target); + const now = new Date().getTime(); + const delta = 'lastTouch' in targetData ? now - targetData.lastTouch : 0; + if (delta < maxDelay && delta > minDelay) { + targetData.lastTouch = null; + event.type = handleObj.origType; + // let jQuery handle the triggering of "dbltap" event handlers + handleObj.handler.call(this, event, ...args); + } else { + targetData.lastTouch = now; + } + } + }; +} diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js new file mode 100644 index 000000000..f2a2b3f68 --- /dev/null +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -0,0 +1,119 @@ +import $ from '../Dom.mjs'; +import V from '../../V/index.mjs'; +import { dataUser, dataPriv, cleanNodesData } from './dom-data'; + +window.dataPriv = dataPriv; + +$.data = dataUser; + +$.parseHTML = function(string) { + // Inline events will not execute when the HTML is parsed; this includes, for example, sending GET requests for images. + const context = document.implementation.createHTMLDocument(); + // Set the base href for the created document so any parsed elements with URLs + // are based on the document's URL + const base = context.createElement('base'); + base.href = document.location.href; + context.head.appendChild(base); + + context.body.innerHTML = string; + // remove scripts + const scripts = context.getElementsByTagName('script'); + for (let i = 0; i < scripts.length; i++) { + scripts[i].remove(); + } + return Array.from(context.body.children); +}; + +$.fn.empty = function() { + for (let i = 0; i < this.length; i++) { + const node = this[i]; + if (node.nodeType === 1) { + cleanNodesData(dataPriv, node.getElementsByTagName('*')); + // Remove any remaining nodes + node.textContent = ''; + } + } + return this; +}; + +$.fn.remove = function() { + for (let i = 0; i < this.length; i++) { + const node = this[i]; + dataPriv.remove(node); + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } +}; + +$.fn.append = function(...nodes) { + const [parent] = this; + if (!parent) return this; + nodes.forEach((node) => { + if (!node) return; + if (typeof node === 'string') { + parent.append(...$.parseHTML(node)); + } else if (node.toString() === '[object Object]') { + // $ object + parent.append(...node.toArray()); + } else { + // DOM node + parent.appendChild(node); + } + }); + return this; +}; + +$.fn.appendTo = function(parent) { + $(parent).append(this); + return this; +}; + + +// $.fn.html = function(string) { +// const [el] = this; +// if (typeof string !== string) { +// return this.append(string); +// } +// // TODO: clean data?? +// el.innerHTML = string; +// return this; +// }; + +// TODO: ? + +$.fn.removeClass = function() { + const [node] = this; + V.prototype.removeClass.apply({ node }, arguments); + return this; +}; + +$.fn.addClass = function() { + const [node] = this; + V.prototype.addClass.apply({ node }, arguments); + return this; +}; + +$.fn.hasClass = function() { + const [node] = this; + return V.prototype.hasClass.apply({ node }, arguments); +}; + +// TODO: cleanup + + +$.fn.css = function(styles) { + if (!this[0]) return this; + if (typeof styles === 'string' && arguments.length === 1) { + return this[0].style[styles]; + } + if (typeof styles === 'string' && arguments.length === 2) { + this[0].style[styles] = arguments[1]; + return this; + } + + Object.keys(styles).forEach((key) => { + this[0].style[key] = styles[key]; + }); + return this; +}; diff --git a/packages/joint-core/src/mvc/dom/methods.js b/packages/joint-core/src/mvc/dom/methods.js deleted file mode 100644 index 6fa387d46..000000000 --- a/packages/joint-core/src/mvc/dom/methods.js +++ /dev/null @@ -1,240 +0,0 @@ -import $ from '../Dom.mjs'; -import V from '../../V/index.mjs'; - -$.parseHTML = function(string) { - const context = document.implementation.createHTMLDocument(); - // Set the base href for the created document so any parsed elements with URLs - // are based on the document's URL - const base = context.createElement('base'); - base.href = document.location.href; - context.head.appendChild(base); - - context.body.innerHTML = string; - return $(context.body.children); -}; - -$.fn.removeClass = function() { - if (!this[0]) return this; - V.prototype.removeClass.apply({ node: this[0] }, arguments); - return this; -}; - -$.fn.addClass = function() { - if (!this[0]) return this; - V.prototype.addClass.apply({ node: this[0] }, arguments); - return this; -}; - -$.fn.hasClass = function() { - if (!this[0]) return false; - return V.prototype.hasClass.apply({ node: this[0] }, arguments); -}; - -$.fn.attr = function(name, value) { - if (!this[0]) return ''; - if (typeof name === 'string' && value === undefined) { - return this[0].getAttribute(name); - } - if (typeof name === 'string') { - this[0].setAttribute(name, value); - return this; - } - Object.keys(name).forEach(key => { - this[0].setAttribute(key, name[key]); - }); - return this; -}; - -$.fn.empty = function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - // jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ''; - } - } - - return this; -}; - -$.fn.append = function(...nodes) { - if (!this[0]) return this; - nodes.forEach(node => { - if (typeof node === 'string') { - node = $.parseHTML(node); - } - this[0].appendChild(node[0] || node); - }); - return this; -}; - -$.fn.html = function(html) { - if (!this[0]) return ''; - if (html === undefined) { - return this[0].innerHTML; - } - this[0].innerHTML = html; - return this; -}; - -$.fn.appendTo = function(parent) { - if (!this[0]) return this; - $(parent).append(this); - return this; -}; - -$.fn.css = function(styles) { - if (!this[0]) return this; - if (typeof styles === 'string' && arguments.length === 1) { - return this[0].style[styles]; - } - if (typeof styles === 'string' && arguments.length === 2) { - this[0].style[styles] = arguments[1]; - return this; - } - - Object.keys(styles).forEach(key => { - this[0].style[key] = styles[key]; - }); - return this; -}; - -$.fn.remove = function() { - if (!this[0]) return this; - const nodes = [this[0], ...Array.from(this[0].getElementsByTagName('*'))]; - for (let i = 0; i < nodes.length; i++) { - $.event.remove(nodes[i]); - } - this[0].remove(); - return this; -}; - -$.fn.data = function() { return this; }; - - -$.data = function() { return this; }; - - -$.attr = function(el, name) { - if (!el) return ''; - return el.getAttribute(name); -}; - -// From test - -$.fn.has = function(e) { - return this.find(e).length > 0; -}; - -$.fn.trigger = function(name, data) { - if (!this[0]) return this; - if (name === 'click') { - this[0].click(); - } else if (name === 'contextmenu') { - this[0].dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); - } else { - - let event; - // Native - if (window.CustomEvent) { - event = new CustomEvent(name, { detail: data }); - } else { - event = document.createEvent('CustomEvent'); - event.initCustomEvent(name, true, true, data); - } - - this[0].dispatchEvent(event); - } - - return this; -}; - -$.fn.click = function() { this.trigger('click'); }; - - -// Native (optional filter function) -function getPreviousSiblings(elem, filter) { - var sibs = []; - while ((elem = elem.previousElementSibling)) { - if (!filter || filter(elem)) sibs.push(elem); - } - return sibs; -} - -$.fn.prevAll = function() { - return $(getPreviousSiblings(this[0])); -}; - - -$.fn.index = function() { - return this.prevAll().length; -}; - -$.fn.nextAll = function() { - var sibs = []; - var elem = this[0]; - while ((elem = elem.nextElementSibling)) { - sibs.push(elem); - } - return $(sibs); -}; - -$.fn.prev = function() { - if (!this[0]) return $(); - return $(this[0].previousElementSibling); -}; - -$.fn.text = function() { - if (!this[0]) return ''; - return this[0].textContent; -}; - -$.fn.prop = function(name) { - if (!this[0]) return ''; - return this[0][name]; -}; - -$.fn.parent = function(i) { - if (!this[0]) return $(); - return $(this[0].parentNode); -}; - -$.fn.width = function() { - if (!this[0]) return 0; - return this[0].getBoundingClientRect().width; -}; - -$.fn.height = function() { - if (!this[0]) return 0; - return this[0].getBoundingClientRect().height; -}; - -// JJ+ is using it as a setter -$.fn.offset = function() { - if (!this[0]) return { top: 0, left: 0 }; - const box = this[0].getBoundingClientRect(); - return { - top: box.top + window.pageYOffset - document.documentElement.clientTop, - left: box.left + window.pageXOffset - document.documentElement.clientLeft - }; -}; - - -// For test only (verified) - -$.fn.children = function(selector) { - const [el] = this; - if (!el) return $(); - if (selector) { - return $(Array.from(el.children).filter(child => child.matches(selector))); - } - return $(el.children); -}; - - diff --git a/packages/joint-core/src/mvc/index.mjs b/packages/joint-core/src/mvc/index.mjs index a523d9d38..13733ddf9 100644 --- a/packages/joint-core/src/mvc/index.mjs +++ b/packages/joint-core/src/mvc/index.mjs @@ -5,6 +5,9 @@ export * from './Collection.mjs'; export * from './Model.mjs'; export * from './ViewBase.mjs'; export * from './mvcUtils.mjs'; -export { default as $ } from './Dom.mjs'; +export * from './Data.mjs'; -import './dom/methods.js'; +export { default as $ } from './Dom.mjs'; +import './dom/dom-methods.js'; +import './dom/dom-events.js'; +import './dom/dom-gestures.js'; diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index 3c6301f96..c34e3a3c7 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -129,7 +129,7 @@ export const parseDOMJSON = function(json, namespace) { const nodeSelector = nodeDef.selector; if (selectors[nodeSelector]) throw new Error('json-dom-parser: selector must be unique'); selectors[nodeSelector] = node; - wrapper(node).attr('joint-selector', nodeSelector); + node.setAttribute('joint-selector', nodeSelector); } // Groups if (nodeDef.hasOwnProperty('groupSelector')) { @@ -863,14 +863,9 @@ export const breakText = function(text, size, styles = {}, opt = {}) { export const sanitizeHTML = function(html) { // Ignores tags that are invalid inside a <div> tag (e.g. <body>, <head>) + var $output = $($.parseHTML('<div>' + html + '</div>')); - // If documentContext (second parameter) is not specified or given as `null` or `undefined`, a new document is used. - // Inline events will not execute when the HTML is parsed; this includes, for example, sending GET requests for images. - - // If keepScripts (last parameter) is `false`, scripts are not executed. - var output = $($.parseHTML('<div>' + html + '</div>', null, false)); - - output.find('*').each(function() { // for all nodes + $output.find('*').each(function() { // for all nodes var currentNode = this; $.each(currentNode.attributes, function() { // for all attributes in each node @@ -887,7 +882,7 @@ export const sanitizeHTML = function(html) { }); }); - return output.html(); + return $output[0].innerHTML; }; // Download `blob` as file with `fileName`. From abc458d23f536da237805ee27a897ce93dd3d81d Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 11:32:29 +0100 Subject: [PATCH 11/58] upadte --- .../joint-core/src/dia/attributes/index.mjs | 2 +- packages/joint-core/src/mvc/View.mjs | 2 - .../joint-core/src/mvc/dom/dom-methods.js | 32 ++--- .../joint-core/test/jointjs/elementPorts.js | 6 +- packages/joint-core/test/jointjs/paper.js | 4 +- packages/joint-core/test/utils.js | 110 +++++++++++++++++- 6 files changed, 131 insertions(+), 25 deletions(-) diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index c21a229c4..44de659b6 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -499,7 +499,7 @@ const attributesNS = { html: { set: function(html, refBBox, node) { - node.innerHTML = html + ''; + $(node).html(html + ''); } }, diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 4eaa13ba5..8f5259aee 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -137,8 +137,6 @@ export const View = ViewBase.extend({ if (this.svgElement) { this.vel.removeClass(className).addClass(prefixedClassName); } else { - // V.prototype.removeClass.call({ node: this.el }, className); - // V.prototype.addClass.call({ node: this.el }, prefixedClassName); this.$el.removeClass(className).addClass(prefixedClassName); } }, diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js index f2a2b3f68..85f1b0180 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -2,8 +2,6 @@ import $ from '../Dom.mjs'; import V from '../../V/index.mjs'; import { dataUser, dataPriv, cleanNodesData } from './dom-data'; -window.dataPriv = dataPriv; - $.data = dataUser; $.parseHTML = function(string) { @@ -69,19 +67,6 @@ $.fn.appendTo = function(parent) { return this; }; - -// $.fn.html = function(string) { -// const [el] = this; -// if (typeof string !== string) { -// return this.append(string); -// } -// // TODO: clean data?? -// el.innerHTML = string; -// return this; -// }; - -// TODO: ? - $.fn.removeClass = function() { const [node] = this; V.prototype.removeClass.apply({ node }, arguments); @@ -99,8 +84,23 @@ $.fn.hasClass = function() { return V.prototype.hasClass.apply({ node }, arguments); }; -// TODO: cleanup +$.fn.addBack = function() { + this.add(this.prevObject); +}; +$.fn.html = function(html) { + const [el] = this; + cleanNodesData(dataPriv, el.getElementsByTagName('*')); + if (typeof string === 'string') { + el.innerHTML = html; + } else { + el.innerHTML = ''; + return this.append(html); + } + return this; +}; + +// TODO: cleanup $.fn.css = function(styles) { if (!this[0]) return this; diff --git a/packages/joint-core/test/jointjs/elementPorts.js b/packages/joint-core/test/jointjs/elementPorts.js index ac587df01..c01e9ba5a 100644 --- a/packages/joint-core/test/jointjs/elementPorts.js +++ b/packages/joint-core/test/jointjs/elementPorts.js @@ -327,7 +327,7 @@ QUnit.module('element ports', function() { assert.equal(rect.length, 1); assert.equal(text.length, 1); assert.equal(text.attr('fill'), 'blue'); - assert.equal(text.text(), 'aaa'); + assert.equal(text[0].textContent, 'aaa'); var snd = shapeView.$el.find('.joint-port').eq(1); var sndPortShape = snd.children().eq(0); @@ -352,10 +352,10 @@ QUnit.module('element ports', function() { assert.equal(shapeView.$el.find('.joint-port').length, 2, 'port wraps'); assert.equal(shapeView.$el.find('.custom-port-markup').length, 1); - assert.equal(shapeView.$el.find('.custom-port-markup').prop('tagName'), 'circle'); + assert.equal(shapeView.$el.find('.custom-port-markup')[0].tagName, 'circle'); assert.equal(shapeView.$el.find('.custom-rect').length, 1); - assert.equal(shapeView.$el.find('.custom-rect').prop('tagName'), 'rect'); + assert.equal(shapeView.$el.find('.custom-rect')[0].tagName, 'rect'); }); QUnit.test('port update/render count', function(assert) { diff --git a/packages/joint-core/test/jointjs/paper.js b/packages/joint-core/test/jointjs/paper.js index bfb3683bf..3d16300ac 100644 --- a/packages/joint-core/test/jointjs/paper.js +++ b/packages/joint-core/test/jointjs/paper.js @@ -73,8 +73,8 @@ QUnit.module('paper', function(hooks) { assert.equal(paper.options.width, null); assert.equal(paper.options.height, null); var size = paper.getComputedSize(); - assert.equal(size.width, paper.$el.width()); - assert.equal(size.height, paper.$el.height()); + assert.equal(size.width, paper.el.clientWidth); + assert.equal(size.height, paper.el.clientHeight); }); QUnit.test('events', function(assert) { diff --git a/packages/joint-core/test/utils.js b/packages/joint-core/test/utils.js index 2c41d5582..887b5a039 100644 --- a/packages/joint-core/test/utils.js +++ b/packages/joint-core/test/utils.js @@ -97,8 +97,116 @@ })(QUnit.assert); // Dom manipulation helpers. +// ------------------------- -window.$ = joint.mvc.$; +const $ = window.$ = joint.mvc.$; + +function matchFilter(elem, filter) { + if (typeof filter === 'string') { + if (!elem.matches(filter)) return false; + } else if (typeof filter === 'function') { + if (!filter(elem)) return false; + } else if (filter === 'object') { + if (elem !== filter) return false; + } + return true; +} + +function dir(elem, dir, filter) { + var sibs = []; + while ((elem = elem[dir])) { + if (!matchFilter(elem, filter)) continue; + sibs.push(elem); + } + return sibs; +} + +function sibling(elem, dir, filter) { + const prevEl = elem[dir]; + if (!matchFilter(elem, filter)) return $(); + return $(prevEl); +} + +$.fn.prevAll = function(filter) { + const [el] = this; + return $(dir(el, 'previousElementSibling', filter)); +}; + +$.fn.nextAll = function(filter) { + const [el] = this; + return $(dir(el, 'nextElementSibling', filter)); +}; + +$.fn.prev = function(filter) { + const [el] = this; + return $(sibling(el, 'previousElementSibling', filter)); +}; + +$.fn.index = function() { + const [el] = this; + return Array.prototype.indexOf.call(el.parentNode.children, el); +}; + +$.fn.offset = function() { + const [el] = this; + const box = el.getBoundingClientRect(); + return { + top: box.top + window.pageYOffset - document.documentElement.clientTop, + left: box.left + window.pageXOffset - document.documentElement.clientLeft + }; +}; + +$.fn.children = function(selector) { + const [el] = this; + if (selector) { + return $(Array.from(el.children).filter(child => child.matches(selector))); + } + return $(el.children); +}; + +$.fn.parent = function(i) { + const [el] = this; + return $(el.parentNode); +}; + +$.fn.has = function(e) { + return this.find(e).length > 0; +}; + +$.fn.trigger = function(name, data) { + const [el] = this; + if (name === 'click') { + el.click(); + } else if (name === 'contextmenu') { + el.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + } else { + let event; + if (window.CustomEvent) { + event = new CustomEvent(name, { detail: data }); + } else { + event = document.createEvent('CustomEvent'); + event.initCustomEvent(name, true, true, data); + } + el.dispatchEvent(event); + } + return this; +}; + +$.fn.click = function() { + return this.trigger('click'); +}; + +$.fn.attr = function(props) { + const [el] = this; + // getter is not present in the original code + if (typeof props === 'string') { + return el.getAttribute(props); + } + Object.keys(props).forEach(key => { + el.setAttribute(key, props[key]); + }); + return this; +}; // Simulate user events. // --------------------- From c56960c67c3eaf39f82553662e9e27f9c8e24605 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 13:52:12 +0100 Subject: [PATCH 12/58] update --- .../joint-core/src/mvc/dom/dom-methods.js | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js index 85f1b0180..9cfd54b8c 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -100,20 +100,27 @@ $.fn.html = function(html) { return this; }; -// TODO: cleanup - -$.fn.css = function(styles) { - if (!this[0]) return this; - if (typeof styles === 'string' && arguments.length === 1) { - return this[0].style[styles]; +$.fn.css = function(name, value) { + let styles; + if (typeof name === 'string') { + if (value === undefined) { + const [el] = this; + if (!el) return null; + return el.style[name]; + } else { + styles = { [name]: value }; + } + } else if (!name) { + throw new Error('no styles provided'); + } else { + styles = name; } - if (typeof styles === 'string' && arguments.length === 2) { - this[0].style[styles] = arguments[1]; - return this; + for (let style in styles) { + if (styles.hasOwnProperty(style)) { + for (let i = 0; i < this.length; i++) { + this[i].style[style] = styles[style]; + } + } } - - Object.keys(styles).forEach((key) => { - this[0].style[key] = styles[key]; - }); return this; }; From da3369cdb64f2c792508e11d83bd71f00f63a65b Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 13:58:33 +0100 Subject: [PATCH 13/58] update --- packages/joint-core/src/mvc/View.mjs | 2 +- packages/joint-core/src/mvc/ViewBase.mjs | 2 +- .../joint-core/src/mvc/dom/dom-methods.js | 25 +++++++++++++++++++ packages/joint-core/src/util/util.mjs | 5 ++-- packages/joint-core/test/utils.js | 12 --------- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index 8f5259aee..ec2397ee1 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -102,7 +102,7 @@ export const View = ViewBase.extend({ if (this.svgElement) { this.vel.attr(attrs); } else { - Object.keys(attrs).forEach(key => this.el.setAttribute(key, attrs[key])); + this.$el.attr(attrs); } }, diff --git a/packages/joint-core/src/mvc/ViewBase.mjs b/packages/joint-core/src/mvc/ViewBase.mjs index b44cb186a..da25e4856 100644 --- a/packages/joint-core/src/mvc/ViewBase.mjs +++ b/packages/joint-core/src/mvc/ViewBase.mjs @@ -173,7 +173,7 @@ assign(ViewBase.prototype, Events, { // Set attributes from a hash on this view's element. Exposed for // subclasses using an alternative DOM manipulation API. _setAttributes: function(attributes) { - Object.keys(attributes).forEach(key => this.el.setAttribute(key, attributes[key])); + this.$el.attr(attributes); } }); diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js index 9cfd54b8c..2cbda97ef 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -124,3 +124,28 @@ $.fn.css = function(name, value) { } return this; }; + +$.fn.attr = function(name, value) { + let attributes; + if (typeof name === 'string') { + if (value === undefined) { + const [el] = this; + if (!el) return null; + return el.getAttribute(name); + } else { + attributes = { [name]: value }; + } + } else if (!name) { + throw new Error('no styles provided'); + } else { + attributes = name; + } + for (let attr in attributes) { + if (attributes.hasOwnProperty(attr)) { + for (let i = 0; i < this.length; i++) { + this[i].setAttribute(attr, attributes[attr]); + } + } + } + return this; +}; diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index c34e3a3c7..660aea59d 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -105,9 +105,10 @@ export const parseDOMJSON = function(json, namespace) { const svg = (ns === svgNamespace); const wrapper = (svg) ? V : $; + const wrapperNode = wrapper(node); // Attributes const attributes = nodeDef.attributes; - if (attributes) wrapper(node).attr(attributes); + if (attributes) wrapperNode.attr(attributes); // Style const style = nodeDef.style; if (style) $(node).css(style); @@ -129,7 +130,7 @@ export const parseDOMJSON = function(json, namespace) { const nodeSelector = nodeDef.selector; if (selectors[nodeSelector]) throw new Error('json-dom-parser: selector must be unique'); selectors[nodeSelector] = node; - node.setAttribute('joint-selector', nodeSelector); + wrapperNode.attr('joint-selector', nodeSelector); } // Groups if (nodeDef.hasOwnProperty('groupSelector')) { diff --git a/packages/joint-core/test/utils.js b/packages/joint-core/test/utils.js index 887b5a039..f71719d48 100644 --- a/packages/joint-core/test/utils.js +++ b/packages/joint-core/test/utils.js @@ -196,18 +196,6 @@ $.fn.click = function() { return this.trigger('click'); }; -$.fn.attr = function(props) { - const [el] = this; - // getter is not present in the original code - if (typeof props === 'string') { - return el.getAttribute(props); - } - Object.keys(props).forEach(key => { - el.setAttribute(key, props[key]); - }); - return this; -}; - // Simulate user events. // --------------------- From d4170fdbc15b034af1715f2689883e3292d57356 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 17:32:54 +0100 Subject: [PATCH 14/58] simplify find --- packages/joint-core/src/mvc/Dom.mjs | 142 +++------------------------- 1 file changed, 11 insertions(+), 131 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index 16254a60c..ec4609af7 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -1,4 +1,4 @@ -import { isPlainObject, isArrayLike } from '../util/utilHelpers.mjs'; +import { isArrayLike } from '../util/utilHelpers.mjs'; /*! * jQuery JavaScript Library v4.0.0-pre+c98597ea.dirty * https://jquery.com/ @@ -25,10 +25,10 @@ var document = window.document; const version = '4.0.0-pre+c98597ea.dirty'; // Define a local copy of $ -const $ = function(selector, context) { +const $ = function(selector) { // The $ object is actually just the init constructor 'enhanced' // Need init if $ is called (just allow error to be thrown if not included) - return new $.fn.init(selector, context); + return new $.fn.init(selector); }; $.fn = $.prototype = { @@ -188,11 +188,6 @@ if (typeof Symbol === 'function') { var isIE = document.documentMode; -// rsingleTag matches a string consisting of a single HTML element with no attributes -// and captures the element's name -const rsingleTag = - /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - function isObviousHtml(input) { return ( input[0] === '<' && input[input.length - 1] === '>' && input.length >= 3 @@ -547,100 +542,13 @@ $.escapeSelector = function(sel) { return (sel + '').replace(rcssescape, fcssescape); }; -var sort = arr.sort; - -var splice = arr.splice; - -var hasDuplicate; - // Document order sorting -function sortOrder(a, b) { - // Flag for duplicate removal - if (a === b) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if (compare) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = - (a.ownerDocument || a) == (b.ownerDocument || b) - ? a.compareDocumentPosition(b) - : // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if (compare & 1) { - // Choose the first element that is related to the document - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( - a == document || - (a.ownerDocument == document && $.contains(document, a)) - ) { - return -1; - } - - // Support: IE 11+ - // IE sometimes throws a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( - b == document || - (b.ownerDocument == document && $.contains(document, b)) - ) { - return 1; - } - - // Maintain original order - return 0; - } - - return compare & 4 ? -1 : 1; -} /** * Document sorting and removing duplicates * @param {ArrayLike} results */ -$.uniqueSort = function(results) { - var elem, - duplicates = [], - j = 0, - i = 0; - - hasDuplicate = false; - - sort.call(results, sortOrder); - - if (hasDuplicate) { - while ((elem = results[i++])) { - if (elem === results[i]) { - j = duplicates.push(i); - } - } - while (j--) { - splice.call(results, duplicates[j], 1); - } - } - return results; -}; - -$.fn.uniqueSort = function() { - return this.pushStack($.uniqueSort(Array.from(this))); -}; /* * Optional limited selector module for custom builds. @@ -828,12 +736,10 @@ $.fn.find = function(selector) { } ret = this.pushStack([]); - - for (i = 0; i < len; i++) { - $.find(selector, self[i], ret); + if (len > 0) { + $.find(selector, this[0], ret); } - - return len > 1 ? $.uniqueSort(ret) : ret; + return ret; }; $.fn.filter = function(selector) { @@ -864,7 +770,7 @@ let root$; // Shortcut simple #id case for speed const rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; -const init = ($.fn.init = function(selector, context) { +const init = ($.fn.init = function(selector) { var match, elem; // HANDLE: $(""), $(null), $(undefined), $(false) @@ -881,10 +787,7 @@ const init = ($.fn.init = function(selector, context) { // HANDLE: $(function) // Shortcut for document ready } else if (typeof selector === 'function') { - return root$.ready !== undefined - ? root$.ready(selector) - : // Execute immediately if ready is not present - selector($); + throw new Error('Not supported'); } else { // Handle obvious HTML strings match = selector + ''; @@ -903,10 +806,9 @@ const init = ($.fn.init = function(selector, context) { // Match html or make sure no context is specified for #id // Note: match[1] may be a string or a TrustedHTML wrapper - if (match && (match[1] || !context)) { + if (match && (match[1])) { // HANDLE: $(html) -> $(array) if (match[1]) { - context = context instanceof $ ? context[0] : context; // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present @@ -914,33 +816,16 @@ const init = ($.fn.init = function(selector, context) { this, $.parseHTML( match[1], - context && context.nodeType - ? context.ownerDocument || context - : document, + document, true ) ); - // HANDLE: $(html, props) - if (rsingleTag.test(match[1]) && isPlainObject(context)) { - for (match in context) { - // Properties of context are called as methods if possible - if (typeof this[match] === 'function') { - this[match](context[match]); - - // ...and otherwise set as attributes - } else { - this.attr(match, context[match]); - } - } - } - return this; // HANDLE: $(#id) } else { elem = document.getElementById(match[2]); - if (elem) { // Inject the element directly into the $ object this[0] = elem; @@ -950,13 +835,8 @@ const init = ($.fn.init = function(selector, context) { } // HANDLE: $(expr) & $(expr, $(...)) - } else if (!context || context.jquery) { - return (context || root$).find(selector); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) } else { - return this.constructor(context).find(selector); + return (root$).find(selector); } } }); From 1a34383dad1af00e653e626057f2cd78849dd7f8 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 19:45:52 +0100 Subject: [PATCH 15/58] simplify core part 1 --- packages/joint-core/src/dia/CellView.mjs | 2 +- packages/joint-core/src/mvc/Dom.mjs | 662 +----------------- packages/joint-core/src/mvc/dom/dom-events.js | 35 +- packages/joint-core/src/util/util.mjs | 8 +- packages/joint-core/test/utils.js | 19 + 5 files changed, 63 insertions(+), 663 deletions(-) diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index c7272ba46..5c0972ff7 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -389,7 +389,7 @@ export const CellView = View.extend({ var selector; if (el === this.el) { - if (typeof prevSelector === 'string') selector = '> ' + prevSelector; + if (typeof prevSelector === 'string') selector = ':scope > ' + prevSelector; return selector; } diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index ec4609af7..847e7468f 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -1,4 +1,4 @@ -import { isArrayLike } from '../util/utilHelpers.mjs'; + /*! * jQuery JavaScript Library v4.0.0-pre+c98597ea.dirty * https://jquery.com/ @@ -10,19 +10,14 @@ import { isArrayLike } from '../util/utilHelpers.mjs'; * Date: 2023-11-24T14:04Z */ +import { isArrayLike } from '../util/utilHelpers.mjs'; + if (!window.document) { throw new Error('$ requires a window with a document'); } -var arr = []; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var document = window.document; - -const version = '4.0.0-pre+c98597ea.dirty'; +const arr = []; +const document = window.document; // Define a local copy of $ const $ = function(selector) { @@ -32,8 +27,6 @@ const $ = function(selector) { }; $.fn = $.prototype = { - // The current version of $ being used - jquery: version, constructor: $, @@ -58,93 +51,31 @@ $.fn = $.prototype = { // Take an array of elements and push it onto the stack // (returning the new matched element set) - pushStack: function(elems) { + pushStack: function(elements) { // Build a new $ matched element set - var ret = $.merge(this.constructor(), elems); - + const ret = $.merge(this.constructor(), elements); // Add the old object onto the stack (as a reference) ret.prevObject = this; - // Return the newly-formed element set return ret; }, - - // Execute a callback for every element in the matched set. - each: function(callback) { - return $.each(this, callback); - }, - - eq: function(i) { - var len = this.length, - j = +i + (i < 0 ? len : 0); - return this.pushStack(j >= 0 && j < len ? [this[j]] : []); - }, }; -// Unique for each copy of $ on the page -$.expando = 'DOM' + (version + Math.random()).replace(/\D/g, ''); - Object.assign($, { - error: function(msg) { - throw new Error(msg); - }, - - each: function(obj, callback) { - var length, - i = 0; - - if (isArrayLike(obj)) { - length = obj.length; - for (; i < length; i++) { - if (callback.call(obj[i], i, obj[i]) === false) { - break; - } - } - } else { - for (i in obj) { - if (callback.call(obj[i], i, obj[i]) === false) { - break; - } - } - } - - return obj; - }, // results is for internal usage only makeArray: function(arr, results) { - var ret = results || []; - + const ret = results || []; if (arr != null) { if (isArrayLike(Object(arr))) { $.merge(ret, typeof arr === 'string' ? [arr] : arr); } else { - push.call(ret, arr); + Array.prototype.push.call(ret, arr); } } - return ret; }, - // Note: an element does not contain itself - contains: function(a, b) { - var bup = b && b.parentNode; - - return ( - a === bup || - !!( - bup && - bup.nodeType === 1 && - // Support: IE 9 - 11+ - // IE doesn't have `contains` on SVG. - (a.contains - ? a.contains(bup) - : a.compareDocumentPosition && - a.compareDocumentPosition(bup) & 16) - ) - ); - }, - merge: function(first, second) { var len = +second.length, j = 0, @@ -159,25 +90,6 @@ Object.assign($, { return first; }, - grep: function(elems, callback, invert) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for (; i < length; i++) { - callbackInverse = !callback(elems[i], i); - if (callbackInverse !== callbackExpect) { - matches.push(elems[i]); - } - } - - return matches; - }, - // A global GUID counter for objects guid: 1, }); @@ -186,369 +98,6 @@ if (typeof Symbol === 'function') { $.fn[Symbol.iterator] = arr[Symbol.iterator]; } -var isIE = document.documentMode; - -function isObviousHtml(input) { - return ( - input[0] === '<' && input[input.length - 1] === '>' && input.length >= 3 - ); -} - -// https://www.w3.org/TR/css3-selectors/#whitespace -var whitespace = '[\\x20\\t\\r\\n\\f]'; - -var booleans = - 'checked|selected|async|autofocus|autoplay|controls|' + - 'defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped'; - -var rleadingCombinator = new RegExp( - '^' + whitespace + '*([>+~]|' + whitespace + ')' + whitespace + '*' -); - -var rdescend = new RegExp(whitespace + '|>'); - -var rsibling = /[+~]/; - -/** - * Checks a node for validity as a $ selector context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext(context) { - return ( - context && - typeof context.getElementsByTagName !== 'undefined' && - context - ); -} - -// https://www.w3.org/TR/css-syntax-3/#ident-token-diagram -var identifier = - '(?:\\\\[\\da-fA-F]{1,6}' + - whitespace + - '?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+'; - -// Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors -var attributes = - '\\[' + - whitespace + - '*(' + - identifier + - ')(?:' + - whitespace + - // Operator (capture 2) - '*([*^$|!~]?=)' + - whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + - identifier + - '))|)' + - whitespace + - '*\\]'; - -var pseudos = - ':(' + - identifier + - ')(?:\\((' + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - '(\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|' + - // 2. simple (capture 6) - '((?:\\\\.|[^\\\\()[\\]]|' + - attributes + - ')*)|' + - // 3. anything else (capture 2) - '.*' + - ')\\)|)'; - -var filterMatchExpr = { - ID: new RegExp('^#(' + identifier + ')'), - CLASS: new RegExp('^\\.(' + identifier + ')'), - TAG: new RegExp('^(' + identifier + '|[*])'), - ATTR: new RegExp('^' + attributes), - PSEUDO: new RegExp('^' + pseudos), - CHILD: new RegExp( - '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + - whitespace + - '*(even|odd|(([+-]|)(\\d*)n|)' + - whitespace + - '*(?:([+-]|)' + - whitespace + - '*(\\d+)|))' + - whitespace + - '*\\)|)', - 'i' - ), -}; - -var rpseudo = new RegExp(pseudos); - -// CSS escapes - -var runescape = new RegExp( - '\\\\[\\da-fA-F]{1,6}' + whitespace + '?|\\\\([^\\r\\n\\f])', - 'g' - ), - funescape = function(escape, nonHex) { - var high = '0x' + escape.slice(1) - 0x10000; - - if (nonHex) { - // Strip the backslash prefix from a non-hex escape sequence - return nonHex; - } - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - return high < 0 - ? String.fromCharCode(high + 0x10000) - : String.fromCharCode( - (high >> 10) | 0xd800, - (high & 0x3ff) | 0xdc00 - ); - }; - -function unescapeSelector(sel) { - return sel.replace(runescape, funescape); -} - -function selectorError(msg) { - $.error('Syntax error, unrecognized expression: ' + msg); -} - -var rcomma = new RegExp('^' + whitespace + '*,' + whitespace + '*'); - -var rtrimCSS = new RegExp( - '^' + whitespace + '+|((?:^|[^\\\\])(?:\\\\.)*)' + whitespace + '+$', - 'g' -); - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache(key, value) { - // Use (key + " ") to avoid collision with native prototype properties - // (see https://github.com/jquery/sizzle/issues/157) - if (keys.push(key + ' ') > $.expr.cacheLength) { - // Only keep the most recent entries - delete cache[keys.shift()]; - } - return (cache[key + ' '] = value); - } - return cache; -} - -var tokenCache = createCache(); - -function tokenize(selector, parseOnly) { - var matched, - match, - tokens, - type, - soFar, - groups, - preFilters, - cached = tokenCache[selector + ' ']; - - if (cached) { - return parseOnly ? 0 : cached.slice(0); - } - - soFar = selector; - groups = []; - preFilters = $.expr.preFilter; - - while (soFar) { - // Comma and first run - if (!matched || (match = rcomma.exec(soFar))) { - if (match) { - // Don't consume trailing commas as valid - soFar = soFar.slice(match[0].length) || soFar; - } - groups.push((tokens = [])); - } - - matched = false; - - // Combinators - if ((match = rleadingCombinator.exec(soFar))) { - matched = match.shift(); - tokens.push({ - value: matched, - - // Cast descendant combinators to space - type: match[0].replace(rtrimCSS, ' '), - }); - soFar = soFar.slice(matched.length); - } - - // Filters - for (type in filterMatchExpr) { - if ( - (match = $.expr.match[type].exec(soFar)) && - (!preFilters[type] || (match = preFilters[type](match))) - ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match, - }); - soFar = soFar.slice(matched.length); - } - } - - if (!matched) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - if (parseOnly) { - return soFar.length; - } - - return soFar - ? selectorError(selector) - : // Cache the tokens - tokenCache(selector, groups).slice(0); -} - -var preFilter = { - ATTR: function(match) { - match[1] = unescapeSelector(match[1]); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = unescapeSelector(match[3] || match[4] || match[5] || ''); - - if (match[2] === '~=') { - match[3] = ' ' + match[3] + ' '; - } - - return match.slice(0, 4); - }, - - CHILD: function(match) { - /* matches from filterMatchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if (match[1].slice(0, 3) === 'nth') { - // nth-* requires argument - if (!match[3]) { - selectorError(match[0]); - } - - // numeric x and y parameters for $.expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +(match[4] - ? match[5] + (match[6] || 1) - : 2 * (match[3] === 'even' || match[3] === 'odd')); - match[5] = +(match[7] + match[8] || match[3] === 'odd'); - - // other types prohibit arguments - } else if (match[3]) { - selectorError(match[0]); - } - - return match; - }, - - PSEUDO: function(match) { - var excess, - unquoted = !match[6] && match[2]; - - if (filterMatchExpr.CHILD.test(match[0])) { - return null; - } - - // Accept quoted arguments as-is - if (match[3]) { - match[2] = match[4] || match[5] || ''; - - // Strip excess characters from unquoted arguments - } else if ( - unquoted && - rpseudo.test(unquoted) && - // Get excess from tokenize (recursively) - (excess = tokenize(unquoted, true)) && - // advance to the next closing parenthesis - (excess = - unquoted.indexOf(')', unquoted.length - excess) - - unquoted.length) - ) { - // excess is a negative index - match[0] = match[0].slice(0, excess); - match[2] = unquoted.slice(0, excess); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice(0, 3); - }, -}; - -function toSelector(tokens) { - var i = 0, - len = tokens.length, - selector = ''; - for (; i < len; i++) { - selector += tokens[i].value; - } - return selector; -} - -// CSS string/identifier serialization -// https://drafts.csswg.org/cssom/#common-serializing-idioms -var rcssescape = /([\0-\x1F\x7F]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; - -function fcssescape(ch, asCodePoint) { - if (asCodePoint) { - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if (ch === '\0') { - return '\uFFFD'; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ( - ch.slice(0, -1) + - '\\' + - ch.charCodeAt(ch.length - 1).toString(16) + - ' ' - ); - } - - // Other potentially-special ASCII characters get backslash-escaped - return '\\' + ch; -} - -$.escapeSelector = function(sel) { - return (sel + '').replace(rcssescape, fcssescape); -}; - -// Document order sorting - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ - /* * Optional limited selector module for custom builds. @@ -573,192 +122,25 @@ $.escapeSelector = function(sel) { * needs. */ -const matchExpr = { - bool: new RegExp('^(?:' + booleans + ')$', 'i'), - needsContext: new RegExp('^' + whitespace + '*[>+~]'), -}; - -Object.assign(matchExpr, filterMatchExpr); - -$.find = function(selector, context, results, seed) { - var elem, - nid, - groups, - newSelector, - newContext = context && context.ownerDocument, - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9, - i = 0; - - results = results || []; - context = context || document; - - // Same basic safeguard as in the full selector module - if (!selector || typeof selector !== 'string') { - return results; - } - +$.fn.find = function(selector) { + const [el] = this; + const ret = this.pushStack([]); + if (!el) return ret; // Early return if context is not an element, document or document fragment + const { nodeType } = el; if (nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { - return []; + return ret; } - - if (seed) { - while ((elem = seed[i++])) { - if (elem.matches(selector)) { - results.push(elem); - } + if (typeof selector !== 'string') { + if (el !== selector && el.contains(selector)) { + $.merge(ret, [selector]); } } else { - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( - nodeType === 1 && - (rdescend.test(selector) || rleadingCombinator.test(selector)) - ) { - // Expand context for sibling selectors - newContext = - (rsibling.test(selector) && testContext(context.parentNode)) || - context; - - // Outside of IE, if we're not changing the context we can - // use :scope instead of an ID. - if (newContext !== context || isIE) { - // Capture the context ID, setting it first if necessary - if ((nid = context.getAttribute('id'))) { - nid = $.escapeSelector(nid); - } else { - context.setAttribute('id', (nid = $.expando)); - } - } - - // Prefix every selector in the list - groups = tokenize(selector); - i = groups.length; - while (i--) { - groups[i] = - (nid ? '#' + nid : ':scope') + ' ' + toSelector(groups[i]); - } - newSelector = groups.join(','); - } - - try { - $.merge(results, newContext.querySelectorAll(newSelector)); - } finally { - if (nid === $.expando) { - context.removeAttribute('id'); - } - } - } - - return results; -}; - -$.expr = { - // Can be adjusted by the user - cacheLength: 50, - - match: matchExpr, - preFilter: preFilter, -}; - -var rneedsContext = $.expr.match.needsContext; - -// Implement the identical functionality for filter and not -function winnow(elements, qualifier, not) { - if (typeof qualifier === 'function') { - return $.grep(elements, function(elem, i) { - return !!qualifier.call(elem, i, elem) !== not; - }); - } - - // Single element - if (qualifier.nodeType) { - return $.grep(elements, function(elem) { - return (elem === qualifier) !== not; - }); - } - - // Arraylike of elements ($, arguments, Array) - if (typeof qualifier !== 'string') { - return $.grep(elements, function(elem) { - return indexOf.call(qualifier, elem) > -1 !== not; - }); - } - - // Filtered directly for both simple and complex selectors - return $.filter(qualifier, elements, not); -} - -$.filter = function(expr, elems, not) { - var elem = elems[0]; - - if (not) { - expr = ':not(' + expr + ')'; - } - - if (elems.length === 1 && elem.nodeType === 1) { - return elem.matches(expr) ? [elem] : []; - } - - return $.find( - expr, - null, - null, - $.grep(elems, (elem) => elem.nodeType === 1) - ); -}; - -$.fn.find = function(selector) { - var i, - ret, - len = this.length, - self = this; - - if (typeof selector !== 'string') { - return this.pushStack( - $(selector).filter(function() { - for (i = 0; i < len; i++) { - if ($.contains(self[i], this)) { - return true; - } - } - }) - ); - } - - ret = this.pushStack([]); - if (len > 0) { - $.find(selector, this[0], ret); + $.merge(ret, el.querySelectorAll(selector)); } return ret; }; -$.fn.filter = function(selector) { - return this.pushStack(winnow(this, selector || [], false)); -}; - -$.fn.is = function(selector) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === 'string' && rneedsContext.test(selector) - ? $(selector) - : selector || [], - false - ).length; -}; - // Initialize a $ object // A central reference to the root $(document) @@ -770,6 +152,12 @@ let root$; // Shortcut simple #id case for speed const rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; +function isObviousHtml(input) { + return ( + input[0] === '<' && input[input.length - 1] === '>' && input.length >= 3 + ); +} + const init = ($.fn.init = function(selector) { var match, elem; diff --git a/packages/joint-core/src/mvc/dom/dom-events.js b/packages/joint-core/src/mvc/dom/dom-events.js index 710720754..63a861b02 100644 --- a/packages/joint-core/src/mvc/dom/dom-events.js +++ b/packages/joint-core/src/mvc/dom/dom-events.js @@ -73,9 +73,12 @@ function on(elem, types, selector, data, fn, one) { // Use same guid so caller can remove using origFn fn.guid = origFn.guid || (origFn.guid = $.guid++); } - return elem.each(function() { - $.event.add(this, types, fn, data, selector); - }); + // return elem.each(function() { + // $.event.add(this, types, fn, data, selector); + // }); + for (let i = 0; i < elem.length; i++) { + $.event.add(elem[i], types, fn, data, selector); + } } /** @@ -179,9 +182,6 @@ $.event = { handler: handler, guid: handler.guid, selector: selector, - needsContext: - selector && - $.expr.match.needsContext.test(selector), namespace: namespaces.join('.'), }, handleObjIn @@ -426,14 +426,10 @@ $.event = { matchedSelectors = {}; for (i = 0; i < delegateCount; i++) { handleObj = handlers[i]; - // Don't conflict with Object.prototype properties (trac-13203) sel = handleObj.selector + ' '; - if (matchedSelectors[sel] === undefined) { - matchedSelectors[sel] = handleObj.needsContext - ? $(sel, this).index(cur) > -1 - : $.find(sel, this, null, [cur]).length; + matchedSelectors[sel] = cur.matches(sel); } if (matchedSelectors[sel]) { matchedHandlers.push(handleObj); @@ -491,9 +487,7 @@ $.event = { }, fix: function(originalEvent) { - return originalEvent[$.expando] - ? originalEvent - : new $.Event(originalEvent); + return originalEvent.wrapped ? originalEvent : new $.Event(originalEvent); }, }; @@ -681,7 +675,7 @@ $.Event = function(src, props) { this.timeStamp = (src && src.timeStamp) || Date.now(); // Mark it as fixed - this[$.expando] = true; + this.wrapped = true; }; // $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding @@ -779,10 +773,7 @@ $.Event.prototype = { // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window - if ( - !related || - (related !== target && !$.contains(target, related)) - ) { + if (!related || !target.contains(related)) { event.type = handleObj.origType; ret = handleObj.handler.apply(this, arguments); event.type = fix; @@ -829,7 +820,7 @@ $.fn.off = function(types, selector, fn) { if (fn === false) { fn = returnFalse; } - return this.each(function() { - $.event.remove(this, types, fn, selector); - }); + for (let i = 0; i < this.length; i++) { + $.event.remove(this[i], types, fn, selector); + } }; diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index 660aea59d..66d02973d 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -1104,9 +1104,11 @@ export const sortElements = function(elements, comparator) { }; }); - return Array.prototype.sort.call($elements, comparator).each(function(i) { - placements[i].call(this); - }); + Array.prototype.sort.call($elements, comparator); + for (var i = 0; i < placements.length; i++) { + placements[i].call($elements[i]); + } + return $elements; }; // Sets attributes on the given element and its descendants based on the selector. diff --git a/packages/joint-core/test/utils.js b/packages/joint-core/test/utils.js index f71719d48..91339acc1 100644 --- a/packages/joint-core/test/utils.js +++ b/packages/joint-core/test/utils.js @@ -101,6 +101,10 @@ const $ = window.$ = joint.mvc.$; +$.contains = function(parent, node) { + return parent !== node && parent.contains(node); +}; + function matchFilter(elem, filter) { if (typeof filter === 'string') { if (!elem.matches(filter)) return false; @@ -196,6 +200,21 @@ $.fn.click = function() { return this.trigger('click'); }; +$.fn.eq = function(i) { + const len = this.length; + const j = +i + (i < 0 ? len : 0); + return this.pushStack(j >= 0 && j < len ? [this[j]] : []); +}; + +$.fn.is = function(selector) { + const [el] = this; + if (!el) return false; + if (typeof selector === 'string') { + return el.matches(selector); + } + return el === selector; +}; + // Simulate user events. // --------------------- From 96dbedee68cbe5fc54da616c1d2c911d7996a64c Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Mon, 27 Nov 2023 20:52:21 +0100 Subject: [PATCH 16/58] simplify core part 2 --- packages/joint-core/src/mvc/Dom.mjs | 238 +++++++----------- .../joint-core/src/mvc/dom/dom-methods.js | 17 -- .../joint-core/test/jointjs/mvc.viewBase.js | 2 +- 3 files changed, 92 insertions(+), 165 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index 847e7468f..4af35afb6 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -9,14 +9,10 @@ * * Date: 2023-11-24T14:04Z */ - -import { isArrayLike } from '../util/utilHelpers.mjs'; - if (!window.document) { throw new Error('$ requires a window with a document'); } -const arr = []; const document = window.document; // Define a local copy of $ @@ -32,95 +28,57 @@ $.fn = $.prototype = { // The default length of a $ object is 0 length: 0, - - toArray: function() { - return Array.from(this); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function(num) { - // Return all the elements in a clean array - if (num == null) { - return Array.from(this); - } - - // Return just the one element from the set - return num < 0 ? this[num + this.length] : this[num]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function(elements) { - // Build a new $ matched element set - const ret = $.merge(this.constructor(), elements); - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - // Return the newly-formed element set - return ret; - }, }; -Object.assign($, { - - // results is for internal usage only - makeArray: function(arr, results) { - const ret = results || []; - if (arr != null) { - if (isArrayLike(Object(arr))) { - $.merge(ret, typeof arr === 'string' ? [arr] : arr); - } else { - Array.prototype.push.call(ret, arr); - } - } - return ret; - }, - - merge: function(first, second) { - var len = +second.length, - j = 0, - i = first.length; - - for (; j < len; j++) { - first[i++] = second[j]; - } - - first.length = i; +// A global GUID counter for objects +$.guid = 1; - return first; - }, +$.merge = function(first, second) { + let len = +second.length; + let i = first.length; + for (let j = 0; j < len; j++) { + first[i++] = second[j]; + } + first.length = i; + return first; +}; - // A global GUID counter for objects - guid: 1, -}); +$.parseHTML = function(string) { + // Inline events will not execute when the HTML is parsed; this includes, for example, sending GET requests for images. + const context = document.implementation.createHTMLDocument(); + // Set the base href for the created document so any parsed elements with URLs + // are based on the document's URL + const base = context.createElement('base'); + base.href = document.location.href; + context.head.appendChild(base); + + context.body.innerHTML = string; + // remove scripts + const scripts = context.getElementsByTagName('script'); + for (let i = 0; i < scripts.length; i++) { + scripts[i].remove(); + } + return Array.from(context.body.children); +}; if (typeof Symbol === 'function') { - $.fn[Symbol.iterator] = arr[Symbol.iterator]; + $.fn[Symbol.iterator] = Array.prototype[Symbol.iterator]; } +$.fn.toArray = function() { + return Array.from(this); +}; -/* - * Optional limited selector module for custom builds. - * - * Note that this DOES NOT SUPPORT many documented jQuery - * features in exchange for its smaller size: - * - * * Attribute not equal selector (!=) - * * Positional selectors (:first; :eq(n); :odd; etc.) - * * Type selectors (:input; :checkbox; :button; etc.) - * * State-based selectors (:animated; :visible; :hidden; etc.) - * * :has(selector) in browsers without native support - * * :not(complex selector) in IE - * * custom selectors via jQuery extensions - * * Reliable functionality on XML fragments - * * Matching against non-elements - * * Reliable sorting of disconnected nodes - * * querySelectorAll bug fixes (e.g., unreliable :focus on WebKit) - * - * If any of these are unacceptable tradeoffs, either use the full - * selector engine or customize this stub for the project's specific - * needs. - */ +// Take an array of elements and push it onto the stack +// (returning the new matched element set) +$.fn.pushStack = function(elements) { + // Build a new $ matched element set + const ret = $.merge(this.constructor(), elements); + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + // Return the newly-formed element set + return ret; +}; $.fn.find = function(selector) { const [el] = this; @@ -141,16 +99,11 @@ $.fn.find = function(selector) { return ret; }; -// Initialize a $ object - -// A central reference to the root $(document) -let root$; - // A simple way to check for HTML strings // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) // Strict HTML recognition (trac-11290: must start with <) // Shortcut simple #id case for speed -const rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; +const rQuickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; function isObviousHtml(input) { return ( @@ -159,80 +112,71 @@ function isObviousHtml(input) { } const init = ($.fn.init = function(selector) { - var match, elem; - // HANDLE: $(""), $(null), $(undefined), $(false) if (!selector) { + // HANDLE: $(""), $(null), $(undefined), $(false) return this; } - // HANDLE: $(DOMElement) + if (typeof selector === 'function') { + // HANDLE: $(function) + // Shortcut for document ready + throw new Error('function not supported'); + } + + if (arguments.length > 1) { + throw new Error('selector with context not supported'); + } + if (selector.nodeType) { + // HANDLE: $(DOMElement) this[0] = selector; this.length = 1; return this; + } - // HANDLE: $(function) - // Shortcut for document ready - } else if (typeof selector === 'function') { - throw new Error('Not supported'); - } else { + let match; + if (isObviousHtml(selector + '')) { // Handle obvious HTML strings - match = selector + ''; - if (isObviousHtml(match)) { - // Assume that strings that start and end with <> are HTML and skip - // the regex check. This also handles browser-supported HTML wrappers - // like TrustedHTML. - match = [null, selector, null]; - - // Handle HTML strings or selectors - } else if (typeof selector === 'string') { - match = rquickExpr.exec(selector); - } else { - return $.makeArray(selector, this); - } + // Assume that strings that start and end with <> are HTML and skip + // the regex check. This also handles browser-supported HTML wrappers + // like TrustedHTML. + match = [null, selector, null]; + } else if (typeof selector === 'string') { + // Handle HTML strings or selectors + match = rQuickExpr.exec(selector); + } else { + // Array-like + return $.merge(this, selector); + } - // Match html or make sure no context is specified for #id - // Note: match[1] may be a string or a TrustedHTML wrapper - if (match && (match[1])) { - // HANDLE: $(html) -> $(array) - if (match[1]) { - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - $.merge( - this, - $.parseHTML( - match[1], - document, - true - ) - ); - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById(match[2]); - if (elem) { - // Inject the element directly into the $ object - this[0] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr) & $(expr, $(...)) - } else { - return (root$).find(selector); - } + if (!match || !match[1]) { + // HANDLE: $(expr) + return $root.find(selector); + } + + // Match html or make sure no context is specified for #id + // Note: match[1] may be a string or a TrustedHTML wrapper + if (match[1]) { + // HANDLE: $(html) -> $(array) + $.merge(this, $.parseHTML(match[1])); + return this; + } + + // HANDLE: $(#id) + const el = document.getElementById(match[2]); + if (el) { + // Inject the element directly into the $ object + this[0] = el; + this.length = 1; } + return this; }); // Give the init function the $ prototype for later instantiation init.prototype = $.fn; -// Initialize central reference -root$ = $(document); +// A central reference to the root $(document) +const $root = $(document); export { $ as default }; diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js index 2cbda97ef..564a0beab 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -4,23 +4,6 @@ import { dataUser, dataPriv, cleanNodesData } from './dom-data'; $.data = dataUser; -$.parseHTML = function(string) { - // Inline events will not execute when the HTML is parsed; this includes, for example, sending GET requests for images. - const context = document.implementation.createHTMLDocument(); - // Set the base href for the created document so any parsed elements with URLs - // are based on the document's URL - const base = context.createElement('base'); - base.href = document.location.href; - context.head.appendChild(base); - - context.body.innerHTML = string; - // remove scripts - const scripts = context.getElementsByTagName('script'); - for (let i = 0; i < scripts.length; i++) { - scripts[i].remove(); - } - return Array.from(context.body.children); -}; $.fn.empty = function() { for (let i = 0; i < this.length; i++) { diff --git a/packages/joint-core/test/jointjs/mvc.viewBase.js b/packages/joint-core/test/jointjs/mvc.viewBase.js index 5923c15b2..cf0b57494 100644 --- a/packages/joint-core/test/jointjs/mvc.viewBase.js +++ b/packages/joint-core/test/jointjs/mvc.viewBase.js @@ -272,7 +272,7 @@ QUnit.module('joint.mvc.ViewBase', function(hooks) { View = joint.mvc.ViewBase.extend({ el: '#testElement > h1' }); - assert.strictEqual(new View().el, $('#testElement > h1').get(0)); + assert.strictEqual(new View().el, $('#testElement > h1')[0]); View = joint.mvc.ViewBase.extend({ el: '#nonexistent' From 27be0ca006058c33d910fd0a7264859d4608c6c1 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Tue, 28 Nov 2023 11:15:11 +0100 Subject: [PATCH 17/58] update --- packages/joint-core/src/mvc/Dom.mjs | 23 +++-- .../joint-core/src/mvc/dom/dom-methods.js | 86 ++++++++++--------- 2 files changed, 62 insertions(+), 47 deletions(-) diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom.mjs index 4af35afb6..1499e7807 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom.mjs @@ -9,6 +9,9 @@ * * Date: 2023-11-24T14:04Z */ + +import { dataUser } from './dom/dom-data'; + if (!window.document) { throw new Error('$ requires a window with a document'); } @@ -19,13 +22,11 @@ const document = window.document; const $ = function(selector) { // The $ object is actually just the init constructor 'enhanced' // Need init if $ is called (just allow error to be thrown if not included) - return new $.fn.init(selector); + return new $.Dom(selector); }; $.fn = $.prototype = { - constructor: $, - // The default length of a $ object is 0 length: 0, }; @@ -33,6 +34,9 @@ $.fn = $.prototype = { // A global GUID counter for objects $.guid = 1; +// User data storage +$.data = dataUser; + $.merge = function(first, second) { let len = +second.length; let i = first.length; @@ -111,7 +115,7 @@ function isObviousHtml(input) { ); } -const init = ($.fn.init = function(selector) { +const Dom = function(selector) { if (!selector) { // HANDLE: $(""), $(null), $(undefined), $(false) @@ -171,12 +175,19 @@ const init = ($.fn.init = function(selector) { this.length = 1; } return this; -}); +}; + +$.Dom = Dom; // Give the init function the $ prototype for later instantiation -init.prototype = $.fn; +Dom.prototype = $.fn; // A central reference to the root $(document) const $root = $(document); + +// $.fn.addBack = function() { +// this.add(this.prevObject); +// }; + export { $ as default }; diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/dom/dom-methods.js index 564a0beab..7e1c65c7d 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/dom/dom-methods.js @@ -1,9 +1,18 @@ import $ from '../Dom.mjs'; import V from '../../V/index.mjs'; -import { dataUser, dataPriv, cleanNodesData } from './dom-data'; +import { dataPriv, cleanNodesData } from './dom-data'; -$.data = dataUser; +// Manipulation +$.fn.remove = function() { + for (let i = 0; i < this.length; i++) { + const node = this[i]; + dataPriv.remove(node); + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } +}; $.fn.empty = function() { for (let i = 0; i < this.length; i++) { @@ -17,14 +26,16 @@ $.fn.empty = function() { return this; }; -$.fn.remove = function() { - for (let i = 0; i < this.length; i++) { - const node = this[i]; - dataPriv.remove(node); - if (node.parentNode) { - node.parentNode.removeChild(node); - } +$.fn.html = function(html) { + const [el] = this; + cleanNodesData(dataPriv, el.getElementsByTagName('*')); + if (typeof string === 'string') { + el.innerHTML = html; + } else { + el.innerHTML = ''; + return this.append(html); } + return this; }; $.fn.append = function(...nodes) { @@ -50,38 +61,7 @@ $.fn.appendTo = function(parent) { return this; }; -$.fn.removeClass = function() { - const [node] = this; - V.prototype.removeClass.apply({ node }, arguments); - return this; -}; - -$.fn.addClass = function() { - const [node] = this; - V.prototype.addClass.apply({ node }, arguments); - return this; -}; - -$.fn.hasClass = function() { - const [node] = this; - return V.prototype.hasClass.apply({ node }, arguments); -}; - -$.fn.addBack = function() { - this.add(this.prevObject); -}; - -$.fn.html = function(html) { - const [el] = this; - cleanNodesData(dataPriv, el.getElementsByTagName('*')); - if (typeof string === 'string') { - el.innerHTML = html; - } else { - el.innerHTML = ''; - return this.append(html); - } - return this; -}; +// Styles and attributes $.fn.css = function(name, value) { let styles; @@ -132,3 +112,27 @@ $.fn.attr = function(name, value) { } return this; }; + +// Classes + +$.fn.removeClass = function() { + for (let i = 0; i < this.length; i++) { + const node = this[i]; + V.prototype.removeClass.apply({ node }, arguments); + } + return this; +}; + +$.fn.addClass = function() { + for (let i = 0; i < this.length; i++) { + const node = this[i]; + V.prototype.addClass.apply({ node }, arguments); + } + return this; +}; + +$.fn.hasClass = function() { + const [node] = this; + if (!node) return false; + return V.prototype.hasClass.apply({ node }, arguments); +}; From 4fd86cf5c4bd7880fe3ae9d95e1beedd6e734901 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Tue, 28 Nov 2023 12:21:24 +0100 Subject: [PATCH 18/58] update --- packages/joint-core/src/dia/CellView.mjs | 2 +- packages/joint-core/src/dia/LinkView.mjs | 2 +- packages/joint-core/src/dia/Paper.mjs | 2 +- .../joint-core/src/dia/attributes/index.mjs | 2 +- .../joint-core/src/linkTools/HoverConnect.mjs | 2 +- packages/joint-core/src/mvc/{ => Dom}/Dom.mjs | 30 ++++++++----------- .../mvc/{dom/dom-events.js => Dom/events.js} | 4 +-- .../{dom/dom-gestures.js => Dom/gestures.js} | 3 +- packages/joint-core/src/mvc/Dom/index.mjs | 11 +++++++ .../{dom/dom-methods.js => Dom/methods.js} | 4 +-- .../src/mvc/{dom/dom-data.js => Dom/vars.mjs} | 0 packages/joint-core/src/mvc/View.mjs | 2 +- packages/joint-core/src/mvc/ViewBase.mjs | 2 +- packages/joint-core/src/mvc/index.mjs | 6 +--- packages/joint-core/src/util/util.mjs | 2 +- 15 files changed, 39 insertions(+), 35 deletions(-) rename packages/joint-core/src/mvc/{ => Dom}/Dom.mjs (93%) rename packages/joint-core/src/mvc/{dom/dom-events.js => Dom/events.js} (99%) rename packages/joint-core/src/mvc/{dom/dom-gestures.js => Dom/gestures.js} (92%) create mode 100644 packages/joint-core/src/mvc/Dom/index.mjs rename packages/joint-core/src/mvc/{dom/dom-methods.js => Dom/methods.js} (97%) rename packages/joint-core/src/mvc/{dom/dom-data.js => Dom/vars.mjs} (100%) diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index 5c0972ff7..a33e5a4b8 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -19,7 +19,7 @@ import { } from '../util/index.mjs'; import { Point, Rect } from '../g/index.mjs'; import V from '../V/index.mjs'; -import $ from '../mvc/Dom.mjs'; +import $ from '../mvc/Dom/index.mjs'; import { HighlighterView } from './HighlighterView.mjs'; const HighlightingTypes = { diff --git a/packages/joint-core/src/dia/LinkView.mjs b/packages/joint-core/src/dia/LinkView.mjs index e41412f18..de6ac14eb 100644 --- a/packages/joint-core/src/dia/LinkView.mjs +++ b/packages/joint-core/src/dia/LinkView.mjs @@ -5,7 +5,7 @@ import { addClassNamePrefix, removeClassNamePrefix, merge, template, assign, toA import { Point, Line, Path, normalizeAngle, Rect, Polyline } from '../g/index.mjs'; import * as routers from '../routers/index.mjs'; import * as connectors from '../connectors/index.mjs'; -import $ from '../mvc/Dom.mjs'; +import $ from '../mvc/Dom/index.mjs'; const Flags = { diff --git a/packages/joint-core/src/dia/Paper.mjs b/packages/joint-core/src/dia/Paper.mjs index b96a96431..6bc87edf2 100644 --- a/packages/joint-core/src/dia/Paper.mjs +++ b/packages/joint-core/src/dia/Paper.mjs @@ -46,7 +46,7 @@ import * as linkAnchors from '../linkAnchors/index.mjs'; import * as connectionPoints from '../connectionPoints/index.mjs'; import * as anchors from '../anchors/index.mjs'; -import $ from '../mvc/Dom.mjs'; +import $ from '../mvc/Dom/index.mjs'; const sortingTypes = { NONE: 'sorting-none', diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index 44de659b6..89574124f 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -2,7 +2,7 @@ import { Point, Path, Polyline } from '../../g/index.mjs'; import { assign, isPlainObject, isObject, isPercentage, breakText } from '../../util/util.mjs'; import { isCalcAttribute, evalCalcAttribute } from './calc.mjs'; import props from './props.mjs'; -import $ from '../../mvc/Dom.mjs'; +import $ from '../../mvc/Dom/index.mjs'; import V from '../../V/index.mjs'; function setWrapper(attrName, dimension) { diff --git a/packages/joint-core/src/linkTools/HoverConnect.mjs b/packages/joint-core/src/linkTools/HoverConnect.mjs index edf02b8d0..854126f67 100644 --- a/packages/joint-core/src/linkTools/HoverConnect.mjs +++ b/packages/joint-core/src/linkTools/HoverConnect.mjs @@ -1,6 +1,6 @@ import { Connect } from '../linkTools/Connect.mjs'; import V from '../V/index.mjs'; -import $ from '../mvc/Dom.mjs'; +import $ from '../mvc/Dom/index.mjs'; import * as util from '../util/index.mjs'; import * as g from '../g/index.mjs'; diff --git a/packages/joint-core/src/mvc/Dom.mjs b/packages/joint-core/src/mvc/Dom/Dom.mjs similarity index 93% rename from packages/joint-core/src/mvc/Dom.mjs rename to packages/joint-core/src/mvc/Dom/Dom.mjs index 1499e7807..bffb462da 100644 --- a/packages/joint-core/src/mvc/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom/Dom.mjs @@ -10,7 +10,7 @@ * Date: 2023-11-24T14:04Z */ -import { dataUser } from './dom/dom-data'; +import { uniq } from '../../util/utilHelpers.mjs'; if (!window.document) { throw new Error('$ requires a window with a document'); @@ -34,9 +34,6 @@ $.fn = $.prototype = { // A global GUID counter for objects $.guid = 1; -// User data storage -$.data = dataUser; - $.merge = function(first, second) { let len = +second.length; let i = first.length; @@ -103,6 +100,18 @@ $.fn.find = function(selector) { return ret; }; +$.fn.add = function(selector, context) { + const newElements = $(selector, context).toArray(); + const prevElements = this.toArray(); + const ret = this.pushStack([]); + $.merge(ret, uniq(prevElements.concat(newElements))); + return ret; +}; + +$.fn.addBack = function() { + return this.add(this.prevObject); +}; + // A simple way to check for HTML strings // Prioritize #id over <tag> to avoid XSS via location.hash (trac-9521) // Strict HTML recognition (trac-11290: must start with <) @@ -116,29 +125,24 @@ function isObviousHtml(input) { } const Dom = function(selector) { - if (!selector) { // HANDLE: $(""), $(null), $(undefined), $(false) return this; } - if (typeof selector === 'function') { // HANDLE: $(function) // Shortcut for document ready throw new Error('function not supported'); } - if (arguments.length > 1) { throw new Error('selector with context not supported'); } - if (selector.nodeType) { // HANDLE: $(DOMElement) this[0] = selector; this.length = 1; return this; } - let match; if (isObviousHtml(selector + '')) { // Handle obvious HTML strings @@ -153,12 +157,10 @@ const Dom = function(selector) { // Array-like return $.merge(this, selector); } - if (!match || !match[1]) { // HANDLE: $(expr) return $root.find(selector); } - // Match html or make sure no context is specified for #id // Note: match[1] may be a string or a TrustedHTML wrapper if (match[1]) { @@ -166,7 +168,6 @@ const Dom = function(selector) { $.merge(this, $.parseHTML(match[1])); return this; } - // HANDLE: $(#id) const el = document.getElementById(match[2]); if (el) { @@ -185,9 +186,4 @@ Dom.prototype = $.fn; // A central reference to the root $(document) const $root = $(document); - -// $.fn.addBack = function() { -// this.add(this.prevObject); -// }; - export { $ as default }; diff --git a/packages/joint-core/src/mvc/dom/dom-events.js b/packages/joint-core/src/mvc/Dom/events.js similarity index 99% rename from packages/joint-core/src/mvc/dom/dom-events.js rename to packages/joint-core/src/mvc/Dom/events.js index 63a861b02..710c2bf8c 100644 --- a/packages/joint-core/src/mvc/dom/dom-events.js +++ b/packages/joint-core/src/mvc/Dom/events.js @@ -1,6 +1,6 @@ import { isEmpty } from '../../util/utilHelpers.mjs'; -import $ from '../Dom.mjs'; -import { dataPriv } from './dom-data.js'; +import $ from './Dom.mjs'; +import { dataPriv } from './vars.mjs'; const rtypenamespace = /^([^.]*)(?:\.(.+)|)/; const rcheckableType = /^(?:checkbox|radio)$/i; diff --git a/packages/joint-core/src/mvc/dom/dom-gestures.js b/packages/joint-core/src/mvc/Dom/gestures.js similarity index 92% rename from packages/joint-core/src/mvc/dom/dom-gestures.js rename to packages/joint-core/src/mvc/Dom/gestures.js index a7636f182..bc73bc5f4 100644 --- a/packages/joint-core/src/mvc/dom/dom-gestures.js +++ b/packages/joint-core/src/mvc/Dom/gestures.js @@ -1,5 +1,6 @@ +// TODO: should not read config outside the mvc package import { config } from '../../config/index.mjs'; -import $ from '../Dom.mjs'; +import $ from './Dom.mjs'; const DoubleTapEventName = 'dbltap'; if ($.event && !(DoubleTapEventName in $.event.special)) { diff --git a/packages/joint-core/src/mvc/Dom/index.mjs b/packages/joint-core/src/mvc/Dom/index.mjs new file mode 100644 index 000000000..ebe1daae7 --- /dev/null +++ b/packages/joint-core/src/mvc/Dom/index.mjs @@ -0,0 +1,11 @@ +import { default as $ } from './Dom.mjs'; +import { dataUser } from './vars.mjs'; + +import './methods.js'; +import './events.js'; +import './gestures.js'; + +$.data = dataUser; + +export default $; + diff --git a/packages/joint-core/src/mvc/dom/dom-methods.js b/packages/joint-core/src/mvc/Dom/methods.js similarity index 97% rename from packages/joint-core/src/mvc/dom/dom-methods.js rename to packages/joint-core/src/mvc/Dom/methods.js index 7e1c65c7d..9beac3bc5 100644 --- a/packages/joint-core/src/mvc/dom/dom-methods.js +++ b/packages/joint-core/src/mvc/Dom/methods.js @@ -1,6 +1,6 @@ -import $ from '../Dom.mjs'; +import $ from './Dom.mjs'; import V from '../../V/index.mjs'; -import { dataPriv, cleanNodesData } from './dom-data'; +import { dataPriv, cleanNodesData } from './vars.mjs'; // Manipulation diff --git a/packages/joint-core/src/mvc/dom/dom-data.js b/packages/joint-core/src/mvc/Dom/vars.mjs similarity index 100% rename from packages/joint-core/src/mvc/dom/dom-data.js rename to packages/joint-core/src/mvc/Dom/vars.mjs diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index ec2397ee1..ff32fef7f 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -1,4 +1,4 @@ -import $ from './Dom.mjs'; +import $ from './Dom/index.mjs'; import * as util from '../util/index.mjs'; import V from '../V/index.mjs'; diff --git a/packages/joint-core/src/mvc/ViewBase.mjs b/packages/joint-core/src/mvc/ViewBase.mjs index da25e4856..975e54e9a 100644 --- a/packages/joint-core/src/mvc/ViewBase.mjs +++ b/packages/joint-core/src/mvc/ViewBase.mjs @@ -1,4 +1,4 @@ -import $ from './Dom.mjs'; +import $ from './Dom/index.mjs'; import { Events } from './Events.mjs'; import { extend } from './mvcUtils.mjs'; diff --git a/packages/joint-core/src/mvc/index.mjs b/packages/joint-core/src/mvc/index.mjs index 13733ddf9..ddf599166 100644 --- a/packages/joint-core/src/mvc/index.mjs +++ b/packages/joint-core/src/mvc/index.mjs @@ -6,8 +6,4 @@ export * from './Model.mjs'; export * from './ViewBase.mjs'; export * from './mvcUtils.mjs'; export * from './Data.mjs'; - -export { default as $ } from './Dom.mjs'; -import './dom/dom-methods.js'; -import './dom/dom-events.js'; -import './dom/dom-gestures.js'; +export { default as $ } from './Dom/index.mjs'; diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index 66d02973d..f635177a2 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -1,4 +1,4 @@ -import $ from '../mvc/Dom.mjs'; +import $ from '../mvc/Dom/index.mjs'; import V from '../V/index.mjs'; import { config } from '../config/index.mjs'; import { From 1c0e152709fab8c9f5014a485462af7d3e384406 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Thu, 30 Nov 2023 18:15:16 +0100 Subject: [PATCH 19/58] update --- packages/joint-core/src/mvc/Data.mjs | 1 + packages/joint-core/src/mvc/Dom/events.js | 471 ++++++---------------- 2 files changed, 125 insertions(+), 347 deletions(-) diff --git a/packages/joint-core/src/mvc/Data.mjs b/packages/joint-core/src/mvc/Data.mjs index 6e47ba0bb..0cf49ec6f 100644 --- a/packages/joint-core/src/mvc/Data.mjs +++ b/packages/joint-core/src/mvc/Data.mjs @@ -43,3 +43,4 @@ class Data { } export default Data; + diff --git a/packages/joint-core/src/mvc/Dom/events.js b/packages/joint-core/src/mvc/Dom/events.js index 710c2bf8c..6b358ff8e 100644 --- a/packages/joint-core/src/mvc/Dom/events.js +++ b/packages/joint-core/src/mvc/Dom/events.js @@ -2,18 +2,12 @@ import { isEmpty } from '../../util/utilHelpers.mjs'; import $ from './Dom.mjs'; import { dataPriv } from './vars.mjs'; -const rtypenamespace = /^([^.]*)(?:\.(.+)|)/; -const rcheckableType = /^(?:checkbox|radio)$/i; +const rTypeNamespace = /^([^.]*)(?:\.(.+)|)/; const documentElement = document.documentElement; // Only count HTML whitespace // Other whitespace should count in values // https://infra.spec.whatwg.org/#ascii-whitespace -const rnothtmlwhite = /[^\x20\t\r\n\f]+/g; - - -function nodeName(elem, name) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); -} +const rNotHtmlWhite = /[^\x20\t\r\n\f]+/g; function returnTrue() { return true; @@ -24,7 +18,6 @@ function returnFalse() { } function on(elem, types, selector, data, fn, one) { - var origFn, type; // Types can be a map of types/handlers if (typeof types === 'object') { @@ -34,7 +27,7 @@ function on(elem, types, selector, data, fn, one) { data = data || selector; selector = undefined; } - for (type in types) { + for (let type in types) { on(elem, type, selector, data, types[type], one); } return elem; @@ -63,7 +56,7 @@ function on(elem, types, selector, data, fn, one) { } if (one === 1) { - origFn = fn; + const origFn = fn; fn = function(event) { // Can use an empty set, since event contains the info $().off(event); @@ -73,52 +66,26 @@ function on(elem, types, selector, data, fn, one) { // Use same guid so caller can remove using origFn fn.guid = origFn.guid || (origFn.guid = $.guid++); } - // return elem.each(function() { - // $.event.add(this, types, fn, data, selector); - // }); for (let i = 0; i < elem.length; i++) { $.event.add(elem[i], types, fn, data, selector); } } -/** - * Determines whether an object can have data - */ -function acceptData(owner) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType; -} - /* * Helper functions for managing events -- not part of the public interface. * Props to Dean Edwards' addEvent library for many of the ideas. */ $.event = { add: function(elem, types, handler, data, selector) { - var handleObjIn, - eventHandle, - tmp, - events, - t, - handleObj, - special, - handlers, - type, - namespaces, - origType, - elemData = dataPriv.get(elem); - - // Only attach events to objects that accept data - if (!acceptData(elem)) { + // Only attach events to objects for which we can store data + if (typeof elem != 'object') { return; } + const elemData = dataPriv.get(elem); + // Caller can pass in an object of custom data in lieu of the handler + let handleObjIn; if (handler.handler) { handleObjIn = handler; handler = handleObjIn.handler; @@ -137,44 +104,40 @@ $.event = { } // Init the element's event structure and main handler, if this is the first + let events; if (!(events = elemData.events)) { events = elemData.events = Object.create(null); } + let eventHandle; if (!(eventHandle = elemData.handle)) { eventHandle = elemData.handle = function(e) { // Discard the second event of a $.event.trigger() and // when an event is called after a page has unloaded - return typeof $ !== 'undefined' && - $.event.triggered !== e.type + return typeof $ !== 'undefined' && $.event.triggered !== e.type ? $.event.dispatch.apply(elem, arguments) : undefined; }; } // Handle multiple events separated by a space - types = (types || '').match(rnothtmlwhite) || ['']; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || '').split('.').sort(); - + const typesArr = (types || '').match(rNotHtmlWhite) || ['']; + let i = typesArr.length; + while (i--) { + const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); // There *must* be a type, no attaching namespace-only handlers - if (!type) { + if (!origType) { continue; } + const namespaces = ns.split('.').sort(); // If event changes its type, use the special event handlers for the changed type - special = $.event.special[type] || {}; - + let special = $.event.special[origType]; // If selector defined, determine special event api type, otherwise given type - type = (selector ? special.delegateType : special.bindType) || type; - + const type = (special && (selector ? special.delegateType : special.bindType)) || origType; // Update special based on newly reset type - special = $.event.special[type] || {}; - + special = $.event.special[type]; // handleObj is passed to all event handlers - handleObj = Object.assign( + const handleObj = Object.assign( { type: type, origType: origType, @@ -187,6 +150,7 @@ $.event = { handleObjIn ); + let handlers; // Init the event handler queue if we're the first if (!(handlers = events[type])) { handlers = events[type] = []; @@ -194,9 +158,8 @@ $.event = { // Only use addEventListener if the special events handler returns false if ( - !special.setup || - special.setup.call(elem, data, namespaces, eventHandle) === - false + !special || !special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === false ) { if (elem.addEventListener) { elem.addEventListener(type, eventHandle); @@ -204,9 +167,8 @@ $.event = { } } - if (special.add) { + if (special && special.add) { special.add.call(elem, handleObj); - if (!handleObj.handler.guid) { handleObj.handler.guid = handler.guid; } @@ -223,37 +185,22 @@ $.event = { // Detach an event or set of events from an element remove: function(elem, types, handler, selector, mappedTypes) { - var j, - origCount, - tmp, - events, - t, - handleObj, - special, - handlers, - type, - namespaces, - origType, - elemData = dataPriv.read(elem); - - if (!elemData || !(events = elemData.events)) { - return; - } - // Once for each type.namespace in types; type may be omitted - types = (types || '').match(rnothtmlwhite) || ['']; - t = types.length; - while (t--) { - tmp = rtypenamespace.exec(types[t]) || []; - type = origType = tmp[1]; - namespaces = (tmp[2] || '').split('.').sort(); + const elemData = dataPriv.read(elem); + if (!elemData || !elemData.events) return; + const events = elemData.events; + // Once for each type.namespace in types; type may be omitted + const typesArr = (types || '').match(rNotHtmlWhite) || ['']; + let i = typesArr.length; + while (i--) { + const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); // Unbind all events (on this namespace, if provided) for the element - if (!type) { - for (type in events) { + if (!origType) { + for (const type in events) { $.event.remove( elem, - type + types[t], + type + typesArr[i], handler, selector, true @@ -262,34 +209,35 @@ $.event = { continue; } - special = $.event.special[type] || {}; - type = (selector ? special.delegateType : special.bindType) || type; - handlers = events[type] || []; - tmp = - tmp[2] && - new RegExp( - '(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)' - ); + const special = $.event.special[origType]; + const type = (special && (selector ? special.delegateType : special.bindType)) || origType; + const handlers = events[type]; + if (!handlers || handlers.length === 0) continue; + + const namespaces = ns.split('.').sort(); + const rNamespace = ns + ? new RegExp('(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)') + : null; // Remove matching events - origCount = j = handlers.length; + const origCount = handlers.length; + let j = origCount; while (j--) { - handleObj = handlers[j]; + const handleObj = handlers[j]; if ( (mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && - (!tmp || tmp.test(handleObj.namespace)) && + (!rNamespace || rNamespace.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || (selector === '**' && handleObj.selector)) ) { handlers.splice(j, 1); - if (handleObj.selector) { handlers.delegateCount--; } - if (special.remove) { + if (special && special.remove) { special.remove.call(elem, handleObj); } } @@ -297,113 +245,94 @@ $.event = { // Remove generic event handler if we removed something and no more handlers exist // (avoids potential for endless recursion during removal of special event handlers) - if (origCount && !handlers.length) { + if (origCount && handlers.length === 0) { if ( - !special.teardown || - special.teardown.call(elem, namespaces, elemData.handle) === - false + !special || !special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === false ) { - $.removeEvent(elem, type, elemData.handle); + // This "if" is needed for plain objects + if (elem.removeEventListener) { + elem.removeEventListener(type, elemData.handle); + } } - delete events[type]; } } // Remove data if it's no longer used if (isEmpty(events)) { - dataPriv.remove(elem, 'handle events'); + dataPriv.remove(elem, 'handle'); + dataPriv.remove(elem, 'events'); } }, dispatch: function(nativeEvent) { - var i, - j, - ret, - matched, - handleObj, - handlerQueue, - args = new Array(arguments.length), - // Make a writable $.Event from the native event object - event = $.event.fix(nativeEvent), - handlers = - (dataPriv.get(this, 'events') || Object.create(null))[ - event.type - ] || [], - special = $.event.special[event.type] || {}; + const elem = this; + // Make a writable $.Event from the native event object + const event = $.event.fix(nativeEvent); + event.delegateTarget = elem; // Use the fix-ed $.Event rather than the (read-only) native event + const args = Array.from(arguments); args[0] = event; - for (i = 1; i < arguments.length; i++) { - args[i] = arguments[i]; - } - - event.delegateTarget = this; + const eventsData = dataPriv.read(elem, 'events'); + const handlers = (eventsData && eventsData[event.type]) || []; + const special = $.event.special[event.type]; // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( - special.preDispatch && - special.preDispatch.call(this, event) === false - ) { - return; + if (special && special.preDispatch) { + if (special.preDispatch.call(elem, event) === false) return; } // Determine handlers - handlerQueue = $.event.handlers.call(this, event, handlers); + const handlerQueue = $.event.handlers.call(elem, event, handlers); // Run delegates first; they may want to stop propagation beneath us - i = 0; + let i = 0; + let matched; while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { event.currentTarget = matched.elem; - - j = 0; + let j = 0; + let handleObj; while ( (handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped() ) { - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( - !event.rnamespace || - handleObj.namespace === false || - event.rnamespace.test(handleObj.namespace) - ) { - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( - ($.event.special[handleObj.origType] || {}) - .handle || handleObj.handler - ).apply(matched.elem, args); - - if (ret !== undefined) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } + + event.handleObj = handleObj; + event.data = handleObj.data; + + const origSpecial = $.event.special[handleObj.origType]; + let handler; + if (origSpecial && origSpecial.handle) { + handler = origSpecial.handle; + } else { + handler = handleObj.handler; + } + + const ret = handler.apply(matched.elem, args); + if (ret !== undefined) { + if ((event.result = ret) === false) { + event.preventDefault(); + event.stopPropagation(); } } } } // Call the postDispatch hook for the mapped type - if (special.postDispatch) { - special.postDispatch.call(this, event); + if (special && special.postDispatch) { + special.postDispatch.call(elem, event); } return event.result; }, handlers: function(event, handlers) { - var i, - handleObj, - sel, - matchedHandlers, - matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; + + const delegateCount = handlers.delegateCount; + const handlerQueue = []; // Find delegate handlers if ( @@ -415,19 +344,19 @@ $.event = { // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) !(event.type === 'click' && event.button >= 1) ) { - for (; cur !== this; cur = cur.parentNode || this) { + for (let cur = event.target; cur !== this; cur = cur.parentNode || this) { // Don't check non-elements (trac-13208) // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) if ( cur.nodeType === 1 && !(event.type === 'click' && cur.disabled === true) ) { - matchedHandlers = []; - matchedSelectors = {}; - for (i = 0; i < delegateCount; i++) { - handleObj = handlers[i]; + const matchedHandlers = []; + const matchedSelectors = {}; + for (let i = 0; i < delegateCount; i++) { + const handleObj = handlers[i]; // Don't conflict with Object.prototype properties (trac-13203) - sel = handleObj.selector + ' '; + const sel = handleObj.selector + ' '; if (matchedSelectors[sel] === undefined) { matchedSelectors[sel] = cur.matches(sel); } @@ -446,10 +375,9 @@ $.event = { } // Add the remaining (directly-bound) handlers - cur = this; if (delegateCount < handlers.length) { handlerQueue.push({ - elem: cur, + elem: this, handlers: handlers.slice(delegateCount), }); } @@ -461,7 +389,6 @@ $.event = { Object.defineProperty($.Event.prototype, name, { enumerable: true, configurable: true, - get: typeof hook === 'function' ? function() { @@ -487,7 +414,7 @@ $.event = { }, fix: function(originalEvent) { - return originalEvent.wrapped ? originalEvent : new $.Event(originalEvent); + return originalEvent.envelope ? originalEvent : new $.Event(originalEvent); }, }; @@ -498,147 +425,6 @@ $.event.special.load = { noBubble: true, }; -$.event.special.click = { - // Utilize native event to ensure correct state for checkable inputs - setup: function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { - // dataPriv.set( el, "click", ... ) - leverageNative(el, 'click', true); - } - - // Return false to allow normal processing in the caller - return false; - }, -}; - -$.event.special.trigger = function(data) { - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if (rcheckableType.test(el.type) && el.click && nodeName(el, 'input')) { - leverageNative(el, 'click'); - } - - // Return non-false to allow normal event-path propagation - return true; -}; - -// For cross-browser consistency, suppress native .click() on links -// Also prevent it if we're currently inside a leveraged native-event stack -$.event.special._default = function(event) { - var target = event.target; - return ( - (rcheckableType.test(target.type) && - target.click && - nodeName(target, 'input') && - dataPriv.get(target, 'click')) || - nodeName(target, 'a') - ); -}; - -$.event.special.beforeunload = { - postDispatch: function(event) { - // Support: Chrome <=73+ - // Chrome doesn't alert on `event.preventDefault()` - // as the standard mandates. - if (event.result !== undefined && event.originalEvent) { - event.originalEvent.returnValue = event.result; - } - }, -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative(el, type, isSetup) { - // Missing `isSetup` indicates a trigger call, which must force setup through $.event.add - if (!isSetup) { - if (dataPriv.get(el, type) === undefined) { - $.event.add(el, type, returnTrue); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set(el, type, false); - $.event.add(el, type, { - namespace: false, - handler: function(event) { - var result, - saved = dataPriv.get(this, type); - - if (event.isTrigger & 1 && this[type]) { - // Interrupt processing of the outer synthetic .trigger()ed event - if (!saved) { - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = Array.from(arguments); - dataPriv.set(this, type, saved); - - // Trigger the native event and capture its result - this[type](); - result = dataPriv.get(this, type); - dataPriv.set(this, type, false); - - if (saved !== result) { - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - - return result; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering - // the native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if (($.event.special[type] || {}).delegateType) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if (saved) { - // ...and capture the result - dataPriv.set( - this, - type, - $.event.trigger(saved[0], saved.slice(1), this) - ); - - // Abort handling of the native event by all $ handlers while allowing - // native handlers on the same element to run. On target, this is achieved - // by stopping immediate propagation just on the $ event. However, - // the native event is re-wrapped by a $ one on each level of the - // propagation so the only way to stop it for $ is to stop it for - // everyone via native `stopPropagation()`. This is not a problem for - // focus/blur which don't bubble, but it does also stop click on checkboxes - // and radios. We accept this limitation. - event.stopPropagation(); - event.isImmediatePropagationStopped = returnTrue; - } - }, - }); -} - -$.removeEvent = function(elem, type, handle) { - // This "if" is needed for plain objects - if (elem.removeEventListener) { - elem.removeEventListener(type, handle); - } -}; - $.Event = function(src, props) { // Allow instantiation without the 'new' keyword if (!(this instanceof $.Event)) { @@ -675,7 +461,7 @@ $.Event = function(src, props) { this.timeStamp = (src && src.timeStamp) || Date.now(); // Mark it as fixed - this.wrapped = true; + this.envelope = true; }; // $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding @@ -685,35 +471,26 @@ $.Event.prototype = { isDefaultPrevented: returnFalse, isPropagationStopped: returnFalse, isImmediatePropagationStopped: returnFalse, - isSimulated: false, - preventDefault: function() { - var e = this.originalEvent; - + const evt = this.originalEvent; this.isDefaultPrevented = returnTrue; - - if (e && !this.isSimulated) { - e.preventDefault(); + if (evt) { + evt.preventDefault(); } }, stopPropagation: function() { - var e = this.originalEvent; - + const evt = this.originalEvent; this.isPropagationStopped = returnTrue; - - if (e && !this.isSimulated) { - e.stopPropagation(); + if (evt) { + evt.stopPropagation(); } }, stopImmediatePropagation: function() { - var e = this.originalEvent; - + const evt = this.originalEvent; this.isImmediatePropagationStopped = returnTrue; - - if (e && !this.isSimulated) { - e.stopImmediatePropagation(); + if (evt) { + evt.stopImmediatePropagation(); } - this.stopPropagation(); }, }; @@ -766,16 +543,15 @@ $.Event.prototype = { delegateType: fix, bindType: fix, handle: function(event) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - + const target = this; + const related = event.relatedTarget; + const handleObj = event.handleObj; + let ret; // For mouseenter/leave call the handler if related is outside the target. // NB: No relatedTarget if the mouse left/entered the browser window if (!related || !target.contains(related)) { event.type = handleObj.origType; - ret = handleObj.handler.apply(this, arguments); + ret = handleObj.handler.apply(target, arguments); event.type = fix; } return ret; @@ -783,6 +559,8 @@ $.Event.prototype = { }; }); +// Methods + $.fn.on = function(types, selector, data, fn) { return on(this, types, selector, data, fn); }; @@ -792,10 +570,9 @@ $.fn.one = function(types, selector, data, fn) { }; $.fn.off = function(types, selector, fn) { - var handleObj, type; if (types && types.preventDefault && types.handleObj) { // ( event ) dispatched $.Event - handleObj = types.handleObj; + const handleObj = types.handleObj; $(types.delegateTarget).off( handleObj.namespace ? handleObj.origType + '.' + handleObj.namespace @@ -807,7 +584,7 @@ $.fn.off = function(types, selector, fn) { } if (typeof types === 'object') { // ( types-object [, selector] ) - for (type in types) { + for (let type in types) { this.off(type, selector, types[type]); } return this; From e0e7c7c2e34290106ff678143ca9ceee00b51396 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Thu, 30 Nov 2023 19:56:53 +0100 Subject: [PATCH 20/58] update --- .../joint-core/src/dia/attributes/index.mjs | 6 ++--- packages/joint-core/src/mvc/Data.mjs | 24 +++++++++---------- packages/joint-core/src/mvc/Dom/events.js | 6 ++--- packages/joint-core/src/mvc/Dom/gestures.js | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index 89574124f..0eef47993 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -75,7 +75,7 @@ function shapeWrapper(shapeConstructor, opt) { var cacheName = 'joint-shape'; var resetOffset = opt && opt.resetOffset; return function(value, refBBox, node) { - var cache = $.data.read(node, cacheName); + var cache = $.data.get(node, cacheName); if (!cache || cache.value !== value) { // only recalculate if value has changed var cachedShape = shapeConstructor(value); @@ -311,7 +311,7 @@ const attributesNS = { }, set: function(text, refBBox, node, attrs) { const cacheName = 'joint-text'; - const cache = $.data.read(node, cacheName); + const cache = $.data.get(node, cacheName); const { lineHeight, annotations, @@ -435,7 +435,7 @@ const attributesNS = { }, set: function(title, refBBox, node) { var cacheName = 'joint-title'; - var cache = $.data.read(node, cacheName); + var cache = $.data.get(node, cacheName); if (cache === undefined || cache !== title) { $.data.set(node, cacheName, title); if (node.tagName === 'title') { diff --git a/packages/joint-core/src/mvc/Data.mjs b/packages/joint-core/src/mvc/Data.mjs index 0cf49ec6f..7fd5e29a3 100644 --- a/packages/joint-core/src/mvc/Data.mjs +++ b/packages/joint-core/src/mvc/Data.mjs @@ -9,25 +9,25 @@ class Data { return key in this.map.get(obj); } - read(obj, key) { - if (!this.has(obj)) return null; - const data = this.map.get(obj); - if (key === undefined) return data; - return data[key]; + create(obj) { + if (!this.has(obj)) this.map.set(obj, Object.create(null)); + return this.get(obj); } get(obj, key) { - if (!this.has(obj)) this.map.set(obj, Object.create(null)); - return this.read(obj, key); + if (!this.has(obj)) return undefined; + const data = this.map.get(obj); + if (key === undefined) return data; + return data[key]; } set(obj, key, value) { - const data = this.get(obj); - if (key === undefined) { - if (value === undefined) return; - Object.assign(data, value); - } else { + if (key === undefined) return; + const data = this.create(obj); + if (typeof key === 'string') { data[key] = value; + } else { + Object.assign(data, key); } } diff --git a/packages/joint-core/src/mvc/Dom/events.js b/packages/joint-core/src/mvc/Dom/events.js index 6b358ff8e..a189b9f85 100644 --- a/packages/joint-core/src/mvc/Dom/events.js +++ b/packages/joint-core/src/mvc/Dom/events.js @@ -82,7 +82,7 @@ $.event = { return; } - const elemData = dataPriv.get(elem); + const elemData = dataPriv.create(elem); // Caller can pass in an object of custom data in lieu of the handler let handleObjIn; @@ -186,7 +186,7 @@ $.event = { // Detach an event or set of events from an element remove: function(elem, types, handler, selector, mappedTypes) { - const elemData = dataPriv.read(elem); + const elemData = dataPriv.get(elem); if (!elemData || !elemData.events) return; const events = elemData.events; @@ -276,7 +276,7 @@ $.event = { const args = Array.from(arguments); args[0] = event; - const eventsData = dataPriv.read(elem, 'events'); + const eventsData = dataPriv.get(elem, 'events'); const handlers = (eventsData && eventsData[event.type]) || []; const special = $.event.special[event.type]; diff --git a/packages/joint-core/src/mvc/Dom/gestures.js b/packages/joint-core/src/mvc/Dom/gestures.js index bc73bc5f4..b1866a3fc 100644 --- a/packages/joint-core/src/mvc/Dom/gestures.js +++ b/packages/joint-core/src/mvc/Dom/gestures.js @@ -11,7 +11,7 @@ if ($.event && !(DoubleTapEventName in $.event.special)) { delegateType: 'touchend', handle: function(event, ...args) { const { handleObj, target } = event; - const targetData = $.data.get(target); + const targetData = $.data.create(target); const now = new Date().getTime(); const delta = 'lastTouch' in targetData ? now - targetData.lastTouch : 0; if (delta < maxDelay && delta > minDelay) { From a213427826f2e8246c7ac4d93d9cea1eace96b4b Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Thu, 30 Nov 2023 21:56:44 +0100 Subject: [PATCH 21/58] types --- packages/joint-core/types/joint.d.ts | 77 ++++++++++++++++++++++- packages/joint-core/types/joint.head.d.ts | 2 - 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/packages/joint-core/types/joint.d.ts b/packages/joint-core/types/joint.d.ts index 30305ff86..8d8f57563 100644 --- a/packages/joint-core/types/joint.d.ts +++ b/packages/joint-core/types/joint.d.ts @@ -8,9 +8,12 @@ export namespace config { var doubleTapInterval: number; } +type NativeEvent = Event; +type JQuery = any; + export namespace dia { - type Event = JQuery.TriggeredEvent; + type Event = mvc.TriggeredEvent; type ObjectHash = { [key: string]: any }; @@ -3348,6 +3351,74 @@ export namespace layout { export namespace mvc { + interface Event { + // Event + bubbles: boolean | undefined; + cancelable: boolean | undefined; + eventPhase: number | undefined; + // UIEvent + detail: number | undefined; + view: Window | undefined; + // MouseEvent + button: number | undefined; + buttons: number | undefined; + clientX: number | undefined; + clientY: number | undefined; + offsetX: number | undefined; + offsetY: number | undefined; + pageX: number | undefined; + pageY: number | undefined; + screenX: number | undefined; + screenY: number | undefined; + /** @deprecated */ + toElement: Element | undefined; + // PointerEvent + pointerId: number | undefined; + pointerType: string | undefined; + // KeyboardEvent + /** @deprecated */ + char: string | undefined; + /** @deprecated */ + charCode: number | undefined; + key: string | undefined; + /** @deprecated */ + keyCode: number | undefined; + // TouchEvent + changedTouches: TouchList | undefined; + targetTouches: TouchList | undefined; + touches: TouchList | undefined; + // MouseEvent, KeyboardEvent + which: number | undefined; + // MouseEvent, KeyboardEvent, TouchEvent + altKey: boolean | undefined; + ctrlKey: boolean | undefined; + metaKey: boolean | undefined; + shiftKey: boolean | undefined; + timeStamp: number; + type: string; + isDefaultPrevented(): boolean; + isImmediatePropagationStopped(): boolean; + isPropagationStopped(): boolean; + preventDefault(): void; + stopImmediatePropagation(): void; + stopPropagation(): void; + } + + interface TriggeredEvent< + TDelegateTarget = any, + TData = any, + TCurrentTarget = any, + TTarget = any + > extends Event { + currentTarget: TCurrentTarget; + delegateTarget: TDelegateTarget; + target: TTarget; + data: TData; + namespace?: string | undefined; + originalEvent?: NativeEvent | undefined; + result?: any; + } + type List<T> = ArrayLike<T>; type ListIterator<T, TResult> = (value: T, index: number, collection: List<T>) => TResult; @@ -3394,7 +3465,7 @@ export namespace mvc { * DOM events (used in the events property of a View) */ interface EventsHash { - [selector: string]: string | { (eventObject: JQuery.TriggeredEvent): void }; + [selector: string]: string | { (eventObject: mvc.TriggeredEvent): void }; } /** @@ -3671,7 +3742,7 @@ export namespace mvc { events?: _Result<EventsHash> | undefined; } - type ViewBaseEventListener = (event: JQuery.Event) => void; + type ViewBaseEventListener = (event: mvc.Event) => void; class ViewBase<TModel extends (Model | undefined) = Model, TElement extends Element = HTMLElement> extends EventsMixin implements Events { /** diff --git a/packages/joint-core/types/joint.head.d.ts b/packages/joint-core/types/joint.head.d.ts index c4e1e4716..9522e9295 100644 --- a/packages/joint-core/types/joint.head.d.ts +++ b/packages/joint-core/types/joint.head.d.ts @@ -9,6 +9,4 @@ // Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped // typings: https://github.com/CaselIT/typings-jointjs -/// <reference types="jquery" /> - export as namespace joint; From 0fe8cae0657a02bd33a7b6aaffb2eb591e9f0a92 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Fri, 1 Dec 2023 14:13:21 +0100 Subject: [PATCH 22/58] update --- packages/joint-core/demo/archive/basic.html | 5 - packages/joint-core/demo/archive/basic.js | 4 +- packages/joint-core/demo/graph.html | 4 - packages/joint-core/demo/graph.js | 2 +- packages/joint-core/demo/interpreter.html | 5 - packages/joint-core/demo/line-draw.html | 5 - packages/joint-core/demo/requirejs/main.js | 8 +- packages/joint-core/demo/ts-demo/index.ts | 9 +- packages/joint-core/demo/ts-demo/package.json | 4 +- packages/joint-core/demo/ts-demo/yarn.lock | 1673 ----------------- packages/joint-core/src/dia/CellView.mjs | 2 +- packages/joint-core/src/dia/LinkView.mjs | 3 - packages/joint-core/src/dia/Paper.mjs | 2 +- packages/joint-core/src/mvc/Dom/Dom.mjs | 2 +- packages/joint-core/src/mvc/Dom/methods.js | 2 + packages/joint-core/src/mvc/View.mjs | 5 +- packages/joint-core/src/util/util.mjs | 24 +- 17 files changed, 28 insertions(+), 1731 deletions(-) delete mode 100644 packages/joint-core/demo/ts-demo/yarn.lock diff --git a/packages/joint-core/demo/archive/basic.html b/packages/joint-core/demo/archive/basic.html index 25e079d0c..e28dc3dca 100644 --- a/packages/joint-core/demo/archive/basic.html +++ b/packages/joint-core/demo/archive/basic.html @@ -45,12 +45,7 @@ <div id="paper"></div> - <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> - <script src="./basic.js"></script> </body> diff --git a/packages/joint-core/demo/archive/basic.js b/packages/joint-core/demo/archive/basic.js index 9aeaae8e3..1ed1d31bd 100644 --- a/packages/joint-core/demo/archive/basic.js +++ b/packages/joint-core/demo/archive/basic.js @@ -3,7 +3,7 @@ var graph = new joint.dia.Graph; var paper = new joint.dia.Paper({ - el: $('#paper'), + el: document.getElementById('paper'), width: 650, height: 400, gridSize: 20, @@ -63,7 +63,7 @@ graph.addCell(rh); var tbl = new joint.shapes.basic.TextBlock({ position: { x: 400, y: 150 }, size: { width: 180, height: 100 }, - content: 'Lorem ipsum dolor sit amet,\n consectetur adipiscing elit. Nulla vel porttitor est.' + content: 'Lorem ipsum dolor <b onclick="alert(\'ahoj\')">test</b> sit amet,\n consectetur adipiscing elit. Nulla vel porttitor est.' }); graph.addCell(tbl); diff --git a/packages/joint-core/demo/graph.html b/packages/joint-core/demo/graph.html index e391b5f60..b2ce8e2ee 100644 --- a/packages/joint-core/demo/graph.html +++ b/packages/joint-core/demo/graph.html @@ -10,12 +10,8 @@ <div id="paper" style="display: inline-block; border: 1px solid gray"></div> <div id="tree-paper" style="display: inline-block; border: 1px solid gray"></div> - <!-- Dependencies: --> - <script src="../node_modules/jquery/dist/jquery.js"></script> - <script src="../node_modules/lodash/lodash.js"></script> <script src="../build/joint.js"></script> - <script src="./graph.js"></script> </body> diff --git a/packages/joint-core/demo/graph.js b/packages/joint-core/demo/graph.js index f8c624d68..ba70affc9 100644 --- a/packages/joint-core/demo/graph.js +++ b/packages/joint-core/demo/graph.js @@ -1,6 +1,6 @@ // Helpers. // -------- - +var $ = joint.mvc.$; var $info = $('<pre>').css({ position: 'fixed', top: 50, diff --git a/packages/joint-core/demo/interpreter.html b/packages/joint-core/demo/interpreter.html index 618b6f288..a91e72c55 100644 --- a/packages/joint-core/demo/interpreter.html +++ b/packages/joint-core/demo/interpreter.html @@ -24,12 +24,7 @@ Click an element to trigger a signal on it. </p> - <!-- Dependencies: --> - <script src="../node_modules/jquery/dist/jquery.js"></script> - <script src="../node_modules/lodash/lodash.js"></script> - <script src="../build/joint.js"></script> - <script src="./interpreter.js"></script> </body> diff --git a/packages/joint-core/demo/line-draw.html b/packages/joint-core/demo/line-draw.html index 33f063d18..332e32cba 100644 --- a/packages/joint-core/demo/line-draw.html +++ b/packages/joint-core/demo/line-draw.html @@ -31,12 +31,7 @@ <h3>How to</h3> and/or <code>ui.FreeTransform</code> control panels around. </p> - <!-- Dependencies: --> - <script src="../node_modules/jquery/dist/jquery.js"></script> - <script src="../node_modules/lodash/lodash.js"></script> - <script src="../build/joint.js"></script> - <script src="./line-draw.js"></script> </body> diff --git a/packages/joint-core/demo/requirejs/main.js b/packages/joint-core/demo/requirejs/main.js index 65fe3b810..96f84d4d6 100644 --- a/packages/joint-core/demo/requirejs/main.js +++ b/packages/joint-core/demo/requirejs/main.js @@ -1,14 +1,10 @@ require.config({ baseUrl: '../../', - paths: { - // Dependencies for Joint: - 'jquery': 'node_modules/jquery/dist/jquery', - 'lodash': 'node_modules/lodash/lodash' - } }); -require(['jquery', 'build/joint'], function($, joint) { +require(['build/joint'], function(joint) { + var $ = joint.mvc.$; var $paper = $('<div/>').appendTo($('#app')); var graph = new joint.dia.Graph; diff --git a/packages/joint-core/demo/ts-demo/index.ts b/packages/joint-core/demo/ts-demo/index.ts index 8f78e1b8b..d5a8b5216 100644 --- a/packages/joint-core/demo/ts-demo/index.ts +++ b/packages/joint-core/demo/ts-demo/index.ts @@ -1,11 +1,16 @@ import * as joint from './vendor/joint'; import './custom'; -import { V, g } from './vendor/joint'; -import * as $ from 'jquery'; +import { V, g, mvc } from './vendor/joint'; import { MyShape } from './shape'; import * as dagre from 'dagre'; import * as graphlib from 'graphlib'; +// @ts-ignore +const $ = mvc.$; +$.fn.text = function(text: string) { + this[0].textContent = text; return this; +}; + const $body = $('body'); // Paper: diff --git a/packages/joint-core/demo/ts-demo/package.json b/packages/joint-core/demo/ts-demo/package.json index 6456e079f..6af30c4f6 100644 --- a/packages/joint-core/demo/ts-demo/package.json +++ b/packages/joint-core/demo/ts-demo/package.json @@ -17,9 +17,7 @@ }, "dependencies": { "dagre": "~0.8.5", - "graphlib": "~2.1.8", - "jquery": "~3.6.4", - "lodash": "~4.17.21" + "graphlib": "~2.1.8" }, "devDependencies": { "@types/dagre": "~0.7.47", diff --git a/packages/joint-core/demo/ts-demo/yarn.lock b/packages/joint-core/demo/ts-demo/yarn.lock deleted file mode 100644 index 7ef11cd3d..000000000 --- a/packages/joint-core/demo/ts-demo/yarn.lock +++ /dev/null @@ -1,1673 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@discoveryjs/json-ext@npm:^0.5.0": - version: 0.5.7 - resolution: "@discoveryjs/json-ext@npm:0.5.7" - checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 - languageName: node - linkType: hard - -"@joint/demo-ts@workspace:.": - version: 0.0.0-use.local - resolution: "@joint/demo-ts@workspace:." - dependencies: - "@types/dagre": ~0.7.47 - "@types/graphlib": ~2.1.8 - "@types/jquery": ~3.5.13 - "@types/lodash": ~4.14.178 - dagre: ~0.8.5 - graphlib: ~2.1.8 - http-server: 0.12.3 - jquery: ~3.6.4 - lodash: ~4.17.21 - ts-loader: 9.4.2 - typescript: 4.9.5 - webpack: 5.61.0 - webpack-cli: 4.10.0 - languageName: unknown - linkType: soft - -"@jridgewell/gen-mapping@npm:^0.3.0": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.5 - resolution: "@jridgewell/source-map@npm:0.3.5" - dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 - languageName: node - linkType: hard - -"@types/dagre@npm:~0.7.47": - version: 0.7.52 - resolution: "@types/dagre@npm:0.7.52" - checksum: 89e046e73f9f83855fcecc0f79838e0e3e0e42d88b6cc42bb573249364a606909ff7ded5b6a0377246eb0648047b330b5003c8dd975358de3135635ddae0f589 - languageName: node - linkType: hard - -"@types/eslint-scope@npm:^3.7.0": - version: 3.7.7 - resolution: "@types/eslint-scope@npm:3.7.7" - dependencies: - "@types/eslint": "*" - "@types/estree": "*" - checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e - languageName: node - linkType: hard - -"@types/eslint@npm:*": - version: 8.44.7 - resolution: "@types/eslint@npm:8.44.7" - dependencies: - "@types/estree": "*" - "@types/json-schema": "*" - checksum: 72a52f74477fbe7cc95ad290b491f51f0bc547cb7ea3672c68da3ffd3fb21ba86145bc36823a37d0a186caedeaee15b2d2a6b4c02c6c55819ff746053bd28310 - languageName: node - linkType: hard - -"@types/estree@npm:*": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a - languageName: node - linkType: hard - -"@types/estree@npm:^0.0.50": - version: 0.0.50 - resolution: "@types/estree@npm:0.0.50" - checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 - languageName: node - linkType: hard - -"@types/graphlib@npm:~2.1.8": - version: 2.1.11 - resolution: "@types/graphlib@npm:2.1.11" - checksum: 909b5db5066a0532210c22922a2c3c619208f614c9a472b631f312a0e6a3fc016e026be5cc8802d71bd72869b3e905d2c0aa955a07400127877fb1f3de98998a - languageName: node - linkType: hard - -"@types/jquery@npm:~3.5.13": - version: 3.5.27 - resolution: "@types/jquery@npm:3.5.27" - dependencies: - "@types/sizzle": "*" - checksum: a217d3dbf134134e1b1e10bb0a197523eb362d8e2aa2ae2ad909ae8db0d625f5784203a0794a498b7a09e495ae7822512b3112440cc96b8374eda4afc33b0d6e - languageName: node - linkType: hard - -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 - languageName: node - linkType: hard - -"@types/lodash@npm:~4.14.178": - version: 4.14.201 - resolution: "@types/lodash@npm:4.14.201" - checksum: 484be655298e9b2dc2d218ea934071b2ea31e4a531c561dd220dbda65237e8d08c20dc2d457ac24f29be7fe167415bf7bb9360ea0d80bdb8b0f0ec8d8db92fae - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 20.9.0 - resolution: "@types/node@npm:20.9.0" - dependencies: - undici-types: ~5.26.4 - checksum: bfd927da6bff8a32051fa44bb47ca32a56d2c8bc8ba0170770f181cc1fa3c0b05863c9b930f0ba8604a48d5eb0d319166601709ca53bf2deae0025d8b6c6b8a3 - languageName: node - linkType: hard - -"@types/sizzle@npm:*": - version: 2.3.6 - resolution: "@types/sizzle@npm:2.3.6" - checksum: 1573d6c86fdf0d7d3d2759b0db65e374b99d773b57781443a6400ce3d0a3bf6a3be393fb9aee5076eff8399c14b7b4d3f51391d1d5cb6a3dcbdccee06a5f6e3e - languageName: node - linkType: hard - -"@webassemblyjs/ast@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ast@npm:1.11.1" - dependencies: - "@webassemblyjs/helper-numbers": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 - languageName: node - linkType: hard - -"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" - checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 - languageName: node - linkType: hard - -"@webassemblyjs/helper-api-error@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" - checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 - languageName: node - linkType: hard - -"@webassemblyjs/helper-buffer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" - checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce - languageName: node - linkType: hard - -"@webassemblyjs/helper-numbers@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" - dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@xtuc/long": 4.2.2 - checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" - checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 - languageName: node - linkType: hard - -"@webassemblyjs/helper-wasm-section@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf - languageName: node - linkType: hard - -"@webassemblyjs/ieee754@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/ieee754@npm:1.11.1" - dependencies: - "@xtuc/ieee754": ^1.2.0 - checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec - languageName: node - linkType: hard - -"@webassemblyjs/leb128@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/leb128@npm:1.11.1" - dependencies: - "@xtuc/long": 4.2.2 - checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a - languageName: node - linkType: hard - -"@webassemblyjs/utf8@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/utf8@npm:1.11.1" - checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b - languageName: node - linkType: hard - -"@webassemblyjs/wasm-edit@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/helper-wasm-section": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-opt": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - "@webassemblyjs/wast-printer": 1.11.1 - checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 - languageName: node - linkType: hard - -"@webassemblyjs/wasm-gen@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b - languageName: node - linkType: hard - -"@webassemblyjs/wasm-opt@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-buffer": 1.11.1 - "@webassemblyjs/wasm-gen": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db - languageName: node - linkType: hard - -"@webassemblyjs/wasm-parser@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/helper-api-error": 1.11.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.1 - "@webassemblyjs/ieee754": 1.11.1 - "@webassemblyjs/leb128": 1.11.1 - "@webassemblyjs/utf8": 1.11.1 - checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 - languageName: node - linkType: hard - -"@webassemblyjs/wast-printer@npm:1.11.1": - version: 1.11.1 - resolution: "@webassemblyjs/wast-printer@npm:1.11.1" - dependencies: - "@webassemblyjs/ast": 1.11.1 - "@xtuc/long": 4.2.2 - checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 - languageName: node - linkType: hard - -"@webpack-cli/configtest@npm:^1.2.0": - version: 1.2.0 - resolution: "@webpack-cli/configtest@npm:1.2.0" - peerDependencies: - webpack: 4.x.x || 5.x.x - webpack-cli: 4.x.x - checksum: a2726cd9ec601d2b57e5fc15e0ebf5200a8892065e735911269ac2038e62be4bfc176ea1f88c2c46ff09b4d05d4c10ae045e87b3679372483d47da625a327e28 - languageName: node - linkType: hard - -"@webpack-cli/info@npm:^1.5.0": - version: 1.5.0 - resolution: "@webpack-cli/info@npm:1.5.0" - dependencies: - envinfo: ^7.7.3 - peerDependencies: - webpack-cli: 4.x.x - checksum: 7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 - languageName: node - linkType: hard - -"@webpack-cli/serve@npm:^1.7.0": - version: 1.7.0 - resolution: "@webpack-cli/serve@npm:1.7.0" - peerDependencies: - webpack-cli: 4.x.x - peerDependenciesMeta: - webpack-dev-server: - optional: true - checksum: d475e8effa23eb7ff9a48b14d4de425989fd82f906ce71c210921cc3852327c22873be00c35e181a25a6bd03d424ae2b83e7f3b3f410ac7ee31b128ab4ac7713 - languageName: node - linkType: hard - -"@xtuc/ieee754@npm:^1.2.0": - version: 1.2.0 - resolution: "@xtuc/ieee754@npm:1.2.0" - checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a - languageName: node - linkType: hard - -"@xtuc/long@npm:4.2.2": - version: 4.2.2 - resolution: "@xtuc/long@npm:4.2.2" - checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec - languageName: node - linkType: hard - -"acorn-import-assertions@npm:^1.7.6": - version: 1.9.0 - resolution: "acorn-import-assertions@npm:1.9.0" - peerDependencies: - acorn: ^8 - checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c - languageName: node - linkType: hard - -"acorn@npm:^8.4.1, acorn@npm:^8.8.2": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" - bin: - acorn: bin/acorn - checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7 - languageName: node - linkType: hard - -"ajv-keywords@npm:^3.5.2": - version: 3.5.2 - resolution: "ajv-keywords@npm:3.5.2" - peerDependencies: - ajv: ^6.9.1 - checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 - languageName: node - linkType: hard - -"ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"async@npm:^2.6.4": - version: 2.6.4 - resolution: "async@npm:2.6.4" - dependencies: - lodash: ^4.17.14 - checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 - languageName: node - linkType: hard - -"basic-auth@npm:^1.0.3": - version: 1.1.0 - resolution: "basic-auth@npm:1.1.0" - checksum: a248a4b125e91a188748011ce7583c8d40f55ce222196190e76ae8c3280fbdf6914f509d66123084e549f41f5b36c6fe09e5e8ec72951f5c32b50e9aa7f08b64 - languageName: node - linkType: hard - -"braces@npm:^3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"browserslist@npm:^4.14.5": - version: 4.22.1 - resolution: "browserslist@npm:4.22.1" - dependencies: - caniuse-lite: ^1.0.30001541 - electron-to-chromium: ^1.4.535 - node-releases: ^2.0.13 - update-browserslist-db: ^1.0.13 - bin: - browserslist: cli.js - checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"call-bind@npm:^1.0.0": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" - dependencies: - function-bind: ^1.1.2 - get-intrinsic: ^1.2.1 - set-function-length: ^1.1.1 - checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001561 - resolution: "caniuse-lite@npm:1.0.30001561" - checksum: 949829fe037e23346595614e01d362130245920503a12677f2506ce68e1240360113d6383febed41e8aa38cd0f5fd9c69c21b0af65a71c0246d560db489f1373 - languageName: node - linkType: hard - -"chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chrome-trace-event@npm:^1.0.2": - version: 1.0.3 - resolution: "chrome-trace-event@npm:1.0.3" - checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 - languageName: node - linkType: hard - -"clone-deep@npm:^4.0.1": - version: 4.0.1 - resolution: "clone-deep@npm:4.0.1" - dependencies: - is-plain-object: ^2.0.4 - kind-of: ^6.0.2 - shallow-clone: ^3.0.0 - checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"colorette@npm:^2.0.14": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d - languageName: node - linkType: hard - -"colors@npm:^1.4.0": - version: 1.4.0 - resolution: "colors@npm:1.4.0" - checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"commander@npm:^7.0.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc - languageName: node - linkType: hard - -"corser@npm:^2.0.1": - version: 2.0.1 - resolution: "corser@npm:2.0.1" - checksum: 9ff6944eda760c8c3118747a636afc3ede53b41e7b9960513a15b88032209a728e630ae4b41e20a941e34da129fe9094d1f5d95123ef64ac2e16cdad8dce9c87 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"dagre@npm:~0.8.5": - version: 0.8.5 - resolution: "dagre@npm:0.8.5" - dependencies: - graphlib: ^2.1.8 - lodash: ^4.17.15 - checksum: b9fabd425466d7b662381c2e457b1adda996bc4169aa60121d4de50250d83a6bb4b77d559e2f887c9c564caea781c2a377fd4de2a76c15f8f04ec3d086ca95f9 - languageName: node - linkType: hard - -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - -"define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" - dependencies: - get-intrinsic: ^1.2.1 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d - languageName: node - linkType: hard - -"ecstatic@npm:^3.3.2": - version: 3.3.2 - resolution: "ecstatic@npm:3.3.2" - dependencies: - he: ^1.1.1 - mime: ^1.6.0 - minimist: ^1.1.0 - url-join: ^2.0.5 - bin: - ecstatic: ./lib/ecstatic.js - checksum: 61787fe020a3344b3750fa95fa38f8e5810d6b8cb2626f084a7283c11dde641d204ef19a5e29926d6f0189b2d14780bb6910493b49f9f1e2a0aa39297cc6b1b9 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.4.535": - version: 1.4.578 - resolution: "electron-to-chromium@npm:1.4.578" - checksum: 9c5e6843e6975adfedb7505b817f07bc91f4f4d3744616406983ed9327b722f045b72d98aa2146b279ba0eecec60ca065b316771b2de7ac6b7a42edcb3e9bb21 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.8.3": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" - dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 - languageName: node - linkType: hard - -"envinfo@npm:^7.7.3": - version: 7.11.0 - resolution: "envinfo@npm:7.11.0" - bin: - envinfo: dist/cli.js - checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef - languageName: node - linkType: hard - -"es-module-lexer@npm:^0.9.0": - version: 0.9.3 - resolution: "es-module-lexer@npm:0.9.3" - checksum: 84bbab23c396281db2c906c766af58b1ae2a1a2599844a504df10b9e8dc77ec800b3211fdaa133ff700f5703d791198807bba25d9667392d27a5e9feda344da8 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"eslint-scope@npm:5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"eventemitter3@npm:^4.0.0": - version: 4.0.7 - resolution: "eventemitter3@npm:4.0.7" - checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 - languageName: node - linkType: hard - -"events@npm:^3.2.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fastest-levenshtein@npm:^1.0.12": - version: 1.0.16 - resolution: "fastest-levenshtein@npm:1.0.16" - checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 - languageName: node - linkType: hard - -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - -"find-up@npm:^4.0.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d - languageName: node - linkType: hard - -"follow-redirects@npm:^1.0.0": - version: 1.15.3 - resolution: "follow-redirects@npm:1.15.3" - peerDependenciesMeta: - debug: - optional: true - checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" - dependencies: - function-bind: ^1.1.2 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 - languageName: node - linkType: hard - -"glob-to-regexp@npm:^0.4.1": - version: 0.4.1 - resolution: "glob-to-regexp@npm:0.4.1" - checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphlib@npm:^2.1.8, graphlib@npm:~2.1.8": - version: 2.1.8 - resolution: "graphlib@npm:2.1.8" - dependencies: - lodash: ^4.17.15 - checksum: 1e0db4dea1c8187d59103d5582ecf32008845ebe2103959a51d22cb6dae495e81fb9263e22c922bca3aaecb56064a45cd53424e15a4626cfb5a0c52d0aff61a8 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0": - version: 1.0.1 - resolution: "has-property-descriptors@npm:1.0.1" - dependencies: - get-intrinsic: ^1.2.2 - checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" - dependencies: - function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 - languageName: node - linkType: hard - -"he@npm:^1.1.1": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 - languageName: node - linkType: hard - -"http-proxy@npm:^1.18.0": - version: 1.18.1 - resolution: "http-proxy@npm:1.18.1" - dependencies: - eventemitter3: ^4.0.0 - follow-redirects: ^1.0.0 - requires-port: ^1.0.0 - checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 - languageName: node - linkType: hard - -"http-server@npm:0.12.3": - version: 0.12.3 - resolution: "http-server@npm:0.12.3" - dependencies: - basic-auth: ^1.0.3 - colors: ^1.4.0 - corser: ^2.0.1 - ecstatic: ^3.3.2 - http-proxy: ^1.18.0 - minimist: ^1.2.5 - opener: ^1.5.1 - portfinder: ^1.0.25 - secure-compare: 3.0.1 - union: ~0.5.0 - bin: - hs: bin/http-server - http-server: bin/http-server - checksum: fdd8652638937940ce3e2c2a36f2b92cee57967aaba40552f0d422ba01cbb86c2645aabc73ba89035651ae0e5a02df28f81adce93cf3188236ced7d426b0b036 - languageName: node - linkType: hard - -"import-local@npm:^3.0.2": - version: 3.1.0 - resolution: "import-local@npm:3.1.0" - dependencies: - pkg-dir: ^4.2.0 - resolve-cwd: ^3.0.0 - bin: - import-local-fixture: fixtures/cli.js - checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd - languageName: node - linkType: hard - -"interpret@npm:^2.2.0": - version: 2.2.0 - resolution: "interpret@npm:2.2.0" - checksum: f51efef7cb8d02da16408ffa3504cd6053014c5aeb7bb8c223727e053e4235bf565e45d67028b0c8740d917c603807aa3c27d7bd2f21bf20b6417e2bb3e5fd6e - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" - dependencies: - hasown: ^2.0.0 - checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a - languageName: node - linkType: hard - -"is-plain-object@npm:^2.0.4": - version: 2.0.4 - resolution: "is-plain-object@npm:2.0.4" - dependencies: - isobject: ^3.0.1 - checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"isobject@npm:^3.0.1": - version: 3.0.1 - resolution: "isobject@npm:3.0.1" - checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 - languageName: node - linkType: hard - -"jest-worker@npm:^27.4.5": - version: 27.5.1 - resolution: "jest-worker@npm:27.5.1" - dependencies: - "@types/node": "*" - merge-stream: ^2.0.0 - supports-color: ^8.0.0 - checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 - languageName: node - linkType: hard - -"jquery@npm:~3.6.4": - version: 3.6.4 - resolution: "jquery@npm:3.6.4" - checksum: 8354f7bd0a0424aa714ee1b6b1ef74b410f834eb5c8501682289b358bc151f11677f11188b544f3bb49309d6ec4d15d1a5de175661250c206b06185a252f706f - languageName: node - linkType: hard - -"json-parse-better-errors@npm:^1.0.2": - version: 1.0.2 - resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"kind-of@npm:^6.0.2": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b - languageName: node - linkType: hard - -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"lodash@npm:^4.17.14, lodash@npm:^4.17.15, lodash@npm:~4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.0": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f - languageName: node - linkType: hard - -"mime-types@npm:^2.1.27": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 - languageName: node - linkType: hard - -"mime@npm:^1.6.0": - version: 1.6.0 - resolution: "mime@npm:1.6.0" - bin: - mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 - languageName: node - linkType: hard - -"minimist@npm:^1.1.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 - languageName: node - linkType: hard - -"mkdirp@npm:^0.5.6": - version: 0.5.6 - resolution: "mkdirp@npm:0.5.6" - dependencies: - minimist: ^1.2.6 - bin: - mkdirp: bin/cmd.js - checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 - languageName: node - linkType: hard - -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"neo-async@npm:^2.6.2": - version: 2.6.2 - resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.13": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 - languageName: node - linkType: hard - -"object-inspect@npm:^1.9.0": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f - languageName: node - linkType: hard - -"opener@npm:^1.5.1": - version: 1.5.2 - resolution: "opener@npm:1.5.2" - bin: - opener: bin/opener-bin.js - checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf - languageName: node - linkType: hard - -"pkg-dir@npm:^4.2.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: ^4.0.0 - checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"portfinder@npm:^1.0.25": - version: 1.0.32 - resolution: "portfinder@npm:1.0.32" - dependencies: - async: ^2.6.4 - debug: ^3.2.7 - mkdirp: ^0.5.6 - checksum: 116b4aed1b9e16f6d5503823d966d9ffd41b1c2339e27f54c06cd2f3015a9d8ef53e2a53b57bc0a25af0885977b692007353aa28f9a0a98a44335cb50487240d - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 - languageName: node - linkType: hard - -"qs@npm:^6.4.0": - version: 6.11.2 - resolution: "qs@npm:6.11.2" - dependencies: - side-channel: ^1.0.4 - checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 - languageName: node - linkType: hard - -"rechoir@npm:^0.7.0": - version: 0.7.1 - resolution: "rechoir@npm:0.7.1" - dependencies: - resolve: ^1.9.0 - checksum: 2a04aab4e28c05fcd6ee6768446bc8b859d8f108e71fc7f5bcbc5ef25e53330ce2c11d10f82a24591a2df4c49c4f61feabe1fd11f844c66feedd4cd7bb61146a - languageName: node - linkType: hard - -"requires-port@npm:^1.0.0": - version: 1.0.0 - resolution: "requires-port@npm:1.0.0" - checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff - languageName: node - linkType: hard - -"resolve-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "resolve-cwd@npm:3.0.0" - dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 - languageName: node - linkType: hard - -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf - languageName: node - linkType: hard - -"resolve@npm:^1.9.0": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.9.0#~builtin<compat/resolve>": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin<compat/resolve>::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 - languageName: node - linkType: hard - -"safe-buffer@npm:^5.1.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": - version: 3.3.0 - resolution: "schema-utils@npm:3.3.0" - dependencies: - "@types/json-schema": ^7.0.8 - ajv: ^6.12.5 - ajv-keywords: ^3.5.2 - checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 - languageName: node - linkType: hard - -"secure-compare@npm:3.0.1": - version: 3.0.1 - resolution: "secure-compare@npm:3.0.1" - checksum: 0a8d8d3e54d5772d2cf1c02325f01fc7366d0bd33f964a08a84fe3ee5f34d46435a6ae729c1d239c750e160ef9b58c764d3efb945a1d07faf47978a8e4161594 - languageName: node - linkType: hard - -"semver@npm:^7.3.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.1": - version: 6.0.1 - resolution: "serialize-javascript@npm:6.0.1" - dependencies: - randombytes: ^2.1.0 - checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f - languageName: node - linkType: hard - -"set-function-length@npm:^1.1.1": - version: 1.1.1 - resolution: "set-function-length@npm:1.1.1" - dependencies: - define-data-property: ^1.1.1 - get-intrinsic: ^1.2.1 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 - languageName: node - linkType: hard - -"shallow-clone@npm:^3.0.0": - version: 3.0.1 - resolution: "shallow-clone@npm:3.0.1" - dependencies: - kind-of: ^6.0.2 - checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"supports-color@npm:^8.0.0": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: ^4.0.0 - checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae - languageName: node - linkType: hard - -"tapable@npm:^2.1.1, tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.1.3": - version: 5.3.9 - resolution: "terser-webpack-plugin@npm:5.3.9" - dependencies: - "@jridgewell/trace-mapping": ^0.3.17 - jest-worker: ^27.4.5 - schema-utils: ^3.1.1 - serialize-javascript: ^6.0.1 - terser: ^5.16.8 - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f - languageName: node - linkType: hard - -"terser@npm:^5.16.8": - version: 5.24.0 - resolution: "terser@npm:5.24.0" - dependencies: - "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 - commander: ^2.20.0 - source-map-support: ~0.5.20 - bin: - terser: bin/terser - checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed - languageName: node - linkType: hard - -"ts-loader@npm:9.4.2": - version: 9.4.2 - resolution: "ts-loader@npm:9.4.2" - dependencies: - chalk: ^4.1.0 - enhanced-resolve: ^5.0.0 - micromatch: ^4.0.0 - semver: ^7.3.4 - peerDependencies: - typescript: "*" - webpack: ^5.0.0 - checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 - languageName: node - linkType: hard - -"typescript@npm:4.9.5": - version: 4.9.5 - resolution: "typescript@npm:4.9.5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db - languageName: node - linkType: hard - -"typescript@patch:typescript@4.9.5#~builtin<compat/typescript>": - version: 4.9.5 - resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin<compat/typescript>::version=4.9.5&hash=23ec76" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d - languageName: node - linkType: hard - -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 - languageName: node - linkType: hard - -"union@npm:~0.5.0": - version: 0.5.0 - resolution: "union@npm:0.5.0" - dependencies: - qs: ^6.4.0 - checksum: 021530d02363fb7470ce45d4cb06ae28a97d5a245666e6d0fca6bab0673bea8c7988e7d2f8046acfbab120908cedcb099ca216b357d4483bcd96518b39101be0 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" - dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"url-join@npm:^2.0.5": - version: 2.0.5 - resolution: "url-join@npm:2.0.5" - checksum: 5c935cc99e5bfd7150302420db4eff9830d117be5ea3edf4b2d9e30a51484bc422e94fd9f2fba78192a75cebe2663735af716e07ec094b9a5f24c75046644c73 - languageName: node - linkType: hard - -"watchpack@npm:^2.2.0": - version: 2.4.0 - resolution: "watchpack@npm:2.4.0" - dependencies: - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.1.2 - checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 - languageName: node - linkType: hard - -"webpack-cli@npm:4.10.0": - version: 4.10.0 - resolution: "webpack-cli@npm:4.10.0" - dependencies: - "@discoveryjs/json-ext": ^0.5.0 - "@webpack-cli/configtest": ^1.2.0 - "@webpack-cli/info": ^1.5.0 - "@webpack-cli/serve": ^1.7.0 - colorette: ^2.0.14 - commander: ^7.0.0 - cross-spawn: ^7.0.3 - fastest-levenshtein: ^1.0.12 - import-local: ^3.0.2 - interpret: ^2.2.0 - rechoir: ^0.7.0 - webpack-merge: ^5.7.3 - peerDependencies: - webpack: 4.x.x || 5.x.x - peerDependenciesMeta: - "@webpack-cli/generators": - optional: true - "@webpack-cli/migrate": - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - bin: - webpack-cli: bin/cli.js - checksum: 2ff5355ac348e6b40f2630a203b981728834dca96d6d621be96249764b2d0fc01dd54edfcc37f02214d02935de2cf0eefd6ce689d970d154ef493f01ba922390 - languageName: node - linkType: hard - -"webpack-merge@npm:^5.7.3": - version: 5.10.0 - resolution: "webpack-merge@npm:5.10.0" - dependencies: - clone-deep: ^4.0.1 - flat: ^5.0.2 - wildcard: ^2.0.0 - checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f - languageName: node - linkType: hard - -"webpack-sources@npm:^3.2.0": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 - languageName: node - linkType: hard - -"webpack@npm:5.61.0": - version: 5.61.0 - resolution: "webpack@npm:5.61.0" - dependencies: - "@types/eslint-scope": ^3.7.0 - "@types/estree": ^0.0.50 - "@webassemblyjs/ast": 1.11.1 - "@webassemblyjs/wasm-edit": 1.11.1 - "@webassemblyjs/wasm-parser": 1.11.1 - acorn: ^8.4.1 - acorn-import-assertions: ^1.7.6 - browserslist: ^4.14.5 - chrome-trace-event: ^1.0.2 - enhanced-resolve: ^5.8.3 - es-module-lexer: ^0.9.0 - eslint-scope: 5.1.1 - events: ^3.2.0 - glob-to-regexp: ^0.4.1 - graceful-fs: ^4.2.4 - json-parse-better-errors: ^1.0.2 - loader-runner: ^4.2.0 - mime-types: ^2.1.27 - neo-async: ^2.6.2 - schema-utils: ^3.1.0 - tapable: ^2.1.1 - terser-webpack-plugin: ^5.1.3 - watchpack: ^2.2.0 - webpack-sources: ^3.2.0 - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 442958ec48645c9e612a2628a815c411cbc18289b5cc7b3d1b5d0f8e5b41606ed225decf4f3684edc365e6390867bded244d20387c70fbb630c0ac08443c34c8 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wildcard@npm:^2.0.0": - version: 2.0.1 - resolution: "wildcard@npm:2.0.1" - checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index a33e5a4b8..85943ddd9 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -529,7 +529,7 @@ export const CellView = View.extend({ if (node instanceof SVGElement) { V(node).attr(attrs); } else { - Object.keys(attrs).forEach(key => node.setAttribute(key, attrs[key])); + $(node).attr(attrs); } } }, diff --git a/packages/joint-core/src/dia/LinkView.mjs b/packages/joint-core/src/dia/LinkView.mjs index de6ac14eb..e1ce9f9e0 100644 --- a/packages/joint-core/src/dia/LinkView.mjs +++ b/packages/joint-core/src/dia/LinkView.mjs @@ -1133,9 +1133,6 @@ export const LinkView = CellView.extend({ if (!this._V.markerArrowheads) return this; - // getting bbox of an element with `display="none"` in IE9 ends up with access violation - // if ($.css(this._V.markerArrowheads.node, 'display') === 'none') return this; - var sx = this.getConnectionLength() < this.options.shortLinkLength ? .5 : 1; this._V.sourceArrowhead.scale(sx); this._V.targetArrowhead.scale(sx); diff --git a/packages/joint-core/src/dia/Paper.mjs b/packages/joint-core/src/dia/Paper.mjs index 6bc87edf2..0144467d6 100644 --- a/packages/joint-core/src/dia/Paper.mjs +++ b/packages/joint-core/src/dia/Paper.mjs @@ -2598,7 +2598,7 @@ export const Paper = View.extend({ return false; } - if (this.svg === target || this.el === target || $.contains(this.svg, target)) { + if (this.el === target || this.svg.contains(target)) { return false; } diff --git a/packages/joint-core/src/mvc/Dom/Dom.mjs b/packages/joint-core/src/mvc/Dom/Dom.mjs index bffb462da..909a913f2 100644 --- a/packages/joint-core/src/mvc/Dom/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom/Dom.mjs @@ -59,7 +59,7 @@ $.parseHTML = function(string) { for (let i = 0; i < scripts.length; i++) { scripts[i].remove(); } - return Array.from(context.body.children); + return Array.from(context.body.childNodes); }; if (typeof Symbol === 'function') { diff --git a/packages/joint-core/src/mvc/Dom/methods.js b/packages/joint-core/src/mvc/Dom/methods.js index 9beac3bc5..c1d3d796c 100644 --- a/packages/joint-core/src/mvc/Dom/methods.js +++ b/packages/joint-core/src/mvc/Dom/methods.js @@ -28,6 +28,8 @@ $.fn.empty = function() { $.fn.html = function(html) { const [el] = this; + if (!el) return null; + if (!html) return el.innerHTML; cleanNodesData(dataPriv, el.getElementsByTagName('*')); if (typeof string === 'string') { el.innerHTML = html; diff --git a/packages/joint-core/src/mvc/View.mjs b/packages/joint-core/src/mvc/View.mjs index ff32fef7f..196461e1b 100644 --- a/packages/joint-core/src/mvc/View.mjs +++ b/packages/joint-core/src/mvc/View.mjs @@ -107,10 +107,7 @@ export const View = ViewBase.extend({ }, _setStyle: function(style) { - if (!style) return; - for (var name in style) { - this.el.style[name] = style[name]; - } + this.$el.css(style); }, _createElement: function(tagName) { diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index f635177a2..b278c6860 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -104,8 +104,7 @@ export const parseDOMJSON = function(json, namespace) { node = document.createElementNS(ns, tagName); const svg = (ns === svgNamespace); - const wrapper = (svg) ? V : $; - const wrapperNode = wrapper(node); + const wrapperNode = (svg) ? V(node) : $(node); // Attributes const attributes = nodeDef.attributes; if (attributes) wrapperNode.attr(attributes); @@ -864,26 +863,21 @@ export const breakText = function(text, size, styles = {}, opt = {}) { export const sanitizeHTML = function(html) { // Ignores tags that are invalid inside a <div> tag (e.g. <body>, <head>) - var $output = $($.parseHTML('<div>' + html + '</div>')); - - $output.find('*').each(function() { // for all nodes - var currentNode = this; - - $.each(currentNode.attributes, function() { // for all attributes in each node - var currentAttribute = this; - - var attrName = currentAttribute.name; - var attrValue = currentAttribute.value; + const [outputEl] = $.parseHTML('<div>' + html + '</div>'); + Array.from(outputEl.getElementsByTagName('*')).forEach(function(node) { // for all nodes + const names = node.getAttributeNames(); + names.forEach(function(name) { + const value = node.getAttribute(name); // Remove attribute names that start with "on" (e.g. onload, onerror...). // Remove attribute values that start with "javascript:" pseudo protocol (e.g. `href="javascript:alert(1)"`). - if (attrName.startsWith('on') || attrValue.startsWith('javascript:') || attrValue.startsWith('data:') || attrValue.startsWith('vbscript:')) { - $(currentNode).removeAttr(attrName); + if (name.startsWith('on') || value.startsWith('javascript:' || value.startsWith('data:') || value.startsWith('vbscript:'))) { + node.removeAttribute(name); } }); }); - return $output[0].innerHTML; + return outputEl.innerHTML; }; // Download `blob` as file with `fileName`. From 9b2581b061df092e42b5acb3e04bff5d2078be25 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Fri, 1 Dec 2023 14:14:05 +0100 Subject: [PATCH 23/58] update --- packages/joint-core/demo/archive/basic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/joint-core/demo/archive/basic.js b/packages/joint-core/demo/archive/basic.js index 1ed1d31bd..c2ebe5275 100644 --- a/packages/joint-core/demo/archive/basic.js +++ b/packages/joint-core/demo/archive/basic.js @@ -63,7 +63,7 @@ graph.addCell(rh); var tbl = new joint.shapes.basic.TextBlock({ position: { x: 400, y: 150 }, size: { width: 180, height: 100 }, - content: 'Lorem ipsum dolor <b onclick="alert(\'ahoj\')">test</b> sit amet,\n consectetur adipiscing elit. Nulla vel porttitor est.' + content: 'Lorem ipsum dolor sit amet,\n consectetur adipiscing elit. Nulla vel porttitor est.' }); graph.addCell(tbl); From 1f95d06d881cebe3b57183d35769b740dcb5a0d1 Mon Sep 17 00:00:00 2001 From: Roman Bruckner <bruckner.roman@gmail.com> Date: Fri, 1 Dec 2023 19:45:14 +0100 Subject: [PATCH 24/58] update demos --- .../joint-core/demo/archive/clipping.html | 4 - packages/joint-core/demo/archive/links.html | 4 - packages/joint-core/demo/archive/links.js | 1 + packages/joint-core/demo/bandwidth/index.html | 3 - packages/joint-core/demo/bus/index.html | 4 - packages/joint-core/demo/chess/index.html | 3 - packages/joint-core/demo/container/index.html | 1 - packages/joint-core/demo/curves/index.html | 2 - packages/joint-core/demo/devs/index.html | 3 - .../demo/dynamic-font-size/index.html | 6 +- .../demo/embedding/front-and-back.html | 4 - .../demo/embedding/nested-clone.html | 4 - .../joint-core/demo/embedding/nested-clone.js | 10 +- .../joint-core/demo/embedding/nested.html | 4 - .../joint-core/demo/embedding/nested2.html | 4 - packages/joint-core/demo/embedding/nested2.js | 10 +- packages/joint-core/demo/erd/index.html | 3 - packages/joint-core/demo/expand/index.html | 4 - packages/joint-core/demo/expand/index.js | 1 + packages/joint-core/demo/flowchart/index.html | 2 - packages/joint-core/demo/fsa/index.html | 4 - packages/joint-core/demo/fta/index.html | 2 - packages/joint-core/demo/html/index.html | 4 - packages/joint-core/demo/hull/index.html | 3 - packages/joint-core/demo/icons/index.html | 3 - .../demo/links/custom-connector.html | 4 - .../joint-core/demo/links/custom-links.html | 3 - .../joint-core/demo/links/custom-router.html | 4 - .../demo/links/jump-over-connector.html | 4 - .../demo/links/links-sticky-points.html | 4 - packages/joint-core/demo/links/pipes.html | 4 - .../demo/links/router-orthogonal.html | 4 - .../demo/links/src/custom-connector.js | 2 +- .../demo/links/src/custom-router.js | 2 +- packages/joint-core/demo/logic/index.html | 3 - packages/joint-core/demo/marey/index.html | 2 - packages/joint-core/demo/orbit/index.html | 2 - packages/joint-core/demo/org/index.html | 3 - packages/joint-core/demo/org/src/org.js | 2 +- packages/joint-core/demo/paper/index.html | 3 +- .../joint-core/demo/paper/responsive.html | 4 - .../joint-core/demo/performance/async.html | 2 - .../joint-core/demo/performance/conveyor.html | 2 - .../joint-core/demo/performance/shapes.html | 2 - .../joint-core/demo/petri-nets/index.html | 3 - packages/joint-core/demo/ports/dynamic.html | 4 - packages/joint-core/demo/ports/ports.html | 6 +- packages/joint-core/demo/ports/ports2.html | 4 - packages/joint-core/demo/puzzle/index.html | 2 - .../demo/right-angle-playground/index.html | 3 - packages/joint-core/demo/roi/index.html | 3 - packages/joint-core/demo/rough/index.html | 4 - packages/joint-core/demo/rough/yarn.lock | 30 ---- packages/joint-core/demo/routing/index.html | 3 - .../joint-core/demo/routing/src/routing.js | 2 + packages/joint-core/demo/sequence/index.html | 6 - packages/joint-core/demo/shapes/3d.html | 4 - packages/joint-core/demo/shapes/fills.html | 3 - packages/joint-core/demo/shapes/filters.html | 4 - .../demo/shapes/foreign-object.html | 3 - .../joint-core/demo/shapes/hyperlinks.html | 4 - packages/joint-core/demo/shapes/iphone.html | 4 - packages/joint-core/demo/shapes/sketched.html | 4 - packages/joint-core/demo/shapes/solar.html | 4 - packages/joint-core/demo/shapes/src/table.js | 2 +- packages/joint-core/demo/shapes/standard.html | 3 - packages/joint-core/demo/shapes/table.html | 2 - packages/joint-core/demo/shapes/textpath.html | 4 - packages/joint-core/demo/spiral/spiral.html | 4 - .../demo/transitions/transition.html | 4 - .../demo/transitions/transition2.html | 4 - packages/joint-core/demo/ts-demo/index.ts | 3 - packages/joint-core/demo/umlcd/index.html | 3 - packages/joint-core/demo/umlsc/index.html | 3 - .../demo/vectorizer/vectorizer.html | 9 -- packages/joint-core/demo/vuejs/index.html | 3 - packages/joint-core/demo/vuejs/yarn.lock | 147 ------------------ 77 files changed, 24 insertions(+), 416 deletions(-) delete mode 100644 packages/joint-core/demo/rough/yarn.lock delete mode 100644 packages/joint-core/demo/vuejs/yarn.lock diff --git a/packages/joint-core/demo/archive/clipping.html b/packages/joint-core/demo/archive/clipping.html index 1b1c76892..eebdca63c 100644 --- a/packages/joint-core/demo/archive/clipping.html +++ b/packages/joint-core/demo/archive/clipping.html @@ -19,10 +19,6 @@ <div id="paper"></div> - <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="./clipping.js"></script> diff --git a/packages/joint-core/demo/archive/links.html b/packages/joint-core/demo/archive/links.html index fb411df11..4fb1dc72d 100644 --- a/packages/joint-core/demo/archive/links.html +++ b/packages/joint-core/demo/archive/links.html @@ -19,10 +19,6 @@ <label>Perpendicular links</label><input type="checkbox" id="perpendicularLinks" /> <div id="paper"></div> - <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="./links.js"></script> diff --git a/packages/joint-core/demo/archive/links.js b/packages/joint-core/demo/archive/links.js index e8d5d4113..3f3b8b62d 100644 --- a/packages/joint-core/demo/archive/links.js +++ b/packages/joint-core/demo/archive/links.js @@ -42,6 +42,7 @@ paper.on('link:connect', function(linkView, evt, connectedToView, magnetElement, console.log('link:connect', type, connectedToView, magnetElement); }); +var $ = joint.mvc.$; $('#perpendicularLinks').on('change', function() { paper.options.perpendicularLinks = $(this).is(':checked') ? true : false; }); diff --git a/packages/joint-core/demo/bandwidth/index.html b/packages/joint-core/demo/bandwidth/index.html index 22c0fdaf4..4000789b4 100644 --- a/packages/joint-core/demo/bandwidth/index.html +++ b/packages/joint-core/demo/bandwidth/index.html @@ -13,9 +13,6 @@ <body> <div id="paper"></div> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="src/bandwidth.js"></script> diff --git a/packages/joint-core/demo/bus/index.html b/packages/joint-core/demo/bus/index.html index ccd66a4e2..252e26f49 100644 --- a/packages/joint-core/demo/bus/index.html +++ b/packages/joint-core/demo/bus/index.html @@ -14,10 +14,6 @@ <div id="paper"></div> - <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="src/joint.shapes.mix.js"></script> <script src="src/bus.js"></script> diff --git a/packages/joint-core/demo/chess/index.html b/packages/joint-core/demo/chess/index.html index 64c803e09..6f828c600 100644 --- a/packages/joint-core/demo/chess/index.html +++ b/packages/joint-core/demo/chess/index.html @@ -16,9 +16,6 @@ <div id="message"></div> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="src/garbochess.js"></script> <script src="src/chess.js"></script> diff --git a/packages/joint-core/demo/container/index.html b/packages/joint-core/demo/container/index.html index aec1b9de7..5ee9dcf08 100644 --- a/packages/joint-core/demo/container/index.html +++ b/packages/joint-core/demo/container/index.html @@ -15,7 +15,6 @@ <div id="paper"></div> <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> <script src="../../node_modules/lodash/lodash.js"></script> <script src="../../node_modules/graphlib/dist/graphlib.min.js"></script> <script src="../../node_modules/dagre/dist/dagre.min.js"></script> diff --git a/packages/joint-core/demo/curves/index.html b/packages/joint-core/demo/curves/index.html index fb1c5186c..160b1c5bc 100644 --- a/packages/joint-core/demo/curves/index.html +++ b/packages/joint-core/demo/curves/index.html @@ -10,8 +10,6 @@ </head> <body> <div id="paper"></div> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> <script src="../../build/joint.js"></script> <script src="src/curves.js"></script> </body> diff --git a/packages/joint-core/demo/devs/index.html b/packages/joint-core/demo/devs/index.html index 83dfaa8f4..1b4e45d95 100644 --- a/packages/joint-core/demo/devs/index.html +++ b/packages/joint-core/demo/devs/index.html @@ -17,9 +17,6 @@ <div id="paper"></div> <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - <script src="../../build/joint.js"></script> <script src="src/shapes.devs.js"></script> diff --git a/packages/joint-core/demo/dynamic-font-size/index.html b/packages/joint-core/demo/dynamic-font-size/index.html index e848838fc..76826d804 100644 --- a/packages/joint-core/demo/dynamic-font-size/index.html +++ b/packages/joint-core/demo/dynamic-font-size/index.html @@ -7,15 +7,11 @@ <link rel="stylesheet" type="text/css" href="../../build/joint.css" /> <link rel="stylesheet" type="text/css" href="./css/styles.css" /> - <!-- Dependencies: --> - <script src="../../node_modules/jquery/dist/jquery.js"></script> - <script src="../../node_modules/lodash/lodash.js"></script> - - <script src="../../build/joint.js"></script> <title>Dynamic font size
+ diff --git a/packages/joint-core/demo/embedding/front-and-back.html b/packages/joint-core/demo/embedding/front-and-back.html index 41be41af2..ba3fd2008 100644 --- a/packages/joint-core/demo/embedding/front-and-back.html +++ b/packages/joint-core/demo/embedding/front-and-back.html @@ -52,10 +52,6 @@

- - - - diff --git a/packages/joint-core/demo/embedding/nested-clone.html b/packages/joint-core/demo/embedding/nested-clone.html index bff1da94f..1a34a73b0 100644 --- a/packages/joint-core/demo/embedding/nested-clone.html +++ b/packages/joint-core/demo/embedding/nested-clone.html @@ -17,10 +17,6 @@
- - - - diff --git a/packages/joint-core/demo/embedding/nested-clone.js b/packages/joint-core/demo/embedding/nested-clone.js index 0ff5e8ada..5a58f1af4 100644 --- a/packages/joint-core/demo/embedding/nested-clone.js +++ b/packages/joint-core/demo/embedding/nested-clone.js @@ -1,8 +1,12 @@ -var $info = $('
').css({ position: 'fixed', top: 50, right: 100 }).appendTo(document.body);
+var infoEl = document.createElement('pre');
+infoEl.style.position = 'fixed';
+infoEl.style.top = '50px';
+infoEl.style.right = '100px';
+document.body.appendChild(infoEl);
 resetInfo();
 
 function resetInfo() {
-    $info.text('Hover over cells to see\nhow cloning and graph search works\non nested graphs.');
+    infoEl.innerHTML = 'Hover over cells to see\nhow cloning and graph search works\non nested graphs.';
 }
 
 function me(id, x, y, w, h, fill) {
@@ -86,7 +90,7 @@ paper.on('cell:mouseenter', function(cellView) {
     i[keyGetConnectedLinks] = joint.util.toArray(graph.getConnectedLinks(cell, { deep: true })).map(function(c) {
         return c.get('name');
     }).join(',');
-    $info.text(JSON.stringify(i, '\t', 4));
+    infoEl.innerHTML = JSON.stringify(i, '\t', 4);
     console.log(i);
 });
 
diff --git a/packages/joint-core/demo/embedding/nested.html b/packages/joint-core/demo/embedding/nested.html
index 565c43b07..ac1c4eaa1 100644
--- a/packages/joint-core/demo/embedding/nested.html
+++ b/packages/joint-core/demo/embedding/nested.html
@@ -19,10 +19,6 @@
 
         
- - - - diff --git a/packages/joint-core/demo/embedding/nested2.html b/packages/joint-core/demo/embedding/nested2.html index 295a48baa..93e9ace14 100644 --- a/packages/joint-core/demo/embedding/nested2.html +++ b/packages/joint-core/demo/embedding/nested2.html @@ -21,10 +21,6 @@

Drag Parent before and after embedding links into Parent using above button

- - - - diff --git a/packages/joint-core/demo/embedding/nested2.js b/packages/joint-core/demo/embedding/nested2.js index 05667befd..9b4397e22 100644 --- a/packages/joint-core/demo/embedding/nested2.js +++ b/packages/joint-core/demo/embedding/nested2.js @@ -36,16 +36,18 @@ parent.embed(child); parent.embed(child2); graph.addCells([parent, child, child2, link, link2]); -$('#button').click(function() { - switch ($('#button').text().split(' ')[0]) { +const buttonEl = document.getElementById('button'); +buttonEl.addEventListener('click', function(event) { + switch (buttonEl.textContent.split(' ')[0]) { case 'embed': parent.embed(link); parent.embed(link2); - $('#button').text('unembed links'); + buttonEl.textContent = 'unembed links'; break; case 'unembed': parent.unembed(link); parent.unembed(link2); - $('#button').text('embed links'); + buttonEl.textContent = 'embed links'; } + }); diff --git a/packages/joint-core/demo/erd/index.html b/packages/joint-core/demo/erd/index.html index febf5c7f2..abf6dcd4c 100644 --- a/packages/joint-core/demo/erd/index.html +++ b/packages/joint-core/demo/erd/index.html @@ -13,9 +13,6 @@
- - - diff --git a/packages/joint-core/demo/expand/index.html b/packages/joint-core/demo/expand/index.html index 70cfec6fe..769c1b57f 100644 --- a/packages/joint-core/demo/expand/index.html +++ b/packages/joint-core/demo/expand/index.html @@ -29,10 +29,6 @@
- - - - diff --git a/packages/joint-core/demo/expand/index.js b/packages/joint-core/demo/expand/index.js index a3c94475f..18f40a944 100644 --- a/packages/joint-core/demo/expand/index.js +++ b/packages/joint-core/demo/expand/index.js @@ -287,6 +287,7 @@ paper.on('element:magnet:pointerclick', function(elementView, evt, magnet) { } }); +var $ = joint.mvc.$; $('
- - diff --git a/packages/joint-core/demo/performance/conveyor.html b/packages/joint-core/demo/performance/conveyor.html index d91144fcf..75278bb26 100644 --- a/packages/joint-core/demo/performance/conveyor.html +++ b/packages/joint-core/demo/performance/conveyor.html @@ -23,8 +23,6 @@
- - diff --git a/packages/joint-core/demo/performance/shapes.html b/packages/joint-core/demo/performance/shapes.html index cb2d2e108..4a7e6a003 100644 --- a/packages/joint-core/demo/performance/shapes.html +++ b/packages/joint-core/demo/performance/shapes.html @@ -10,8 +10,6 @@
- - diff --git a/packages/joint-core/demo/petri-nets/index.html b/packages/joint-core/demo/petri-nets/index.html index 470eef17f..bfba4cbcf 100644 --- a/packages/joint-core/demo/petri-nets/index.html +++ b/packages/joint-core/demo/petri-nets/index.html @@ -14,9 +14,6 @@
- - - diff --git a/packages/joint-core/demo/ports/dynamic.html b/packages/joint-core/demo/ports/dynamic.html index ae7419d14..be56560e2 100644 --- a/packages/joint-core/demo/ports/dynamic.html +++ b/packages/joint-core/demo/ports/dynamic.html @@ -19,10 +19,6 @@
- - - - diff --git a/packages/joint-core/demo/ports/ports.html b/packages/joint-core/demo/ports/ports.html index 27ae139ea..818db68a6 100644 --- a/packages/joint-core/demo/ports/ports.html +++ b/packages/joint-core/demo/ports/ports.html @@ -17,14 +17,10 @@ - - - - - - - diff --git a/packages/joint-core/demo/puzzle/index.html b/packages/joint-core/demo/puzzle/index.html index e397d3b89..06950a914 100644 --- a/packages/joint-core/demo/puzzle/index.html +++ b/packages/joint-core/demo/puzzle/index.html @@ -39,8 +39,6 @@ - - diff --git a/packages/joint-core/demo/right-angle-playground/index.html b/packages/joint-core/demo/right-angle-playground/index.html index a864b600c..f2aa6c147 100644 --- a/packages/joint-core/demo/right-angle-playground/index.html +++ b/packages/joint-core/demo/right-angle-playground/index.html @@ -8,9 +8,6 @@
- - - diff --git a/packages/joint-core/demo/roi/index.html b/packages/joint-core/demo/roi/index.html index 368ab369b..03b381fac 100644 --- a/packages/joint-core/demo/roi/index.html +++ b/packages/joint-core/demo/roi/index.html @@ -12,9 +12,6 @@
- - - diff --git a/packages/joint-core/demo/rough/index.html b/packages/joint-core/demo/rough/index.html index 774bd51c0..e59ddec24 100644 --- a/packages/joint-core/demo/rough/index.html +++ b/packages/joint-core/demo/rough/index.html @@ -17,10 +17,6 @@ Use ⇧ shift key to add links or connect shapes. Double click a shape to edit text. - - - - diff --git a/packages/joint-core/demo/rough/yarn.lock b/packages/joint-core/demo/rough/yarn.lock deleted file mode 100644 index 9560d4542..000000000 --- a/packages/joint-core/demo/rough/yarn.lock +++ /dev/null @@ -1,30 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@joint/demo-rough@workspace:.": - version: 0.0.0-use.local - resolution: "@joint/demo-rough@workspace:." - dependencies: - roughjs: ^3.1.0 - languageName: unknown - linkType: soft - -"roughjs@npm:^3.1.0": - version: 3.1.0 - resolution: "roughjs@npm:3.1.0" - dependencies: - workly: ^1.2.0 - checksum: 9519f929a8e7f91cfd92ca4d9fe625f7c2018fb2ccf12f67b61de306e001d294a95ddd76cce08daa8fe078358e48f4b5fde1afc4e841326892dbd77c5a086ded - languageName: node - linkType: hard - -"workly@npm:^1.2.0": - version: 1.3.1 - resolution: "workly@npm:1.3.1" - checksum: fa08b20f0cbc50925b2b42e20bdbda33929a8b9cacbf33ede7cc959d4b9c36717640c59a58f1a5e64bdc3b6d349c0f59525b9b6038945b22652e4dba301ca6b6 - languageName: node - linkType: hard diff --git a/packages/joint-core/demo/routing/index.html b/packages/joint-core/demo/routing/index.html index cad8fb2d7..df0397392 100644 --- a/packages/joint-core/demo/routing/index.html +++ b/packages/joint-core/demo/routing/index.html @@ -27,9 +27,6 @@
- - - diff --git a/packages/joint-core/demo/routing/src/routing.js b/packages/joint-core/demo/routing/src/routing.js index 67ff5463a..a2f54485a 100644 --- a/packages/joint-core/demo/routing/src/routing.js +++ b/packages/joint-core/demo/routing/src/routing.js @@ -1,3 +1,5 @@ +var $ = joint.mvc.$; + var graph = new joint.dia.Graph(); var paper = new joint.dia.Paper({ diff --git a/packages/joint-core/demo/sequence/index.html b/packages/joint-core/demo/sequence/index.html index 23eff7a51..1ae01ab0b 100644 --- a/packages/joint-core/demo/sequence/index.html +++ b/packages/joint-core/demo/sequence/index.html @@ -37,12 +37,6 @@
- - - - - - diff --git a/packages/joint-core/demo/shapes/3d.html b/packages/joint-core/demo/shapes/3d.html index cbcc8a1c9..1d5e5e0f8 100644 --- a/packages/joint-core/demo/shapes/3d.html +++ b/packages/joint-core/demo/shapes/3d.html @@ -18,10 +18,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/fills.html b/packages/joint-core/demo/shapes/fills.html index 0f28c9729..6a34ba355 100644 --- a/packages/joint-core/demo/shapes/fills.html +++ b/packages/joint-core/demo/shapes/fills.html @@ -15,9 +15,6 @@
- - - diff --git a/packages/joint-core/demo/shapes/filters.html b/packages/joint-core/demo/shapes/filters.html index 8bc5831d4..7ff9fd83a 100644 --- a/packages/joint-core/demo/shapes/filters.html +++ b/packages/joint-core/demo/shapes/filters.html @@ -17,10 +17,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/foreign-object.html b/packages/joint-core/demo/shapes/foreign-object.html index 4de323869..81917baf3 100644 --- a/packages/joint-core/demo/shapes/foreign-object.html +++ b/packages/joint-core/demo/shapes/foreign-object.html @@ -29,9 +29,6 @@
- - - diff --git a/packages/joint-core/demo/shapes/hyperlinks.html b/packages/joint-core/demo/shapes/hyperlinks.html index 71303bc86..5925e38ef 100644 --- a/packages/joint-core/demo/shapes/hyperlinks.html +++ b/packages/joint-core/demo/shapes/hyperlinks.html @@ -18,10 +18,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/iphone.html b/packages/joint-core/demo/shapes/iphone.html index 73d8debca..17a6d49ed 100644 --- a/packages/joint-core/demo/shapes/iphone.html +++ b/packages/joint-core/demo/shapes/iphone.html @@ -19,10 +19,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/sketched.html b/packages/joint-core/demo/shapes/sketched.html index c5076dbc6..de2b3c710 100644 --- a/packages/joint-core/demo/shapes/sketched.html +++ b/packages/joint-core/demo/shapes/sketched.html @@ -19,10 +19,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/solar.html b/packages/joint-core/demo/shapes/solar.html index 266750b77..2e53df211 100644 --- a/packages/joint-core/demo/shapes/solar.html +++ b/packages/joint-core/demo/shapes/solar.html @@ -22,10 +22,6 @@
- - - - diff --git a/packages/joint-core/demo/shapes/src/table.js b/packages/joint-core/demo/shapes/src/table.js index ac62f2fb2..4c770e324 100644 --- a/packages/joint-core/demo/shapes/src/table.js +++ b/packages/joint-core/demo/shapes/src/table.js @@ -1,7 +1,7 @@ var graph = new joint.dia.Graph; new joint.dia.Paper({ - el: $('
').prependTo(document.body).css({ border: '1px solid gray' }), + el: joint.mvc.$('
').prependTo(document.body).css({ border: '1px solid gray' }), width: 1200, height: 550, gridSize: 40, diff --git a/packages/joint-core/demo/shapes/standard.html b/packages/joint-core/demo/shapes/standard.html index d8fd4ea8a..e5b5653f8 100644 --- a/packages/joint-core/demo/shapes/standard.html +++ b/packages/joint-core/demo/shapes/standard.html @@ -13,9 +13,6 @@
- - - diff --git a/packages/joint-core/demo/shapes/table.html b/packages/joint-core/demo/shapes/table.html index 4fd9f26a4..4183d8f18 100644 --- a/packages/joint-core/demo/shapes/table.html +++ b/packages/joint-core/demo/shapes/table.html @@ -7,8 +7,6 @@ - - diff --git a/packages/joint-core/demo/shapes/textpath.html b/packages/joint-core/demo/shapes/textpath.html index 21c616421..f964e58b4 100644 --- a/packages/joint-core/demo/shapes/textpath.html +++ b/packages/joint-core/demo/shapes/textpath.html @@ -18,10 +18,6 @@
- - - - diff --git a/packages/joint-core/demo/spiral/spiral.html b/packages/joint-core/demo/spiral/spiral.html index dae089bac..d312e96a9 100644 --- a/packages/joint-core/demo/spiral/spiral.html +++ b/packages/joint-core/demo/spiral/spiral.html @@ -17,10 +17,6 @@
- - - - diff --git a/packages/joint-core/demo/transitions/transition.html b/packages/joint-core/demo/transitions/transition.html index f172819f2..5518247ac 100644 --- a/packages/joint-core/demo/transitions/transition.html +++ b/packages/joint-core/demo/transitions/transition.html @@ -19,10 +19,6 @@
- - - - diff --git a/packages/joint-core/demo/transitions/transition2.html b/packages/joint-core/demo/transitions/transition2.html index 5855d562b..5b47698ef 100644 --- a/packages/joint-core/demo/transitions/transition2.html +++ b/packages/joint-core/demo/transitions/transition2.html @@ -23,10 +23,6 @@
- - - - diff --git a/packages/joint-core/demo/ts-demo/index.ts b/packages/joint-core/demo/ts-demo/index.ts index d5a8b5216..b79d7c410 100644 --- a/packages/joint-core/demo/ts-demo/index.ts +++ b/packages/joint-core/demo/ts-demo/index.ts @@ -7,9 +7,6 @@ import * as graphlib from 'graphlib'; // @ts-ignore const $ = mvc.$; -$.fn.text = function(text: string) { - this[0].textContent = text; return this; -}; const $body = $('body'); diff --git a/packages/joint-core/demo/umlcd/index.html b/packages/joint-core/demo/umlcd/index.html index 995831c5f..95d117a4f 100644 --- a/packages/joint-core/demo/umlcd/index.html +++ b/packages/joint-core/demo/umlcd/index.html @@ -13,9 +13,6 @@
- - - diff --git a/packages/joint-core/demo/umlsc/index.html b/packages/joint-core/demo/umlsc/index.html index 948621834..ac45b65d0 100644 --- a/packages/joint-core/demo/umlsc/index.html +++ b/packages/joint-core/demo/umlsc/index.html @@ -13,9 +13,6 @@
- - - diff --git a/packages/joint-core/demo/vectorizer/vectorizer.html b/packages/joint-core/demo/vectorizer/vectorizer.html index ae34e27b7..527ffa4c3 100644 --- a/packages/joint-core/demo/vectorizer/vectorizer.html +++ b/packages/joint-core/demo/vectorizer/vectorizer.html @@ -14,16 +14,7 @@ - - - - - - - - - diff --git a/packages/joint-core/demo/vuejs/index.html b/packages/joint-core/demo/vuejs/index.html index 43b4b0435..60666615f 100644 --- a/packages/joint-core/demo/vuejs/index.html +++ b/packages/joint-core/demo/vuejs/index.html @@ -9,9 +9,6 @@ - - - diff --git a/packages/joint-core/demo/vuejs/yarn.lock b/packages/joint-core/demo/vuejs/yarn.lock deleted file mode 100644 index 7b87c3c5e..000000000 --- a/packages/joint-core/demo/vuejs/yarn.lock +++ /dev/null @@ -1,147 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea - languageName: node - linkType: hard - -"@babel/parser@npm:^7.11.5": - version: 7.22.7 - resolution: "@babel/parser@npm:7.22.7" - bin: - parser: ./bin/babel-parser.js - checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 - languageName: node - linkType: hard - -"@babel/types@npm:^7.11.5, @babel/types@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/types@npm:7.22.5" - dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - to-fast-properties: ^2.0.0 - checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 - languageName: node - linkType: hard - -"@joint/demo-vuejs@workspace:.": - version: 0.0.0-use.local - resolution: "@joint/demo-vuejs@workspace:." - dependencies: - vue: 3.0.0 - languageName: unknown - linkType: soft - -"@vue/compiler-core@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/compiler-core@npm:3.0.0" - dependencies: - "@babel/parser": ^7.11.5 - "@babel/types": ^7.11.5 - "@vue/shared": 3.0.0 - estree-walker: ^2.0.1 - source-map: ^0.6.1 - checksum: ca47c03ab00bc3d480bd45427815e5ee30c408d0839182acb8299d57f9a39c7d21431129ca90ba56f6bd710b8e6497296f0a9ddb3c3d49ea7d0c06fb0fa36fc7 - languageName: node - linkType: hard - -"@vue/compiler-dom@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/compiler-dom@npm:3.0.0" - dependencies: - "@vue/compiler-core": 3.0.0 - "@vue/shared": 3.0.0 - checksum: cbe58a35ec6af2f9af952093c124f4a202d249efd4f2d20bf1e10476025b233f731357b33554ef66b1e9b5a0090424771b31330c702278e7633c0d10939619cd - languageName: node - linkType: hard - -"@vue/reactivity@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/reactivity@npm:3.0.0" - dependencies: - "@vue/shared": 3.0.0 - checksum: 1955b47fdc96fb7da01534d0380f42738b0b6e0353fe25f70df194911741144f2403605c8a128730b2da590b971fd44be9bdcaabade20a016c6a275123d5e323 - languageName: node - linkType: hard - -"@vue/runtime-core@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/runtime-core@npm:3.0.0" - dependencies: - "@vue/reactivity": 3.0.0 - "@vue/shared": 3.0.0 - checksum: 21ddc0c74208151caa44a1bccadb8b1a57bb505c4ffef57f00aa28c694f9a556c9f0af27b36fbd0dafde478ef42b4a5000d91a1259be01984f8a424c030f45e1 - languageName: node - linkType: hard - -"@vue/runtime-dom@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/runtime-dom@npm:3.0.0" - dependencies: - "@vue/runtime-core": 3.0.0 - "@vue/shared": 3.0.0 - csstype: ^2.6.8 - checksum: 7026d70289a96b78e8366491d15f14329468b182419ddcee75465277edd3a5600d693165c6d85252375add3b7ab0e5787a1020fe54a5855b1bd6c2ae93e0ed75 - languageName: node - linkType: hard - -"@vue/shared@npm:3.0.0": - version: 3.0.0 - resolution: "@vue/shared@npm:3.0.0" - checksum: 10cd76e54dd5e93cc5c521688ce6f18501b2b67b3be953475996cd0bcd5533360ba2aad18cfdb4030a598920e655778b146748c8f70e15c0101939b00760547f - languageName: node - linkType: hard - -"csstype@npm:^2.6.8": - version: 2.6.21 - resolution: "csstype@npm:2.6.21" - checksum: 2ce8bc832375146eccdf6115a1f8565a27015b74cce197c35103b4494955e9516b246140425ad24103864076aa3e1257ac9bab25a06c8d931dd87a6428c9dccf - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.1": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc - languageName: node - linkType: hard - -"source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"vue@npm:3.0.0": - version: 3.0.0 - resolution: "vue@npm:3.0.0" - dependencies: - "@vue/compiler-dom": 3.0.0 - "@vue/runtime-dom": 3.0.0 - "@vue/shared": 3.0.0 - checksum: 1e52f5858b8b4b028ccfc11ec246697f78ba2a1dadde19493e385f8b69abecb1924d5512f0c03f74f7322ef49f194ad51c8d1069c6df44cd60e8216a76add17d - languageName: node - linkType: hard From fb718d3daa62efecc89a352da2c18180d1d0393d Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sat, 2 Dec 2023 18:33:17 +0100 Subject: [PATCH 25/58] update --- .../joint-core/src/linkTools/HoverConnect.mjs | 2 +- packages/joint-core/src/mvc/Dom/Dom.mjs | 389 ++++++++++- packages/joint-core/src/mvc/Dom/Event.mjs | 130 ++++ packages/joint-core/src/mvc/Dom/events.js | 603 ------------------ packages/joint-core/src/mvc/Dom/events.mjs | 67 ++ packages/joint-core/src/mvc/Dom/gestures.js | 27 - packages/joint-core/src/mvc/Dom/index.mjs | 10 +- .../src/mvc/Dom/{methods.js => methods.mjs} | 111 +++- 8 files changed, 681 insertions(+), 658 deletions(-) create mode 100644 packages/joint-core/src/mvc/Dom/Event.mjs delete mode 100644 packages/joint-core/src/mvc/Dom/events.js create mode 100644 packages/joint-core/src/mvc/Dom/events.mjs delete mode 100644 packages/joint-core/src/mvc/Dom/gestures.js rename packages/joint-core/src/mvc/Dom/{methods.js => methods.mjs} (58%) diff --git a/packages/joint-core/src/linkTools/HoverConnect.mjs b/packages/joint-core/src/linkTools/HoverConnect.mjs index 854126f67..419cb233a 100644 --- a/packages/joint-core/src/linkTools/HoverConnect.mjs +++ b/packages/joint-core/src/linkTools/HoverConnect.mjs @@ -131,7 +131,7 @@ export const HoverConnect = Connect.extend({ canShowButton() { // Has been the paper events undelegated? If so, we can't show the button. // TODO: add a method to the paper to check if the events are delegated. - return $._data(this.paper.el, 'events'); + return $.event.has(this.paper.el); }, showButton() { diff --git a/packages/joint-core/src/mvc/Dom/Dom.mjs b/packages/joint-core/src/mvc/Dom/Dom.mjs index 909a913f2..cddd0f5da 100644 --- a/packages/joint-core/src/mvc/Dom/Dom.mjs +++ b/packages/joint-core/src/mvc/Dom/Dom.mjs @@ -10,13 +10,21 @@ * Date: 2023-11-24T14:04Z */ -import { uniq } from '../../util/utilHelpers.mjs'; +import { uniq, isEmpty } from '../../util/utilHelpers.mjs'; +import { dataPriv, dataUser } from './vars.mjs'; +import { Event } from './Event.mjs'; if (!window.document) { throw new Error('$ requires a window with a document'); } const document = window.document; +const rTypeNamespace = /^([^.]*)(?:\.(.+)|)/; +const documentElement = document.documentElement; +// Only count HTML whitespace +// Other whitespace should count in values +// https://infra.spec.whatwg.org/#ascii-whitespace +const rNotHtmlWhite = /[^\x20\t\r\n\f]+/g; // Define a local copy of $ const $ = function(selector) { @@ -34,6 +42,9 @@ $.fn = $.prototype = { // A global GUID counter for objects $.guid = 1; +// User data storage +$.data = dataUser; + $.merge = function(first, second) { let len = +second.length; let i = first.length; @@ -183,6 +194,382 @@ $.Dom = Dom; // Give the init function the $ prototype for later instantiation Dom.prototype = $.fn; +// Events + +$.Event = Event; + +$.event = { + special: Object.create(null), +}; + +$.event.has = function(elem) { + return dataPriv.has(elem, 'events'); +}; + +$.event.on = function(elem, types, selector, data, fn, one) { + + // Types can be a map of types/handlers + if (typeof types === 'object') { + // ( types-Object, selector, data ) + if (typeof selector !== 'string') { + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for (let type in types) { + $.event.on(elem, type, selector, data, types[type], one); + } + return elem; + } + + if (data == null && fn == null) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if (fn == null) { + if (typeof selector === 'string') { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if (!fn) { + return elem; + } + if (one === 1) { + const origFn = fn; + fn = function(event) { + // Can use an empty set, since event contains the info + $().off(event); + return origFn.apply(this, arguments); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || (origFn.guid = $.guid++); + } + for (let i = 0; i < elem.length; i++) { + $.event.add(elem[i], types, fn, data, selector); + } +}; + +$.event.add = function(elem, types, handler, data, selector) { + // Only attach events to objects for which we can store data + if (typeof elem != 'object') { + return; + } + + const elemData = dataPriv.create(elem); + + // Caller can pass in an object of custom data in lieu of the handler + let handleObjIn; + if (handler.handler) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if (selector) { + documentElement.matches(selector); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if (!handler.guid) { + handler.guid = $.guid++; + } + + // Init the element's event structure and main handler, if this is the first + let events; + if (!(events = elemData.events)) { + events = elemData.events = Object.create(null); + } + let eventHandle; + if (!(eventHandle = elemData.handle)) { + eventHandle = elemData.handle = function(e) { + // Discard the second event of a $.event.trigger() and + // when an event is called after a page has unloaded + return (typeof $ !== 'undefined') + ? $.event.dispatch.apply(elem, arguments) + : undefined; + }; + } + + // Handle multiple events separated by a space + const typesArr = (types || '').match(rNotHtmlWhite) || ['']; + let i = typesArr.length; + while (i--) { + const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); + // There *must* be a type, no attaching namespace-only handlers + if (!origType) { + continue; + } + + const namespaces = ns.split('.').sort(); + // If event changes its type, use the special event handlers for the changed type + let special = $.event.special[origType]; + // If selector defined, determine special event api type, otherwise given type + const type = (special && (selector ? special.delegateType : special.bindType)) || origType; + // Update special based on newly reset type + special = $.event.special[type]; + // handleObj is passed to all event handlers + const handleObj = Object.assign( + { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + namespace: namespaces.join('.'), + }, + handleObjIn + ); + + let handlers; + // Init the event handler queue if we're the first + if (!(handlers = events[type])) { + handlers = events[type] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( + !special || !special.setup || + special.setup.call(elem, data, namespaces, eventHandle) === false + ) { + if (elem.addEventListener) { + elem.addEventListener(type, eventHandle); + } + } + } + + if (special && special.add) { + special.add.call(elem, handleObj); + if (!handleObj.handler.guid) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if (selector) { + handlers.splice(handlers.delegateCount++, 0, handleObj); + } else { + handlers.push(handleObj); + } + } +}; + +// Detach an event or set of events from an element +$.event.remove = function(elem, types, handler, selector, mappedTypes) { + + const elemData = dataPriv.get(elem); + if (!elemData || !elemData.events) return; + const events = elemData.events; + + // Once for each type.namespace in types; type may be omitted + const typesArr = (types || '').match(rNotHtmlWhite) || ['']; + let i = typesArr.length; + while (i--) { + const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); + // Unbind all events (on this namespace, if provided) for the element + if (!origType) { + for (const type in events) { + $.event.remove( + elem, + type + typesArr[i], + handler, + selector, + true + ); + } + continue; + } + + const special = $.event.special[origType]; + const type = (special && (selector ? special.delegateType : special.bindType)) || origType; + const handlers = events[type]; + if (!handlers || handlers.length === 0) continue; + + const namespaces = ns.split('.').sort(); + const rNamespace = ns + ? new RegExp('(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)') + : null; + + // Remove matching events + const origCount = handlers.length; + let j = origCount; + while (j--) { + const handleObj = handlers[j]; + + if ( + (mappedTypes || origType === handleObj.origType) && + (!handler || handler.guid === handleObj.guid) && + (!rNamespace || rNamespace.test(handleObj.namespace)) && + (!selector || + selector === handleObj.selector || + (selector === '**' && handleObj.selector)) + ) { + handlers.splice(j, 1); + if (handleObj.selector) { + handlers.delegateCount--; + } + if (special && special.remove) { + special.remove.call(elem, handleObj); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if (origCount && handlers.length === 0) { + if ( + !special || !special.teardown || + special.teardown.call(elem, namespaces, elemData.handle) === false + ) { + // This "if" is needed for plain objects + if (elem.removeEventListener) { + elem.removeEventListener(type, elemData.handle); + } + } + delete events[type]; + } + } + + // Remove data if it's no longer used + if (isEmpty(events)) { + dataPriv.remove(elem, 'handle'); + dataPriv.remove(elem, 'events'); + } +}; + +$.event.dispatch = function(nativeEvent) { + + const elem = this; + // Make a writable $.Event from the native event object + const event = $.event.fix(nativeEvent); + event.delegateTarget = elem; + // Use the fix-ed $.Event rather than the (read-only) native event + const args = Array.from(arguments); + args[0] = event; + + const eventsData = dataPriv.get(elem, 'events'); + const handlers = (eventsData && eventsData[event.type]) || []; + const special = $.event.special[event.type]; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if (special && special.preDispatch) { + if (special.preDispatch.call(elem, event) === false) return; + } + + // Determine handlers + const handlerQueue = $.event.handlers.call(elem, event, handlers); + + // Run delegates first; they may want to stop propagation beneath us + let i = 0; + let matched; + while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { + event.currentTarget = matched.elem; + let j = 0; + let handleObj; + while ( + (handleObj = matched.handlers[j++]) && + !event.isImmediatePropagationStopped() + ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + const origSpecial = $.event.special[handleObj.origType]; + let handler; + if (origSpecial && origSpecial.handle) { + handler = origSpecial.handle; + } else { + handler = handleObj.handler; + } + + const ret = handler.apply(matched.elem, args); + if (ret !== undefined) { + if ((event.result = ret) === false) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + + // Call the postDispatch hook for the mapped type + if (special && special.postDispatch) { + special.postDispatch.call(elem, event); + } + + return event.result; +}, + +$.event.handlers = function(event, handlers) { + + const delegateCount = handlers.delegateCount; + const handlerQueue = []; + + // Find delegate handlers + if ( + delegateCount && + // Support: Firefox <=42 - 66+ + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11+ + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !(event.type === 'click' && event.button >= 1) + ) { + for (let cur = event.target; cur !== this; cur = cur.parentNode || this) { + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( + cur.nodeType === 1 && + !(event.type === 'click' && cur.disabled === true) + ) { + const matchedHandlers = []; + const matchedSelectors = {}; + for (let i = 0; i < delegateCount; i++) { + const handleObj = handlers[i]; + // Don't conflict with Object.prototype properties (trac-13203) + const sel = handleObj.selector + ' '; + if (matchedSelectors[sel] === undefined) { + matchedSelectors[sel] = cur.matches(sel); + } + if (matchedSelectors[sel]) { + matchedHandlers.push(handleObj); + } + } + if (matchedHandlers.length) { + handlerQueue.push({ + elem: cur, + handlers: matchedHandlers, + }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if (delegateCount < handlers.length) { + handlerQueue.push({ + elem: this, + handlers: handlers.slice(delegateCount), + }); + } + + return handlerQueue; +}; + +$.event.fix = function(originalEvent) { + return originalEvent.envelope ? originalEvent : new Event(originalEvent); +}; + // A central reference to the root $(document) const $root = $(document); diff --git a/packages/joint-core/src/mvc/Dom/Event.mjs b/packages/joint-core/src/mvc/Dom/Event.mjs new file mode 100644 index 000000000..e2821ef03 --- /dev/null +++ b/packages/joint-core/src/mvc/Dom/Event.mjs @@ -0,0 +1,130 @@ +export const Event = function(src, props) { + // Allow instantiation without the 'new' keyword + if (!(this instanceof Event)) { + return new Event(src, props); + } + + // Event object + if (src && src.type) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented + ? returnTrue + : returnFalse; + + // Create target properties + this.target = src.target; + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if (props) { + Object.assign(this, props); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = (src && src.timeStamp) || Date.now(); + + // Mark it as fixed + this.envelope = true; +}; + +// $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +Event.prototype = { + constructor: Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + preventDefault: function() { + const evt = this.originalEvent; + this.isDefaultPrevented = returnTrue; + if (evt) { + evt.preventDefault(); + } + }, + stopPropagation: function() { + const evt = this.originalEvent; + this.isPropagationStopped = returnTrue; + if (evt) { + evt.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + const evt = this.originalEvent; + this.isImmediatePropagationStopped = returnTrue; + if (evt) { + evt.stopImmediatePropagation(); + } + this.stopPropagation(); + }, +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +[ + 'altKey', + 'bubbles', + 'cancelable', + 'changedTouches', + 'ctrlKey', + 'detail', + 'eventPhase', + 'metaKey', + 'pageX', + 'pageY', + 'shiftKey', + 'view', + 'char', + 'code', + 'charCode', + 'key', + 'keyCode', + 'button', + 'buttons', + 'clientX', + 'clientY', + 'offsetX', + 'offsetY', + 'pointerId', + 'pointerType', + 'screenX', + 'screenY', + 'targetTouches', + 'toElement', + 'touches', + 'which', +].forEach((name) => addProp(name)); + +function addProp(name) { + Object.defineProperty(Event.prototype, name, { + enumerable: true, + configurable: true, + get: function() { + return this.originalEvent ? this.originalEvent[name] : undefined; + }, + set: function(value) { + Object.defineProperty(this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value, + }); + }, + }); +} + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} diff --git a/packages/joint-core/src/mvc/Dom/events.js b/packages/joint-core/src/mvc/Dom/events.js deleted file mode 100644 index a189b9f85..000000000 --- a/packages/joint-core/src/mvc/Dom/events.js +++ /dev/null @@ -1,603 +0,0 @@ -import { isEmpty } from '../../util/utilHelpers.mjs'; -import $ from './Dom.mjs'; -import { dataPriv } from './vars.mjs'; - -const rTypeNamespace = /^([^.]*)(?:\.(.+)|)/; -const documentElement = document.documentElement; -// Only count HTML whitespace -// Other whitespace should count in values -// https://infra.spec.whatwg.org/#ascii-whitespace -const rNotHtmlWhite = /[^\x20\t\r\n\f]+/g; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function on(elem, types, selector, data, fn, one) { - - // Types can be a map of types/handlers - if (typeof types === 'object') { - // ( types-Object, selector, data ) - if (typeof selector !== 'string') { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for (let type in types) { - on(elem, type, selector, data, types[type], one); - } - return elem; - } - - if (data == null && fn == null) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if (fn == null) { - if (typeof selector === 'string') { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if (fn === false) { - fn = returnFalse; - } else if (!fn) { - return elem; - } - - if (one === 1) { - const origFn = fn; - fn = function(event) { - // Can use an empty set, since event contains the info - $().off(event); - return origFn.apply(this, arguments); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || (origFn.guid = $.guid++); - } - for (let i = 0; i < elem.length; i++) { - $.event.add(elem[i], types, fn, data, selector); - } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -$.event = { - add: function(elem, types, handler, data, selector) { - // Only attach events to objects for which we can store data - if (typeof elem != 'object') { - return; - } - - const elemData = dataPriv.create(elem); - - // Caller can pass in an object of custom data in lieu of the handler - let handleObjIn; - if (handler.handler) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if (selector) { - documentElement.matches(selector); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if (!handler.guid) { - handler.guid = $.guid++; - } - - // Init the element's event structure and main handler, if this is the first - let events; - if (!(events = elemData.events)) { - events = elemData.events = Object.create(null); - } - let eventHandle; - if (!(eventHandle = elemData.handle)) { - eventHandle = elemData.handle = function(e) { - // Discard the second event of a $.event.trigger() and - // when an event is called after a page has unloaded - return typeof $ !== 'undefined' && $.event.triggered !== e.type - ? $.event.dispatch.apply(elem, arguments) - : undefined; - }; - } - - // Handle multiple events separated by a space - const typesArr = (types || '').match(rNotHtmlWhite) || ['']; - let i = typesArr.length; - while (i--) { - const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); - // There *must* be a type, no attaching namespace-only handlers - if (!origType) { - continue; - } - - const namespaces = ns.split('.').sort(); - // If event changes its type, use the special event handlers for the changed type - let special = $.event.special[origType]; - // If selector defined, determine special event api type, otherwise given type - const type = (special && (selector ? special.delegateType : special.bindType)) || origType; - // Update special based on newly reset type - special = $.event.special[type]; - // handleObj is passed to all event handlers - const handleObj = Object.assign( - { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - namespace: namespaces.join('.'), - }, - handleObjIn - ); - - let handlers; - // Init the event handler queue if we're the first - if (!(handlers = events[type])) { - handlers = events[type] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( - !special || !special.setup || - special.setup.call(elem, data, namespaces, eventHandle) === false - ) { - if (elem.addEventListener) { - elem.addEventListener(type, eventHandle); - } - } - } - - if (special && special.add) { - special.add.call(elem, handleObj); - if (!handleObj.handler.guid) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if (selector) { - handlers.splice(handlers.delegateCount++, 0, handleObj); - } else { - handlers.push(handleObj); - } - } - }, - - // Detach an event or set of events from an element - remove: function(elem, types, handler, selector, mappedTypes) { - - const elemData = dataPriv.get(elem); - if (!elemData || !elemData.events) return; - const events = elemData.events; - - // Once for each type.namespace in types; type may be omitted - const typesArr = (types || '').match(rNotHtmlWhite) || ['']; - let i = typesArr.length; - while (i--) { - const [, origType, ns = ''] = rTypeNamespace.exec(typesArr[i]); - // Unbind all events (on this namespace, if provided) for the element - if (!origType) { - for (const type in events) { - $.event.remove( - elem, - type + typesArr[i], - handler, - selector, - true - ); - } - continue; - } - - const special = $.event.special[origType]; - const type = (special && (selector ? special.delegateType : special.bindType)) || origType; - const handlers = events[type]; - if (!handlers || handlers.length === 0) continue; - - const namespaces = ns.split('.').sort(); - const rNamespace = ns - ? new RegExp('(^|\\.)' + namespaces.join('\\.(?:.*\\.|)') + '(\\.|$)') - : null; - - // Remove matching events - const origCount = handlers.length; - let j = origCount; - while (j--) { - const handleObj = handlers[j]; - - if ( - (mappedTypes || origType === handleObj.origType) && - (!handler || handler.guid === handleObj.guid) && - (!rNamespace || rNamespace.test(handleObj.namespace)) && - (!selector || - selector === handleObj.selector || - (selector === '**' && handleObj.selector)) - ) { - handlers.splice(j, 1); - if (handleObj.selector) { - handlers.delegateCount--; - } - if (special && special.remove) { - special.remove.call(elem, handleObj); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if (origCount && handlers.length === 0) { - if ( - !special || !special.teardown || - special.teardown.call(elem, namespaces, elemData.handle) === false - ) { - // This "if" is needed for plain objects - if (elem.removeEventListener) { - elem.removeEventListener(type, elemData.handle); - } - } - delete events[type]; - } - } - - // Remove data if it's no longer used - if (isEmpty(events)) { - dataPriv.remove(elem, 'handle'); - dataPriv.remove(elem, 'events'); - } - }, - - dispatch: function(nativeEvent) { - - const elem = this; - // Make a writable $.Event from the native event object - const event = $.event.fix(nativeEvent); - event.delegateTarget = elem; - // Use the fix-ed $.Event rather than the (read-only) native event - const args = Array.from(arguments); - args[0] = event; - - const eventsData = dataPriv.get(elem, 'events'); - const handlers = (eventsData && eventsData[event.type]) || []; - const special = $.event.special[event.type]; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if (special && special.preDispatch) { - if (special.preDispatch.call(elem, event) === false) return; - } - - // Determine handlers - const handlerQueue = $.event.handlers.call(elem, event, handlers); - - // Run delegates first; they may want to stop propagation beneath us - let i = 0; - let matched; - while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { - event.currentTarget = matched.elem; - let j = 0; - let handleObj; - while ( - (handleObj = matched.handlers[j++]) && - !event.isImmediatePropagationStopped() - ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - const origSpecial = $.event.special[handleObj.origType]; - let handler; - if (origSpecial && origSpecial.handle) { - handler = origSpecial.handle; - } else { - handler = handleObj.handler; - } - - const ret = handler.apply(matched.elem, args); - if (ret !== undefined) { - if ((event.result = ret) === false) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - - // Call the postDispatch hook for the mapped type - if (special && special.postDispatch) { - special.postDispatch.call(elem, event); - } - - return event.result; - }, - - handlers: function(event, handlers) { - - const delegateCount = handlers.delegateCount; - const handlerQueue = []; - - // Find delegate handlers - if ( - delegateCount && - // Support: Firefox <=42 - 66+ - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11+ - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !(event.type === 'click' && event.button >= 1) - ) { - for (let cur = event.target; cur !== this; cur = cur.parentNode || this) { - // Don't check non-elements (trac-13208) - // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) - if ( - cur.nodeType === 1 && - !(event.type === 'click' && cur.disabled === true) - ) { - const matchedHandlers = []; - const matchedSelectors = {}; - for (let i = 0; i < delegateCount; i++) { - const handleObj = handlers[i]; - // Don't conflict with Object.prototype properties (trac-13203) - const sel = handleObj.selector + ' '; - if (matchedSelectors[sel] === undefined) { - matchedSelectors[sel] = cur.matches(sel); - } - if (matchedSelectors[sel]) { - matchedHandlers.push(handleObj); - } - } - if (matchedHandlers.length) { - handlerQueue.push({ - elem: cur, - handlers: matchedHandlers, - }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if (delegateCount < handlers.length) { - handlerQueue.push({ - elem: this, - handlers: handlers.slice(delegateCount), - }); - } - - return handlerQueue; - }, - - addProp: function(name, hook) { - Object.defineProperty($.Event.prototype, name, { - enumerable: true, - configurable: true, - get: - typeof hook === 'function' - ? function() { - if (this.originalEvent) { - return hook(this.originalEvent); - } - } - : function() { - if (this.originalEvent) { - return this.originalEvent[name]; - } - }, - - set: function(value) { - Object.defineProperty(this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value, - }); - }, - }); - }, - - fix: function(originalEvent) { - return originalEvent.envelope ? originalEvent : new $.Event(originalEvent); - }, -}; - -$.event.special = Object.create(null); - -$.event.special.load = { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true, -}; - -$.Event = function(src, props) { - // Allow instantiation without the 'new' keyword - if (!(this instanceof $.Event)) { - return new $.Event(src, props); - } - - // Event object - if (src && src.type) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented - ? returnTrue - : returnFalse; - - // Create target properties - this.target = src.target; - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if (props) { - Object.assign(this, props); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = (src && src.timeStamp) || Date.now(); - - // Mark it as fixed - this.envelope = true; -}; - -// $.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -$.Event.prototype = { - constructor: $.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - preventDefault: function() { - const evt = this.originalEvent; - this.isDefaultPrevented = returnTrue; - if (evt) { - evt.preventDefault(); - } - }, - stopPropagation: function() { - const evt = this.originalEvent; - this.isPropagationStopped = returnTrue; - if (evt) { - evt.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - const evt = this.originalEvent; - this.isImmediatePropagationStopped = returnTrue; - if (evt) { - evt.stopImmediatePropagation(); - } - this.stopPropagation(); - }, -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -[ - 'altKey', - 'bubbles', - 'cancelable', - 'changedTouches', - 'ctrlKey', - 'detail', - 'eventPhase', - 'metaKey', - 'pageX', - 'pageY', - 'shiftKey', - 'view', - 'char', - 'code', - 'charCode', - 'key', - 'keyCode', - 'button', - 'buttons', - 'clientX', - 'clientY', - 'offsetX', - 'offsetY', - 'pointerId', - 'pointerType', - 'screenX', - 'screenY', - 'targetTouches', - 'toElement', - 'touches', - 'which', -].forEach((name) => $.event.addProp(name)); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in $. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -[ - ['mouseenter', 'mouseover'], - ['mouseleave', 'mouseout'], - ['pointerenter', 'pointerover'], - ['pointerleave', 'pointerout'], -].forEach(([orig, fix]) => { - $.event.special[orig] = { - delegateType: fix, - bindType: fix, - handle: function(event) { - const target = this; - const related = event.relatedTarget; - const handleObj = event.handleObj; - let ret; - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if (!related || !target.contains(related)) { - event.type = handleObj.origType; - ret = handleObj.handler.apply(target, arguments); - event.type = fix; - } - return ret; - }, - }; -}); - -// Methods - -$.fn.on = function(types, selector, data, fn) { - return on(this, types, selector, data, fn); -}; - -$.fn.one = function(types, selector, data, fn) { - return on(this, types, selector, data, fn, 1); -}; - -$.fn.off = function(types, selector, fn) { - if (types && types.preventDefault && types.handleObj) { - // ( event ) dispatched $.Event - const handleObj = types.handleObj; - $(types.delegateTarget).off( - handleObj.namespace - ? handleObj.origType + '.' + handleObj.namespace - : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if (typeof types === 'object') { - // ( types-object [, selector] ) - for (let type in types) { - this.off(type, selector, types[type]); - } - return this; - } - if (selector === false || typeof selector === 'function') { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if (fn === false) { - fn = returnFalse; - } - for (let i = 0; i < this.length; i++) { - $.event.remove(this[i], types, fn, selector); - } -}; diff --git a/packages/joint-core/src/mvc/Dom/events.mjs b/packages/joint-core/src/mvc/Dom/events.mjs new file mode 100644 index 000000000..988d49f9f --- /dev/null +++ b/packages/joint-core/src/mvc/Dom/events.mjs @@ -0,0 +1,67 @@ +// TODO: should not read config outside the mvc package +import { config } from '../../config/index.mjs'; +import $ from './Dom.mjs'; + + +// Special events + +export const special = Object.create(null); + +special.load = { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true, +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in $. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +[ + ['mouseenter', 'mouseover'], + ['mouseleave', 'mouseout'], + ['pointerenter', 'pointerover'], + ['pointerleave', 'pointerout'], +].forEach(([orig, fix]) => { + special[orig] = { + delegateType: fix, + bindType: fix, + handle: function(event) { + const target = this; + const related = event.relatedTarget; + const handleObj = event.handleObj; + let ret; + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if (!related || !target.contains(related)) { + event.type = handleObj.origType; + ret = handleObj.handler.apply(target, arguments); + event.type = fix; + } + return ret; + }, + }; +}); + + +// Gestures + +const maxDelay = config.doubleTapInterval; +const minDelay = 30; + +special.dbltap = { + bindType: 'touchend', + delegateType: 'touchend', + handle: function(event, ...args) { + const { handleObj, target } = event; + const targetData = $.data.create(target); + const now = new Date().getTime(); + const delta = 'lastTouch' in targetData ? now - targetData.lastTouch : 0; + if (delta < maxDelay && delta > minDelay) { + targetData.lastTouch = null; + event.type = handleObj.origType; + // let jQuery handle the triggering of "dbltap" event handlers + handleObj.handler.call(this, event, ...args); + } else { + targetData.lastTouch = now; + } + } +}; diff --git a/packages/joint-core/src/mvc/Dom/gestures.js b/packages/joint-core/src/mvc/Dom/gestures.js deleted file mode 100644 index b1866a3fc..000000000 --- a/packages/joint-core/src/mvc/Dom/gestures.js +++ /dev/null @@ -1,27 +0,0 @@ -// TODO: should not read config outside the mvc package -import { config } from '../../config/index.mjs'; -import $ from './Dom.mjs'; - -const DoubleTapEventName = 'dbltap'; -if ($.event && !(DoubleTapEventName in $.event.special)) { - const maxDelay = config.doubleTapInterval; - const minDelay = 30; - $.event.special[DoubleTapEventName] = { - bindType: 'touchend', - delegateType: 'touchend', - handle: function(event, ...args) { - const { handleObj, target } = event; - const targetData = $.data.create(target); - const now = new Date().getTime(); - const delta = 'lastTouch' in targetData ? now - targetData.lastTouch : 0; - if (delta < maxDelay && delta > minDelay) { - targetData.lastTouch = null; - event.type = handleObj.origType; - // let jQuery handle the triggering of "dbltap" event handlers - handleObj.handler.call(this, event, ...args); - } else { - targetData.lastTouch = now; - } - } - }; -} diff --git a/packages/joint-core/src/mvc/Dom/index.mjs b/packages/joint-core/src/mvc/Dom/index.mjs index ebe1daae7..b9d2b4826 100644 --- a/packages/joint-core/src/mvc/Dom/index.mjs +++ b/packages/joint-core/src/mvc/Dom/index.mjs @@ -1,11 +1,9 @@ import { default as $ } from './Dom.mjs'; -import { dataUser } from './vars.mjs'; +import * as methods from './methods.mjs'; +import { special } from './events.mjs'; -import './methods.js'; -import './events.js'; -import './gestures.js'; - -$.data = dataUser; +Object.assign($.fn, methods); +Object.assign($.event.special, special); export default $; diff --git a/packages/joint-core/src/mvc/Dom/methods.js b/packages/joint-core/src/mvc/Dom/methods.mjs similarity index 58% rename from packages/joint-core/src/mvc/Dom/methods.js rename to packages/joint-core/src/mvc/Dom/methods.mjs index c1d3d796c..5ef14ac78 100644 --- a/packages/joint-core/src/mvc/Dom/methods.js +++ b/packages/joint-core/src/mvc/Dom/methods.mjs @@ -4,7 +4,7 @@ import { dataPriv, cleanNodesData } from './vars.mjs'; // Manipulation -$.fn.remove = function() { +export function remove() { for (let i = 0; i < this.length; i++) { const node = this[i]; dataPriv.remove(node); @@ -12,9 +12,9 @@ $.fn.remove = function() { node.parentNode.removeChild(node); } } -}; +} -$.fn.empty = function() { +export function empty() { for (let i = 0; i < this.length; i++) { const node = this[i]; if (node.nodeType === 1) { @@ -24,9 +24,9 @@ $.fn.empty = function() { } } return this; -}; +} -$.fn.html = function(html) { +export function html(html) { const [el] = this; if (!el) return null; if (!html) return el.innerHTML; @@ -38,9 +38,17 @@ $.fn.html = function(html) { return this.append(html); } return this; -}; +} -$.fn.append = function(...nodes) { +export function text(text) { + const [el] = this; + if (!el) return null; + if (!text) return el.textContent; + el.textContent = text; + return this; +} + +export function append(...nodes) { const [parent] = this; if (!parent) return this; nodes.forEach((node) => { @@ -56,16 +64,39 @@ $.fn.append = function(...nodes) { } }); return this; -}; +} -$.fn.appendTo = function(parent) { +export function prepend(...nodes) { + const [parent] = this; + if (!parent) return this; + nodes.forEach((node) => { + if (!node) return; + if (typeof node === 'string') { + parent.prepend(...$.parseHTML(node)); + } else if (node.toString() === '[object Object]') { + // $ object + parent.prepend(...node.toArray()); + } else { + // DOM node + parent.insertBefore(node, parent.firstChild); + } + }); + return this; +} + +export function appendTo(parent) { $(parent).append(this); return this; -}; +} + +export function prependTo(parent) { + $(parent).prepend(this); + return this; +} // Styles and attributes -$.fn.css = function(name, value) { +export function css(name, value) { let styles; if (typeof name === 'string') { if (value === undefined) { @@ -88,9 +119,9 @@ $.fn.css = function(name, value) { } } return this; -}; +} -$.fn.attr = function(name, value) { +export function attr(name, value) { let attributes; if (typeof name === 'string') { if (value === undefined) { @@ -113,28 +144,68 @@ $.fn.attr = function(name, value) { } } return this; -}; +} // Classes -$.fn.removeClass = function() { +export function removeClass() { for (let i = 0; i < this.length; i++) { const node = this[i]; V.prototype.removeClass.apply({ node }, arguments); } return this; -}; +} -$.fn.addClass = function() { +export function addClass() { for (let i = 0; i < this.length; i++) { const node = this[i]; V.prototype.addClass.apply({ node }, arguments); } return this; -}; +} -$.fn.hasClass = function() { +export function hasClass() { const [node] = this; if (!node) return false; return V.prototype.hasClass.apply({ node }, arguments); -}; +} + +// Events + +export function on(types, selector, data, fn) { + return $.event.on(this, types, selector, data, fn); +} + +export function one(types, selector, data, fn) { + return $.event.on(this, types, selector, data, fn, 1); +} + +export function off(types, selector, fn) { + if (types && types.preventDefault && types.handleObj) { + // ( event ) dispatched $.Event + const handleObj = types.handleObj; + $(types.delegateTarget).off( + handleObj.namespace + ? handleObj.origType + '.' + handleObj.namespace + : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if (typeof types === 'object') { + // ( types-object [, selector] ) + for (let type in types) { + this.off(type, selector, types[type]); + } + return this; + } + if (selector === false || typeof selector === 'function') { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + for (let i = 0; i < this.length; i++) { + $.event.remove(this[i], types, fn, selector); + } +} From 37b344a73011a1147de6b1b18fc625de86fb5242 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sat, 2 Dec 2023 18:59:26 +0100 Subject: [PATCH 26/58] update --- packages/joint-core/demo/dgl/package.json | 5 - .../demo/dgl/src/directed-graph.mjs | 9 + packages/joint-core/demo/dgl/yarn.lock | 1658 +++++++++-------- packages/joint-core/demo/elk/package.json | 4 +- packages/joint-core/demo/elk/yarn.lock | 1650 ++++++++-------- packages/joint-core/demo/ts-demo/package.json | 2 - packages/joint-core/demo/ts-demo/yarn.lock | 1639 ++++++++++++++++ 7 files changed, 3349 insertions(+), 1618 deletions(-) create mode 100644 packages/joint-core/demo/ts-demo/yarn.lock diff --git a/packages/joint-core/demo/dgl/package.json b/packages/joint-core/demo/dgl/package.json index 355437e01..47251c4d4 100644 --- a/packages/joint-core/demo/dgl/package.json +++ b/packages/joint-core/demo/dgl/package.json @@ -15,10 +15,6 @@ "build": "webpack --config webpack.config.js", "start": "webpack serve --config webpack.config.js" }, - "dependencies": { - "jquery": "~3.5.1", - "lodash": "~4.17.20" - }, "devDependencies": { "@babel/core": "7.10.4", "@babel/preset-env": "7.10.4", @@ -26,7 +22,6 @@ "copy-webpack-plugin": "5.1.1", "core-js": "3.6.1", "css-loader": "3.5.3", - "elkjs": "0.6.2", "file-loader": "6.0.0", "regenerator-runtime": "0.13.5", "sass": "1.26.8", diff --git a/packages/joint-core/demo/dgl/src/directed-graph.mjs b/packages/joint-core/demo/dgl/src/directed-graph.mjs index 35bed64df..346ee5233 100644 --- a/packages/joint-core/demo/dgl/src/directed-graph.mjs +++ b/packages/joint-core/demo/dgl/src/directed-graph.mjs @@ -1,6 +1,15 @@ import * as dagre from 'dagre'; import * as joint from '../../../joint.mjs'; +joint.mvc.$.fn.val = function(val) { + const [el] = this; + if (!el) return null; + if (val === undefined) { + return el.value; + } + return el.value = val; +}; + var Shape = joint.dia.Element.define('demo.Shape', { z: 2, size: { diff --git a/packages/joint-core/demo/dgl/yarn.lock b/packages/joint-core/demo/dgl/yarn.lock index da3170562..b3ec66619 100644 --- a/packages/joint-core/demo/dgl/yarn.lock +++ b/packages/joint-core/demo/dgl/yarn.lock @@ -5,19 +5,20 @@ __metadata: version: 6 cacheKey: 8 -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/code-frame@npm:7.22.5" +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" dependencies: - "@babel/highlight": ^7.22.5 - checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a languageName: node linkType: hard "@babel/compat-data@npm:^7.10.4, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/compat-data@npm:7.22.9" - checksum: bed77d9044ce948b4327b30dd0de0779fa9f3a7ed1f2d31638714ed00229fa71fc4d1617ae0eb1fad419338d3658d0e9a5a083297451e09e73e078d0347ff808 + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 languageName: node linkType: hard @@ -45,15 +46,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.10.4, @babel/generator@npm:^7.22.7": - version: 7.22.9 - resolution: "@babel/generator@npm:7.22.9" +"@babel/generator@npm:^7.10.4, @babel/generator@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/generator@npm:7.23.5" dependencies: - "@babel/types": ^7.22.5 + "@babel/types": ^7.23.5 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 7c9d2c58b8d5ac5e047421a6ab03ec2ff5d9a5ff2c2212130a0055e063ac349e0b19d435537d6886c999771aef394832e4f54cd9fc810100a7f23d982f6af06b + checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 languageName: node linkType: hard @@ -66,76 +67,74 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.5" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: d753acac62399fc6dd354cf1b9441bde0c331c2fe792a4c14904c5e5eafc3cac79478f6aa038e8a51c1148b0af6710a2e619855e4b5d54497ac972eaffed5884 + "@babel/types": ^7.22.15 + checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.10.4, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.9 - resolution: "@babel/helper-compilation-targets@npm:7.22.9" +"@babel/helper-compilation-targets@npm:^7.10.4, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 browserslist: ^4.21.9 lru-cache: ^5.1.1 semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: ea0006c6a93759025f4a35a25228ae260538c9f15023e8aac2a6d45ca68aef4cf86cfc429b19af9a402cbdd54d5de74ad3fbcf6baa7e48184dc079f1a791e178 + checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6": - version: 7.22.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.9" + version: 7.23.5 + resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-member-expression-to-functions": ^7.23.0 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.9 + "@babel/helper-replace-supers": ^7.22.20 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 6c2436d1a5a3f1ff24628d78fa8c6d3120c40285aa3eda7815b1adbf8c5951e0dd73d368cf845825888fa3dc2f207dadce53309825598d7c67953e5ed9dd51d2 + checksum: fe7c6c0baca1838bba76ac1330df47b661d932354115ea9e2ea65b179f80b717987d3c3da7e1525fd648e5f2d86c620efc959cabda4d7562b125a27c3ac780d0 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.9" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 regexpu-core: ^5.3.1 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 87cb48a7ee898ab205374274364c3adc70b87b08c7bd07f51019ae4562c0170d7148e654d591f825dee14b5fe11666a0e7966872dfdbfa0d1b94b861ecf0e4e1 + checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-environment-visitor@npm:7.22.5" - checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 +"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-function-name@npm:7.22.5" +"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" dependencies: - "@babel/template": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 6b1f6ce1b1f4e513bf2c8385a557ea0dd7fa37971b9002ad19268ca4384bbe90c09681fe4c076013f33deabc63a53b341ed91e792de741b4b35e01c00238177a + "@babel/template": ^7.22.15 + "@babel/types": ^7.23.0 + checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 languageName: node linkType: hard @@ -148,36 +147,36 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-member-expression-to-functions@npm:7.22.5" +"@babel/helper-member-expression-to-functions@npm:^7.22.15, @babel/helper-member-expression-to-functions@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" dependencies: - "@babel/types": ^7.22.5 - checksum: 4bd5791529c280c00743e8bdc669ef0d4cd1620d6e3d35e0d42b862f8262bc2364973e5968007f960780344c539a4b9cf92ab41f5b4f94560a9620f536de2a39 + "@babel/types": ^7.23.0 + checksum: 494659361370c979ada711ca685e2efe9460683c36db1b283b446122596602c901e291e09f2f980ecedfe6e0f2bd5386cb59768285446530df10c14df1024e75 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad + "@babel/types": ^7.22.15 + checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.10.4, @babel/helper-module-transforms@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-module-transforms@npm:7.22.9" +"@babel/helper-module-transforms@npm:^7.10.4, @babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-simple-access": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2751f77660518cf4ff027514d6f4794f04598c6393be7b04b8e46c6e21606e11c19f3f57ab6129a9c21bacdf8b3ffe3af87bb401d972f34af2d0ffde02ac3001 + checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 languageName: node linkType: hard @@ -197,29 +196,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.9" +"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-wrap-function": ^7.22.9 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-wrap-function": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 05538079447829b13512157491cc77f9cf1ea7e1680e15cff0682c3ed9ee162de0c4862ece20a6d6b2df28177a1520bcfe45993fbeccf2747a81795a7c3f6290 + checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/helper-replace-supers@npm:7.22.9" +"@babel/helper-replace-supers@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-member-expression-to-functions": ^7.22.15 "@babel/helper-optimise-call-expression": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: d41471f56ff2616459d35a5df1900d5f0756ae78b1027040365325ef332d66e08e3be02a9489756d870887585ff222403a228546e93dd7019e19e59c0c0fe586 + checksum: a0008332e24daedea2e9498733e3c39b389d6d4512637e000f96f62b797e702ee24a407ccbcd7a236a551590a38f31282829a8ef35c50a3c0457d88218cae639 languageName: node linkType: hard @@ -250,66 +249,66 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-option@npm:7.22.5" - checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 +"@babel/helper-validator-option@npm:^7.22.15": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/helper-wrap-function@npm:7.22.9" +"@babel/helper-wrap-function@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-wrap-function@npm:7.22.20" dependencies: "@babel/helper-function-name": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 037317dc06dac6593e388738ae1d3e43193bc1d31698f067c0ef3d4dc6f074dbed860ed42aa137b48a67aa7cb87336826c4bdc13189260481bcf67eb7256c789 + "@babel/template": ^7.22.15 + "@babel/types": ^7.22.19 + checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca languageName: node linkType: hard "@babel/helpers@npm:^7.10.4": - version: 7.22.6 - resolution: "@babel/helpers@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/helpers@npm:7.23.5" dependencies: - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.6 - "@babel/types": ^7.22.5 - checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.5 + "@babel/types": ^7.23.5 + checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/highlight@npm:7.22.5" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: - "@babel/helper-validator-identifier": ^7.22.5 - chalk: ^2.0.0 + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 languageName: node linkType: hard -"@babel/parser@npm:^7.10.4, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/parser@npm:7.22.7" +"@babel/parser@npm:^7.10.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/parser@npm:7.23.5" bin: parser: ./bin/babel-parser.js - checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 + checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 languageName: node linkType: hard @@ -562,222 +561,222 @@ __metadata: linkType: hard "@babel/plugin-transform-arrow-functions@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 35abb6c57062802c7ce8bd96b2ef2883e3124370c688bbd67609f7d2453802fb73944df8808f893b6c67de978eb2bcf87bbfe325e46d6f39b5fcb09ece11d01a + checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 languageName: node linkType: hard "@babel/plugin-transform-async-to-generator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" dependencies: - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b95f23f99dcb379a9f0a1c2a3bbea3f8dc0e1b16dc1ac8b484fe378370169290a7a63d520959a9ba1232837cf74a80e23f6facbe14fd42a3cda6d3c2d7168e62 + checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c languageName: node linkType: hard "@babel/plugin-transform-block-scoped-functions@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 416b1341858e8ca4e524dee66044735956ced5f478b2c3b9bc11ec2285b0c25d7dbb96d79887169eb938084c95d0a89338c8b2fe70d473bd9dc92e5d9db1732c + checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 languageName: node linkType: hard "@babel/plugin-transform-block-scoping@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.22.5" + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 26987002cfe6e24544e60fa35f07052b6557f590c1a1cc5cf35d6dc341d7fea163c1222a2d70d5d2692f0b9860d942fd3ba979848b2995d4debffa387b9b19ae + checksum: fc4b2100dd9f2c47d694b4b35ae8153214ccb4e24ef545c259a9db17211b18b6a430f22799b56db8f6844deaeaa201af45a03331d0c80cc28b0c4e3c814570e4 languageName: node linkType: hard "@babel/plugin-transform-classes@npm:^7.10.4": - version: 7.22.6 - resolution: "@babel/plugin-transform-classes@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/plugin-transform-classes@npm:7.23.5" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8380e855c01033dbc7460d9acfbc1fc37c880350fa798c2de8c594ef818ade0e4c96173ec72f05f2a4549d8d37135e18cb62548352d51557b45a0fb4388d2f3f + checksum: 6d0dd3b0828e84a139a51b368f33f315edee5688ef72c68ba25e0175c68ea7357f9c8810b3f61713e368a3063cdcec94f3a2db952e453b0b14ef428a34aa8169 languageName: node linkType: hard "@babel/plugin-transform-computed-properties@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/template": ^7.22.5 + "@babel/template": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c2a77a0f94ec71efbc569109ec14ea2aa925b333289272ced8b33c6108bdbb02caf01830ffc7e49486b62dec51911924d13f3a76f1149f40daace1898009e131 + checksum: 80452661dc25a0956f89fe98cb562e8637a9556fb6c00d312c57653ce7df8798f58d138603c7e1aad96614ee9ccd10c47e50ab9ded6b6eded5adeb230d2a982e languageName: node linkType: hard "@babel/plugin-transform-destructuring@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-destructuring@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 76f6ea2aee1fcfa1c3791eb7a5b89703c6472650b993e8666fff0f1d6e9d737a84134edf89f63c92297f3e75064c1263219463b02dd9bc7434b6e5b9935e3f20 + checksum: 9e015099877272501162419bfe781689aec5c462cd2aec752ee22288f209eec65969ff11b8fdadca2eaddea71d705d3bba5b9c60752fcc1be67874fcec687105 languageName: node linkType: hard "@babel/plugin-transform-dotall-regex@npm:^7.10.4, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 409b658d11e3082c8f69e9cdef2d96e4d6d11256f005772425fb230cc48fd05945edbfbcb709dab293a1a2f01f9c8a5bb7b4131e632b23264039d9f95864b453 + checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 languageName: node linkType: hard "@babel/plugin-transform-duplicate-keys@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bb1280fbabaab6fab2ede585df34900712698210a3bd413f4df5bae6d8c24be36b496c92722ae676a7a67d060a4624f4d6c23b923485f906bfba8773c69f55b4 + checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 languageName: node linkType: hard "@babel/plugin-transform-exponentiation-operator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.5 + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2d660c1b1d51ad5fec1cd5ad426a52187204068c4158f8c4aa977b31535c61b66898d532603eef21c15756827be8277f724c869b888d560f26d7fe848bb5eae + checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 languageName: node linkType: hard "@babel/plugin-transform-for-of@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-for-of@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7b8d4db010bce7273674caa95c4e6abd909362866ce297e86a2ecaa9ae636e05d525415811db9b3c942155df7f3651d19b91dd6c41f142f7308a97c7cb06023 + checksum: a6288122a5091d96c744b9eb23dc1b2d4cce25f109ac1e26a0ea03c4ea60330e6f3cc58530b33ba7369fa07163b71001399a145238b7e92bff6270ef3b9c32a0 languageName: node linkType: hard "@babel/plugin-transform-function-name@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-function-name@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" dependencies: - "@babel/helper-compilation-targets": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cff3b876357999cb8ae30e439c3ec6b0491a53b0aa6f722920a4675a6dd5b53af97a833051df4b34791fe5b3dd326ccf769d5c8e45b322aa50ee11a660b17845 + checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 languageName: node linkType: hard "@babel/plugin-transform-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec37cc2ffb32667af935ab32fe28f00920ec8a1eb999aa6dc6602f2bebd8ba205a558aeedcdccdebf334381d5c57106c61f52332045730393e73410892a9735b + checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed languageName: node linkType: hard "@babel/plugin-transform-member-expression-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec4b0e07915ddd4fda0142fd104ee61015c208608a84cfa13643a95d18760b1dc1ceb6c6e0548898b8c49e5959a994e46367260176dbabc4467f729b21868504 + checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db languageName: node linkType: hard "@babel/plugin-transform-modules-amd@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7da4c4ebbbcf7d182abb59b2046b22d86eee340caf8a22a39ef6a727da2d8acfec1f714fcdcd5054110b280e4934f735e80a6848d192b6834c5d4459a014f04d + checksum: d163737b6a3d67ea579c9aa3b83d4df4b5c34d9dcdf25f415f027c0aa8cded7bac2750d2de5464081f67a042ad9e1c03930c2fab42acd79f9e57c00cf969ddff languageName: node linkType: hard "@babel/plugin-transform-modules-commonjs@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-simple-access": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2067aca8f6454d54ffcce69b02c457cfa61428e11372f6a1d99ff4fcfbb55c396ed2ca6ca886bf06c852e38c1a205b8095921b2364fd0243f3e66bc1dda61caa + checksum: 720a231ceade4ae4d2632478db4e7fecf21987d444942b72d523487ac8d715ca97de6c8f415c71e939595e1a4776403e7dc24ed68fe9125ad4acf57753c9bff7 languageName: node linkType: hard "@babel/plugin-transform-modules-systemjs@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" dependencies: "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 04f4178589543396b3c24330a67a59c5e69af5e96119c9adda730c0f20122deaff54671ebbc72ad2df6495a5db8a758bd96942de95fba7ad427de9c80b1b38c8 + checksum: 0d2fdd993c785aecac9e0850cd5ed7f7d448f0fbb42992a950cc0590167144df25d82af5aac9a5c99ef913d2286782afa44e577af30c10901c5ee8984910fa1f languageName: node linkType: hard "@babel/plugin-transform-modules-umd@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 46622834c54c551b231963b867adbc80854881b3e516ff29984a8da989bd81665bd70e8cba6710345248e97166689310f544aee1a5773e262845a8f1b3e5b8b4 + checksum: 586a7a2241e8b4e753a37af9466a9ffa8a67b4ba9aa756ad7500712c05d8fa9a8c1ed4f7bd25fae2a8265e6cf8fe781ec85a8ee885dd34cf50d8955ee65f12dc languageName: node linkType: hard @@ -794,149 +793,149 @@ __metadata: linkType: hard "@babel/plugin-transform-new-target@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-new-target@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b72112773487a881a1d6ffa680afde08bad699252020e86122180ee7a88854d5da3f15d9bca3331cf2e025df045604494a8208a2e63b486266b07c14e2ffbf3 + checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b languageName: node linkType: hard "@babel/plugin-transform-object-super@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-super@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b71887877d74cb64dbccb5c0324fa67e31171e6a5311991f626650e44a4083e5436a1eaa89da78c0474fb095d4ec322d63ee778b202d33aa2e4194e1ed8e62d7 + checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 languageName: node linkType: hard "@babel/plugin-transform-parameters@npm:^7.10.4, @babel/plugin-transform-parameters@npm:^7.20.7": - version: 7.22.5 - resolution: "@babel/plugin-transform-parameters@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b44f89cf97daf23903776ba27c2ab13b439d80d8c8a95be5c476ab65023b1e0c0e94c28d3745f3b60a58edc4e590fa0cd4287a0293e51401ca7d29a2ddb13b8e + checksum: a735b3e85316d17ec102e3d3d1b6993b429bdb3b494651c9d754e3b7d270462ee1f1a126ccd5e3d871af5e683727e9ef98c9d34d4a42204fffaabff91052ed16 languageName: node linkType: hard "@babel/plugin-transform-property-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 796176a3176106f77fcb8cd04eb34a8475ce82d6d03a88db089531b8f0453a2fb8b0c6ec9a52c27948bc0ea478becec449893741fc546dfc3930ab927e3f9f2e + checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 languageName: node linkType: hard "@babel/plugin-transform-regenerator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-regenerator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - regenerator-transform: ^0.15.1 + regenerator-transform: ^0.15.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f7c5ca5151321963df777cc02725d10d1ccc3b3b8323da0423aecd9ac6144cbdd2274af5281a5580db2fc2f8b234e318517b5d76b85669118906533a559f2b6a + checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 languageName: node linkType: hard "@babel/plugin-transform-reserved-words@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3ffd7dbc425fe8132bfec118b9817572799cab1473113a635d25ab606c1f5a2341a636c04cf6b22df3813320365ed5a965b5eeb3192320a10e4cc2c137bd8bfc + checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 languageName: node linkType: hard "@babel/plugin-transform-shorthand-properties@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a5ac902c56ea8effa99f681340ee61bac21094588f7aef0bc01dff98246651702e677552fa6d10e548c4ac22a3ffad047dd2f8c8f0540b68316c2c203e56818b + checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 languageName: node linkType: hard "@babel/plugin-transform-spread@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-spread@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5587f0deb60b3dfc9b274e269031cc45ec75facccf1933ea2ea71ced9fd3ce98ed91bb36d6cd26817c14474b90ed998c5078415f0eab531caf301496ce24c95c + checksum: 8fd5cac201e77a0b4825745f4e07a25f923842f282f006b3a79223c00f61075c8868d12eafec86b2642cd0b32077cdd32314e27bcb75ee5e6a68c0144140dcf2 languageName: node linkType: hard "@babel/plugin-transform-sticky-regex@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 63b2c575e3e7f96c32d52ed45ee098fb7d354b35c2223b8c8e76840b32cc529ee0c0ceb5742fd082e56e91e3d82842a367ce177e82b05039af3d602c9627a729 + checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 languageName: node linkType: hard "@babel/plugin-transform-template-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e9bb030654cb425381c69754be4abe6a7c75b45cd7f962cd8d604b841b2f0fb7b024f2efc1c25cc53f5b16d79d5e8cfc47cacbdaa983895b3aeefa3e7e24ff + checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 languageName: node linkType: hard "@babel/plugin-transform-typeof-symbol@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 82a53a63ffc3010b689ca9a54e5f53b2718b9f4b4a9818f36f9b7dba234f38a01876680553d2716a645a61920b5e6e4aaf8d4a0064add379b27ca0b403049512 + checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 languageName: node linkType: hard "@babel/plugin-transform-unicode-escapes@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: da5e85ab3bb33a75cbf6181bfd236b208dc934702fd304db127232f17b4e0f42c6d3f238de8589470b4190906967eea8ca27adf3ae9d8ee4de2a2eae906ed186 + checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 languageName: node linkType: hard "@babel/plugin-transform-unicode-regex@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b5d1404c8c623b0ec9bd436c00d885a17d6a34f3f2597996343ddb9d94f6379705b21582dfd4cec2c47fd34068872e74ab6b9580116c0566b3f9447e2a7fa06 + checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a languageName: node linkType: hard @@ -1015,8 +1014,8 @@ __metadata: linkType: hard "@babel/preset-modules@npm:^0.1.3": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" + version: 0.1.6 + resolution: "@babel/preset-modules@npm:0.1.6" dependencies: "@babel/helper-plugin-utils": ^7.0.0 "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 @@ -1024,8 +1023,8 @@ __metadata: "@babel/types": ^7.4.4 esutils: ^2.0.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8430e0e9e9d520b53e22e8c4c6a5a080a12b63af6eabe559c2310b187bd62ae113f3da82ba33e9d1d0f3230930ca702843aae9dd226dec51f7d7114dc1f51c10 + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 9700992d2b9526e703ab49eb8c4cd0b26bec93594d57c6b808967619df1a387565e0e58829b65b5bd6d41049071ea0152c9195b39599515fddb3e52b09a55ff0 languageName: node linkType: hard @@ -1037,51 +1036,51 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.8.4": - version: 7.22.6 - resolution: "@babel/runtime@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/runtime@npm:7.23.5" dependencies: - regenerator-runtime: ^0.13.11 - checksum: e585338287c4514a713babf4fdb8fc2a67adcebab3e7723a739fc62c79cfda875b314c90fd25f827afb150d781af97bc16c85bfdbfa2889f06053879a1ddb597 + regenerator-runtime: ^0.14.0 + checksum: 164d9802424f06908e62d29b8fd3a87db55accf82f46f964ac481dcead11ff7df8391e3696e5fa91a8ca10ea8845bf650acd730fa88cf13f8026cd8d5eec6936 languageName: node linkType: hard -"@babel/template@npm:^7.10.4, @babel/template@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/template@npm:7.22.5" +"@babel/template@npm:^7.10.4, @babel/template@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/template@npm:7.22.15" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/parser": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 + "@babel/code-frame": ^7.22.13 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd languageName: node linkType: hard -"@babel/traverse@npm:^7.10.4, @babel/traverse@npm:^7.22.6": - version: 7.22.8 - resolution: "@babel/traverse@npm:7.22.8" +"@babel/traverse@npm:^7.10.4, @babel/traverse@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/traverse@npm:7.23.5" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.7 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.22.7 - "@babel/types": ^7.22.5 + "@babel/parser": ^7.23.5 + "@babel/types": ^7.23.5 debug: ^4.1.0 globals: ^11.1.0 - checksum: a381369bc3eedfd13ed5fef7b884657f1c29024ea7388198149f0edc34bd69ce3966e9f40188d15f56490a5e12ba250ccc485f2882b53d41b054fccefb233e33 + checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d languageName: node linkType: hard -"@babel/types@npm:^7.10.4, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/types@npm:7.22.5" +"@babel/types@npm:^7.10.4, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.5 + resolution: "@babel/types@npm:7.23.5" dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 to-fast-properties: ^2.0.0 - checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 + checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 languageName: node linkType: hard @@ -1092,10 +1091,17 @@ __metadata: languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb languageName: node linkType: hard @@ -1109,10 +1115,7 @@ __metadata: copy-webpack-plugin: 5.1.1 core-js: 3.6.1 css-loader: 3.5.3 - elkjs: 0.6.2 file-loader: 6.0.0 - jquery: ~3.5.1 - lodash: ~4.17.20 regenerator-runtime: 0.13.5 sass: 1.26.8 sass-loader: 8.0.2 @@ -1136,10 +1139,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard @@ -1160,14 +1163,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -1175,12 +1171,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.18 - resolution: "@jridgewell/trace-mapping@npm:0.3.18" + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 languageName: node linkType: hard @@ -1191,102 +1187,104 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.1 + checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.21 - resolution: "@polka/url@npm:1.0.0-next.21" - checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"@polka/url@npm:^1.0.0-next.20": + version: 1.0.0-next.23 + resolution: "@polka/url@npm:1.0.0-next.23" + checksum: 4b0330de1ceecd1002c7e7449094d0c41f2ed0e21765f4835ccc7b003f2f024ac557d503b9ffdf0918cf50b80d5b8c99dfc5a91927e7b3c468b09c6bb42a3c41 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 languageName: node linkType: hard "@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: "@types/node": "*" - checksum: bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a + checksum: e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee languageName: node linkType: hard "@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.0 - resolution: "@types/connect-history-api-fallback@npm:1.5.0" + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: "@types/express-serve-static-core": "*" "@types/node": "*" - checksum: f180e7c540728d6dd3a1eb2376e445fe7f9de4ee8a5b460d5ad80062cdb6de6efc91c6851f39e9d5933b3dcd5cd370673c52343a959aa091238b6f863ea4447c + checksum: e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "*" - checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard "@types/eslint-scope@npm:^3.7.0": - version: 3.7.4 - resolution: "@types/eslint-scope@npm:3.7.4" + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: "@types/eslint": "*" "@types/estree": "*" - checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e languageName: node linkType: hard "@types/eslint@npm:*": - version: 8.44.0 - resolution: "@types/eslint@npm:8.44.0" + version: 8.44.8 + resolution: "@types/eslint@npm:8.44.8" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 + checksum: c3bc70166075e6e9f7fb43978882b9ac0b22596b519900b08dc8a1d761bbbddec4c48a60cc4eb674601266223c6f11db30f3fb6ceaae96c23c54b35ad88022bc languageName: node linkType: hard "@types/estree@npm:*": - version: 1.0.0 - resolution: "@types/estree@npm:1.0.0" - checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a languageName: node linkType: hard @@ -1298,91 +1296,95 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: cc8995d10c6feda475ec1b3a0e69eb0f35f21ab6b49129ad5c6f279e0bc5de8175bc04ec51304cb79a43eec3ed2f5a1e01472eb6d5f827b8c35c6ca8ad24eb6e + checksum: 12750f6511dd870bbaccfb8208ad1e79361cf197b147f62a3bedc19ec642f3a0f9926ace96705f4bc88ec2ae56f61f7ca8c2438e6b22f5540842b5569c28a121 languageName: node linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5 languageName: node linkType: hard "@types/http-errors@npm:*": - version: 2.0.1 - resolution: "@types/http-errors@npm:2.0.1" - checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 languageName: node linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" + version: 1.17.14 + resolution: "@types/http-proxy@npm:1.17.14" dependencies: "@types/node": "*" - checksum: 38ef4f8c91c7a5b664cf6dd4d90de7863f88549a9f8ef997f2f1184e4f8cf2e7b9b63c04f0b7b962f34a09983073a31a9856de5aae5159b2ddbb905a4c44dc9f + checksum: 491320bce3565bbb6c7d39d25b54bce626237cfb6b09e60ee7f77b56ae7c6cbad76f08d47fe01eaa706781124ee3dfad9bb737049254491efd98ed1f014c4e83 languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d +"@types/mime@npm:*": + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843 languageName: node linkType: hard -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard -"@types/mime@npm:^1": - version: 1.3.2 - resolution: "@types/mime@npm:1.3.2" - checksum: 0493368244cced1a69cb791b485a260a422e6fcc857782e1178d1e6f219f1b161793e9f87f5fae1b219af0f50bee24fcbe733a18b4be8fdd07a38a8fb91146fd +"@types/node-forge@npm:^1.3.0": + version: 1.3.10 + resolution: "@types/node-forge@npm:1.3.10" + dependencies: + "@types/node": "*" + checksum: 363af42c83956c7e2483a71e398a02101ef6a55b4d86386c276315ca98bad02d6050b99fdbe13debcd1bcda250086b4a5b5c15a6fb2953d32420d269865ca7f8 languageName: node linkType: hard "@types/node@npm:*": - version: 18.15.0 - resolution: "@types/node@npm:18.15.0" - checksum: d81372276dd5053b1743338b61a2178ff9722dc609189d01fc7d1c2acd539414039e0e4780678730514390dad3f29c366a28c29e8dbd5b0025651181f6dd6669 + version: 20.10.2 + resolution: "@types/node@npm:20.10.2" + dependencies: + undici-types: ~5.26.4 + checksum: c0c84e8270cdf7a47a18c0230c0321537cc59506adb0e3cba51949b6f1ad4879f2e2ec3a29161f2f5321ebb6415460712d9f0a25ac5c02be0f5435464fe77c23 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.10 + resolution: "@types/qs@npm:6.9.10" + checksum: 3e479ee056bd2b60894baa119d12ecd33f20a25231b836af04654e784c886f28a356477630430152a86fba253da65d7ecd18acffbc2a8877a336e75aa0272c67 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a languageName: node linkType: hard @@ -1394,50 +1396,50 @@ __metadata: linkType: hard "@types/send@npm:*": - version: 0.17.1 - resolution: "@types/send@npm:0.17.1" + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: "@types/mime": ^1 "@types/node": "*" - checksum: 10b620a5960058ef009afbc17686f680d6486277c62f640845381ec4baa0ea683fdd77c3afea4803daf5fcddd3fb2972c8aa32e078939f1d4e96f83195c89793 + checksum: cf4db48251bbb03cd6452b4de6e8e09e2d75390a92fd798eca4a803df06444adc94ed050246c94c7ed46fb97be1f63607f0e1f13c3ce83d71788b3e08640e5e0 languageName: node linkType: hard "@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" dependencies: "@types/express": "*" - checksum: 026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 + checksum: 72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 languageName: node linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.2 - resolution: "@types/serve-static@npm:1.15.2" + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: "@types/http-errors": "*" "@types/mime": "*" "@types/node": "*" - checksum: 15c261dbfc57890f7cc17c04d5b22b418dfa0330c912b46c5d8ae2064da5d6f844ef7f41b63c7f4bbf07675e97ebe6ac804b032635ec742ae45d6f1274259b3e + checksum: 0ff4b3703cf20ba89c9f9e345bc38417860a88e85863c8d6fe274a543220ab7f5f647d307c60a71bb57dc9559f0890a661e8dc771a6ec5ef195d91c8afc4a893 languageName: node linkType: hard "@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: "@types/node": "*" - checksum: b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 + checksum: b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc languageName: node linkType: hard "@types/ws@npm:^8.5.1": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: 3ec416ea2be24042ebd677932a462cf16d2080393d8d7d0b1b3f5d6eaa4a7387aaf0eefb99193c0bfd29444857cf2e0c3ac89899e130550dc6c14ada8a46d25e languageName: node linkType: hard @@ -1639,10 +1641,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 languageName: node linkType: hard @@ -1666,22 +1668,13 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + version: 8.3.0 + resolution: "acorn-walk@npm:8.3.0" + checksum: 15ea56ab6529135be05e7d018f935ca80a572355dd3f6d3cd717e36df3346e0f635a93ae781b1c7942607693e2e5f3ef81af5c6fc697bbadcc377ebda7b7f5f6 languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.8.2": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"acorn@npm:^8.4.1": +"acorn@npm:^8.0.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -1690,23 +1683,12 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" - dependencies: - debug: ^4.1.0 - depd: ^2.0.0 - humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f languageName: node linkType: hard @@ -1810,6 +1792,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -1819,7 +1808,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -1828,6 +1817,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -1838,13 +1834,6 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - "aproba@npm:^1.1.1": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -1852,16 +1841,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -2003,17 +1982,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.12.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.9": - version: 4.21.9 - resolution: "browserslist@npm:4.21.9" +"browserslist@npm:^4.12.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" dependencies: - caniuse-lite: ^1.0.30001503 - electron-to-chromium: ^1.4.431 - node-releases: ^2.0.12 - update-browserslist-db: ^1.0.11 + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 bin: browserslist: cli.js - checksum: 80d3820584e211484ad1b1a5cfdeca1dd00442f47be87e117e1dda34b628c87e18b81ae7986fa5977b3e6a03154f6d13cd763baa6b8bf5dd9dd19f4926603698 + checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 languageName: node linkType: hard @@ -2061,39 +2040,34 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^18.0.0": + version: 18.0.1 + resolution: "cacache@npm:18.0.1" dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 + ssri: ^10.0.0 tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + unique-filename: ^3.0.0 + checksum: 5a0b3b2ea451a0379814dc1d3c81af48c7c6db15cd8f7d72e028501ae0036a599a99bbac9687bfec307afb2760808d1c7708e9477c8c70d2b166e7d80b162a23 languageName: node linkType: hard "call-bind@npm:^1.0.0": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.1 + set-function-length: ^1.1.1 + checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 languageName: node linkType: hard @@ -2104,14 +2078,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001516 - resolution: "caniuse-lite@npm:1.0.30001516" - checksum: 044adf3493b734a356a2922445a30095a0f6de6b9194695cdf74deafe7bef658e85858a31177762c2813f6e1ed2722d832d59eee0ecb2151e93a611ee18cb21f +"caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001565 + resolution: "caniuse-lite@npm:1.0.30001565" + checksum: 7621f358d0e1158557430a111ca5506008ae0b2c796039ef53aeebf4e2ba15e5241cb89def21ea3a633b6a609273085835b44a522165d871fa44067cdf29cccd languageName: node linkType: hard -"chalk@npm:^2.0.0": +"chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -2222,15 +2196,6 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - "colorette@npm:^2.0.10, colorette@npm:^2.0.14": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -2309,13 +2274,6 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -2390,11 +2348,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.6.2": - version: 3.31.1 - resolution: "core-js-compat@npm:3.31.1" + version: 3.33.3 + resolution: "core-js-compat@npm:3.33.3" dependencies: - browserslist: ^4.21.9 - checksum: 9a16d6992621f4e099169297381a28d5712cdef7df1fa85352a7c285a5885d5d7a117ec2eae9ad715ed88c7cc774787a22cdb8aceababf6775fbc8b0cbeccdb7 + browserslist: ^4.22.1 + checksum: cb121e83f0f5f18b2b75428cdfb19524936a18459f1e0358f9124c8ff8b75d6a5901495cb996560cfde3a416103973f78eb5947777bb8b2fd877cdf84471465d languageName: node linkType: hard @@ -2412,7 +2370,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -2471,7 +2429,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -2492,6 +2450,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -2499,14 +2468,7 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0": +"depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -2551,11 +2513,11 @@ __metadata: linkType: hard "dns-packet@npm:^5.2.2": - version: 5.6.0 - resolution: "dns-packet@npm:5.6.0" + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" dependencies: "@leichtgewicht/ip-codec": ^2.0.1 - checksum: 1b643814e5947a87620f8a906287079347492282964ce1c236d52c414e3e3941126b96581376b180ba6e66899e70b86b587bc1aa23e3acd9957765be952d83fc + checksum: 64c06457f0c6e143f7a0946e0aeb8de1c5f752217cfa143ef527467c00a6d78db1835cfdb6bb68333d9f9a4963cf23f410439b5262a8935cce1236f45e344b81 languageName: node linkType: hard @@ -2578,6 +2540,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -2585,17 +2554,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.431": - version: 1.4.463 - resolution: "electron-to-chromium@npm:1.4.463" - checksum: 0f8d9b7ac7bcd48ae1963827a752d8c1d1f36d84e778e818a8027ea708f81b58faa0b599c964777e8245277f06ac45828515975fc7e1e08ed20e360571600c2c - languageName: node - linkType: hard - -"elkjs@npm:0.6.2": - version: 0.6.2 - resolution: "elkjs@npm:0.6.2" - checksum: da992bf84bc24c42cd60737bcdfe16a9b2670c09ba17fe3e899a3ae59ebb9fc5371a167545b01c2aa1bde1338122e4b2e5bb6b3a75154404fd15ba3dcdff168b +"electron-to-chromium@npm:^1.4.535": + version: 1.4.601 + resolution: "electron-to-chromium@npm:1.4.601" + checksum: 6c6d090afaab83f49fe413c2558a3294e7dfce6a9d8afda3496a80ba59377901279ea7903122558399d5f5dbbdcca8562e3e826b7b78e7ec0b561fcc02c45f73 languageName: node linkType: hard @@ -2606,6 +2568,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -2656,11 +2625,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.10.0 - resolution: "envinfo@npm:7.10.0" + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" bin: envinfo: dist/cli.js - checksum: 05e81a5768c42cbd5c580dc3f274db3401facadd53e9bd52e2aa49dfbb5d8b26f6181c25a6652d79618a6994185bd2b1c137673101690b147f758e4e71d42f7d + checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef languageName: node linkType: hard @@ -2777,6 +2746,13 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + "express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" @@ -2919,6 +2895,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + "flush-write-stream@npm:^1.0.0": version: 1.1.1 resolution: "flush-write-stream@npm:1.1.1" @@ -2930,12 +2915,22 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: debug: optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 languageName: node linkType: hard @@ -2963,7 +2958,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": +"fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -2972,10 +2967,19 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + "fs-monkey@npm:^1.0.4": - version: 1.0.4 - resolution: "fs-monkey@npm:1.0.4" - checksum: 8b254c982905c0b7e028eab22b410dc35a5c0019c1c860456f5f54ae6a61666e1cb8c6b700d6c88cc873694c00953c935847b9959cc4dcf274aacb8673c1e8bf + version: 1.0.5 + resolution: "fs-monkey@npm:1.0.5" + checksum: 424b67f65b37fe66117ae2bb061f790fe6d4b609e1d160487c74b3d69fbf42f262c665ccfba32e8b5f113f96f92e9a58fcdebe42d5f6649bdfc72918093a3119 languageName: node linkType: hard @@ -2999,44 +3003,28 @@ __metadata: linkType: hard "fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 conditions: os=darwin languageName: node linkType: hard "fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: latest conditions: os=darwin languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard @@ -3047,14 +3035,15 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.0 - resolution: "get-intrinsic@npm:1.2.0" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 + function-bind: ^1.1.2 + has-proto: ^1.0.1 has-symbols: ^1.0.3 - checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d + hasown: ^2.0.0 + checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 languageName: node linkType: hard @@ -3091,6 +3080,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + "glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -3105,19 +3109,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -3139,17 +3130,19 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.4": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard @@ -3183,26 +3176,35 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-property-descriptors@npm:^1.0.0": + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.2 + checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e languageName: node linkType: hard -"has@npm:^1.0.3": +"has-symbols@npm:^1.0.3": version: 1.0.3 - resolution: "has@npm:1.0.3" + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 languageName: node linkType: hard @@ -3225,7 +3227,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -3271,14 +3273,13 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 languageName: node linkType: hard @@ -3311,13 +3312,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" dependencies: - agent-base: 6 + agent-base: ^7.0.2 debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 languageName: node linkType: hard @@ -3328,15 +3329,6 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -3404,7 +3396,7 @@ __metadata: languageName: node linkType: hard -"infer-owner@npm:^1.0.3, infer-owner@npm:^1.0.4": +"infer-owner@npm:^1.0.3": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 @@ -3488,21 +3480,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.12.0": - version: 2.12.1 - resolution: "is-core-module@npm:2.12.1" +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 - languageName: node - linkType: hard - -"is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" - dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c languageName: node linkType: hard @@ -3607,6 +3590,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + "isobject@npm:^3.0.1": version: 3.0.1 resolution: "isobject@npm:3.0.1" @@ -3614,6 +3604,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + "jest-worker@npm:^27.4.5": version: 27.5.1 resolution: "jest-worker@npm:27.5.1" @@ -3625,13 +3628,6 @@ __metadata: languageName: node linkType: hard -"jquery@npm:~3.5.1": - version: 3.5.1 - resolution: "jquery@npm:3.5.1" - checksum: 813047b852511ca1ecfaa7b2568aba1d7270a92e5c74962b308792a401adf041869a3b2a6858b0b7a02f6684947fb93171e40cbb4460831977a937b40b0e15ce - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -3769,7 +3765,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.13, lodash@npm:^4.17.20, lodash@npm:~4.17.20": +"lodash@npm:^4.17.13, lodash@npm:^4.17.20": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -3787,6 +3783,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -3805,13 +3808,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - "make-dir@npm:^2.0.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -3822,27 +3818,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 + http-cache-semantics: ^4.1.1 is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + ssri: ^10.0.0 + checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af languageName: node linkType: hard @@ -3941,12 +3932,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" dependencies: brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 languageName: node linkType: hard @@ -3957,27 +3948,27 @@ __metadata: languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" dependencies: encoding: ^0.1.13 - minipass: ^3.1.6 + minipass: ^7.0.3 minipass-sized: ^1.0.3 minizlib: ^2.1.2 dependenciesMeta: encoding: optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a languageName: node linkType: hard @@ -4008,7 +3999,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -4017,10 +4008,17 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.2.4 - resolution: "minipass@npm:4.2.4" - checksum: c664f2ae4401408d1e7a6e4f50aca45f87b1b0634bc9261136df5c378e313e77355765f73f59c4a5abcadcdf43d83fcd3eb14e4a7cdcce8e36508e2290345753 +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 languageName: node linkType: hard @@ -4063,7 +4061,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -4107,7 +4105,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0": +"ms@npm:2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -4148,40 +4146,40 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" dependencies: env-paths: ^2.2.0 - glob: ^7.1.4 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 semver: ^7.3.5 tar: ^6.1.2 - which: ^2.0.2 + which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f languageName: node linkType: hard -"node-releases@npm:^2.0.12": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 +"node-releases@npm:^2.0.13": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" dependencies: - abbrev: ^1.0.0 + abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410 languageName: node linkType: hard @@ -4201,22 +4199,10 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - "object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f languageName: node linkType: hard @@ -4394,6 +4380,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -4531,6 +4527,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -4597,9 +4600,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard @@ -4655,7 +4658,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.6": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -4694,11 +4697,11 @@ __metadata: linkType: hard "regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.0 - resolution: "regenerate-unicode-properties@npm:10.1.0" + version: 10.1.1 + resolution: "regenerate-unicode-properties@npm:10.1.1" dependencies: regenerate: ^1.4.2 - checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17 + checksum: b80958ef40f125275824c2c47d5081dfaefebd80bff26c76761e9236767c748a4a95a69c053fe29d2df881177f2ca85df4a71fe70a82360388b31159ef19adcf languageName: node linkType: hard @@ -4716,19 +4719,19 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.11": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 languageName: node linkType: hard -"regenerator-transform@npm:^0.15.1": - version: 0.15.1 - resolution: "regenerator-transform@npm:0.15.1" +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" dependencies: "@babel/runtime": ^7.8.4 - checksum: 2d15bdeadbbfb1d12c93f5775493d85874dbe1d405bec323da5c61ec6e701bc9eea36167483e1a5e752de9b2df59ab9a2dfff6bf3784f2b28af2279a673d29a4 + checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 languageName: node linkType: hard @@ -4787,55 +4790,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.3.2": - version: 1.22.3 - resolution: "resolve@npm:1.22.3" - dependencies: - is-core-module: ^2.12.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 - languageName: node - linkType: hard - -"resolve@npm:^1.9.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" +"resolve@npm:^1.1.6, resolve@npm:^1.3.2, resolve@npm:^1.9.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.3.2#~builtin": - version: 1.22.3 - resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.3.2#~builtin, resolve@patch:resolve@^1.9.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.12.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.9.0#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 languageName: node linkType: hard @@ -4994,11 +4971,12 @@ __metadata: linkType: hard "selfsigned@npm:^2.0.1": - version: 2.1.1 - resolution: "selfsigned@npm:2.1.1" + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" dependencies: + "@types/node-forge": ^1.3.0 node-forge: ^1 - checksum: aa9ce2150a54838978d5c0aee54d7ebe77649a32e4e690eb91775f71fdff773874a4fbafd0ac73d8ec3b702ff8a395c604df4f8e8868528f36fd6c15076fb43a + checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa languageName: node linkType: hard @@ -5021,13 +4999,13 @@ __metadata: linkType: hard "semver@npm:^7.3.5": - version: 7.3.8 - resolution: "semver@npm:7.3.8" + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -5095,10 +5073,15 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: ^1.1.1 + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 languageName: node linkType: hard @@ -5165,13 +5148,20 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + "sirv@npm:^1.0.7": version: 1.0.19 resolution: "sirv@npm:1.0.19" @@ -5208,18 +5198,18 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: ^7.0.2 + debug: ^4.3.4 + socks: ^2.7.1 + checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: @@ -5280,6 +5270,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + "ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -5289,15 +5288,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -5329,7 +5319,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -5340,6 +5330,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -5358,7 +5359,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -5367,6 +5368,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -5428,16 +5438,16 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" + version: 6.2.0 + resolution: "tar@npm:6.2.0" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 - minipass: ^4.0.0 + minipass: ^5.0.0 minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c languageName: node linkType: hard @@ -5464,8 +5474,8 @@ __metadata: linkType: hard "terser@npm:^5.16.8": - version: 5.19.1 - resolution: "terser@npm:5.19.1" + version: 5.24.0 + resolution: "terser@npm:5.24.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -5473,7 +5483,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 18657b2a282238a1ca9c825efa966f4dd043a33196b2f8a7a2cba406a2006e14f55295b9d9cf6380a18599b697e9579e4092c99b9f40c7871ceec01cc98e3606 + checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c languageName: node linkType: hard @@ -5541,6 +5551,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -5581,12 +5598,12 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df languageName: node linkType: hard @@ -5599,12 +5616,12 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 languageName: node linkType: hard @@ -5615,9 +5632,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.11": - version: 1.0.11 - resolution: "update-browserslist-db@npm:1.0.11" +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" dependencies: escalade: ^3.1.1 picocolors: ^1.0.0 @@ -5625,7 +5642,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 languageName: node linkType: hard @@ -5818,12 +5835,13 @@ __metadata: linkType: hard "webpack-merge@npm:^5.7.3": - version: 5.9.0 - resolution: "webpack-merge@npm:5.9.0" + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" dependencies: clone-deep: ^4.0.1 + flat: ^5.0.2 wildcard: ^2.0.0 - checksum: 64fe2c23aacc5f19684452a0e84ec02c46b990423aee6fcc5c18d7d471155bd14e9a6adb02bd3656eb3e0ac2532c8e97d69412ad14c97eeafe32fa6d10050872 + checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f languageName: node linkType: hard @@ -5889,7 +5907,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -5900,12 +5918,14 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 languageName: node linkType: hard @@ -5916,6 +5936,28 @@ __metadata: languageName: node linkType: hard +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -5939,8 +5981,8 @@ __metadata: linkType: hard "ws@npm:^8.4.2": - version: 8.13.0 - resolution: "ws@npm:8.13.0" + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -5949,7 +5991,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b languageName: node linkType: hard diff --git a/packages/joint-core/demo/elk/package.json b/packages/joint-core/demo/elk/package.json index 76b9be4df..7dc7e6ce6 100644 --- a/packages/joint-core/demo/elk/package.json +++ b/packages/joint-core/demo/elk/package.json @@ -16,8 +16,7 @@ "start": "webpack serve --config webpack.config.js" }, "dependencies": { - "jquery": "~3.5.1", - "lodash": "~4.17.20" + "elkjs": "0.6.2" }, "devDependencies": { "@babel/core": "7.10.4", @@ -26,7 +25,6 @@ "copy-webpack-plugin": "5.1.1", "core-js": "3.6.1", "css-loader": "3.5.3", - "elkjs": "0.6.2", "file-loader": "6.0.0", "regenerator-runtime": "0.13.5", "sass": "1.26.8", diff --git a/packages/joint-core/demo/elk/yarn.lock b/packages/joint-core/demo/elk/yarn.lock index 0aa52fd80..9074612b2 100644 --- a/packages/joint-core/demo/elk/yarn.lock +++ b/packages/joint-core/demo/elk/yarn.lock @@ -5,19 +5,20 @@ __metadata: version: 6 cacheKey: 8 -"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/code-frame@npm:7.22.5" +"@babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" dependencies: - "@babel/highlight": ^7.22.5 - checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a languageName: node linkType: hard "@babel/compat-data@npm:^7.10.4, @babel/compat-data@npm:^7.20.5, @babel/compat-data@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/compat-data@npm:7.22.9" - checksum: bed77d9044ce948b4327b30dd0de0779fa9f3a7ed1f2d31638714ed00229fa71fc4d1617ae0eb1fad419338d3658d0e9a5a083297451e09e73e078d0347ff808 + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 languageName: node linkType: hard @@ -45,15 +46,15 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.10.4, @babel/generator@npm:^7.22.7": - version: 7.22.9 - resolution: "@babel/generator@npm:7.22.9" +"@babel/generator@npm:^7.10.4, @babel/generator@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/generator@npm:7.23.5" dependencies: - "@babel/types": ^7.22.5 + "@babel/types": ^7.23.5 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 7c9d2c58b8d5ac5e047421a6ab03ec2ff5d9a5ff2c2212130a0055e063ac349e0b19d435537d6886c999771aef394832e4f54cd9fc810100a7f23d982f6af06b + checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 languageName: node linkType: hard @@ -66,76 +67,74 @@ __metadata: languageName: node linkType: hard -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.5" +"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: d753acac62399fc6dd354cf1b9441bde0c331c2fe792a4c14904c5e5eafc3cac79478f6aa038e8a51c1148b0af6710a2e619855e4b5d54497ac972eaffed5884 + "@babel/types": ^7.22.15 + checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.10.4, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.9 - resolution: "@babel/helper-compilation-targets@npm:7.22.9" +"@babel/helper-compilation-targets@npm:^7.10.4, @babel/helper-compilation-targets@npm:^7.20.7, @babel/helper-compilation-targets@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 browserslist: ^4.21.9 lru-cache: ^5.1.1 semver: ^6.3.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: ea0006c6a93759025f4a35a25228ae260538c9f15023e8aac2a6d45ca68aef4cf86cfc429b19af9a402cbdd54d5de74ad3fbcf6baa7e48184dc079f1a791e178 + checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 languageName: node linkType: hard "@babel/helper-create-class-features-plugin@npm:^7.18.6": - version: 7.22.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.9" + version: 7.23.5 + resolution: "@babel/helper-create-class-features-plugin@npm:7.23.5" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 + "@babel/helper-member-expression-to-functions": ^7.23.0 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.9 + "@babel/helper-replace-supers": ^7.22.20 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 6c2436d1a5a3f1ff24628d78fa8c6d3120c40285aa3eda7815b1adbf8c5951e0dd73d368cf845825888fa3dc2f207dadce53309825598d7c67953e5ed9dd51d2 + checksum: fe7c6c0baca1838bba76ac1330df47b661d932354115ea9e2ea65b179f80b717987d3c3da7e1525fd648e5f2d86c620efc959cabda4d7562b125a27c3ac780d0 languageName: node linkType: hard -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.9" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.15, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 regexpu-core: ^5.3.1 semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 87cb48a7ee898ab205374274364c3adc70b87b08c7bd07f51019ae4562c0170d7148e654d591f825dee14b5fe11666a0e7966872dfdbfa0d1b94b861ecf0e4e1 + checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-environment-visitor@npm:7.22.5" - checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 +"@babel/helper-environment-visitor@npm:^7.18.9, @babel/helper-environment-visitor@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-function-name@npm:7.22.5" +"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" dependencies: - "@babel/template": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 6b1f6ce1b1f4e513bf2c8385a557ea0dd7fa37971b9002ad19268ca4384bbe90c09681fe4c076013f33deabc63a53b341ed91e792de741b4b35e01c00238177a + "@babel/template": ^7.22.15 + "@babel/types": ^7.23.0 + checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 languageName: node linkType: hard @@ -148,36 +147,36 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-member-expression-to-functions@npm:7.22.5" +"@babel/helper-member-expression-to-functions@npm:^7.22.15, @babel/helper-member-expression-to-functions@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" dependencies: - "@babel/types": ^7.22.5 - checksum: 4bd5791529c280c00743e8bdc669ef0d4cd1620d6e3d35e0d42b862f8262bc2364973e5968007f960780344c539a4b9cf92ab41f5b4f94560a9620f536de2a39 + "@babel/types": ^7.23.0 + checksum: 494659361370c979ada711ca685e2efe9460683c36db1b283b446122596602c901e291e09f2f980ecedfe6e0f2bd5386cb59768285446530df10c14df1024e75 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" +"@babel/helper-module-imports@npm:^7.10.4, @babel/helper-module-imports@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad + "@babel/types": ^7.22.15 + checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.10.4, @babel/helper-module-transforms@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-module-transforms@npm:7.22.9" +"@babel/helper-module-transforms@npm:^7.10.4, @babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-simple-access": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 2751f77660518cf4ff027514d6f4794f04598c6393be7b04b8e46c6e21606e11c19f3f57ab6129a9c21bacdf8b3ffe3af87bb401d972f34af2d0ffde02ac3001 + checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 languageName: node linkType: hard @@ -197,29 +196,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.5": - version: 7.22.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.9" +"@babel/helper-remap-async-to-generator@npm:^7.18.9, @babel/helper-remap-async-to-generator@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-wrap-function": ^7.22.9 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-wrap-function": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 05538079447829b13512157491cc77f9cf1ea7e1680e15cff0682c3ed9ee162de0c4862ece20a6d6b2df28177a1520bcfe45993fbeccf2747a81795a7c3f6290 + checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/helper-replace-supers@npm:7.22.9" +"@babel/helper-replace-supers@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-member-expression-to-functions": ^7.22.15 "@babel/helper-optimise-call-expression": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: d41471f56ff2616459d35a5df1900d5f0756ae78b1027040365325ef332d66e08e3be02a9489756d870887585ff222403a228546e93dd7019e19e59c0c0fe586 + checksum: a0008332e24daedea2e9498733e3c39b389d6d4512637e000f96f62b797e702ee24a407ccbcd7a236a551590a38f31282829a8ef35c50a3c0457d88218cae639 languageName: node linkType: hard @@ -250,66 +249,66 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-string-parser@npm:7.22.5" - checksum: 836851ca5ec813077bbb303acc992d75a360267aa3b5de7134d220411c852a6f17de7c0d0b8c8dcc0f567f67874c00f4528672b2a4f1bc978a3ada64c8c78467 +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-option@npm:7.22.5" - checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 +"@babel/helper-validator-option@npm:^7.22.15": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.9": - version: 7.22.9 - resolution: "@babel/helper-wrap-function@npm:7.22.9" +"@babel/helper-wrap-function@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-wrap-function@npm:7.22.20" dependencies: "@babel/helper-function-name": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 037317dc06dac6593e388738ae1d3e43193bc1d31698f067c0ef3d4dc6f074dbed860ed42aa137b48a67aa7cb87336826c4bdc13189260481bcf67eb7256c789 + "@babel/template": ^7.22.15 + "@babel/types": ^7.22.19 + checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca languageName: node linkType: hard "@babel/helpers@npm:^7.10.4": - version: 7.22.6 - resolution: "@babel/helpers@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/helpers@npm:7.23.5" dependencies: - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.6 - "@babel/types": ^7.22.5 - checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.5 + "@babel/types": ^7.23.5 + checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 languageName: node linkType: hard -"@babel/highlight@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/highlight@npm:7.22.5" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: - "@babel/helper-validator-identifier": ^7.22.5 - chalk: ^2.0.0 + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 languageName: node linkType: hard -"@babel/parser@npm:^7.10.4, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/parser@npm:7.22.7" +"@babel/parser@npm:^7.10.4, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/parser@npm:7.23.5" bin: parser: ./bin/babel-parser.js - checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 + checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 languageName: node linkType: hard @@ -562,222 +561,222 @@ __metadata: linkType: hard "@babel/plugin-transform-arrow-functions@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 35abb6c57062802c7ce8bd96b2ef2883e3124370c688bbd67609f7d2453802fb73944df8808f893b6c67de978eb2bcf87bbfe325e46d6f39b5fcb09ece11d01a + checksum: 1e99118176e5366c2636064d09477016ab5272b2a92e78b8edb571d20bc3eaa881789a905b20042942c3c2d04efc530726cf703f937226db5ebc495f5d067e66 languageName: node linkType: hard "@babel/plugin-transform-async-to-generator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.23.3" dependencies: - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b95f23f99dcb379a9f0a1c2a3bbea3f8dc0e1b16dc1ac8b484fe378370169290a7a63d520959a9ba1232837cf74a80e23f6facbe14fd42a3cda6d3c2d7168e62 + checksum: 2e9d9795d4b3b3d8090332104e37061c677f29a1ce65bcbda4099a32d243e5d9520270a44bbabf0fb1fb40d463bd937685b1a1042e646979086c546d55319c3c languageName: node linkType: hard "@babel/plugin-transform-block-scoped-functions@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 416b1341858e8ca4e524dee66044735956ced5f478b2c3b9bc11ec2285b0c25d7dbb96d79887169eb938084c95d0a89338c8b2fe70d473bd9dc92e5d9db1732c + checksum: e63b16d94ee5f4d917e669da3db5ea53d1e7e79141a2ec873c1e644678cdafe98daa556d0d359963c827863d6b3665d23d4938a94a4c5053a1619c4ebd01d020 languageName: node linkType: hard "@babel/plugin-transform-block-scoping@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.22.5" + version: 7.23.4 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.4" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 26987002cfe6e24544e60fa35f07052b6557f590c1a1cc5cf35d6dc341d7fea163c1222a2d70d5d2692f0b9860d942fd3ba979848b2995d4debffa387b9b19ae + checksum: fc4b2100dd9f2c47d694b4b35ae8153214ccb4e24ef545c259a9db17211b18b6a430f22799b56db8f6844deaeaa201af45a03331d0c80cc28b0c4e3c814570e4 languageName: node linkType: hard "@babel/plugin-transform-classes@npm:^7.10.4": - version: 7.22.6 - resolution: "@babel/plugin-transform-classes@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/plugin-transform-classes@npm:7.23.5" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8380e855c01033dbc7460d9acfbc1fc37c880350fa798c2de8c594ef818ade0e4c96173ec72f05f2a4549d8d37135e18cb62548352d51557b45a0fb4388d2f3f + checksum: 6d0dd3b0828e84a139a51b368f33f315edee5688ef72c68ba25e0175c68ea7357f9c8810b3f61713e368a3063cdcec94f3a2db952e453b0b14ef428a34aa8169 languageName: node linkType: hard "@babel/plugin-transform-computed-properties@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-computed-properties@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-computed-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/template": ^7.22.5 + "@babel/template": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c2a77a0f94ec71efbc569109ec14ea2aa925b333289272ced8b33c6108bdbb02caf01830ffc7e49486b62dec51911924d13f3a76f1149f40daace1898009e131 + checksum: 80452661dc25a0956f89fe98cb562e8637a9556fb6c00d312c57653ce7df8798f58d138603c7e1aad96614ee9ccd10c47e50ab9ded6b6eded5adeb230d2a982e languageName: node linkType: hard "@babel/plugin-transform-destructuring@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-destructuring@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 76f6ea2aee1fcfa1c3791eb7a5b89703c6472650b993e8666fff0f1d6e9d737a84134edf89f63c92297f3e75064c1263219463b02dd9bc7434b6e5b9935e3f20 + checksum: 9e015099877272501162419bfe781689aec5c462cd2aec752ee22288f209eec65969ff11b8fdadca2eaddea71d705d3bba5b9c60752fcc1be67874fcec687105 languageName: node linkType: hard "@babel/plugin-transform-dotall-regex@npm:^7.10.4, @babel/plugin-transform-dotall-regex@npm:^7.4.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 409b658d11e3082c8f69e9cdef2d96e4d6d11256f005772425fb230cc48fd05945edbfbcb709dab293a1a2f01f9c8a5bb7b4131e632b23264039d9f95864b453 + checksum: a2dbbf7f1ea16a97948c37df925cb364337668c41a3948b8d91453f140507bd8a3429030c7ce66d09c299987b27746c19a2dd18b6f17dcb474854b14fd9159a3 languageName: node linkType: hard "@babel/plugin-transform-duplicate-keys@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: bb1280fbabaab6fab2ede585df34900712698210a3bd413f4df5bae6d8c24be36b496c92722ae676a7a67d060a4624f4d6c23b923485f906bfba8773c69f55b4 + checksum: c2a21c34dc0839590cd945192cbc46fde541a27e140c48fe1808315934664cdbf18db64889e23c4eeb6bad9d3e049482efdca91d29de5734ffc887c4fbabaa16 languageName: node linkType: hard "@babel/plugin-transform-exponentiation-operator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.23.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.5 + "@babel/helper-builder-binary-assignment-operator-visitor": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2d660c1b1d51ad5fec1cd5ad426a52187204068c4158f8c4aa977b31535c61b66898d532603eef21c15756827be8277f724c869b888d560f26d7fe848bb5eae + checksum: 00d05ab14ad0f299160fcf9d8f55a1cc1b740e012ab0b5ce30207d2365f091665115557af7d989cd6260d075a252d9e4283de5f2b247dfbbe0e42ae586e6bf66 languageName: node linkType: hard "@babel/plugin-transform-for-of@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-for-of@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-for-of@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7b8d4db010bce7273674caa95c4e6abd909362866ce297e86a2ecaa9ae636e05d525415811db9b3c942155df7f3651d19b91dd6c41f142f7308a97c7cb06023 + checksum: a6288122a5091d96c744b9eb23dc1b2d4cce25f109ac1e26a0ea03c4ea60330e6f3cc58530b33ba7369fa07163b71001399a145238b7e92bff6270ef3b9c32a0 languageName: node linkType: hard "@babel/plugin-transform-function-name@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-function-name@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-function-name@npm:7.23.3" dependencies: - "@babel/helper-compilation-targets": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: cff3b876357999cb8ae30e439c3ec6b0491a53b0aa6f722920a4675a6dd5b53af97a833051df4b34791fe5b3dd326ccf769d5c8e45b322aa50ee11a660b17845 + checksum: 355c6dbe07c919575ad42b2f7e020f320866d72f8b79181a16f8e0cd424a2c761d979f03f47d583d9471b55dcd68a8a9d829b58e1eebcd572145b934b48975a6 languageName: node linkType: hard "@babel/plugin-transform-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec37cc2ffb32667af935ab32fe28f00920ec8a1eb999aa6dc6602f2bebd8ba205a558aeedcdccdebf334381d5c57106c61f52332045730393e73410892a9735b + checksum: 519a544cd58586b9001c4c9b18da25a62f17d23c48600ff7a685d75ca9eb18d2c5e8f5476f067f0a8f1fea2a31107eff950b9864833061e6076dcc4bdc3e71ed languageName: node linkType: hard "@babel/plugin-transform-member-expression-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: ec4b0e07915ddd4fda0142fd104ee61015c208608a84cfa13643a95d18760b1dc1ceb6c6e0548898b8c49e5959a994e46367260176dbabc4467f729b21868504 + checksum: 95cec13c36d447c5aa6b8e4c778b897eeba66dcb675edef01e0d2afcec9e8cb9726baf4f81b4bbae7a782595aed72e6a0d44ffb773272c3ca180fada99bf92db languageName: node linkType: hard "@babel/plugin-transform-modules-amd@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7da4c4ebbbcf7d182abb59b2046b22d86eee340caf8a22a39ef6a727da2d8acfec1f714fcdcd5054110b280e4934f735e80a6848d192b6834c5d4459a014f04d + checksum: d163737b6a3d67ea579c9aa3b83d4df4b5c34d9dcdf25f415f027c0aa8cded7bac2750d2de5464081f67a042ad9e1c03930c2fab42acd79f9e57c00cf969ddff languageName: node linkType: hard "@babel/plugin-transform-modules-commonjs@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-simple-access": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2067aca8f6454d54ffcce69b02c457cfa61428e11372f6a1d99ff4fcfbb55c396ed2ca6ca886bf06c852e38c1a205b8095921b2364fd0243f3e66bc1dda61caa + checksum: 720a231ceade4ae4d2632478db4e7fecf21987d444942b72d523487ac8d715ca97de6c8f415c71e939595e1a4776403e7dc24ed68fe9125ad4acf57753c9bff7 languageName: node linkType: hard "@babel/plugin-transform-modules-systemjs@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.3" dependencies: "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 04f4178589543396b3c24330a67a59c5e69af5e96119c9adda730c0f20122deaff54671ebbc72ad2df6495a5db8a758bd96942de95fba7ad427de9c80b1b38c8 + checksum: 0d2fdd993c785aecac9e0850cd5ed7f7d448f0fbb42992a950cc0590167144df25d82af5aac9a5c99ef913d2286782afa44e577af30c10901c5ee8984910fa1f languageName: node linkType: hard "@babel/plugin-transform-modules-umd@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-umd@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-modules-umd@npm:7.23.3" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.3 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 46622834c54c551b231963b867adbc80854881b3e516ff29984a8da989bd81665bd70e8cba6710345248e97166689310f544aee1a5773e262845a8f1b3e5b8b4 + checksum: 586a7a2241e8b4e753a37af9466a9ffa8a67b4ba9aa756ad7500712c05d8fa9a8c1ed4f7bd25fae2a8265e6cf8fe781ec85a8ee885dd34cf50d8955ee65f12dc languageName: node linkType: hard @@ -794,149 +793,149 @@ __metadata: linkType: hard "@babel/plugin-transform-new-target@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-new-target@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-new-target@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b72112773487a881a1d6ffa680afde08bad699252020e86122180ee7a88854d5da3f15d9bca3331cf2e025df045604494a8208a2e63b486266b07c14e2ffbf3 + checksum: e5053389316fce73ad5201b7777437164f333e24787fbcda4ae489cd2580dbbbdfb5694a7237bad91fabb46b591d771975d69beb1c740b82cb4761625379f00b languageName: node linkType: hard "@babel/plugin-transform-object-super@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-super@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-object-super@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b71887877d74cb64dbccb5c0324fa67e31171e6a5311991f626650e44a4083e5436a1eaa89da78c0474fb095d4ec322d63ee778b202d33aa2e4194e1ed8e62d7 + checksum: e495497186f621fa79026e183b4f1fbb172fd9df812cbd2d7f02c05b08adbe58012b1a6eb6dd58d11a30343f6ec80d0f4074f9b501d70aa1c94df76d59164c53 languageName: node linkType: hard "@babel/plugin-transform-parameters@npm:^7.10.4, @babel/plugin-transform-parameters@npm:^7.20.7": - version: 7.22.5 - resolution: "@babel/plugin-transform-parameters@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-parameters@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b44f89cf97daf23903776ba27c2ab13b439d80d8c8a95be5c476ab65023b1e0c0e94c28d3745f3b60a58edc4e590fa0cd4287a0293e51401ca7d29a2ddb13b8e + checksum: a735b3e85316d17ec102e3d3d1b6993b429bdb3b494651c9d754e3b7d270462ee1f1a126ccd5e3d871af5e683727e9ef98c9d34d4a42204fffaabff91052ed16 languageName: node linkType: hard "@babel/plugin-transform-property-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-property-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-property-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 796176a3176106f77fcb8cd04eb34a8475ce82d6d03a88db089531b8f0453a2fb8b0c6ec9a52c27948bc0ea478becec449893741fc546dfc3930ab927e3f9f2e + checksum: 16b048c8e87f25095f6d53634ab7912992f78e6997a6ff549edc3cf519db4fca01c7b4e0798530d7f6a05228ceee479251245cdd850a5531c6e6f404104d6cc9 languageName: node linkType: hard "@babel/plugin-transform-regenerator@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-regenerator@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-regenerator@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - regenerator-transform: ^0.15.1 + regenerator-transform: ^0.15.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f7c5ca5151321963df777cc02725d10d1ccc3b3b8323da0423aecd9ac6144cbdd2274af5281a5580db2fc2f8b234e318517b5d76b85669118906533a559f2b6a + checksum: 7fdacc7b40008883871b519c9e5cdea493f75495118ccc56ac104b874983569a24edd024f0f5894ba1875c54ee2b442f295d6241c3280e61c725d0dd3317c8e6 languageName: node linkType: hard "@babel/plugin-transform-reserved-words@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-reserved-words@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-reserved-words@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3ffd7dbc425fe8132bfec118b9817572799cab1473113a635d25ab606c1f5a2341a636c04cf6b22df3813320365ed5a965b5eeb3192320a10e4cc2c137bd8bfc + checksum: 298c4440ddc136784ff920127cea137168e068404e635dc946ddb5d7b2a27b66f1dd4c4acb01f7184478ff7d5c3e7177a127279479926519042948fb7fa0fa48 languageName: node linkType: hard "@babel/plugin-transform-shorthand-properties@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: a5ac902c56ea8effa99f681340ee61bac21094588f7aef0bc01dff98246651702e677552fa6d10e548c4ac22a3ffad047dd2f8c8f0540b68316c2c203e56818b + checksum: 5d677a03676f9fff969b0246c423d64d77502e90a832665dc872a5a5e05e5708161ce1effd56bb3c0f2c20a1112fca874be57c8a759d8b08152755519281f326 languageName: node linkType: hard "@babel/plugin-transform-spread@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-spread@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-spread@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 5587f0deb60b3dfc9b274e269031cc45ec75facccf1933ea2ea71ced9fd3ce98ed91bb36d6cd26817c14474b90ed998c5078415f0eab531caf301496ce24c95c + checksum: 8fd5cac201e77a0b4825745f4e07a25f923842f282f006b3a79223c00f61075c8868d12eafec86b2642cd0b32077cdd32314e27bcb75ee5e6a68c0144140dcf2 languageName: node linkType: hard "@babel/plugin-transform-sticky-regex@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 63b2c575e3e7f96c32d52ed45ee098fb7d354b35c2223b8c8e76840b32cc529ee0c0ceb5742fd082e56e91e3d82842a367ce177e82b05039af3d602c9627a729 + checksum: 53e55eb2575b7abfdb4af7e503a2bf7ef5faf8bf6b92d2cd2de0700bdd19e934e5517b23e6dfed94ba50ae516b62f3f916773ef7d9bc81f01503f585051e2949 languageName: node linkType: hard "@babel/plugin-transform-template-literals@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-template-literals@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-template-literals@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 27e9bb030654cb425381c69754be4abe6a7c75b45cd7f962cd8d604b841b2f0fb7b024f2efc1c25cc53f5b16d79d5e8cfc47cacbdaa983895b3aeefa3e7e24ff + checksum: b16c5cb0b8796be0118e9c144d15bdc0d20a7f3f59009c6303a6e9a8b74c146eceb3f05186f5b97afcba7cfa87e34c1585a22186e3d5b22f2fd3d27d959d92b2 languageName: node linkType: hard "@babel/plugin-transform-typeof-symbol@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 82a53a63ffc3010b689ca9a54e5f53b2718b9f4b4a9818f36f9b7dba234f38a01876680553d2716a645a61920b5e6e4aaf8d4a0064add379b27ca0b403049512 + checksum: 0af7184379d43afac7614fc89b1bdecce4e174d52f4efaeee8ec1a4f2c764356c6dba3525c0685231f1cbf435b6dd4ee9e738d7417f3b10ce8bbe869c32f4384 languageName: node linkType: hard "@babel/plugin-transform-unicode-escapes@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: da5e85ab3bb33a75cbf6181bfd236b208dc934702fd304db127232f17b4e0f42c6d3f238de8589470b4190906967eea8ca27adf3ae9d8ee4de2a2eae906ed186 + checksum: 561c429183a54b9e4751519a3dfba6014431e9cdc1484fad03bdaf96582dfc72c76a4f8661df2aeeae7c34efd0fa4d02d3b83a2f63763ecf71ecc925f9cc1f60 languageName: node linkType: hard "@babel/plugin-transform-unicode-regex@npm:^7.10.4": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.22.5" + version: 7.23.3 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.23.3" dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.22.5 + "@babel/helper-create-regexp-features-plugin": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 6b5d1404c8c623b0ec9bd436c00d885a17d6a34f3f2597996343ddb9d94f6379705b21582dfd4cec2c47fd34068872e74ab6b9580116c0566b3f9447e2a7fa06 + checksum: c5f835d17483ba899787f92e313dfa5b0055e3deab332f1d254078a2bba27ede47574b6599fcf34d3763f0c048ae0779dc21d2d8db09295edb4057478dc80a9a languageName: node linkType: hard @@ -1015,8 +1014,8 @@ __metadata: linkType: hard "@babel/preset-modules@npm:^0.1.3": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" + version: 0.1.6 + resolution: "@babel/preset-modules@npm:0.1.6" dependencies: "@babel/helper-plugin-utils": ^7.0.0 "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 @@ -1024,8 +1023,8 @@ __metadata: "@babel/types": ^7.4.4 esutils: ^2.0.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8430e0e9e9d520b53e22e8c4c6a5a080a12b63af6eabe559c2310b187bd62ae113f3da82ba33e9d1d0f3230930ca702843aae9dd226dec51f7d7114dc1f51c10 + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 9700992d2b9526e703ab49eb8c4cd0b26bec93594d57c6b808967619df1a387565e0e58829b65b5bd6d41049071ea0152c9195b39599515fddb3e52b09a55ff0 languageName: node linkType: hard @@ -1037,51 +1036,51 @@ __metadata: linkType: hard "@babel/runtime@npm:^7.8.4": - version: 7.22.6 - resolution: "@babel/runtime@npm:7.22.6" + version: 7.23.5 + resolution: "@babel/runtime@npm:7.23.5" dependencies: - regenerator-runtime: ^0.13.11 - checksum: e585338287c4514a713babf4fdb8fc2a67adcebab3e7723a739fc62c79cfda875b314c90fd25f827afb150d781af97bc16c85bfdbfa2889f06053879a1ddb597 + regenerator-runtime: ^0.14.0 + checksum: 164d9802424f06908e62d29b8fd3a87db55accf82f46f964ac481dcead11ff7df8391e3696e5fa91a8ca10ea8845bf650acd730fa88cf13f8026cd8d5eec6936 languageName: node linkType: hard -"@babel/template@npm:^7.10.4, @babel/template@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/template@npm:7.22.5" +"@babel/template@npm:^7.10.4, @babel/template@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/template@npm:7.22.15" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/parser": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 + "@babel/code-frame": ^7.22.13 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd languageName: node linkType: hard -"@babel/traverse@npm:^7.10.4, @babel/traverse@npm:^7.22.6": - version: 7.22.8 - resolution: "@babel/traverse@npm:7.22.8" +"@babel/traverse@npm:^7.10.4, @babel/traverse@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/traverse@npm:7.23.5" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.7 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.22.7 - "@babel/types": ^7.22.5 + "@babel/parser": ^7.23.5 + "@babel/types": ^7.23.5 debug: ^4.1.0 globals: ^11.1.0 - checksum: a381369bc3eedfd13ed5fef7b884657f1c29024ea7388198149f0edc34bd69ce3966e9f40188d15f56490a5e12ba250ccc485f2882b53d41b054fccefb233e33 + checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d languageName: node linkType: hard -"@babel/types@npm:^7.10.4, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/types@npm:7.22.5" +"@babel/types@npm:^7.10.4, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.5 + resolution: "@babel/types@npm:7.23.5" dependencies: - "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 to-fast-properties: ^2.0.0 - checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 + checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 languageName: node linkType: hard @@ -1092,10 +1091,17 @@ __metadata: languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: ^5.1.2 + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: ^7.0.1 + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: ^8.1.0 + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb languageName: node linkType: hard @@ -1111,8 +1117,6 @@ __metadata: css-loader: 3.5.3 elkjs: 0.6.2 file-loader: 6.0.0 - jquery: ~3.5.1 - lodash: ~4.17.20 regenerator-runtime: 0.13.5 sass: 1.26.8 sass-loader: 8.0.2 @@ -1136,10 +1140,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard @@ -1160,14 +1164,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -1175,12 +1172,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.18 - resolution: "@jridgewell/trace-mapping@npm:0.3.18" + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 languageName: node linkType: hard @@ -1191,102 +1188,104 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + agent-base: ^7.1.0 + http-proxy-agent: ^7.0.0 + https-proxy-agent: ^7.0.1 + lru-cache: ^10.0.1 + socks-proxy-agent: ^8.0.1 + checksum: 3b25312edbdfaa4089af28e2d423b6f19838b945e47765b0c8174c1395c79d43c3ad6d23cb364b43f59fd3acb02c93e3b493f72ddbe3dfea04c86843a7311fc4 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + semver: ^7.3.5 + checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.21 - resolution: "@polka/url@npm:1.0.0-next.21" - checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"@polka/url@npm:^1.0.0-next.20": + version: 1.0.0-next.23 + resolution: "@polka/url@npm:1.0.0-next.23" + checksum: 4b0330de1ceecd1002c7e7449094d0c41f2ed0e21765f4835ccc7b003f2f024ac557d503b9ffdf0918cf50b80d5b8c99dfc5a91927e7b3c468b09c6bb42a3c41 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 languageName: node linkType: hard "@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" + version: 3.5.13 + resolution: "@types/bonjour@npm:3.5.13" dependencies: "@types/node": "*" - checksum: bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a + checksum: e827570e097bd7d625a673c9c208af2d1a22fa3885c0a1646533cf24394c839c3e5f60ac1bc60c0ddcc69c0615078c9fb2c01b42596c7c582d895d974f2409ee languageName: node linkType: hard "@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.0 - resolution: "@types/connect-history-api-fallback@npm:1.5.0" + version: 1.5.4 + resolution: "@types/connect-history-api-fallback@npm:1.5.4" dependencies: "@types/express-serve-static-core": "*" "@types/node": "*" - checksum: f180e7c540728d6dd3a1eb2376e445fe7f9de4ee8a5b460d5ad80062cdb6de6efc91c6851f39e9d5933b3dcd5cd370673c52343a959aa091238b6f863ea4447c + checksum: e1dee43b8570ffac02d2d47a2b4ba80d3ca0dd1840632dafb221da199e59dbe3778d3d7303c9e23c6b401f37c076935a5bc2aeae1c4e5feaefe1c371fe2073fd languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: "@types/node": "*" - checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + checksum: 7eb1bc5342a9604facd57598a6c62621e244822442976c443efb84ff745246b10d06e8b309b6e80130026a396f19bf6793b7cecd7380169f369dac3bfc46fb99 languageName: node linkType: hard "@types/eslint-scope@npm:^3.7.0": - version: 3.7.4 - resolution: "@types/eslint-scope@npm:3.7.4" + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" dependencies: "@types/eslint": "*" "@types/estree": "*" - checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e languageName: node linkType: hard "@types/eslint@npm:*": - version: 8.44.0 - resolution: "@types/eslint@npm:8.44.0" + version: 8.44.8 + resolution: "@types/eslint@npm:8.44.8" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 + checksum: c3bc70166075e6e9f7fb43978882b9ac0b22596b519900b08dc8a1d761bbbddec4c48a60cc4eb674601266223c6f11db30f3fb6ceaae96c23c54b35ad88022bc languageName: node linkType: hard "@types/estree@npm:*": - version: 1.0.0 - resolution: "@types/estree@npm:1.0.0" - checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a languageName: node linkType: hard @@ -1298,91 +1297,95 @@ __metadata: linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: cc8995d10c6feda475ec1b3a0e69eb0f35f21ab6b49129ad5c6f279e0bc5de8175bc04ec51304cb79a43eec3ed2f5a1e01472eb6d5f827b8c35c6ca8ad24eb6e + checksum: 12750f6511dd870bbaccfb8208ad1e79361cf197b147f62a3bedc19ec642f3a0f9926ace96705f4bc88ec2ae56f61f7ca8c2438e6b22f5540842b5569c28a121 languageName: node linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + checksum: fb238298630370a7392c7abdc80f495ae6c716723e114705d7e3fb67e3850b3859bbfd29391463a3fb8c0b32051847935933d99e719c0478710f8098ee7091c5 languageName: node linkType: hard "@types/http-errors@npm:*": - version: 2.0.1 - resolution: "@types/http-errors@npm:2.0.1" - checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 languageName: node linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" + version: 1.17.14 + resolution: "@types/http-proxy@npm:1.17.14" dependencies: "@types/node": "*" - checksum: 38ef4f8c91c7a5b664cf6dd4d90de7863f88549a9f8ef997f2f1184e4f8cf2e7b9b63c04f0b7b962f34a09983073a31a9856de5aae5159b2ddbb905a4c44dc9f + checksum: 491320bce3565bbb6c7d39d25b54bce626237cfb6b09e60ee7f77b56ae7c6cbad76f08d47fe01eaa706781124ee3dfad9bb737049254491efd98ed1f014c4e83 languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d +"@types/mime@npm:*": + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843 languageName: node linkType: hard -"@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: e29a5f9c4776f5229d84e525b7cd7dd960b51c30a0fb9a028c0821790b82fca9f672dab56561e2acd9e8eed51d431bde52eafdfef30f643586c4162f1aecfc78 languageName: node linkType: hard -"@types/mime@npm:^1": - version: 1.3.2 - resolution: "@types/mime@npm:1.3.2" - checksum: 0493368244cced1a69cb791b485a260a422e6fcc857782e1178d1e6f219f1b161793e9f87f5fae1b219af0f50bee24fcbe733a18b4be8fdd07a38a8fb91146fd +"@types/node-forge@npm:^1.3.0": + version: 1.3.10 + resolution: "@types/node-forge@npm:1.3.10" + dependencies: + "@types/node": "*" + checksum: 363af42c83956c7e2483a71e398a02101ef6a55b4d86386c276315ca98bad02d6050b99fdbe13debcd1bcda250086b4a5b5c15a6fb2953d32420d269865ca7f8 languageName: node linkType: hard "@types/node@npm:*": - version: 18.15.0 - resolution: "@types/node@npm:18.15.0" - checksum: d81372276dd5053b1743338b61a2178ff9722dc609189d01fc7d1c2acd539414039e0e4780678730514390dad3f29c366a28c29e8dbd5b0025651181f6dd6669 + version: 20.10.2 + resolution: "@types/node@npm:20.10.2" + dependencies: + undici-types: ~5.26.4 + checksum: c0c84e8270cdf7a47a18c0230c0321537cc59506adb0e3cba51949b6f1ad4879f2e2ec3a29161f2f5321ebb6415460712d9f0a25ac5c02be0f5435464fe77c23 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.10 + resolution: "@types/qs@npm:6.9.10" + checksum: 3e479ee056bd2b60894baa119d12ecd33f20a25231b836af04654e784c886f28a356477630430152a86fba253da65d7ecd18acffbc2a8877a336e75aa0272c67 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 95640233b689dfbd85b8c6ee268812a732cf36d5affead89e806fe30da9a430767af8ef2cd661024fd97e19d61f3dec75af2df5e80ec3bea000019ab7028629a languageName: node linkType: hard @@ -1394,50 +1397,50 @@ __metadata: linkType: hard "@types/send@npm:*": - version: 0.17.1 - resolution: "@types/send@npm:0.17.1" + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: "@types/mime": ^1 "@types/node": "*" - checksum: 10b620a5960058ef009afbc17686f680d6486277c62f640845381ec4baa0ea683fdd77c3afea4803daf5fcddd3fb2972c8aa32e078939f1d4e96f83195c89793 + checksum: cf4db48251bbb03cd6452b4de6e8e09e2d75390a92fd798eca4a803df06444adc94ed050246c94c7ed46fb97be1f63607f0e1f13c3ce83d71788b3e08640e5e0 languageName: node linkType: hard "@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" + version: 1.9.4 + resolution: "@types/serve-index@npm:1.9.4" dependencies: "@types/express": "*" - checksum: 026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 + checksum: 72727c88d54da5b13275ebfb75dcdc4aa12417bbe9da1939e017c4c5f0c906fae843aa4e0fbfe360e7ee9df2f3d388c21abfc488f77ce58693fb57809f8ded92 languageName: node linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.2 - resolution: "@types/serve-static@npm:1.15.2" + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: "@types/http-errors": "*" "@types/mime": "*" "@types/node": "*" - checksum: 15c261dbfc57890f7cc17c04d5b22b418dfa0330c912b46c5d8ae2064da5d6f844ef7f41b63c7f4bbf07675e97ebe6ac804b032635ec742ae45d6f1274259b3e + checksum: 0ff4b3703cf20ba89c9f9e345bc38417860a88e85863c8d6fe274a543220ab7f5f647d307c60a71bb57dc9559f0890a661e8dc771a6ec5ef195d91c8afc4a893 languageName: node linkType: hard "@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" + version: 0.3.36 + resolution: "@types/sockjs@npm:0.3.36" dependencies: "@types/node": "*" - checksum: b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 + checksum: b4b5381122465d80ea8b158537c00bc82317222d3fb31fd7229ff25b31fa89134abfbab969118da55622236bf3d8fee75759f3959908b5688991f492008f29bc languageName: node linkType: hard "@types/ws@npm:^8.5.1": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" + version: 8.5.10 + resolution: "@types/ws@npm:8.5.10" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: 3ec416ea2be24042ebd677932a462cf16d2080393d8d7d0b1b3f5d6eaa4a7387aaf0eefb99193c0bfd29444857cf2e0c3ac89899e130550dc6c14ada8a46d25e languageName: node linkType: hard @@ -1639,10 +1642,10 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: 0e994ad2aa6575f94670d8a2149afe94465de9cedaaaac364e7fb43a40c3691c980ff74899f682f4ca58fa96b4cbd7421a015d3a6defe43a442117d7821a2f36 languageName: node linkType: hard @@ -1666,22 +1669,13 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 + version: 8.3.0 + resolution: "acorn-walk@npm:8.3.0" + checksum: 15ea56ab6529135be05e7d018f935ca80a572355dd3f6d3cd717e36df3346e0f635a93ae781b1c7942607693e2e5f3ef81af5c6fc697bbadcc377ebda7b7f5f6 languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.8.2": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"acorn@npm:^8.4.1": +"acorn@npm:^8.0.4, acorn@npm:^8.4.1, acorn@npm:^8.8.2": version: 8.11.2 resolution: "acorn@npm:8.11.2" bin: @@ -1690,23 +1684,12 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" dependencies: - debug: ^4.1.0 - depd: ^2.0.0 - humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + debug: ^4.3.4 + checksum: f7828f991470a0cc22cb579c86a18cbae83d8a3cbed39992ab34fc7217c4d126017f1c74d0ab66be87f71455318a8ea3e757d6a37881b8d0f2a2c6aa55e5418f languageName: node linkType: hard @@ -1810,6 +1793,13 @@ __metadata: languageName: node linkType: hard +"ansi-regex@npm:^6.0.1": + version: 6.0.1 + resolution: "ansi-regex@npm:6.0.1" + checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -1819,7 +1809,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^4.1.0": +"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: @@ -1828,6 +1818,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + languageName: node + linkType: hard + "anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -1838,13 +1835,6 @@ __metadata: languageName: node linkType: hard -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - "aproba@npm:^1.1.1": version: 1.2.0 resolution: "aproba@npm:1.2.0" @@ -1852,16 +1842,6 @@ __metadata: languageName: node linkType: hard -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" @@ -2003,17 +1983,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.12.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.9": - version: 4.21.9 - resolution: "browserslist@npm:4.21.9" +"browserslist@npm:^4.12.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" dependencies: - caniuse-lite: ^1.0.30001503 - electron-to-chromium: ^1.4.431 - node-releases: ^2.0.12 - update-browserslist-db: ^1.0.11 + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 bin: browserslist: cli.js - checksum: 80d3820584e211484ad1b1a5cfdeca1dd00442f47be87e117e1dda34b628c87e18b81ae7986fa5977b3e6a03154f6d13cd763baa6b8bf5dd9dd19f4926603698 + checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 languageName: node linkType: hard @@ -2061,39 +2041,34 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^18.0.0": + version: 18.0.1 + resolution: "cacache@npm:18.0.1" dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 + "@npmcli/fs": ^3.1.0 + fs-minipass: ^3.0.0 + glob: ^10.2.2 + lru-cache: ^10.0.1 + minipass: ^7.0.3 + minipass-collect: ^2.0.1 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 + ssri: ^10.0.0 tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + unique-filename: ^3.0.0 + checksum: 5a0b3b2ea451a0379814dc1d3c81af48c7c6db15cd8f7d72e028501ae0036a599a99bbac9687bfec307afb2760808d1c7708e9477c8c70d2b166e7d80b162a23 languageName: node linkType: hard "call-bind@npm:^1.0.0": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.1 + set-function-length: ^1.1.1 + checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 languageName: node linkType: hard @@ -2104,14 +2079,14 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001516 - resolution: "caniuse-lite@npm:1.0.30001516" - checksum: 044adf3493b734a356a2922445a30095a0f6de6b9194695cdf74deafe7bef658e85858a31177762c2813f6e1ed2722d832d59eee0ecb2151e93a611ee18cb21f +"caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001565 + resolution: "caniuse-lite@npm:1.0.30001565" + checksum: 7621f358d0e1158557430a111ca5506008ae0b2c796039ef53aeebf4e2ba15e5241cb89def21ea3a633b6a609273085835b44a522165d871fa44067cdf29cccd languageName: node linkType: hard -"chalk@npm:^2.0.0": +"chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -2222,15 +2197,6 @@ __metadata: languageName: node linkType: hard -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - "colorette@npm:^2.0.10, colorette@npm:^2.0.14": version: 2.0.20 resolution: "colorette@npm:2.0.20" @@ -2309,13 +2275,6 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -2390,11 +2349,11 @@ __metadata: linkType: hard "core-js-compat@npm:^3.6.2": - version: 3.31.1 - resolution: "core-js-compat@npm:3.31.1" + version: 3.33.3 + resolution: "core-js-compat@npm:3.33.3" dependencies: - browserslist: ^4.21.9 - checksum: 9a16d6992621f4e099169297381a28d5712cdef7df1fa85352a7c285a5885d5d7a117ec2eae9ad715ed88c7cc774787a22cdb8aceababf6775fbc8b0cbeccdb7 + browserslist: ^4.22.1 + checksum: cb121e83f0f5f18b2b75428cdfb19524936a18459f1e0358f9124c8ff8b75d6a5901495cb996560cfde3a416103973f78eb5947777bb8b2fd877cdf84471465d languageName: node linkType: hard @@ -2412,7 +2371,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -2471,7 +2430,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.3": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -2492,6 +2451,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -2499,14 +2469,7 @@ __metadata: languageName: node linkType: hard -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"depd@npm:2.0.0, depd@npm:^2.0.0": +"depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -2551,11 +2514,11 @@ __metadata: linkType: hard "dns-packet@npm:^5.2.2": - version: 5.6.0 - resolution: "dns-packet@npm:5.6.0" + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" dependencies: "@leichtgewicht/ip-codec": ^2.0.1 - checksum: 1b643814e5947a87620f8a906287079347492282964ce1c236d52c414e3e3941126b96581376b180ba6e66899e70b86b587bc1aa23e3acd9957765be952d83fc + checksum: 64c06457f0c6e143f7a0946e0aeb8de1c5f752217cfa143ef527467c00a6d78db1835cfdb6bb68333d9f9a4963cf23f410439b5262a8935cce1236f45e344b81 languageName: node linkType: hard @@ -2578,6 +2541,13 @@ __metadata: languageName: node linkType: hard +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + languageName: node + linkType: hard + "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" @@ -2585,10 +2555,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.431": - version: 1.4.463 - resolution: "electron-to-chromium@npm:1.4.463" - checksum: 0f8d9b7ac7bcd48ae1963827a752d8c1d1f36d84e778e818a8027ea708f81b58faa0b599c964777e8245277f06ac45828515975fc7e1e08ed20e360571600c2c +"electron-to-chromium@npm:^1.4.535": + version: 1.4.601 + resolution: "electron-to-chromium@npm:1.4.601" + checksum: 6c6d090afaab83f49fe413c2558a3294e7dfce6a9d8afda3496a80ba59377901279ea7903122558399d5f5dbbdcca8562e3e826b7b78e7ec0b561fcc02c45f73 languageName: node linkType: hard @@ -2606,6 +2576,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -2656,11 +2633,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.10.0 - resolution: "envinfo@npm:7.10.0" + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" bin: envinfo: dist/cli.js - checksum: 05e81a5768c42cbd5c580dc3f274db3401facadd53e9bd52e2aa49dfbb5d8b26f6181c25a6652d79618a6994185bd2b1c137673101690b147f758e4e71d42f7d + checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef languageName: node linkType: hard @@ -2777,6 +2754,13 @@ __metadata: languageName: node linkType: hard +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 + languageName: node + linkType: hard + "express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" @@ -2919,6 +2903,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + "flush-write-stream@npm:^1.0.0": version: 1.1.1 resolution: "flush-write-stream@npm:1.1.1" @@ -2930,12 +2923,22 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: debug: optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + languageName: node + linkType: hard + +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: ^7.0.0 + signal-exit: ^4.0.1 + checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 languageName: node linkType: hard @@ -2963,7 +2966,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": +"fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -2972,10 +2975,19 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 + languageName: node + linkType: hard + "fs-monkey@npm:^1.0.4": - version: 1.0.4 - resolution: "fs-monkey@npm:1.0.4" - checksum: 8b254c982905c0b7e028eab22b410dc35a5c0019c1c860456f5f54ae6a61666e1cb8c6b700d6c88cc873694c00953c935847b9959cc4dcf274aacb8673c1e8bf + version: 1.0.5 + resolution: "fs-monkey@npm:1.0.5" + checksum: 424b67f65b37fe66117ae2bb061f790fe6d4b609e1d160487c74b3d69fbf42f262c665ccfba32e8b5f113f96f92e9a58fcdebe42d5f6649bdfc72918093a3119 languageName: node linkType: hard @@ -2999,44 +3011,28 @@ __metadata: linkType: hard "fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 conditions: os=darwin languageName: node linkType: hard "fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: latest conditions: os=darwin languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard @@ -3047,14 +3043,15 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.0 - resolution: "get-intrinsic@npm:1.2.0" +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 + function-bind: ^1.1.2 + has-proto: ^1.0.1 has-symbols: ^1.0.3 - checksum: 78fc0487b783f5c58cf2dccafc3ae656ee8d2d8062a8831ce4a95e7057af4587a1d4882246c033aca0a7b4965276f4802b45cc300338d1b77a73d3e3e3f4877d + hasown: ^2.0.0 + checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 languageName: node linkType: hard @@ -3091,6 +3088,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.2.2, glob@npm:^10.3.10": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: ^3.1.0 + jackspeak: ^2.3.5 + minimatch: ^9.0.1 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + path-scurry: ^1.10.1 + bin: + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 + languageName: node + linkType: hard + "glob@npm:^7.0.0, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -3105,19 +3117,6 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 - languageName: node - linkType: hard - "globals@npm:^11.1.0": version: 11.12.0 resolution: "globals@npm:11.12.0" @@ -3139,17 +3138,19 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.4": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da +"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard @@ -3183,26 +3184,35 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 +"has-property-descriptors@npm:^1.0.0": + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.2 + checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 languageName: node linkType: hard -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e languageName: node linkType: hard -"has@npm:^1.0.3": +"has-symbols@npm:^1.0.3": version: 1.0.3 - resolution: "has@npm:1.0.3" + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 languageName: node linkType: hard @@ -3225,7 +3235,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": +"http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 @@ -3271,14 +3281,13 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + agent-base: ^7.1.0 + debug: ^4.3.4 + checksum: 48d4fac997917e15f45094852b63b62a46d0c8a4f0b9c6c23ca26d27b8df8d178bed88389e604745e748bd9a01f5023e25093722777f0593c3f052009ff438b6 languageName: node linkType: hard @@ -3311,13 +3320,13 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" dependencies: - agent-base: 6 + agent-base: ^7.0.2 debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + checksum: 088969a0dd476ea7a0ed0a2cf1283013682b08f874c3bc6696c83fa061d2c157d29ef0ad3eb70a2046010bb7665573b2388d10fdcb3e410a66995e5248444292 languageName: node linkType: hard @@ -3328,15 +3337,6 @@ __metadata: languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - "iconv-lite@npm:0.4.24": version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" @@ -3404,7 +3404,7 @@ __metadata: languageName: node linkType: hard -"infer-owner@npm:^1.0.3, infer-owner@npm:^1.0.4": +"infer-owner@npm:^1.0.3": version: 1.0.4 resolution: "infer-owner@npm:1.0.4" checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 @@ -3488,21 +3488,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.12.0": - version: 2.12.1 - resolution: "is-core-module@npm:2.12.1" +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 - languageName: node - linkType: hard - -"is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" - dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c languageName: node linkType: hard @@ -3607,6 +3598,13 @@ __metadata: languageName: node linkType: hard +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e + languageName: node + linkType: hard + "isobject@npm:^3.0.1": version: 3.0.1 resolution: "isobject@npm:3.0.1" @@ -3614,6 +3612,19 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": ^8.0.2 + "@pkgjs/parseargs": ^0.11.0 + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 + languageName: node + linkType: hard + "jest-worker@npm:^27.4.5": version: 27.5.1 resolution: "jest-worker@npm:27.5.1" @@ -3625,13 +3636,6 @@ __metadata: languageName: node linkType: hard -"jquery@npm:~3.5.1": - version: 3.5.1 - resolution: "jquery@npm:3.5.1" - checksum: 813047b852511ca1ecfaa7b2568aba1d7270a92e5c74962b308792a401adf041869a3b2a6858b0b7a02f6684947fb93171e40cbb4460831977a937b40b0e15ce - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -3769,7 +3773,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.13, lodash@npm:^4.17.20, lodash@npm:~4.17.20": +"lodash@npm:^4.17.13, lodash@npm:^4.17.20": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -3787,6 +3791,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 58056d33e2500fbedce92f8c542e7c11b50d7d086578f14b7074d8c241422004af0718e08a6eaae8705cee09c77e39a61c1c79e9370ba689b7010c152e6a76ab + languageName: node + linkType: hard + "lru-cache@npm:^5.1.1": version: 5.1.1 resolution: "lru-cache@npm:5.1.1" @@ -3805,13 +3816,6 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - "make-dir@npm:^2.0.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -3822,27 +3826,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 + "@npmcli/agent": ^2.0.0 + cacache: ^18.0.0 + http-cache-semantics: ^4.1.1 is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 + minipass: ^7.0.2 + minipass-fetch: ^3.0.0 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 negotiator: ^0.6.3 promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + ssri: ^10.0.0 + checksum: 7c7a6d381ce919dd83af398b66459a10e2fe8f4504f340d1d090d3fa3d1b0c93750220e1d898114c64467223504bd258612ba83efbc16f31b075cd56de24b4af languageName: node linkType: hard @@ -3941,12 +3940,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^5.0.1": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" dependencies: brace-expansion: ^2.0.1 - checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 languageName: node linkType: hard @@ -3957,27 +3956,27 @@ __metadata: languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: ^7.0.3 + checksum: b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" dependencies: encoding: ^0.1.13 - minipass: ^3.1.6 + minipass: ^7.0.3 minipass-sized: ^1.0.3 minizlib: ^2.1.2 dependenciesMeta: encoding: optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a languageName: node linkType: hard @@ -4008,7 +4007,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -4017,10 +4016,17 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.2.4 - resolution: "minipass@npm:4.2.4" - checksum: c664f2ae4401408d1e7a6e4f50aca45f87b1b0634bc9261136df5c378e313e77355765f73f59c4a5abcadcdf43d83fcd3eb14e4a7cdcce8e36508e2290345753 +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 languageName: node linkType: hard @@ -4063,7 +4069,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -4107,7 +4113,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0": +"ms@npm:2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -4148,40 +4154,40 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" dependencies: env-paths: ^2.2.0 - glob: ^7.1.4 + exponential-backoff: ^3.1.1 + glob: ^10.3.10 graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 + make-fetch-happen: ^13.0.0 + nopt: ^7.0.0 + proc-log: ^3.0.0 semver: ^7.3.5 tar: ^6.1.2 - which: ^2.0.2 + which: ^4.0.0 bin: node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + checksum: 60a74e66d364903ce02049966303a57f898521d139860ac82744a5fdd9f7b7b3b61f75f284f3bfe6e6add3b8f1871ce305a1d41f775c7482de837b50c792223f languageName: node linkType: hard -"node-releases@npm:^2.0.12": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 +"node-releases@npm:^2.0.13": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" dependencies: - abbrev: ^1.0.0 + abbrev: ^2.0.0 bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: a9c0f57fb8cb9cc82ae47192ca2b7ef00e199b9480eed202482c962d61b59a7fbe7541920b2a5839a97b42ee39e288c0aed770e38057a608d7f579389dfde410 languageName: node linkType: hard @@ -4201,22 +4207,10 @@ __metadata: languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - "object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f languageName: node linkType: hard @@ -4394,6 +4388,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 + checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -4531,6 +4535,13 @@ __metadata: languageName: node linkType: hard +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: 02b64e1b3919e63df06f836b98d3af002b5cd92655cab18b5746e37374bfb73e03b84fe305454614b34c25b485cc687a9eebdccf0242cda8fda2475dd2c97e02 + languageName: node + linkType: hard + "process-nextick-args@npm:~2.0.0": version: 2.0.1 resolution: "process-nextick-args@npm:2.0.1" @@ -4597,9 +4608,9 @@ __metadata: linkType: hard "punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 languageName: node linkType: hard @@ -4655,7 +4666,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.6": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -4694,11 +4705,11 @@ __metadata: linkType: hard "regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.0 - resolution: "regenerate-unicode-properties@npm:10.1.0" + version: 10.1.1 + resolution: "regenerate-unicode-properties@npm:10.1.1" dependencies: regenerate: ^1.4.2 - checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17 + checksum: b80958ef40f125275824c2c47d5081dfaefebd80bff26c76761e9236767c748a4a95a69c053fe29d2df881177f2ca85df4a71fe70a82360388b31159ef19adcf languageName: node linkType: hard @@ -4716,19 +4727,19 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.11": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 languageName: node linkType: hard -"regenerator-transform@npm:^0.15.1": - version: 0.15.1 - resolution: "regenerator-transform@npm:0.15.1" +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" dependencies: "@babel/runtime": ^7.8.4 - checksum: 2d15bdeadbbfb1d12c93f5775493d85874dbe1d405bec323da5c61ec6e701bc9eea36167483e1a5e752de9b2df59ab9a2dfff6bf3784f2b28af2279a673d29a4 + checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 languageName: node linkType: hard @@ -4787,55 +4798,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.3.2": - version: 1.22.3 - resolution: "resolve@npm:1.22.3" - dependencies: - is-core-module: ^2.12.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 - languageName: node - linkType: hard - -"resolve@npm:^1.9.0": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" - dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.3.2#~builtin": - version: 1.22.3 - resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" +"resolve@npm:^1.1.6, resolve@npm:^1.3.2, resolve@npm:^1.9.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.12.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c languageName: node linkType: hard -"resolve@patch:resolve@^1.9.0#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.3.2#~builtin, resolve@patch:resolve@^1.9.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 languageName: node linkType: hard @@ -4994,11 +4979,12 @@ __metadata: linkType: hard "selfsigned@npm:^2.0.1": - version: 2.1.1 - resolution: "selfsigned@npm:2.1.1" + version: 2.4.1 + resolution: "selfsigned@npm:2.4.1" dependencies: + "@types/node-forge": ^1.3.0 node-forge: ^1 - checksum: aa9ce2150a54838978d5c0aee54d7ebe77649a32e4e690eb91775f71fdff773874a4fbafd0ac73d8ec3b702ff8a395c604df4f8e8868528f36fd6c15076fb43a + checksum: 38b91c56f1d7949c0b77f9bbe4545b19518475cae15e7d7f0043f87b1626710b011ce89879a88969651f650a19d213bb15b7d5b4c2877df9eeeff7ba8f8b9bfa languageName: node linkType: hard @@ -5021,13 +5007,13 @@ __metadata: linkType: hard "semver@npm:^7.3.5": - version: 7.3.8 - resolution: "semver@npm:7.3.8" + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: ^6.0.0 bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 languageName: node linkType: hard @@ -5095,10 +5081,15 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: ^1.1.1 + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 languageName: node linkType: hard @@ -5165,13 +5156,20 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.3": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 languageName: node linkType: hard +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 + languageName: node + linkType: hard + "sirv@npm:^1.0.7": version: 1.0.19 resolution: "sirv@npm:1.0.19" @@ -5208,18 +5206,18 @@ __metadata: languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: ^7.0.2 + debug: ^4.3.4 + socks: ^2.7.1 + checksum: 4fb165df08f1f380881dcd887b3cdfdc1aba3797c76c1e9f51d29048be6e494c5b06d68e7aea2e23df4572428f27a3ec22b3d7c75c570c5346507433899a4b6d languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: @@ -5280,6 +5278,15 @@ __metadata: languageName: node linkType: hard +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" + dependencies: + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 + languageName: node + linkType: hard + "ssri@npm:^6.0.1": version: 6.0.2 resolution: "ssri@npm:6.0.2" @@ -5289,15 +5296,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb - languageName: node - linkType: hard - "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" @@ -5329,7 +5327,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -5340,6 +5338,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: ^0.2.0 + emoji-regex: ^9.2.2 + strip-ansi: ^7.0.1 + checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -5358,7 +5367,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -5367,6 +5376,15 @@ __metadata: languageName: node linkType: hard +"strip-ansi@npm:^7.0.1": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" + dependencies: + ansi-regex: ^6.0.1 + checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d + languageName: node + linkType: hard + "strip-final-newline@npm:^2.0.0": version: 2.0.0 resolution: "strip-final-newline@npm:2.0.0" @@ -5428,16 +5446,16 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" + version: 6.2.0 + resolution: "tar@npm:6.2.0" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 - minipass: ^4.0.0 + minipass: ^5.0.0 minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c languageName: node linkType: hard @@ -5464,8 +5482,8 @@ __metadata: linkType: hard "terser@npm:^5.16.8": - version: 5.19.1 - resolution: "terser@npm:5.19.1" + version: 5.24.0 + resolution: "terser@npm:5.24.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -5473,7 +5491,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 18657b2a282238a1ca9c825efa966f4dd043a33196b2f8a7a2cba406a2006e14f55295b9d9cf6380a18599b697e9579e4092c99b9f40c7871ceec01cc98e3606 + checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c languageName: node linkType: hard @@ -5541,6 +5559,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + "unicode-canonical-property-names-ecmascript@npm:^2.0.0": version: 2.0.0 resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" @@ -5581,12 +5606,12 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" +"unique-filename@npm:^3.0.0": + version: 3.0.0 + resolution: "unique-filename@npm:3.0.0" dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f + unique-slug: ^4.0.0 + checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df languageName: node linkType: hard @@ -5599,12 +5624,12 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" dependencies: imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 languageName: node linkType: hard @@ -5615,9 +5640,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.11": - version: 1.0.11 - resolution: "update-browserslist-db@npm:1.0.11" +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" dependencies: escalade: ^3.1.1 picocolors: ^1.0.0 @@ -5625,7 +5650,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 languageName: node linkType: hard @@ -5818,12 +5843,13 @@ __metadata: linkType: hard "webpack-merge@npm:^5.7.3": - version: 5.9.0 - resolution: "webpack-merge@npm:5.9.0" + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" dependencies: clone-deep: ^4.0.1 + flat: ^5.0.2 wildcard: ^2.0.0 - checksum: 64fe2c23aacc5f19684452a0e84ec02c46b990423aee6fcc5c18d7d471155bd14e9a6adb02bd3656eb3e0ac2532c8e97d69412ad14c97eeafe32fa6d10050872 + checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f languageName: node linkType: hard @@ -5889,7 +5915,7 @@ __metadata: languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: @@ -5900,12 +5926,14 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + isexe: ^3.1.1 + bin: + node-which: bin/which.js + checksum: f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 languageName: node linkType: hard @@ -5916,6 +5944,28 @@ __metadata: languageName: node linkType: hard +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: ^4.0.0 + string-width: ^4.1.0 + strip-ansi: ^6.0.0 + checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: ^6.1.0 + string-width: ^5.0.1 + strip-ansi: ^7.0.1 + checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -5939,8 +5989,8 @@ __metadata: linkType: hard "ws@npm:^8.4.2": - version: 8.13.0 - resolution: "ws@npm:8.13.0" + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -5949,7 +5999,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b languageName: node linkType: hard diff --git a/packages/joint-core/demo/ts-demo/package.json b/packages/joint-core/demo/ts-demo/package.json index 6af30c4f6..f4dce24d8 100644 --- a/packages/joint-core/demo/ts-demo/package.json +++ b/packages/joint-core/demo/ts-demo/package.json @@ -22,8 +22,6 @@ "devDependencies": { "@types/dagre": "~0.7.47", "@types/graphlib": "~2.1.8", - "@types/jquery": "~3.5.13", - "@types/lodash": "~4.14.178", "http-server": "0.12.3", "ts-loader": "9.4.2", "typescript": "4.9.5", diff --git a/packages/joint-core/demo/ts-demo/yarn.lock b/packages/joint-core/demo/ts-demo/yarn.lock new file mode 100644 index 000000000..85aeabc57 --- /dev/null +++ b/packages/joint-core/demo/ts-demo/yarn.lock @@ -0,0 +1,1639 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@discoveryjs/json-ext@npm:^0.5.0": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 2176d301cc258ea5c2324402997cf8134ebb212469c0d397591636cea8d3c02f2b3cf9fd58dcb748c7a0dade77ebdc1b10284fa63e608c033a1db52fddc69918 + languageName: node + linkType: hard + +"@joint/demo-ts@workspace:.": + version: 0.0.0-use.local + resolution: "@joint/demo-ts@workspace:." + dependencies: + "@types/dagre": ~0.7.47 + "@types/graphlib": ~2.1.8 + dagre: ~0.8.5 + graphlib: ~2.1.8 + http-server: 0.12.3 + ts-loader: 9.4.2 + typescript: 4.9.5 + webpack: 5.61.0 + webpack-cli: 4.10.0 + languageName: unknown + linkType: soft + +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.3 + resolution: "@jridgewell/gen-mapping@npm:0.3.3" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 + languageName: node + linkType: hard + +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.3": + version: 0.3.5 + resolution: "@jridgewell/source-map@npm:0.3.5" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 + languageName: node + linkType: hard + +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" + dependencies: + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 + languageName: node + linkType: hard + +"@types/dagre@npm:~0.7.47": + version: 0.7.52 + resolution: "@types/dagre@npm:0.7.52" + checksum: 89e046e73f9f83855fcecc0f79838e0e3e0e42d88b6cc42bb573249364a606909ff7ded5b6a0377246eb0648047b330b5003c8dd975358de3135635ddae0f589 + languageName: node + linkType: hard + +"@types/eslint-scope@npm:^3.7.0": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "*" + "@types/estree": "*" + checksum: e2889a124aaab0b89af1bab5959847c5bec09809209255de0e63b9f54c629a94781daa04adb66bffcdd742f5e25a17614fb933965093c0eea64aacda4309380e + languageName: node + linkType: hard + +"@types/eslint@npm:*": + version: 8.44.8 + resolution: "@types/eslint@npm:8.44.8" + dependencies: + "@types/estree": "*" + "@types/json-schema": "*" + checksum: c3bc70166075e6e9f7fb43978882b9ac0b22596b519900b08dc8a1d761bbbddec4c48a60cc4eb674601266223c6f11db30f3fb6ceaae96c23c54b35ad88022bc + languageName: node + linkType: hard + +"@types/estree@npm:*": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: dd8b5bed28e6213b7acd0fb665a84e693554d850b0df423ac8076cc3ad5823a6bc26b0251d080bdc545af83179ede51dd3f6fa78cad2c46ed1f29624ddf3e41a + languageName: node + linkType: hard + +"@types/estree@npm:^0.0.50": + version: 0.0.50 + resolution: "@types/estree@npm:0.0.50" + checksum: 9a2b6a4a8c117f34d08fbda5e8f69b1dfb109f7d149b60b00fd7a9fb6ac545c078bc590aa4ec2f0a256d680cf72c88b3b28b60c326ee38a7bc8ee1ee95624922 + languageName: node + linkType: hard + +"@types/graphlib@npm:~2.1.8": + version: 2.1.12 + resolution: "@types/graphlib@npm:2.1.12" + checksum: 009195aaf7d7c33068c93ece23e8fe11449663ba0ae6494f8028ffabebd7090a8a2daa86db73c65816a2e97d32d66db4a922c5003c2824ae4d4b4a169d77587d + languageName: node + linkType: hard + +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 + languageName: node + linkType: hard + +"@types/node@npm:*": + version: 20.10.2 + resolution: "@types/node@npm:20.10.2" + dependencies: + undici-types: ~5.26.4 + checksum: c0c84e8270cdf7a47a18c0230c0321537cc59506adb0e3cba51949b6f1ad4879f2e2ec3a29161f2f5321ebb6415460712d9f0a25ac5c02be0f5435464fe77c23 + languageName: node + linkType: hard + +"@webassemblyjs/ast@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/ast@npm:1.11.1" + dependencies: + "@webassemblyjs/helper-numbers": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + checksum: 1eee1534adebeece635362f8e834ae03e389281972611408d64be7895fc49f48f98fddbbb5339bf8a72cb101bcb066e8bca3ca1bf1ef47dadf89def0395a8d87 + languageName: node + linkType: hard + +"@webassemblyjs/floating-point-hex-parser@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.1" + checksum: b8efc6fa08e4787b7f8e682182d84dfdf8da9d9c77cae5d293818bc4a55c1f419a87fa265ab85252b3e6c1fd323d799efea68d825d341a7c365c64bc14750e97 + languageName: node + linkType: hard + +"@webassemblyjs/helper-api-error@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-api-error@npm:1.11.1" + checksum: 0792813f0ed4a0e5ee0750e8b5d0c631f08e927f4bdfdd9fe9105dc410c786850b8c61bff7f9f515fdfb149903bec3c976a1310573a4c6866a94d49bc7271959 + languageName: node + linkType: hard + +"@webassemblyjs/helper-buffer@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.11.1" + checksum: a337ee44b45590c3a30db5a8b7b68a717526cf967ada9f10253995294dbd70a58b2da2165222e0b9830cd4fc6e4c833bf441a721128d1fe2e9a7ab26b36003ce + languageName: node + linkType: hard + +"@webassemblyjs/helper-numbers@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-numbers@npm:1.11.1" + dependencies: + "@webassemblyjs/floating-point-hex-parser": 1.11.1 + "@webassemblyjs/helper-api-error": 1.11.1 + "@xtuc/long": 4.2.2 + checksum: 44d2905dac2f14d1e9b5765cf1063a0fa3d57295c6d8930f6c59a36462afecc6e763e8a110b97b342a0f13376166c5d41aa928e6ced92e2f06b071fd0db59d3a + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-bytecode@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.1" + checksum: eac400113127832c88f5826bcc3ad1c0db9b3dbd4c51a723cfdb16af6bfcbceb608170fdaac0ab7731a7e18b291be7af68a47fcdb41cfe0260c10857e7413d97 + languageName: node + linkType: hard + +"@webassemblyjs/helper-wasm-section@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + checksum: 617696cfe8ecaf0532763162aaf748eb69096fb27950219bb87686c6b2e66e11cd0614d95d319d0ab1904bc14ebe4e29068b12c3e7c5e020281379741fe4bedf + languageName: node + linkType: hard + +"@webassemblyjs/ieee754@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/ieee754@npm:1.11.1" + dependencies: + "@xtuc/ieee754": ^1.2.0 + checksum: 23a0ac02a50f244471631802798a816524df17e56b1ef929f0c73e3cde70eaf105a24130105c60aff9d64a24ce3b640dad443d6f86e5967f922943a7115022ec + languageName: node + linkType: hard + +"@webassemblyjs/leb128@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/leb128@npm:1.11.1" + dependencies: + "@xtuc/long": 4.2.2 + checksum: 33ccc4ade2f24de07bf31690844d0b1ad224304ee2062b0e464a610b0209c79e0b3009ac190efe0e6bd568b0d1578d7c3047fc1f9d0197c92fc061f56224ff4a + languageName: node + linkType: hard + +"@webassemblyjs/utf8@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/utf8@npm:1.11.1" + checksum: 972c5cfc769d7af79313a6bfb96517253a270a4bf0c33ba486aa43cac43917184fb35e51dfc9e6b5601548cd5931479a42e42c89a13bb591ffabebf30c8a6a0b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-edit@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/helper-wasm-section": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + "@webassemblyjs/wasm-opt": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + "@webassemblyjs/wast-printer": 1.11.1 + checksum: 6d7d9efaec1227e7ef7585a5d7ff0be5f329f7c1c6b6c0e906b18ed2e9a28792a5635e450aca2d136770d0207225f204eff70a4b8fd879d3ac79e1dcc26dbeb9 + languageName: node + linkType: hard + +"@webassemblyjs/wasm-gen@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/ieee754": 1.11.1 + "@webassemblyjs/leb128": 1.11.1 + "@webassemblyjs/utf8": 1.11.1 + checksum: 1f6921e640293bf99fb16b21e09acb59b340a79f986c8f979853a0ae9f0b58557534b81e02ea2b4ef11e929d946708533fd0693c7f3712924128fdafd6465f5b + languageName: node + linkType: hard + +"@webassemblyjs/wasm-opt@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-buffer": 1.11.1 + "@webassemblyjs/wasm-gen": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + checksum: 21586883a20009e2b20feb67bdc451bbc6942252e038aae4c3a08e6f67b6bae0f5f88f20bfc7bd0452db5000bacaf5ab42b98cf9aa034a6c70e9fc616142e1db + languageName: node + linkType: hard + +"@webassemblyjs/wasm-parser@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/helper-api-error": 1.11.1 + "@webassemblyjs/helper-wasm-bytecode": 1.11.1 + "@webassemblyjs/ieee754": 1.11.1 + "@webassemblyjs/leb128": 1.11.1 + "@webassemblyjs/utf8": 1.11.1 + checksum: 1521644065c360e7b27fad9f4bb2df1802d134dd62937fa1f601a1975cde56bc31a57b6e26408b9ee0228626ff3ba1131ae6f74ffb7d718415b6528c5a6dbfc2 + languageName: node + linkType: hard + +"@webassemblyjs/wast-printer@npm:1.11.1": + version: 1.11.1 + resolution: "@webassemblyjs/wast-printer@npm:1.11.1" + dependencies: + "@webassemblyjs/ast": 1.11.1 + "@xtuc/long": 4.2.2 + checksum: f15ae4c2441b979a3b4fce78f3d83472fb22350c6dc3fd34bfe7c3da108e0b2360718734d961bba20e7716cb8578e964b870da55b035e209e50ec9db0378a3f7 + languageName: node + linkType: hard + +"@webpack-cli/configtest@npm:^1.2.0": + version: 1.2.0 + resolution: "@webpack-cli/configtest@npm:1.2.0" + peerDependencies: + webpack: 4.x.x || 5.x.x + webpack-cli: 4.x.x + checksum: a2726cd9ec601d2b57e5fc15e0ebf5200a8892065e735911269ac2038e62be4bfc176ea1f88c2c46ff09b4d05d4c10ae045e87b3679372483d47da625a327e28 + languageName: node + linkType: hard + +"@webpack-cli/info@npm:^1.5.0": + version: 1.5.0 + resolution: "@webpack-cli/info@npm:1.5.0" + dependencies: + envinfo: ^7.7.3 + peerDependencies: + webpack-cli: 4.x.x + checksum: 7f56fe037cd7d1fd5c7428588519fbf04a0cad33925ee4202ffbafd00f8ec1f2f67d991245e687d50e0f3e23f7b7814273d56cb9f7da4b05eed47c8d815c6296 + languageName: node + linkType: hard + +"@webpack-cli/serve@npm:^1.7.0": + version: 1.7.0 + resolution: "@webpack-cli/serve@npm:1.7.0" + peerDependencies: + webpack-cli: 4.x.x + peerDependenciesMeta: + webpack-dev-server: + optional: true + checksum: d475e8effa23eb7ff9a48b14d4de425989fd82f906ce71c210921cc3852327c22873be00c35e181a25a6bd03d424ae2b83e7f3b3f410ac7ee31b128ab4ac7713 + languageName: node + linkType: hard + +"@xtuc/ieee754@npm:^1.2.0": + version: 1.2.0 + resolution: "@xtuc/ieee754@npm:1.2.0" + checksum: ac56d4ca6e17790f1b1677f978c0c6808b1900a5b138885d3da21732f62e30e8f0d9120fcf8f6edfff5100ca902b46f8dd7c1e3f903728634523981e80e2885a + languageName: node + linkType: hard + +"@xtuc/long@npm:4.2.2": + version: 4.2.2 + resolution: "@xtuc/long@npm:4.2.2" + checksum: 8ed0d477ce3bc9c6fe2bf6a6a2cc316bb9c4127c5a7827bae947fa8ec34c7092395c5a283cc300c05b5fa01cbbfa1f938f410a7bf75db7c7846fea41949989ec + languageName: node + linkType: hard + +"acorn-import-assertions@npm:^1.7.6": + version: 1.9.0 + resolution: "acorn-import-assertions@npm:1.9.0" + peerDependencies: + acorn: ^8 + checksum: 944fb2659d0845c467066bdcda2e20c05abe3aaf11972116df457ce2627628a81764d800dd55031ba19de513ee0d43bb771bc679cc0eda66dc8b4fade143bc0c + languageName: node + linkType: hard + +"acorn@npm:^8.4.1, acorn@npm:^8.8.2": + version: 8.11.2 + resolution: "acorn@npm:8.11.2" + bin: + acorn: bin/acorn + checksum: 818450408684da89423e3daae24e4dc9b68692db8ab49ea4569c7c5abb7a3f23669438bf129cc81dfdada95e1c9b944ee1bfca2c57a05a4dc73834a612fbf6a7 + languageName: node + linkType: hard + +"ajv-keywords@npm:^3.5.2": + version: 3.5.2 + resolution: "ajv-keywords@npm:3.5.2" + peerDependencies: + ajv: ^6.9.1 + checksum: 7dc5e5931677a680589050f79dcbe1fefbb8fea38a955af03724229139175b433c63c68f7ae5f86cf8f65d55eb7c25f75a046723e2e58296707617ca690feae9 + languageName: node + linkType: hard + +"ajv@npm:^6.12.5": + version: 6.12.6 + resolution: "ajv@npm:6.12.6" + dependencies: + fast-deep-equal: ^3.1.1 + fast-json-stable-stringify: ^2.0.0 + json-schema-traverse: ^0.4.1 + uri-js: ^4.2.2 + checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + languageName: node + linkType: hard + +"ansi-styles@npm:^4.1.0": + version: 4.3.0 + resolution: "ansi-styles@npm:4.3.0" + dependencies: + color-convert: ^2.0.1 + checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + languageName: node + linkType: hard + +"async@npm:^2.6.4": + version: 2.6.4 + resolution: "async@npm:2.6.4" + dependencies: + lodash: ^4.17.14 + checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 + languageName: node + linkType: hard + +"basic-auth@npm:^1.0.3": + version: 1.1.0 + resolution: "basic-auth@npm:1.1.0" + checksum: a248a4b125e91a188748011ce7583c8d40f55ce222196190e76ae8c3280fbdf6914f509d66123084e549f41f5b36c6fe09e5e8ec72951f5c32b50e9aa7f08b64 + languageName: node + linkType: hard + +"braces@npm:^3.0.2": + version: 3.0.2 + resolution: "braces@npm:3.0.2" + dependencies: + fill-range: ^7.0.1 + checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + languageName: node + linkType: hard + +"browserslist@npm:^4.14.5": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" + dependencies: + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 + bin: + browserslist: cli.js + checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 + languageName: node + linkType: hard + +"buffer-from@npm:^1.0.0": + version: 1.1.2 + resolution: "buffer-from@npm:1.1.2" + checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + languageName: node + linkType: hard + +"call-bind@npm:^1.0.0": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" + dependencies: + function-bind: ^1.1.2 + get-intrinsic: ^1.2.1 + set-function-length: ^1.1.1 + checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 + languageName: node + linkType: hard + +"caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001565 + resolution: "caniuse-lite@npm:1.0.30001565" + checksum: 7621f358d0e1158557430a111ca5506008ae0b2c796039ef53aeebf4e2ba15e5241cb89def21ea3a633b6a609273085835b44a522165d871fa44067cdf29cccd + languageName: node + linkType: hard + +"chalk@npm:^4.1.0": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + +"chrome-trace-event@npm:^1.0.2": + version: 1.0.3 + resolution: "chrome-trace-event@npm:1.0.3" + checksum: cb8b1fc7e881aaef973bd0c4a43cd353c2ad8323fb471a041e64f7c2dd849cde4aad15f8b753331a32dda45c973f032c8a03b8177fc85d60eaa75e91e08bfb97 + languageName: node + linkType: hard + +"clone-deep@npm:^4.0.1": + version: 4.0.1 + resolution: "clone-deep@npm:4.0.1" + dependencies: + is-plain-object: ^2.0.4 + kind-of: ^6.0.2 + shallow-clone: ^3.0.0 + checksum: 770f912fe4e6f21873c8e8fbb1e99134db3b93da32df271d00589ea4a29dbe83a9808a322c93f3bcaf8584b8b4fa6fc269fc8032efbaa6728e0c9886c74467d2 + languageName: node + linkType: hard + +"color-convert@npm:^2.0.1": + version: 2.0.1 + resolution: "color-convert@npm:2.0.1" + dependencies: + color-name: ~1.1.4 + checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + languageName: node + linkType: hard + +"color-name@npm:~1.1.4": + version: 1.1.4 + resolution: "color-name@npm:1.1.4" + checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + languageName: node + linkType: hard + +"colorette@npm:^2.0.14": + version: 2.0.20 + resolution: "colorette@npm:2.0.20" + checksum: 0c016fea2b91b733eb9f4bcdb580018f52c0bc0979443dad930e5037a968237ac53d9beb98e218d2e9235834f8eebce7f8e080422d6194e957454255bde71d3d + languageName: node + linkType: hard + +"colors@npm:^1.4.0": + version: 1.4.0 + resolution: "colors@npm:1.4.0" + checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec + languageName: node + linkType: hard + +"commander@npm:^2.20.0": + version: 2.20.3 + resolution: "commander@npm:2.20.3" + checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + languageName: node + linkType: hard + +"commander@npm:^7.0.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + +"corser@npm:^2.0.1": + version: 2.0.1 + resolution: "corser@npm:2.0.1" + checksum: 9ff6944eda760c8c3118747a636afc3ede53b41e7b9960513a15b88032209a728e630ae4b41e20a941e34da129fe9094d1f5d95123ef64ac2e16cdad8dce9c87 + languageName: node + linkType: hard + +"cross-spawn@npm:^7.0.3": + version: 7.0.3 + resolution: "cross-spawn@npm:7.0.3" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 + languageName: node + linkType: hard + +"dagre@npm:~0.8.5": + version: 0.8.5 + resolution: "dagre@npm:0.8.5" + dependencies: + graphlib: ^2.1.8 + lodash: ^4.17.15 + checksum: b9fabd425466d7b662381c2e457b1adda996bc4169aa60121d4de50250d83a6bb4b77d559e2f887c9c564caea781c2a377fd4de2a76c15f8f04ec3d086ca95f9 + languageName: node + linkType: hard + +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + languageName: node + linkType: hard + +"ecstatic@npm:^3.3.2": + version: 3.3.2 + resolution: "ecstatic@npm:3.3.2" + dependencies: + he: ^1.1.1 + mime: ^1.6.0 + minimist: ^1.1.0 + url-join: ^2.0.5 + bin: + ecstatic: ./lib/ecstatic.js + checksum: 61787fe020a3344b3750fa95fa38f8e5810d6b8cb2626f084a7283c11dde641d204ef19a5e29926d6f0189b2d14780bb6910493b49f9f1e2a0aa39297cc6b1b9 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.535": + version: 1.4.601 + resolution: "electron-to-chromium@npm:1.4.601" + checksum: 6c6d090afaab83f49fe413c2558a3294e7dfce6a9d8afda3496a80ba59377901279ea7903122558399d5f5dbbdcca8562e3e826b7b78e7ec0b561fcc02c45f73 + languageName: node + linkType: hard + +"enhanced-resolve@npm:^5.0.0, enhanced-resolve@npm:^5.8.3": + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 + languageName: node + linkType: hard + +"envinfo@npm:^7.7.3": + version: 7.11.0 + resolution: "envinfo@npm:7.11.0" + bin: + envinfo: dist/cli.js + checksum: c45a7d20409d5f4cda72483b150d3816b15b434f2944d72c1495d8838bd7c4e7b2f32c12128ffb9b92b5f66f436237b8a525eb3a9a5da2d20013bc4effa28aef + languageName: node + linkType: hard + +"es-module-lexer@npm:^0.9.0": + version: 0.9.3 + resolution: "es-module-lexer@npm:0.9.3" + checksum: 84bbab23c396281db2c906c766af58b1ae2a1a2599844a504df10b9e8dc77ec800b3211fdaa133ff700f5703d791198807bba25d9667392d27a5e9feda344da8 + languageName: node + linkType: hard + +"escalade@npm:^3.1.1": + version: 3.1.1 + resolution: "escalade@npm:3.1.1" + checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + languageName: node + linkType: hard + +"eslint-scope@npm:5.1.1": + version: 5.1.1 + resolution: "eslint-scope@npm:5.1.1" + dependencies: + esrecurse: ^4.3.0 + estraverse: ^4.1.1 + checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + languageName: node + linkType: hard + +"esrecurse@npm:^4.3.0": + version: 4.3.0 + resolution: "esrecurse@npm:4.3.0" + dependencies: + estraverse: ^5.2.0 + checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 + languageName: node + linkType: hard + +"estraverse@npm:^4.1.1": + version: 4.3.0 + resolution: "estraverse@npm:4.3.0" + checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + languageName: node + linkType: hard + +"estraverse@npm:^5.2.0": + version: 5.3.0 + resolution: "estraverse@npm:5.3.0" + checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b + languageName: node + linkType: hard + +"eventemitter3@npm:^4.0.0": + version: 4.0.7 + resolution: "eventemitter3@npm:4.0.7" + checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 + languageName: node + linkType: hard + +"events@npm:^3.2.0": + version: 3.3.0 + resolution: "events@npm:3.3.0" + checksum: f6f487ad2198aa41d878fa31452f1a3c00958f46e9019286ff4787c84aac329332ab45c9cdc8c445928fc6d7ded294b9e005a7fce9426488518017831b272780 + languageName: node + linkType: hard + +"fast-deep-equal@npm:^3.1.1": + version: 3.1.3 + resolution: "fast-deep-equal@npm:3.1.3" + checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + languageName: node + linkType: hard + +"fast-json-stable-stringify@npm:^2.0.0": + version: 2.1.0 + resolution: "fast-json-stable-stringify@npm:2.1.0" + checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + languageName: node + linkType: hard + +"fastest-levenshtein@npm:^1.0.12": + version: 1.0.16 + resolution: "fastest-levenshtein@npm:1.0.16" + checksum: a78d44285c9e2ae2c25f3ef0f8a73f332c1247b7ea7fb4a191e6bb51aa6ee1ef0dfb3ed113616dcdc7023e18e35a8db41f61c8d88988e877cf510df8edafbc71 + languageName: node + linkType: hard + +"fill-range@npm:^7.0.1": + version: 7.0.1 + resolution: "fill-range@npm:7.0.1" + dependencies: + to-regex-range: ^5.0.1 + checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + languageName: node + linkType: hard + +"find-up@npm:^4.0.0": + version: 4.1.0 + resolution: "find-up@npm:4.1.0" + dependencies: + locate-path: ^5.0.0 + path-exists: ^4.0.0 + checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + languageName: node + linkType: hard + +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 12a1536ac746db74881316a181499a78ef953632ddd28050b7a3a43c62ef5462e3357c8c29d76072bb635f147f7a9a1f0c02efef6b4be28f8db62ceb3d5c7f5d + languageName: node + linkType: hard + +"follow-redirects@npm:^1.0.0": + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" + peerDependenciesMeta: + debug: + optional: true + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" + dependencies: + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 + languageName: node + linkType: hard + +"glob-to-regexp@npm:^0.4.1": + version: 0.4.1 + resolution: "glob-to-regexp@npm:0.4.1" + checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 + languageName: node + linkType: hard + +"gopd@npm:^1.0.1": + version: 1.0.1 + resolution: "gopd@npm:1.0.1" + dependencies: + get-intrinsic: ^1.1.3 + checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + languageName: node + linkType: hard + +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.2.4": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 + languageName: node + linkType: hard + +"graphlib@npm:^2.1.8, graphlib@npm:~2.1.8": + version: 2.1.8 + resolution: "graphlib@npm:2.1.8" + dependencies: + lodash: ^4.17.15 + checksum: 1e0db4dea1c8187d59103d5582ecf32008845ebe2103959a51d22cb6dae495e81fb9263e22c922bca3aaecb56064a45cd53424e15a4626cfb5a0c52d0aff61a8 + languageName: node + linkType: hard + +"has-flag@npm:^4.0.0": + version: 4.0.0 + resolution: "has-flag@npm:4.0.0" + checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.0": + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.2 + checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 + languageName: node + linkType: hard + +"has-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "has-proto@npm:1.0.1" + checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3": + version: 1.0.3 + resolution: "has-symbols@npm:1.0.3" + checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + languageName: node + linkType: hard + +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" + dependencies: + function-bind: ^1.1.2 + checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + languageName: node + linkType: hard + +"he@npm:^1.1.1": + version: 1.2.0 + resolution: "he@npm:1.2.0" + bin: + he: bin/he + checksum: 3d4d6babccccd79c5c5a3f929a68af33360d6445587d628087f39a965079d84f18ce9c3d3f917ee1e3978916fc833bb8b29377c3b403f919426f91bc6965e7a7 + languageName: node + linkType: hard + +"http-proxy@npm:^1.18.0": + version: 1.18.1 + resolution: "http-proxy@npm:1.18.1" + dependencies: + eventemitter3: ^4.0.0 + follow-redirects: ^1.0.0 + requires-port: ^1.0.0 + checksum: f5bd96bf83e0b1e4226633dbb51f8b056c3e6321917df402deacec31dd7fe433914fc7a2c1831cf7ae21e69c90b3a669b8f434723e9e8b71fd68afe30737b6a5 + languageName: node + linkType: hard + +"http-server@npm:0.12.3": + version: 0.12.3 + resolution: "http-server@npm:0.12.3" + dependencies: + basic-auth: ^1.0.3 + colors: ^1.4.0 + corser: ^2.0.1 + ecstatic: ^3.3.2 + http-proxy: ^1.18.0 + minimist: ^1.2.5 + opener: ^1.5.1 + portfinder: ^1.0.25 + secure-compare: 3.0.1 + union: ~0.5.0 + bin: + hs: bin/http-server + http-server: bin/http-server + checksum: fdd8652638937940ce3e2c2a36f2b92cee57967aaba40552f0d422ba01cbb86c2645aabc73ba89035651ae0e5a02df28f81adce93cf3188236ced7d426b0b036 + languageName: node + linkType: hard + +"import-local@npm:^3.0.2": + version: 3.1.0 + resolution: "import-local@npm:3.1.0" + dependencies: + pkg-dir: ^4.2.0 + resolve-cwd: ^3.0.0 + bin: + import-local-fixture: fixtures/cli.js + checksum: bfcdb63b5e3c0e245e347f3107564035b128a414c4da1172a20dc67db2504e05ede4ac2eee1252359f78b0bfd7b19ef180aec427c2fce6493ae782d73a04cddd + languageName: node + linkType: hard + +"interpret@npm:^2.2.0": + version: 2.2.0 + resolution: "interpret@npm:2.2.0" + checksum: f51efef7cb8d02da16408ffa3504cd6053014c5aeb7bb8c223727e053e4235bf565e45d67028b0c8740d917c603807aa3c27d7bd2f21bf20b6417e2bb3e5fd6e + languageName: node + linkType: hard + +"is-core-module@npm:^2.13.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" + dependencies: + hasown: ^2.0.0 + checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + languageName: node + linkType: hard + +"is-number@npm:^7.0.0": + version: 7.0.0 + resolution: "is-number@npm:7.0.0" + checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + languageName: node + linkType: hard + +"is-plain-object@npm:^2.0.4": + version: 2.0.4 + resolution: "is-plain-object@npm:2.0.4" + dependencies: + isobject: ^3.0.1 + checksum: 2a401140cfd86cabe25214956ae2cfee6fbd8186809555cd0e84574f88de7b17abacb2e477a6a658fa54c6083ecbda1e6ae404c7720244cd198903848fca70ca + languageName: node + linkType: hard + +"isexe@npm:^2.0.0": + version: 2.0.0 + resolution: "isexe@npm:2.0.0" + checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + languageName: node + linkType: hard + +"isobject@npm:^3.0.1": + version: 3.0.1 + resolution: "isobject@npm:3.0.1" + checksum: db85c4c970ce30693676487cca0e61da2ca34e8d4967c2e1309143ff910c207133a969f9e4ddb2dc6aba670aabce4e0e307146c310350b298e74a31f7d464703 + languageName: node + linkType: hard + +"jest-worker@npm:^27.4.5": + version: 27.5.1 + resolution: "jest-worker@npm:27.5.1" + dependencies: + "@types/node": "*" + merge-stream: ^2.0.0 + supports-color: ^8.0.0 + checksum: 98cd68b696781caed61c983a3ee30bf880b5bd021c01d98f47b143d4362b85d0737f8523761e2713d45e18b4f9a2b98af1eaee77afade4111bb65c77d6f7c980 + languageName: node + linkType: hard + +"json-parse-better-errors@npm:^1.0.2": + version: 1.0.2 + resolution: "json-parse-better-errors@npm:1.0.2" + checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + languageName: node + linkType: hard + +"json-schema-traverse@npm:^0.4.1": + version: 0.4.1 + resolution: "json-schema-traverse@npm:0.4.1" + checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + languageName: node + linkType: hard + +"kind-of@npm:^6.0.2": + version: 6.0.3 + resolution: "kind-of@npm:6.0.3" + checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + languageName: node + linkType: hard + +"loader-runner@npm:^4.2.0": + version: 4.3.0 + resolution: "loader-runner@npm:4.3.0" + checksum: a90e00dee9a16be118ea43fec3192d0b491fe03a32ed48a4132eb61d498f5536a03a1315531c19d284392a8726a4ecad71d82044c28d7f22ef62e029bf761569 + languageName: node + linkType: hard + +"locate-path@npm:^5.0.0": + version: 5.0.0 + resolution: "locate-path@npm:5.0.0" + dependencies: + p-locate: ^4.1.0 + checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + languageName: node + linkType: hard + +"lodash@npm:^4.17.14, lodash@npm:^4.17.15": + version: 4.17.21 + resolution: "lodash@npm:4.17.21" + checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"merge-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-stream@npm:2.0.0" + checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + languageName: node + linkType: hard + +"micromatch@npm:^4.0.0": + version: 4.0.5 + resolution: "micromatch@npm:4.0.5" + dependencies: + braces: ^3.0.2 + picomatch: ^2.3.1 + checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-types@npm:^2.1.27": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mime@npm:^1.6.0": + version: 1.6.0 + resolution: "mime@npm:1.6.0" + bin: + mime: cli.js + checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + languageName: node + linkType: hard + +"minimist@npm:^1.1.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 75a6d645fb122dad29c06a7597bddea977258957ed88d7a6df59b5cd3fe4a527e253e9bbf2e783e4b73657f9098b96a5fe96ab8a113655d4109108577ecf85b0 + languageName: node + linkType: hard + +"mkdirp@npm:^0.5.6": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"ms@npm:^2.1.1": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"neo-async@npm:^2.6.2": + version: 2.6.2 + resolution: "neo-async@npm:2.6.2" + checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + languageName: node + linkType: hard + +"node-releases@npm:^2.0.13": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 + languageName: node + linkType: hard + +"object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f + languageName: node + linkType: hard + +"opener@npm:^1.5.1": + version: 1.5.2 + resolution: "opener@npm:1.5.2" + bin: + opener: bin/opener-bin.js + checksum: 33b620c0d53d5b883f2abc6687dd1c5fd394d270dbe33a6356f2d71e0a2ec85b100d5bac94694198ccf5c30d592da863b2292c5539009c715a9c80c697b4f6cc + languageName: node + linkType: hard + +"p-limit@npm:^2.2.0": + version: 2.3.0 + resolution: "p-limit@npm:2.3.0" + dependencies: + p-try: ^2.0.0 + checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + languageName: node + linkType: hard + +"p-locate@npm:^4.1.0": + version: 4.1.0 + resolution: "p-locate@npm:4.1.0" + dependencies: + p-limit: ^2.2.0 + checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + languageName: node + linkType: hard + +"p-try@npm:^2.0.0": + version: 2.2.0 + resolution: "p-try@npm:2.2.0" + checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + languageName: node + linkType: hard + +"path-exists@npm:^4.0.0": + version: 4.0.0 + resolution: "path-exists@npm:4.0.0" + checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 + languageName: node + linkType: hard + +"path-key@npm:^3.1.0": + version: 3.1.1 + resolution: "path-key@npm:3.1.1" + checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + languageName: node + linkType: hard + +"path-parse@npm:^1.0.7": + version: 1.0.7 + resolution: "path-parse@npm:1.0.7" + checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0": + version: 1.0.0 + resolution: "picocolors@npm:1.0.0" + checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + languageName: node + linkType: hard + +"picomatch@npm:^2.3.1": + version: 2.3.1 + resolution: "picomatch@npm:2.3.1" + checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + languageName: node + linkType: hard + +"pkg-dir@npm:^4.2.0": + version: 4.2.0 + resolution: "pkg-dir@npm:4.2.0" + dependencies: + find-up: ^4.0.0 + checksum: 9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 + languageName: node + linkType: hard + +"portfinder@npm:^1.0.25": + version: 1.0.32 + resolution: "portfinder@npm:1.0.32" + dependencies: + async: ^2.6.4 + debug: ^3.2.7 + mkdirp: ^0.5.6 + checksum: 116b4aed1b9e16f6d5503823d966d9ffd41b1c2339e27f54c06cd2f3015a9d8ef53e2a53b57bc0a25af0885977b692007353aa28f9a0a98a44335cb50487240d + languageName: node + linkType: hard + +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 + languageName: node + linkType: hard + +"qs@npm:^6.4.0": + version: 6.11.2 + resolution: "qs@npm:6.11.2" + dependencies: + side-channel: ^1.0.4 + checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b + languageName: node + linkType: hard + +"randombytes@npm:^2.1.0": + version: 2.1.0 + resolution: "randombytes@npm:2.1.0" + dependencies: + safe-buffer: ^5.1.0 + checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + languageName: node + linkType: hard + +"rechoir@npm:^0.7.0": + version: 0.7.1 + resolution: "rechoir@npm:0.7.1" + dependencies: + resolve: ^1.9.0 + checksum: 2a04aab4e28c05fcd6ee6768446bc8b859d8f108e71fc7f5bcbc5ef25e53330ce2c11d10f82a24591a2df4c49c4f61feabe1fd11f844c66feedd4cd7bb61146a + languageName: node + linkType: hard + +"requires-port@npm:^1.0.0": + version: 1.0.0 + resolution: "requires-port@npm:1.0.0" + checksum: eee0e303adffb69be55d1a214e415cf42b7441ae858c76dfc5353148644f6fd6e698926fc4643f510d5c126d12a705e7c8ed7e38061113bdf37547ab356797ff + languageName: node + linkType: hard + +"resolve-cwd@npm:^3.0.0": + version: 3.0.0 + resolution: "resolve-cwd@npm:3.0.0" + dependencies: + resolve-from: ^5.0.0 + checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + languageName: node + linkType: hard + +"resolve-from@npm:^5.0.0": + version: 5.0.0 + resolution: "resolve-from@npm:5.0.0" + checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + languageName: node + linkType: hard + +"resolve@npm:^1.9.0": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c + languageName: node + linkType: hard + +"resolve@patch:resolve@^1.9.0#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" + dependencies: + is-core-module: ^2.13.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 + languageName: node + linkType: hard + +"safe-buffer@npm:^5.1.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"schema-utils@npm:^3.1.0, schema-utils@npm:^3.1.1": + version: 3.3.0 + resolution: "schema-utils@npm:3.3.0" + dependencies: + "@types/json-schema": ^7.0.8 + ajv: ^6.12.5 + ajv-keywords: ^3.5.2 + checksum: ea56971926fac2487f0757da939a871388891bc87c6a82220d125d587b388f1704788f3706e7f63a7b70e49fc2db974c41343528caea60444afd5ce0fe4b85c0 + languageName: node + linkType: hard + +"secure-compare@npm:3.0.1": + version: 3.0.1 + resolution: "secure-compare@npm:3.0.1" + checksum: 0a8d8d3e54d5772d2cf1c02325f01fc7366d0bd33f964a08a84fe3ee5f34d46435a6ae729c1d239c750e160ef9b58c764d3efb945a1d07faf47978a8e4161594 + languageName: node + linkType: hard + +"semver@npm:^7.3.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" + dependencies: + lru-cache: ^6.0.0 + bin: + semver: bin/semver.js + checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + languageName: node + linkType: hard + +"serialize-javascript@npm:^6.0.1": + version: 6.0.1 + resolution: "serialize-javascript@npm:6.0.1" + dependencies: + randombytes: ^2.1.0 + checksum: 3c4f4cb61d0893b988415bdb67243637333f3f574e9e9cc9a006a2ced0b390b0b3b44aef8d51c951272a9002ec50885eefdc0298891bc27eb2fe7510ea87dc4f + languageName: node + linkType: hard + +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: ^1.1.1 + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 + languageName: node + linkType: hard + +"shallow-clone@npm:^3.0.0": + version: 3.0.1 + resolution: "shallow-clone@npm:3.0.1" + dependencies: + kind-of: ^6.0.2 + checksum: 39b3dd9630a774aba288a680e7d2901f5c0eae7b8387fc5c8ea559918b29b3da144b7bdb990d7ccd9e11be05508ac9e459ce51d01fd65e583282f6ffafcba2e7 + languageName: node + linkType: hard + +"shebang-command@npm:^2.0.0": + version: 2.0.0 + resolution: "shebang-command@npm:2.0.0" + dependencies: + shebang-regex: ^3.0.0 + checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + languageName: node + linkType: hard + +"shebang-regex@npm:^3.0.0": + version: 3.0.0 + resolution: "shebang-regex@npm:3.0.0" + checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + languageName: node + linkType: hard + +"side-channel@npm:^1.0.4": + version: 1.0.4 + resolution: "side-channel@npm:1.0.4" + dependencies: + call-bind: ^1.0.0 + get-intrinsic: ^1.0.2 + object-inspect: ^1.9.0 + checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + languageName: node + linkType: hard + +"source-map-support@npm:~0.5.20": + version: 0.5.21 + resolution: "source-map-support@npm:0.5.21" + dependencies: + buffer-from: ^1.0.0 + source-map: ^0.6.0 + checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + languageName: node + linkType: hard + +"source-map@npm:^0.6.0": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 + languageName: node + linkType: hard + +"supports-color@npm:^7.1.0": + version: 7.2.0 + resolution: "supports-color@npm:7.2.0" + dependencies: + has-flag: ^4.0.0 + checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + languageName: node + linkType: hard + +"supports-color@npm:^8.0.0": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: ^4.0.0 + checksum: c052193a7e43c6cdc741eb7f378df605636e01ad434badf7324f17fb60c69a880d8d8fcdcb562cf94c2350e57b937d7425ab5b8326c67c2adc48f7c87c1db406 + languageName: node + linkType: hard + +"supports-preserve-symlinks-flag@npm:^1.0.0": + version: 1.0.0 + resolution: "supports-preserve-symlinks-flag@npm:1.0.0" + checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + languageName: node + linkType: hard + +"tapable@npm:^2.1.1, tapable@npm:^2.2.0": + version: 2.2.1 + resolution: "tapable@npm:2.2.1" + checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + languageName: node + linkType: hard + +"terser-webpack-plugin@npm:^5.1.3": + version: 5.3.9 + resolution: "terser-webpack-plugin@npm:5.3.9" + dependencies: + "@jridgewell/trace-mapping": ^0.3.17 + jest-worker: ^27.4.5 + schema-utils: ^3.1.1 + serialize-javascript: ^6.0.1 + terser: ^5.16.8 + peerDependencies: + webpack: ^5.1.0 + peerDependenciesMeta: + "@swc/core": + optional: true + esbuild: + optional: true + uglify-js: + optional: true + checksum: 41705713d6f9cb83287936b21e27c658891c78c4392159f5148b5623f0e8c48559869779619b058382a4c9758e7820ea034695e57dc7c474b4962b79f553bc5f + languageName: node + linkType: hard + +"terser@npm:^5.16.8": + version: 5.24.0 + resolution: "terser@npm:5.24.0" + dependencies: + "@jridgewell/source-map": ^0.3.3 + acorn: ^8.8.2 + commander: ^2.20.0 + source-map-support: ~0.5.20 + bin: + terser: bin/terser + checksum: d88f774b6fa711a234fcecefd7657f99189c367e17dbe95a51c2776d426ad0e4d98d1ffe6edfdf299877c7602e495bdd711d21b2caaec188410795e5447d0f6c + languageName: node + linkType: hard + +"to-regex-range@npm:^5.0.1": + version: 5.0.1 + resolution: "to-regex-range@npm:5.0.1" + dependencies: + is-number: ^7.0.0 + checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + languageName: node + linkType: hard + +"ts-loader@npm:9.4.2": + version: 9.4.2 + resolution: "ts-loader@npm:9.4.2" + dependencies: + chalk: ^4.1.0 + enhanced-resolve: ^5.0.0 + micromatch: ^4.0.0 + semver: ^7.3.4 + peerDependencies: + typescript: "*" + webpack: ^5.0.0 + checksum: 6f306ee4c615c2a159fb177561e3fb86ca2cbd6c641e710d408a64b4978e1ff3f2c9733df07bff27d3f82efbfa7c287523d4306049510c7485ac2669a9c37eb0 + languageName: node + linkType: hard + +"typescript@npm:4.9.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ee000bc26848147ad423b581bd250075662a354d84f0e06eb76d3b892328d8d4440b7487b5a83e851b12b255f55d71835b008a66cbf8f255a11e4400159237db + languageName: node + linkType: hard + +"typescript@patch:typescript@4.9.5#~builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#~builtin::version=4.9.5&hash=23ec76" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: ab417a2f398380c90a6cf5a5f74badd17866adf57f1165617d6a551f059c3ba0a3e4da0d147b3ac5681db9ac76a303c5876394b13b3de75fdd5b1eaa06181c9d + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"union@npm:~0.5.0": + version: 0.5.0 + resolution: "union@npm:0.5.0" + dependencies: + qs: ^6.4.0 + checksum: 021530d02363fb7470ce45d4cb06ae28a97d5a245666e6d0fca6bab0673bea8c7988e7d2f8046acfbab120908cedcb099ca216b357d4483bcd96518b39101be0 + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" + dependencies: + escalade: ^3.1.1 + picocolors: ^1.0.0 + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 + languageName: node + linkType: hard + +"uri-js@npm:^4.2.2": + version: 4.4.1 + resolution: "uri-js@npm:4.4.1" + dependencies: + punycode: ^2.1.0 + checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + languageName: node + linkType: hard + +"url-join@npm:^2.0.5": + version: 2.0.5 + resolution: "url-join@npm:2.0.5" + checksum: 5c935cc99e5bfd7150302420db4eff9830d117be5ea3edf4b2d9e30a51484bc422e94fd9f2fba78192a75cebe2663735af716e07ec094b9a5f24c75046644c73 + languageName: node + linkType: hard + +"watchpack@npm:^2.2.0": + version: 2.4.0 + resolution: "watchpack@npm:2.4.0" + dependencies: + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.1.2 + checksum: 23d4bc58634dbe13b86093e01c6a68d8096028b664ab7139d58f0c37d962d549a940e98f2f201cecdabd6f9c340338dc73ef8bf094a2249ef582f35183d1a131 + languageName: node + linkType: hard + +"webpack-cli@npm:4.10.0": + version: 4.10.0 + resolution: "webpack-cli@npm:4.10.0" + dependencies: + "@discoveryjs/json-ext": ^0.5.0 + "@webpack-cli/configtest": ^1.2.0 + "@webpack-cli/info": ^1.5.0 + "@webpack-cli/serve": ^1.7.0 + colorette: ^2.0.14 + commander: ^7.0.0 + cross-spawn: ^7.0.3 + fastest-levenshtein: ^1.0.12 + import-local: ^3.0.2 + interpret: ^2.2.0 + rechoir: ^0.7.0 + webpack-merge: ^5.7.3 + peerDependencies: + webpack: 4.x.x || 5.x.x + peerDependenciesMeta: + "@webpack-cli/generators": + optional: true + "@webpack-cli/migrate": + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + bin: + webpack-cli: bin/cli.js + checksum: 2ff5355ac348e6b40f2630a203b981728834dca96d6d621be96249764b2d0fc01dd54edfcc37f02214d02935de2cf0eefd6ce689d970d154ef493f01ba922390 + languageName: node + linkType: hard + +"webpack-merge@npm:^5.7.3": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" + dependencies: + clone-deep: ^4.0.1 + flat: ^5.0.2 + wildcard: ^2.0.0 + checksum: 1fe8bf5309add7298e1ac72fb3f2090e1dfa80c48c7e79fa48aa60b5961332c7d0d61efa8851acb805e6b91a4584537a347bc106e05e9aec87fa4f7088c62f2f + languageName: node + linkType: hard + +"webpack-sources@npm:^3.2.0": + version: 3.2.3 + resolution: "webpack-sources@npm:3.2.3" + checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + languageName: node + linkType: hard + +"webpack@npm:5.61.0": + version: 5.61.0 + resolution: "webpack@npm:5.61.0" + dependencies: + "@types/eslint-scope": ^3.7.0 + "@types/estree": ^0.0.50 + "@webassemblyjs/ast": 1.11.1 + "@webassemblyjs/wasm-edit": 1.11.1 + "@webassemblyjs/wasm-parser": 1.11.1 + acorn: ^8.4.1 + acorn-import-assertions: ^1.7.6 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.8.3 + es-module-lexer: ^0.9.0 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.4 + json-parse-better-errors: ^1.0.2 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.1.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.1.3 + watchpack: ^2.2.0 + webpack-sources: ^3.2.0 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 442958ec48645c9e612a2628a815c411cbc18289b5cc7b3d1b5d0f8e5b41606ed225decf4f3684edc365e6390867bded244d20387c70fbb630c0ac08443c34c8 + languageName: node + linkType: hard + +"which@npm:^2.0.1": + version: 2.0.2 + resolution: "which@npm:2.0.2" + dependencies: + isexe: ^2.0.0 + bin: + node-which: ./bin/node-which + checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + languageName: node + linkType: hard + +"wildcard@npm:^2.0.0": + version: 2.0.1 + resolution: "wildcard@npm:2.0.1" + checksum: e0c60a12a219e4b12065d1199802d81c27b841ed6ad6d9d28240980c73ceec6f856771d575af367cbec2982d9ae7838759168b551776577f155044f5a5ba843c + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard From 006fdaccb7eb83b7d2972811cc563fd0b8d6d445 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sat, 2 Dec 2023 22:19:42 +0100 Subject: [PATCH 27/58] docs demos --- .../docs/demo/dia/Element/portZIndex.html | 6 +---- .../Paper/interactive/addLinkFromMagnet.html | 9 +++----- .../dia/Paper/interactive/arrowheadMove.html | 8 +++---- .../dia/Paper/interactive/elementMove.html | 10 +++----- .../demo/dia/Paper/interactive/enableAll.html | 10 +++----- .../demo/dia/Paper/interactive/labelMove.html | 10 +++----- .../interactive/labelMoveSnapLabels.html | 10 +++----- .../demo/dia/Paper/interactive/linkMove.html | 10 +++----- .../dia/Paper/interactive/stopDelegation.html | 10 +++----- .../dia/Paper/interactive/useLinkTools.html | 10 +++----- .../demo/dia/Paper/interactive/vertexAdd.html | 10 +++----- .../dia/Paper/interactive/vertexMove.html | 10 +++----- .../dia/Paper/interactive/vertexRemove.html | 10 +++----- .../docs/demo/elementTools/control.html | 4 ---- .../docs/demo/highlighters/mask.html | 4 ---- .../demo/layout/DirectedGraph/clusters.html | 4 ---- .../docs/demo/layout/DirectedGraph/index.html | 4 ---- .../demo/layout/DirectedGraph/js/clusters.js | 2 +- .../demo/layout/DirectedGraph/js/index.js | 17 +++++++------- .../docs/demo/layout/Port/js/port.js | 19 +++++++++------ .../demo/layout/Port/js/portRotationComp.js | 8 ++++++- .../docs/demo/layout/Port/port.html | 17 +++----------- .../demo/layout/Port/portRotationComp.html | 23 +++++-------------- .../demo/layout/PortLabel/js/portLabel.js | 12 ++++++---- .../docs/demo/layout/PortLabel/portLabel.html | 19 ++++----------- .../docs/demo/shapes/shapes.devs.html | 4 ---- .../docs/demo/shapes/shapes.devs.js | 2 +- .../docs/demo/shapes/shapes.standard.html | 4 ---- 28 files changed, 88 insertions(+), 178 deletions(-) diff --git a/packages/joint-core/docs/demo/dia/Element/portZIndex.html b/packages/joint-core/docs/demo/dia/Element/portZIndex.html index 0ba8ba2fe..577b5c950 100644 --- a/packages/joint-core/docs/demo/dia/Element/portZIndex.html +++ b/packages/joint-core/docs/demo/dia/Element/portZIndex.html @@ -27,14 +27,10 @@ -

Left click on any port to increment, right click to decrement 'z'

+

Left click on any port to increment, right click to decrement 'z'

(Source Code)

- - - - diff --git a/packages/joint-core/docs/demo/dia/Paper/interactive/addLinkFromMagnet.html b/packages/joint-core/docs/demo/dia/Paper/interactive/addLinkFromMagnet.html index 918b5c8e3..878c48ac0 100644 --- a/packages/joint-core/docs/demo/dia/Paper/interactive/addLinkFromMagnet.html +++ b/packages/joint-core/docs/demo/dia/Paper/interactive/addLinkFromMagnet.html @@ -22,18 +22,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/joint-core/docs/demo/highlighters/mask.html b/packages/joint-core/docs/demo/highlighters/mask.html index 99406f888..bb8d8bde8 100644 --- a/packages/joint-core/docs/demo/highlighters/mask.html +++ b/packages/joint-core/docs/demo/highlighters/mask.html @@ -27,10 +27,6 @@

Click an element, link, label or a port to highlight it. Click a blank area of the paper to unhighlight all cells. (Source Code)


- - - - diff --git a/packages/joint-core/docs/demo/layout/DirectedGraph/clusters.html b/packages/joint-core/docs/demo/layout/DirectedGraph/clusters.html index a85dd3ae2..23e11ef6f 100644 --- a/packages/joint-core/docs/demo/layout/DirectedGraph/clusters.html +++ b/packages/joint-core/docs/demo/layout/DirectedGraph/clusters.html @@ -11,10 +11,6 @@
- - - - diff --git a/packages/joint-core/docs/demo/layout/DirectedGraph/index.html b/packages/joint-core/docs/demo/layout/DirectedGraph/index.html index af5da5d30..a6c51ce60 100644 --- a/packages/joint-core/docs/demo/layout/DirectedGraph/index.html +++ b/packages/joint-core/docs/demo/layout/DirectedGraph/index.html @@ -27,10 +27,6 @@
- - - - diff --git a/packages/joint-core/docs/demo/layout/DirectedGraph/js/clusters.js b/packages/joint-core/docs/demo/layout/DirectedGraph/js/clusters.js index e603b64a8..ecf7097fd 100644 --- a/packages/joint-core/docs/demo/layout/DirectedGraph/js/clusters.js +++ b/packages/joint-core/docs/demo/layout/DirectedGraph/js/clusters.js @@ -4,7 +4,7 @@ var graph = new joint.dia.Graph; var paper = new joint.dia.Paper({ - el: $('#paper'), + el: document.getElementById('paper'), width: 600, height: 400, gridSize: 1, diff --git a/packages/joint-core/docs/demo/layout/DirectedGraph/js/index.js b/packages/joint-core/docs/demo/layout/DirectedGraph/js/index.js index 32218be5f..4ceb4334f 100644 --- a/packages/joint-core/docs/demo/layout/DirectedGraph/js/index.js +++ b/packages/joint-core/docs/demo/layout/DirectedGraph/js/index.js @@ -10,12 +10,13 @@ model: graph }); - $('#btn-layout').on('click', layout); + document.getElementById('btn-layout').addEventListener('click', layout, false); function layout() { try { - var adjacencyList = JSON.parse($('#adjacency-list').val()); + var adjacencyListEl = document.getElementById('adjacency-list'); + var adjacencyList = JSON.parse(adjacencyListEl.value); } catch (error) { console.log(error); } @@ -39,10 +40,10 @@ var elements = []; var links = []; - _.each(adjacencyList, function(edges, parentElementLabel) { + Object.keys(adjacencyList).forEach(function(parentElementLabel) { elements.push(makeElement(parentElementLabel)); - - _.each(edges, function(childElementLabel) { + var edges = adjacencyList[parentElementLabel] || []; + edges.forEach(function(childElementLabel) { links.push(makeLink(parentElementLabel, childElementLabel)); }); }); @@ -73,9 +74,9 @@ function makeElement(label) { - var maxLineLength = _.max(label.split('\n'), function(l) { - return l.length; - }).length; + var maxLineLength = label.split('\n').reduce(function(max, l) { + return Math.max(l.length, max); + }, 0); // Compute width/height of the rectangle based on the number // of lines in the label and the letter size. 0.6 * letterSize is diff --git a/packages/joint-core/docs/demo/layout/Port/js/port.js b/packages/joint-core/docs/demo/layout/Port/js/port.js index 0faf748c8..5165cd9f4 100644 --- a/packages/joint-core/docs/demo/layout/Port/js/port.js +++ b/packages/joint-core/docs/demo/layout/Port/js/port.js @@ -16,12 +16,12 @@ var g2Rect = new joint.shapes.basic.Rect({ }, 'reds': { position: function(ports, elBBox, opt) { - return _.map(ports, function(port, index) { + return ports.map(function(port, index) { var step = -Math.PI / 8; var y = Math.sin(index * step) * 50; - return g.point({ x: index * 12, y: y + elBBox.height }); + return new g.Point({ x: index * 12, y: y + elBBox.height }); }); }, label: { position: { name: 'manual', args: { attrs: { '.': { y: 40, 'text-anchor': 'middle' }}}}}, @@ -77,10 +77,14 @@ var g2Circle = new joint.shapes.basic.Circle({ } }); -_.times(4, function() { +function times(n, cb) { + Array.from({ length: n }).forEach((_, i) => cb(i)); +} + +times(4, function() { g2Rect.addPort({ group: 'blacks' }); }); -_.times(24, function() { +times(24, function() { g2Rect.addPort({ group: 'reds' }); }); g2Rect.addPort({ group: 'reds', attrs: { text: { text: 'fn: sin(x)' }}}); @@ -95,15 +99,16 @@ g2Rect.addPort({ } }); -_.times(8, function() { +times(8, function() { g2Circle.addPort({ group: 'blacks' }); }); paper2.model.addCell(g2Circle); paper2.model.addCell(g2Rect); -$('').text('Click on Rectangle or Ellipse to toggle port positions alignment').appendTo('body'); -$('
').html(' ').appendTo('body'); +var b = document.createElement('b'); +b.textContent = 'Click on Rectangle or Ellipse to toggle port positions alignment'; +document.body.appendChild(b); var portPosition = { 'basic.Rect': 1, diff --git a/packages/joint-core/docs/demo/layout/Port/js/portRotationComp.js b/packages/joint-core/docs/demo/layout/Port/js/portRotationComp.js index 92c26c240..6d32d16e0 100644 --- a/packages/joint-core/docs/demo/layout/Port/js/portRotationComp.js +++ b/packages/joint-core/docs/demo/layout/Port/js/portRotationComp.js @@ -40,7 +40,11 @@ var g6 = new joint.shapes.basic.Circle({ } }); -_.times(36, function(index) { +function times(n, cb) { + Array.from({ length: n }).forEach((_, i) => cb(i)); +} + +times(36, function(index) { g6.addPort({ group: 'a', id: index + '', attrs: { text: { text: index }}}); }); @@ -56,6 +60,8 @@ paper6.on('cell:pointerclick', function(cellView, e) { cellView.model.prop('ports/groups/a/position/args/compensateRotation', !current); }); +var $ = joint.mvc.$; + $('').text('Click on Element to toggle port rotation compensation').appendTo('body'); $('
').appendTo('body'); diff --git a/packages/joint-core/docs/demo/layout/Port/port.html b/packages/joint-core/docs/demo/layout/Port/port.html index e35c601e7..10285c284 100644 --- a/packages/joint-core/docs/demo/layout/Port/port.html +++ b/packages/joint-core/docs/demo/layout/Port/port.html @@ -20,11 +20,6 @@ - - - - - diff --git a/packages/joint-core/docs/demo/layout/Port/portRotationComp.html b/packages/joint-core/docs/demo/layout/Port/portRotationComp.html index a83bde0db..42b1377b0 100644 --- a/packages/joint-core/docs/demo/layout/Port/portRotationComp.html +++ b/packages/joint-core/docs/demo/layout/Port/portRotationComp.html @@ -20,34 +20,23 @@ - - - - - diff --git a/packages/joint-core/docs/demo/layout/PortLabel/js/portLabel.js b/packages/joint-core/docs/demo/layout/PortLabel/js/portLabel.js index b11e0c77c..9c9218ab4 100644 --- a/packages/joint-core/docs/demo/layout/PortLabel/js/portLabel.js +++ b/packages/joint-core/docs/demo/layout/PortLabel/js/portLabel.js @@ -38,8 +38,11 @@ var g3 = new joint.shapes.basic.Circle({ } }); +function times(n, cb) { + Array.from({ length: n }).forEach((_, i) => cb(i)); +} -_.times(10, function(index) { +times(10, function(index) { g3.addPort({ attrs: { text: { text: 'L ' + index }}, group: 'a' }); }); @@ -84,7 +87,7 @@ var g33 = new joint.shapes.basic.Rect({ } }); -_.times(3, function(index) { +times(3, function(index) { g33.addPort({ attrs: { text: { text: 'L' + index }, circle: { magnet: true }}, group: 'a' }); }); @@ -118,8 +121,9 @@ g33.addPort({ paper3.model.addCell(g3); paper3.model.addCell(g33); -$('').text('Click on Ellipse or Rectangle to toggle label position alignment').appendTo('body'); -$('
').html(' ').appendTo('body'); +var b = document.createElement('b'); +b.textContent = 'Click on Rectangle or Ellipse to toggle port positions alignment'; +document.body.appendChild(b); var labelPos = { 'basic.Rect': 0, diff --git a/packages/joint-core/docs/demo/layout/PortLabel/portLabel.html b/packages/joint-core/docs/demo/layout/PortLabel/portLabel.html index 2ee0adf1a..9f9e8680f 100644 --- a/packages/joint-core/docs/demo/layout/PortLabel/portLabel.html +++ b/packages/joint-core/docs/demo/layout/PortLabel/portLabel.html @@ -20,34 +20,23 @@ - - - - - diff --git a/packages/joint-core/docs/demo/shapes/shapes.devs.html b/packages/joint-core/docs/demo/shapes/shapes.devs.html index bbe83d46d..a16054fd8 100644 --- a/packages/joint-core/docs/demo/shapes/shapes.devs.html +++ b/packages/joint-core/docs/demo/shapes/shapes.devs.html @@ -15,10 +15,6 @@
- - - - diff --git a/packages/joint-core/docs/demo/shapes/shapes.devs.js b/packages/joint-core/docs/demo/shapes/shapes.devs.js index 77b1faf26..17e00da47 100644 --- a/packages/joint-core/docs/demo/shapes/shapes.devs.js +++ b/packages/joint-core/docs/demo/shapes/shapes.devs.js @@ -112,7 +112,7 @@ connect(c1, 'out 2', a3, 'b'); /* rounded corners */ -_.each([c1, a1, a2, a3], function(element) { +[c1, a1, a2, a3].forEach(function(element) { element.attr({ '.body': { diff --git a/packages/joint-core/docs/demo/shapes/shapes.standard.html b/packages/joint-core/docs/demo/shapes/shapes.standard.html index 1be8e3fd8..eb542ace1 100644 --- a/packages/joint-core/docs/demo/shapes/shapes.standard.html +++ b/packages/joint-core/docs/demo/shapes/shapes.standard.html @@ -18,11 +18,7 @@
- - - - From 182f696dbba20ff09e283e4fc3345661aa24a36f Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sun, 3 Dec 2023 12:51:54 +0100 Subject: [PATCH 28/58] update --- .../docs/src/joint/api/util/sanitizeHTML.html | 2 +- .../docs/src/joint/api/util/sortElements.html | 5 +++-- packages/joint-core/src/util/util.mjs | 10 +++++----- packages/joint-core/test/jointjs/core/util.js | 8 ++++++++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/joint-core/docs/src/joint/api/util/sanitizeHTML.html b/packages/joint-core/docs/src/joint/api/util/sanitizeHTML.html index aa59c3c20..58e85bb23 100644 --- a/packages/joint-core/docs/src/joint/api/util/sanitizeHTML.html +++ b/packages/joint-core/docs/src/joint/api/util/sanitizeHTML.html @@ -3,7 +3,7 @@
  • Wrap the provided HTML inside a <div> tag. This will remove tags that are invalid in that context (e.g. <body> and <head>).
  • -
  • Parse the provided HTML in a new document context (using jQuery.parseHTML()). This prevents inline events from firing and also prevents image GET requests from being sent.
  • +
  • Parse the provided HTML in a new document context. This prevents inline events from firing and also prevents image GET requests from being sent.
  • Discard all <script> tags.
  • Iterate through all DOM nodes and remove all on... attributes (e.g. onload, onerror).
  • Iterate through all attributes of the nodes and remove all that use the javascript: pseudo-protocol as value.
  • diff --git a/packages/joint-core/docs/src/joint/api/util/sortElements.html b/packages/joint-core/docs/src/joint/api/util/sortElements.html index 43f0a9a93..3a05eba01 100644 --- a/packages/joint-core/docs/src/joint/api/util/sortElements.html +++ b/packages/joint-core/docs/src/joint/api/util/sortElements.html @@ -1,4 +1,5 @@ -
    util.sortElements(elements, comparator)

    Change the order of elements (a collection of HTML elements or a selector or jQuery object) in the DOM +

    util.sortElements(elements, comparator)

    Change the order of elements (a collection of HTML elements or a selector) in the DOM according to the comparator(elementA, elementB) function. The comparator function has the exact same meaning as in Array.prototype.sort(comparator). -

    \ No newline at end of file + The function returns the sorted array of elements.

    +

    diff --git a/packages/joint-core/src/util/util.mjs b/packages/joint-core/src/util/util.mjs index b278c6860..b41a7bb76 100644 --- a/packages/joint-core/src/util/util.mjs +++ b/packages/joint-core/src/util/util.mjs @@ -1076,8 +1076,8 @@ export const getElementBBox = function(el) { // See http://james.padolsey.com/javascript/sorting-elements-with-jquery/. export const sortElements = function(elements, comparator) { - var $elements = $(elements); - var placements = $elements.toArray().map(function(sortElement) { + elements = $(elements).toArray(); + var placements = elements.map(function(sortElement) { var parentNode = sortElement.parentNode; // Since the element itself will change position, we have @@ -1098,11 +1098,11 @@ export const sortElements = function(elements, comparator) { }; }); - Array.prototype.sort.call($elements, comparator); + elements.sort(comparator); for (var i = 0; i < placements.length; i++) { - placements[i].call($elements[i]); + placements[i].call(elements[i]); } - return $elements; + return elements; }; // Sets attributes on the given element and its descendants based on the selector. diff --git a/packages/joint-core/test/jointjs/core/util.js b/packages/joint-core/test/jointjs/core/util.js index d1728c856..ebfc23b39 100644 --- a/packages/joint-core/test/jointjs/core/util.js +++ b/packages/joint-core/test/jointjs/core/util.js @@ -1426,6 +1426,14 @@ QUnit.module('util', function(hooks) { }); }); + QUnit.test('sanitizeHTML', function(assert) { + + assert.equal(joint.util.sanitizeHTML('

    Hello

    '), '

    Hello

    '); + assert.equal(joint.util.sanitizeHTML('

    Hello

    '), '

    Hello

    '); + assert.equal(joint.util.sanitizeHTML('

    Hello

    '), '

    Hello

    '); + assert.equal(joint.util.sanitizeHTML('

    Hello

    '), '

    Hello

    '); + }); + QUnit.test('getRectPoint', function(assert) { var x = 7; From 3db831937de29b2a327b4a65e97319578911f3e5 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Sun, 3 Dec 2023 16:17:24 +0100 Subject: [PATCH 29/58] update --- .../api/dia/CellView/prototype/findBySelector.html | 13 +++++-------- .../src/joint/api/dia/Paper/prototype/findView.html | 4 ++-- .../joint/api/dia/Paper/prototype/options/el.html | 2 +- .../docs/src/joint/api/elementTools/Button.html | 2 +- .../docs/src/joint/api/linkTools/Button.html | 2 +- .../docs/src/joint/api/linkTools/Remove.html | 2 +- .../src/joint/api/mvc/ViewBase/prototype/$.html | 7 ------- .../src/joint/api/mvc/ViewBase/prototype/$el.html | 5 ----- 8 files changed, 11 insertions(+), 26 deletions(-) delete mode 100644 packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$.html delete mode 100644 packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$el.html diff --git a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findBySelector.html b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findBySelector.html index fb843ae1a..ed4e879fe 100644 --- a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findBySelector.html +++ b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findBySelector.html @@ -1,12 +1,9 @@ -
    cellView.findBySelector([selector, root, selectors])
    -

    Return an array of subelements of this CellView which are identified by selector. If no such subelements are found, return an empty array.

    +
    cellView.findBySelector(selector)
    -

    This method mimics jQuery element search methods in that it always returns an array. If you are only expecting to find a single subelement (most common scenario), you can get it by accessing the first element in the returned array – e.g. this.findBySelector('body')[0].

    +

    The method returns an array of DOM nodes matching the selector.

    -

    If you do not specify a selector, the root of the CellView is returned as the only element of the return array. For backwards compatibility, the same applies also if you provide the special value selector = '.'. By default root = this.el (the wrapping <g> SVGElement of the CellView), but if you provide a different root (see below), then that value is returned instead.

    +

    The method searches for matching sub-elements among the descendants of this this.el. If no such sub-elements are found, an empty array is returned.

    -

    By default, JointJS searches for matching subelements among descendants of this.el SVGElement. As an advanced feature, you may provide a different root – e.g. an el SVGElement of another CellView. Then JointJS searches for matching subelements among the descendants of that SVGElement.

    +

    The available selectors are defined by the markup attribute of the Cell model from which the CellView was initialized.

    -

    By default, JointJS uses this.selectors array for reference. (The selectors array is a cached structure of this CellView's SVGElement descendants as defined by the markup attribute of the Cell model from which the CellView was initialized.) As an advanced feature, you may provide a different selectors array for the search – e.g. a selectors array of another CellView.

    - -

    (Deprecated) For backwards compatibility, if no matching subelement is found among selectors, then jQuery is used to try and find an element through CSS selectors ($(root).find(selector).toArray()). If you are using standard shapes, you may disable this functionality for increased performance by setting useCSSSelectors = false in the global config.

    +

    (Deprecated) If no matching sub-element JSON selector is found then this.el.querySelectorAll(selector) is used to try and find an element through CSS selectors. You may disable this functionality to increase performance by setting useCSSSelectors = false in the global config.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/findView.html b/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/findView.html index ef0728361..5ba521346 100644 --- a/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/findView.html +++ b/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/findView.html @@ -1,2 +1,2 @@ -
    paper.findView(element)

    Find a view (instance of joint.dia.ElementView or joint.dia.LinkView) associated with a DOM element in the paper. element can either be a DOM element, jQuery object or a CSS selector. - Sometimes, it is useful to find a view object for an element in the DOM. This method finds the closest view for any subelement of a view element.

    \ No newline at end of file +
    paper.findView(element)

    Find a view (instance of joint.dia.ElementView or joint.dia.LinkView) associated with a DOM element in the paper. element can either be a DOM element, or a CSS selector. + Sometimes, it is useful to find a view object for an element in the DOM. This method finds the closest view for any subelement of a view element.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/options/el.html b/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/options/el.html index 94f92f4f4..0e85c8521 100644 --- a/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/options/el.html +++ b/packages/joint-core/docs/src/joint/api/dia/Paper/prototype/options/el.html @@ -1 +1 @@ -el - CSS selector, jQuery object or a DOM element holding the container for the paper \ No newline at end of file +el - CSS selector, or a DOM element holding the container for the paper diff --git a/packages/joint-core/docs/src/joint/api/elementTools/Button.html b/packages/joint-core/docs/src/joint/api/elementTools/Button.html index 4df7a8db8..bd93a84cf 100644 --- a/packages/joint-core/docs/src/joint/api/elementTools/Button.html +++ b/packages/joint-core/docs/src/joint/api/elementTools/Button.html @@ -24,7 +24,7 @@
+ The callback function is expected to have the signature function(evt, elementView, buttonView) where evt is a mvc.Event object. The element view is available inside the function as this; the element model is available as this.model. diff --git a/packages/joint-core/docs/src/joint/api/linkTools/Button.html b/packages/joint-core/docs/src/joint/api/linkTools/Button.html index feab55b25..1a821217b 100644 --- a/packages/joint-core/docs/src/joint/api/linkTools/Button.html +++ b/packages/joint-core/docs/src/joint/api/linkTools/Button.html @@ -26,7 +26,7 @@ + The callback function is expected to have the signature function(evt, linkView, buttonView) where evt is a mvc.Event object. The related link view is available inside the function as this. The link model is available as this.model. diff --git a/packages/joint-core/docs/src/joint/api/linkTools/Remove.html b/packages/joint-core/docs/src/joint/api/linkTools/Remove.html index f4247c6cf..58aaba92c 100644 --- a/packages/joint-core/docs/src/joint/api/linkTools/Remove.html +++ b/packages/joint-core/docs/src/joint/api/linkTools/Remove.html @@ -30,7 +30,7 @@ linkView.model.remove({ ui: true, tool: toolView.cid }); } - The callback function is expected to have the signature function(evt) where evt is a jQuery.Event object. The button view is available inside the function as this; the button model is available as this.model.

+ The callback function is expected to have the signature function(evt) where evt is a mvc.Event object. The button view is available inside the function as this; the button model is available as this.model.

diff --git a/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$.html b/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$.html deleted file mode 100644 index 44e5c0352..000000000 --- a/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$.html +++ /dev/null @@ -1,7 +0,0 @@ -
view.$(selector)
- -

- If jQuery is included on the page, each view has a $ function that runs queries scoped within the view's element. If you use - this scoped jQuery function, you don't have to use model ids as part of your query to pull out specific elements in a list, and can rely much - more on HTML class attributes. It's equivalent to running: view.$el.find(selector) -

diff --git a/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$el.html b/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$el.html deleted file mode 100644 index af53d9368..000000000 --- a/packages/joint-core/docs/src/joint/api/mvc/ViewBase/prototype/$el.html +++ /dev/null @@ -1,5 +0,0 @@ -
view.$el
- -

- A cached jQuery object for the view's element. A handy reference instead of re-wrapping the DOM element all the time. -

From f6edb9593e321991f86c24352fbaf2ec5e16b661 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Mon, 4 Dec 2023 12:22:16 +0100 Subject: [PATCH 30/58] update tutorials --- packages/joint-core/package.json | 2 - packages/joint-core/tutorials/advanced.html | 9 - packages/joint-core/tutorials/archive.html | 10 +- .../joint-core/tutorials/cell-namespace.html | 112 +++--- .../tutorials/connecting-by-dropping.html | 86 ---- .../tutorials/constraint-move-to-circle.html | 149 ------- .../tutorials/content-driven-element.html | 49 +-- .../tutorials/custom-attributes.html | 61 ++- .../joint-core/tutorials/custom-elements.html | 43 +- .../joint-core/tutorials/custom-links.html | 29 +- .../joint-core/tutorials/element-tools.html | 12 +- packages/joint-core/tutorials/elements.html | 20 +- .../joint-core/tutorials/event-handling.html | 13 +- packages/joint-core/tutorials/events.html | 18 +- .../tutorials/filters-gradients.html | 11 - .../joint-core/tutorials/foreign-object.html | 185 +++++---- .../joint-core/tutorials/graph-and-paper.html | 21 +- .../joint-core/tutorials/hello-world.html | 15 +- packages/joint-core/tutorials/hierarchy.html | 137 ------- .../joint-core/tutorials/html-elements.html | 90 ----- packages/joint-core/tutorials/hyperlinks.html | 11 - .../joint-core/tutorials/installation.html | 29 +- .../joint-core/tutorials/intermediate.html | 9 - .../joint-core/tutorials/introduction.html | 14 +- .../tutorials/js/circle-constraint.js | 54 --- .../tutorials/js/connecting-by-dropping.js | 74 ---- .../tutorials/js/hierarchy-parent-expand.js | 86 ---- .../js/hierarchy-parent-restriction.js | 44 --- .../tutorials/js/hierarchy-reparenting.js | 54 --- .../joint-core/tutorials/js/html-elements.js | 108 ----- packages/joint-core/tutorials/js/pipes.js | 255 ------------ .../tutorials/js/ports-archive-create.js | 37 -- .../js/ports-archive-link-snapping.js | 57 --- .../tutorials/js/ports-archive-link.js | 60 --- .../js/ports-archive-mark-available.js | 57 --- .../tutorials/js/ports-archive-restrict.js | 64 --- .../joint-core/tutorials/link-labels.html | 10 - packages/joint-core/tutorials/link-tools.html | 10 - .../joint-core/tutorials/links-patterns.html | 368 ------------------ packages/joint-core/tutorials/links.html | 20 +- .../multiple-links-between-elements.html | 8 - .../joint-core/tutorials/multiple-papers.html | 13 +- .../joint-core/tutorials/ports-archive.html | 188 --------- packages/joint-core/tutorials/ports.html | 115 +++--- packages/joint-core/tutorials/requirejs.html | 123 ------ .../joint-core/tutorials/serialization.html | 10 - .../tutorials/special-attributes.html | 28 +- .../tutorials/testing-e2e-playwright.html | 207 +++++----- packages/joint-core/tutorials/ts-shape.html | 137 ++++--- yarn.lock | 18 - 50 files changed, 476 insertions(+), 2864 deletions(-) delete mode 100644 packages/joint-core/tutorials/connecting-by-dropping.html delete mode 100644 packages/joint-core/tutorials/constraint-move-to-circle.html delete mode 100644 packages/joint-core/tutorials/hierarchy.html delete mode 100644 packages/joint-core/tutorials/html-elements.html delete mode 100644 packages/joint-core/tutorials/js/circle-constraint.js delete mode 100644 packages/joint-core/tutorials/js/connecting-by-dropping.js delete mode 100644 packages/joint-core/tutorials/js/hierarchy-parent-expand.js delete mode 100644 packages/joint-core/tutorials/js/hierarchy-parent-restriction.js delete mode 100644 packages/joint-core/tutorials/js/hierarchy-reparenting.js delete mode 100644 packages/joint-core/tutorials/js/html-elements.js delete mode 100644 packages/joint-core/tutorials/js/pipes.js delete mode 100644 packages/joint-core/tutorials/js/ports-archive-create.js delete mode 100644 packages/joint-core/tutorials/js/ports-archive-link-snapping.js delete mode 100644 packages/joint-core/tutorials/js/ports-archive-link.js delete mode 100644 packages/joint-core/tutorials/js/ports-archive-mark-available.js delete mode 100644 packages/joint-core/tutorials/js/ports-archive-restrict.js delete mode 100644 packages/joint-core/tutorials/links-patterns.html delete mode 100644 packages/joint-core/tutorials/ports-archive.html delete mode 100644 packages/joint-core/tutorials/requirejs.html diff --git a/packages/joint-core/package.json b/packages/joint-core/package.json index c6a72ffeb..ee5d1fea2 100644 --- a/packages/joint-core/package.json +++ b/packages/joint-core/package.json @@ -72,8 +72,6 @@ "devDependencies": { "@types/dagre": "~0.7.50", "@types/graphlib": "~2.1.9", - "@types/jquery": "~3.5.22", - "@types/lodash": "~4.14.199", "@typescript-eslint/eslint-plugin": "5.48.1", "@typescript-eslint/parser": "5.48.1", "async": "2.6.1", diff --git a/packages/joint-core/tutorials/advanced.html b/packages/joint-core/tutorials/advanced.html index 37afff049..6cf11dd0c 100644 --- a/packages/joint-core/tutorials/advanced.html +++ b/packages/joint-core/tutorials/advanced.html @@ -8,10 +8,6 @@ - - - - @@ -20,11 +16,6 @@ -

Advanced Tutorial

diff --git a/packages/joint-core/tutorials/archive.html b/packages/joint-core/tutorials/archive.html index 1eb870066..6d07ee18a 100644 --- a/packages/joint-core/tutorials/archive.html +++ b/packages/joint-core/tutorials/archive.html @@ -8,10 +8,6 @@ - - - - @@ -20,11 +16,7 @@ - +

Archive

diff --git a/packages/joint-core/tutorials/cell-namespace.html b/packages/joint-core/tutorials/cell-namespace.html index 1fa9ef090..641adb20a 100644 --- a/packages/joint-core/tutorials/cell-namespace.html +++ b/packages/joint-core/tutorials/cell-namespace.html @@ -8,10 +8,6 @@ - - - - @@ -27,8 +23,8 @@

Cell Namespace

A simple, but important aspect of working with JointJS is to ensure that JointJS knows where to look for built-in and custom shapes. In order to achieve this, it's a requirement to tell JointJS where to read cell view definitions. Failure to do so - will result in an error in our application. Built-in shapes are usually located in the joint.shapes namespace, so this - is a common namespace to use. It's possible to add custom shapes to this namespace, or alternatively, you may like to use a different + will result in an error in our application. Built-in shapes are usually located in the joint.shapes namespace, so this + is a common namespace to use. It's possible to add custom shapes to this namespace, or alternatively, you may like to use a different namespace completely. The choice is yours, but you need to state the namespace at the outset when using JointJS.

@@ -50,7 +46,7 @@

Cell Namespace

} }; } - + preinitialize() { this.markup = joint.util.svg/* xml */ ` <rect @selector="body" /> @@ -68,7 +64,7 @@

Cell Namespace

- If you want a little more organization and nesting in your cell namespace, you can define a type using dot notation, + If you want a little more organization and nesting in your cell namespace, you can define a type using dot notation, and structure your shape definitions how you would like.

@@ -87,17 +83,17 @@

Cell Namespace

- Now that we have created a cell namespace, how do we tell JointJS which namespace to use? There are 2 important options to be aware - of when creating your diagrams. The first is the graph option - cellNamespace, and the second is the paper - option cellViewNamespace. In - the following example, for a cell of type 'standard.Rectangle', the graph looks up the - 'joint.shapes.standard.Rectangle' path to find the correct constructor. If you don't plan on creating custom shapes, + Now that we have created a cell namespace, how do we tell JointJS which namespace to use? There are 2 important options to be aware + of when creating your diagrams. The first is the graph option + cellNamespace, and the second is the paper + option cellViewNamespace. In + the following example, for a cell of type 'standard.Rectangle', the graph looks up the + 'joint.shapes.standard.Rectangle' path to find the correct constructor. If you don't plan on creating custom shapes, or playing around with namespaces, the following setup should be fine for your application.

const namespace = joint.shapes;
-            
+
 const graph = new joint.dia.Graph({}, { cellNamespace: namespace });
 
 const paper = new joint.dia.Paper({
@@ -108,8 +104,8 @@ 

Cell Namespace

graph.fromJSON({ cells: [ - { - type: 'standard.Rectangle', + { + type: 'standard.Rectangle', size: { width: 80, height: 50 }, position: { x: 10, y: 10 } } @@ -118,29 +114,29 @@

Cell Namespace

A More Detailed Look

- +

- With the intention of strengthening this concept in our minds, let's define another shape, so that we are more familiar with this process. + With the intention of strengthening this concept in our minds, let's define another shape, so that we are more familiar with this process. Below, we create a class RectangleTwoLabels with a type property of 'custom.RectangleTwoLabels'. - JointJS will now expect that our custom RectangleTwoLabels element will be located within the custom + JointJS will now expect that our custom RectangleTwoLabels element will be located within the custom namespace.

- As we want our custom namespace to be at the same level of nesting as built-in JointJS shapes, we will structure our - cell namespace accordingly. First, we declare a namespace variable, then using the + As we want our custom namespace to be at the same level of nesting as built-in JointJS shapes, we will structure our + cell namespace accordingly. First, we declare a namespace variable, then using the spread operator, - ensure that namespace contains all of the properties of joint.shapes. These properties correspond to shape + ensure that namespace contains all of the properties of joint.shapes. These properties correspond to shape namespaces such as standard.

Afterwards, we also place our new custom namespace which contains our custom shape definition RectangleTwoLabels - alongside our built-in shapes. As a result, standard and custom are both defined at the same level in our - namespace object. Lastly, we make sure that namespace is set as the value of our cellNamespace - and cellViewNamespace options respectively. + alongside our built-in shapes. As a result, standard and custom are both defined at the same level in our + namespace object. Lastly, we make sure that namespace is set as the value of our cellNamespace + and cellViewNamespace options respectively.

- +
class RectangleTwoLabels extends joint.shapes.standard.Rectangle {
     defaults() {
         return {
@@ -148,7 +144,7 @@ 

A Mo type: 'custom.RectangleTwoLabels' }; } - + preinitialize() { this.markup = joint.util.svg/* xml */ ` <rect @selector="body" /> @@ -171,65 +167,65 @@

A Mo

With the objective of defining our custom namespace at the same nesting level of standard taken care of, - it's now possible to add cells to our graph with the confidence that we shouldn't run into any errors regarding cell + it's now possible to add cells to our graph with the confidence that we shouldn't run into any errors regarding cell namespaces.

graph.fromJSON({
     cells: [
         {
-            type: 'standard.Rectangle', 
+            type: 'standard.Rectangle',
             size: { width: 100, height: 60 },
             position: { x: 50, y: 50 },
             attrs: { body: { fill: '#C9ECF5' }, label: { text: 'standard.Rectangle', textWrap: { width: 'calc(w-10)' }}}
         },
-        { 
-            type: 'custom.RectangleTwoLabels', 
+        {
+            type: 'custom.RectangleTwoLabels',
             size: { width: 140, height: 80 },
             position: { x: 200, y: 30 },
             attrs: {
                 body: {
                     fill: '#F5BDB0'
-                }, 
-                label: { 
+                },
+                label: {
                     text: 'custom.RectangleTwoLabels',
-                    textWrap: { width: 'calc(w-10)' } 
-                }, 
-                labelSecondary: { 
-                    text: 'SecondaryLabel', 
-                    x: 'calc(w/2)', 
-                    y: 'calc(h+15)', 
-                    textAnchor: 'middle', 
+                    textWrap: { width: 'calc(w-10)' }
+                },
+                labelSecondary: {
+                    text: 'SecondaryLabel',
+                    x: 'calc(w/2)',
+                    y: 'calc(h+15)',
+                    textAnchor: 'middle',
                     textVerticalAnchor: 'middle',
-                    fontSize: 14 
+                    fontSize: 14
                 }
             }
         },
     ]
 });
 
- +

JointJS source code: cell-namespace.js

- Discovering your cell namespaces are not organized correctly should result in a common JointJS error. If you see the dreaded - Uncaught Error: dia.ElementView: markup required appearing in your console, it's likely + Discovering your cell namespaces are not organized correctly should result in a common JointJS error. If you see the dreaded + Uncaught Error: dia.ElementView: markup required appearing in your console, it's likely your namespace is not set up correctly, and JointJS cannot find the correct shape.

Don't Forget Custom Views!

- Last but not least, the topics covered so far also apply to our custom views. Placing a custom view in the correct location is + Last but not least, the topics covered so far also apply to our custom views. Placing a custom view in the correct location is necessary, because the JointJS paper will search for any model types with a suffix of 'View' in our provided namespace.

- In this snippet, we create a simple rectangle shape with text input. We also define a custom view that on user input, sets the input - value on the model, and also logs the value to the console. This time around, we choose joint.shapes as our + In this snippet, we create a simple rectangle shape with text input. We also define a custom view that on user input, sets the input + value on the model, and also logs the value to the console. This time around, we choose joint.shapes as our cellNamespace and cellViewNamespace values, and 'example.RectangleInput' as the type - for our custom element. Those things combined mean JointJS assumes our custom element & view will be located at + for our custom element. Those things combined mean JointJS assumes our custom element & view will be located at 'joint.shapes.example.RectangleInput' and 'joint.shapes.example.RectangleInputView' respectively.

@@ -256,7 +252,7 @@

Don' } }; } - + preinitialize() { this.markup = joint.util.svg/* xml */` <foreignObject @selector="foreignObject"> @@ -289,7 +285,7 @@

Don' Object.assign(namespace, { example: { RectangleInput, - RectangleInputView + RectangleInputView } }); @@ -302,9 +298,9 @@

Don'

Quick Validation Tips

- If you are experimenting with cell namespaces, you may like to perform some quick validation, or double-check exactly what - type values you are working with. Taking advantage of the - prop() method on both Elements & Links allows you + If you are experimenting with cell namespaces, you may like to perform some quick validation, or double-check exactly what + type values you are working with. Taking advantage of the + prop() method on both Elements & Links allows you to quickly access the type value, so it can be useful to keep track of where your shapes are located.

@@ -317,8 +313,8 @@

Quic

- A concise way to check if your namespaces are set up correctly is to overwrite the graph via graph.toJSON() - passing it the value returned from graph.toJSON(). If no error occurs, you can be more confident that your namespaces are + A concise way to check if your namespaces are set up correctly is to overwrite the graph via graph.toJSON() + passing it the value returned from graph.toJSON(). If no error occurs, you can be more confident that your namespaces are organized correctly.

@@ -326,8 +322,8 @@

Quic

- That's all we will cover in this tutorial. Thanks for staying with us if you got this far, and we hope you will have more confidence - when working with cell namespaces in JointJS. If you would like to explore any of the features mentioned here in more detail, you + That's all we will cover in this tutorial. Thanks for staying with us if you got this far, and we hope you will have more confidence + when working with cell namespaces in JointJS. If you would like to explore any of the features mentioned here in more detail, you can find more information in our JointJS documentation.

diff --git a/packages/joint-core/tutorials/connecting-by-dropping.html b/packages/joint-core/tutorials/connecting-by-dropping.html deleted file mode 100644 index ad2359305..000000000 --- a/packages/joint-core/tutorials/connecting-by-dropping.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - JointJS - JavaScript diagramming library - Getting started. - - - - - - -
- -

Connecting an element by dropping it over another element

- -

- Disclaimer - - - - The following tutorial was created with a past version of JointJS. The tutorial is still provided for - those who may face a similar problem, but it may no longer show the best practices of JointJS. You may - encounter the following issues: - -

- -
    -
  • Use of outdated/deprecated API calls, or inheritance from superseded shape collections.
  • -
  • Use of SVG string markup for custom Element/Link shape definitions; we have since started - recommending using JSON markup instead.
  • -
  • The Element and Link types defined may not serialize properly.
  • -
  • Other unexpected problems.
  • -
- -

- Our current recommendations on best practices can be found in the appropriate sections of the - basic and intermediate tutorials. -

- -

This quick tutorial shows how to automatically create links when the user drops an element over another - element. - Note that this is not necessary if you have elements with ports. For more details on elements with ports, - see - the Working with Ports tutorial. -

- -

Let's start with a demo and then let's have a look on how this can be done.

- -

- Try to drag an element and drop it over another element. You should see a new link has - been created between the two elements. - -

- -
- - -

The trick is to listen on the element:pointerup event on the paper and search for - an element whose area contains the point of the mouse cursor. If such an element was found, - we just create a link connecting both elements and move the dropped element to the position before dragging (we stored this information on the element:pointerdown event) to give the user a clue of what just happend.

- -

-
-        
- - - - - diff --git a/packages/joint-core/tutorials/constraint-move-to-circle.html b/packages/joint-core/tutorials/constraint-move-to-circle.html deleted file mode 100644 index 56a9cfe13..000000000 --- a/packages/joint-core/tutorials/constraint-move-to-circle.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - JointJS - JavaScript diagramming library - Getting started. - - - - - - -
- -

Constraint movement to circle/ellipse/rectangle

- -

- Disclaimer - - - - The following tutorial was created with a past version of JointJS. The tutorial is still provided for - those who may face a similar problem, but it may no longer show the best practices of JointJS. You may - encounter the following issues: - -

- -
    -
  • Use of outdated/deprecated API calls, or inheritance from superseded shape collections.
  • -
  • Use of SVG string markup for custom Element/Link shape definitions; we have since started - recommending using JSON markup instead.
  • -
  • The Element and Link types defined may not serialize properly.
  • -
  • Other unexpected problems.
  • -
- -

- Our current recommendations on best practices can be found in the appropriate sections of the - basic and intermediate tutorials. -

- -

Some applications might need to constrain an element dragging to ellipse, circle or even rectangle - shapes. - This post shows you how this can be achieved via a custom view for your element and with the help of the - handy geometry library - that is part of JointJS. -

- -
- -

Creating a custom constraint view

- -

First we need to create a custom view that overrides the pointerdown() and - pointermove() methods. These methods make sure that the x and y - coordinates passed to the default pointerdown() and pointermove() - methods are located on the boundary of our ellipse object. To compute the points on the boundary - of our ellipse, we simply take advantage of the ellipse.prototype.intersectionWithLineFromCenterToPoint() - function. [A complete documentation to the geometry library of JointJS can be found on - my blog] -

- -
// This is the ellipse that will be used as a constraint for our element dragging.
-var constraint = g.ellipse(g.point(200, 150), 100, 80);
-
-var ConstraintElementView = joint.dia.ElementView.extend({
-
-    pointerdown: function(evt, x, y) {
-        var position = this.model.get('position');
-        var size = this.model.get('size');
-        var center = g.rect(position.x, position.y, size.width, size.height).center();
-        var intersection = constraint.intersectionWithLineFromCenterToPoint(center);
-        joint.dia.ElementView.prototype.pointerdown.apply(this, [evt, intersection.x, intersection.y]);
-    },
-    pointermove: function(evt, x, y) {
-        var intersection = constraint.intersectionWithLineFromCenterToPoint(g.point(x, y));
-        joint.dia.ElementView.prototype.pointermove.apply(this, [evt, intersection.x, intersection.y]);
-    }
-});
- -

Creating a paper and forcing it to use our custom view

- -

Now we can just create a graph and paper as usual and tell the paper to use - our custom view for all the element models. [Note that if you need a custom view - for just one type of model (not all the models added to the paper), you can do that - be defining a view for a specific type. An example of this can be found in the - forum page.]

- -
var namespace = joint.shapes;
-
-var graph = new joint.dia.Graph({}, { cellNamespace: namespace });
-
-var paper = new joint.dia.Paper({
-    el: $('#paper'),
-    width: 650,
-    height: 400,
-    gridSize: 1,
-    model: graph,
-    cellViewNamespace: namespace,
-    elementView: ConstraintElementView
-});
- -

Finalizing the example by adding elements to the graph and drawing our constraint ellipse

- -

We're almost there! Now we just add a circle element to the paper which will be the one - whose dragging we just constraint. We also draw our ellipse so that it is visible in the paper. - Here we'll use the built-in Vectorizer library that makes life easier when dealing with SVG. -

- -
var earth = new joint.shapes.basic.Circle({
-    position: constraint.intersectionWithLineFromCenterToPoint(g.point(100, 100)).offset(-10, -10),
-    size: { width: 20, height: 20 },
-    attrs: { text: { text: 'earth' }, circle: { fill: '#2ECC71' } },
-    name: 'earth'
-});
-graph.addCell(earth);
-
-var orbit = V('<ellipse/>');
-orbit.attr({
-    cx: constraint.x, cy: constraint.y, rx: constraint.a, ry: constraint.b
-});
-V(paper.viewport).append(orbit);
- -

That's it! One can use the exact same technique to constrain dragging to a rectangular area. - The full source code to the demo is available here:

- circle-constraint.js - - - -
- - - - - diff --git a/packages/joint-core/tutorials/content-driven-element.html b/packages/joint-core/tutorials/content-driven-element.html index fb9a06a9e..597b6fc3d 100644 --- a/packages/joint-core/tutorials/content-driven-element.html +++ b/packages/joint-core/tutorials/content-driven-element.html @@ -8,10 +8,6 @@ - - - - @@ -20,34 +16,29 @@ -

Content Driven Elements

JointJS provides its users with a lot of flexibility when it comes to creating custom shapes. You may have already taken - advantage of this flexibility by using traditional JointJS mechanisms such as markup and attrs. + advantage of this flexibility by using traditional JointJS mechanisms such as markup and attrs. This is a well-established method for creating custom elements, but it's not the only approach that you could utilize.

- Another approach to creating custom elements is to allow the content to drive the size of the element. That means we don't + Another approach to creating custom elements is to allow the content to drive the size of the element. That means we don't set the element sizing explicitly, but allow the element dimensions to be derived from the content itself.

- Depending on your use case, a content driven element may not be essential for your workflow, so your next question might be, + Depending on your use case, a content driven element may not be essential for your workflow, so your next question might be, why would I need to use one?

- Imagine working with a lot of data points, what if each one has a label of different length, and you want to make sure the - label doesn't extend beyond its element bounds? In this instance, it might not be desirable to set the element's size in + Imagine working with a lot of data points, what if each one has a label of different length, and you want to make sure the + label doesn't extend beyond its element bounds? In this instance, it might not be desirable to set the element's size in retrospect. It's possible a more efficient workflow might be to allow the label content to drive element sizing instead.

@@ -64,13 +55,13 @@

Shape Definition

The first step towards content driven elements is to define our shape. We start by creating a Shape - class which inherits from joint.dia.Element. Since we aren't using traditional markup + class which inherits from joint.dia.Element. Since we aren't using traditional markup or attrs, we just provide a few default properties we want to work with in our shape.

type is a unique path identifier where JointJS looks for our shape. As joint.shapes is implied, - the full path is joint.shapes.custom.Shape. The remaining default attributes on our model are related to + the full path is joint.shapes.custom.Shape. The remaining default attributes on our model are related to the visual aspects of our shape. As we update these attributes on our model, we would like the view to update itself too.

@@ -116,19 +107,19 @@

Shape Definition

When we initialize() our shape instance, we accomplish a number of things. We add an event - listener to detect any attribute changes in our model, and we also set the size of our element based on + listener to detect any attribute changes in our model, and we also set the size of our element based on the values returned from our layout calculation.

The onAttributeChange() method checks if attributes that affect the size of our element have - changed. If there is no label present in the changes, that means we don't need to recalculate the label + changed. If there is no label present in the changes, that means we don't need to recalculate the label size, and can use the dimensions stored in the cache.

If either the image or label are present in the changes, we then need to recalculate the size of our element. - We achieve this in the setSizeFromContent() method which derives the width and + We achieve this in the setSizeFromContent() method which derives the width and height from our layout.

@@ -164,13 +155,13 @@

Shape Definition

- As we mentioned earlier, most of the action relating to the dimensions of our content driven element happens + As we mentioned earlier, most of the action relating to the dimensions of our content driven element happens in the layout. In the following code, you will see how we utilize properties introduced in the preinitialize() method to create a flexible layout.

- The layout() method first determines if there are any layout metrics already present in the cache, + The layout() method first determines if there are any layout metrics already present in the cache, and if not, calls the calcLayout() method to create them.

@@ -189,7 +180,7 @@

Shape Definition

return layout; } } - + calcLayout() { const { attributes, @@ -269,7 +260,7 @@

Shape Definition

const svg = paper.svg;
-      
+
 function measureText(svgDocument, text, attrs) {
     const vText = V('text').attr(attrs).text(text);
     vText.appendTo(svgDocument);
@@ -283,7 +274,7 @@ 

Custom Shape View

The other important aspect of our content driven element is a custom element view. The view is responsible for rendering - our shape, and working with our element visually. Our custom view also listens to underlying model changes, and updates + our shape, and working with our element visually. Our custom view also listens to underlying model changes, and updates itself.

@@ -300,7 +291,7 @@

Custom Shape View

- confirmUpdate() receives all scheduled flags, and based on them updates the view. In our example, + confirmUpdate() receives all scheduled flags, and based on them updates the view. In our example, it isn't necessary to perform updates for resizing DOM elements if the received flag is '@color'.

@@ -331,7 +322,7 @@

Custom Shape View

// Other Methods }); - + joint.shapes.custom = { Shape, ShapeView @@ -339,7 +330,7 @@

Custom Shape View

- The render() function runs once during initialization. It is responsible for creating the DOM elements, + The render() function runs once during initialization. It is responsible for creating the DOM elements, and updates during the initial render.

@@ -463,8 +454,8 @@

Custom Shape View

Thanks for reading. I hope you consider content driven elements if it's suitable for your application. - If you would like to explore any of the features mentioned here in more detail, you can find extra information in our - JointJS documentation. + If you would like to explore any of the features mentioned here in more detail, you can find extra information in our + JointJS documentation.

diff --git a/packages/joint-core/tutorials/custom-attributes.html b/packages/joint-core/tutorials/custom-attributes.html index d2c05e4fe..8ce5c937b 100644 --- a/packages/joint-core/tutorials/custom-attributes.html +++ b/packages/joint-core/tutorials/custom-attributes.html @@ -12,9 +12,6 @@ - - - JointJS - Create custom attributes with prop() and set() @@ -26,27 +23,27 @@

Custom Attributes

If you have been working with JointJS for any amount of time, you are probably familiar with presentation attributes. These are the attributes which contribute to the visual aspect of our shape, and are mostly defined through - attrs objects. While presentation attributes provide us with great functionality, occasionally we might want - to create our own attributes to help us work with our shape. This is where custom attributes come in useful. Maybe we - want a boolean to represent a state, a number for our threshold value, or just provide some attributes which represent our + attrs objects. While presentation attributes provide us with great functionality, occasionally we might want + to create our own attributes to help us work with our shape. This is where custom attributes come in useful. Maybe we + want a boolean to represent a state, a number for our threshold value, or just provide some attributes which represent our specific problem, all of these could be possible use cases for a custom attribute.

- To work with presentation attributes, we usually use the - attr() - method. However, when working with custom attributes, we recommend working with prop() and set(). - These methods will help you store custom data on the model, while at the same time also providing a nice separation between + To work with presentation attributes, we usually use the + attr() + method. However, when working with custom attributes, we recommend working with prop() and set(). + These methods will help you store custom data on the model, while at the same time also providing a nice separation between custom and presentation attributes if needed.

The prop() method

- Prop + Prop is used to set attributes on the element model. It can be used to set both custom and presentation attributes, and - it also provides support for nesting making it very flexible. When setting an attribute, the first parameter is an object or - string representation of our path, and when not using an object, the second parameter will be the value we wish to set. Prop + it also provides support for nesting making it very flexible. When setting an attribute, the first parameter is an object or + string representation of our path, and when not using an object, the second parameter will be the value we wish to set. Prop will merge the properties you want to set with existing ones already present in the Cell.

@@ -93,7 +90,7 @@

The prop() method

element.prop('mylist/0/data/0/value', 50); // Set custom attribute as nested array
-    
+
 // Output from element.toJSON();
 {
     "type": "standard.Rectangle",
@@ -117,10 +114,10 @@ 

The prop() method

The set() method

- Set is a method provided by mvc.Model, and similarly to prop(), it can be used to create custom data - attributes on the element model. Like prop(), when setting an attribute, the first parameter can be an object - or string, but set() doesn't provide nesting capability in the form of a string. That means any path representation - is considered to be one attribute. Again, when not using an object, the second parameter is the value we wish to set. Another + Set is a method provided by mvc.Model, and similarly to prop(), it can be used to create custom data + attributes on the element model. Like prop(), when setting an attribute, the first parameter can be an object + or string, but set() doesn't provide nesting capability in the form of a string. That means any path representation + is considered to be one attribute. Again, when not using an object, the second parameter is the value we wish to set. Another difference to take note of is that set() will override attributes, while prop() merges them.

@@ -157,9 +154,9 @@

The set() method

Overwriting attributes with prop()

- We do provide some extra functionality when using prop, and that is to enable rewrite mode. To - enable rewrite mode, we simply use { rewrite: true } as the 3rd argument in our prop() method. - This will replace the value referenced by the path with the new one. This differs from the default behaviour which is to + We do provide some extra functionality when using prop, and that is to enable rewrite mode. To + enable rewrite mode, we simply use { rewrite: true } as the 3rd argument in our prop() method. + This will replace the value referenced by the path with the new one. This differs from the default behaviour which is to merge our properties.

@@ -208,15 +205,15 @@

Relationship between prop() and attr() methods

Both of these methods function similarly, but there are a few small differences to be aware of. Internally, attr() - implements prop() to process our attributes. Afterwards, the method places the presentation attributes within + implements prop() to process our attributes. Afterwards, the method places the presentation attributes within the attrs object. Separating attributes in this manner also provides our model with a nice semantic and organizational divide between our custom and presentation properties.

- In the following example, you can see both attr() and prop() in action. It would be possible to set both of these - attributes using prop(), but as mentioned above, both these methods achieve what we want in our example. We see that nice - separation between attributes, because after attr() implements prop(), it also + In the following example, you can see both attr() and prop() in action. It would be possible to set both of these + attributes using prop(), but as mentioned above, both these methods achieve what we want in our example. We see that nice + separation between attributes, because after attr() implements prop(), it also prepends our path with 'attrs'. This means we find our presentation attributes in the attrs object.

@@ -241,20 +238,20 @@

Relationship between prop() and attr() methods

Another important note to mention when talking about prop() and attr() is that when changing the model, - some useful information is passed along with the change event in JointJS. propertyPath, propertyValue, - and propertyPathArray are all values which can be accessed when updating the model. This can prove useful if for some - reason you need to listen to a specific attribute change. Note that it is not possible to access these values in this manner + some useful information is passed along with the change event in JointJS. propertyPath, propertyValue, + and propertyPathArray are all values which can be accessed when updating the model. This can prove useful if for some + reason you need to listen to a specific attribute change. Note that it is not possible to access these values in this manner when using set().

graph.on('change', (cell, opt) => {
     if ('attrs' in cell.changed) {
-        console.log(opt.propertyPathArray, 'was changed'); 
+        console.log(opt.propertyPathArray, 'was changed');
         // --> ['attrs', 'body', 'fill'] 'was changed'
     }
 
     if ('isInteractive' in cell.changed) {
-        console.log(opt.propertyPathArray, 'was changed'); 
+        console.log(opt.propertyPathArray, 'was changed');
         // --> ['isInteractive'] 'was changed'
     }
 });
@@ -266,9 +263,9 @@ 

Relationship between prop() and attr() methods

Thanks for reading this far. As you can see, custom attributes open up a new world of functionality within our shapes, and don't get in the way of our presentation attributes which is nice. The most important take away is that - prop() and set() are the right set of tools to work with custom attributes. If you would like + prop() and set() are the right set of tools to work with custom attributes. If you would like to explore any of the features mentioned here in more detail, you can find our full JointJS documentation - here. + here.

diff --git a/packages/joint-core/tutorials/custom-elements.html b/packages/joint-core/tutorials/custom-elements.html index 4551ec79c..3b0e1342c 100644 --- a/packages/joint-core/tutorials/custom-elements.html +++ b/packages/joint-core/tutorials/custom-elements.html @@ -1,18 +1,13 @@ - + - - - - - @@ -21,19 +16,13 @@ - -

Custom Elements

- This is the fourth article of the intermediate section of the JointJS tutorial. Return to - serialization. See index + This is the fourth article of the intermediate section of the JointJS tutorial. Return to + serialization. See index of basic and intermediate articles.

@@ -146,13 +135,13 @@

Name

- By default, JointJS reads cell definitions from the joint.shapes namespace. If for some reason you would like to change this behaviour, - it is possible to do so. We can achieve this by combining the cellNamespace and cellViewNamespace options which can be found + By default, JointJS reads cell definitions from the joint.shapes namespace. If for some reason you would like to change this behaviour, + it is possible to do so. We can achieve this by combining the cellNamespace and cellViewNamespace options which can be found on graph and paper respectively. Let's see how that might look.

var customNamespace = {};
-    
+
 var graph = new joint.dia.Graph({}, { cellNamespace: customNamespace });
 
 new joint.dia.Paper({
@@ -179,9 +168,9 @@ 

Name

} }); -graph.fromJSON({ +graph.fromJSON({ cells: [ - { + { "type": "shapeGroup.Shape", "size": { "width": 500, "height": 50 }, "position": { "x": 50, "y": 25 }, @@ -192,13 +181,13 @@

Name

} } ] -}); +});

- As you can see, type is very important, especially if you want to import a graph from JSON. + As you can see, type is very important, especially if you want to import a graph from JSON. In the example above, graph looks at the customNamespace.shapeGroup.Shape path to find the correct constructor. - If we were to use the incorrect type in graph.fromJSON(), that would mean graph is unable to find the correct constructor, + If we were to use the incorrect type in graph.fromJSON(), that would mean graph is unable to find the correct constructor, and we wouldn't see our custom element.

@@ -268,7 +257,7 @@

Default Attributes

In joint.shapes.standard.Rectangle, we can see that the subelement referenced by body (i.e. the SVGRectElement component of the shape) has its default width and height set in terms of the shape model size (using the calc() function). Read more about calc() - in our attributes + in our attributes documentation. Alongside sizing, you can see the fill and stroke styling. The label subelement (the SVGTextElement component of the shape) has its text anchor set to the center of the text bbox; that point is then positioned into the center of the model bbox by x @@ -322,8 +311,8 @@

Default Attributes

We can see that the anchor of the label of joint.shapes.standard.Rectangle in our example is placed centrally. We use calc() to place the label relative to our - shape model. If the model size was kept at (100, 100), that would mean that the anchor of the label - will be offset from the reference origin by (50, 50) when using x: 'calc(0.5*w)' and + shape model. If the model size was kept at (100, 100), that would mean that the anchor of the label + will be offset from the reference origin by (50, 50) when using x: 'calc(0.5*w)' and y: 'calc(0.5*h)'.

@@ -415,7 +404,7 @@

Example

We add our shapes to the graph in the same manner described in our basic Graph & Paper tutorial. In the code below, we add a joint.shapes.standard.Rectangle with rounded corners and - a Multiline label. The Multiline label respects the x and y values that we + a Multiline label. The Multiline label respects the x and y values that we calculated with the calc() function earlier.

@@ -436,7 +425,7 @@

Example

The following example shows the default look of joint.shapes.standard.Rectangle (i.e. with - no instance attributes set), and the Multiline label example above. Alongside those, you can see the default + no instance attributes set), and the Multiline label example above. Alongside those, you can see the default look of our custom element, and the randomized results of the createRandom() constructor function. Try refreshing the page to see createRandom() in action.

diff --git a/packages/joint-core/tutorials/custom-links.html b/packages/joint-core/tutorials/custom-links.html index 1e1a0b568..1201e3a14 100644 --- a/packages/joint-core/tutorials/custom-links.html +++ b/packages/joint-core/tutorials/custom-links.html @@ -8,11 +8,6 @@ - - - - - @@ -21,18 +16,12 @@ - -

Custom Links

- This is the fifth article of the intermediate section of the JointJS tutorial. Return to + This is the fifth article of the intermediate section of the JointJS tutorial. Return to custom elements. See index of basic and intermediate articles.

@@ -146,17 +135,17 @@

Name

// Markup }] }); - +

- By default, JointJS reads cell definitions from the joint.shapes namespace. If for some reason you would like to change this behaviour, - it is possible to do so. We can achieve this by combining the cellNamespace and cellViewNamespace options which can be found + By default, JointJS reads cell definitions from the joint.shapes namespace. If for some reason you would like to change this behaviour, + it is possible to do so. We can achieve this by combining the cellNamespace and cellViewNamespace options which can be found on graph and paper respectively. Let's see how that might look.

var customNamespace = {};
 
 var graph = new joint.dia.Graph({}, { cellNamespace: customNamespace });
-    
+
 new joint.dia.Paper({
     el: document.getElementById('paper-custom-links-namespace'),
     model: graph,
@@ -181,9 +170,9 @@ 

Name

} }); -graph.fromJSON({ +graph.fromJSON({ cells: [ - { + { "type": "shapeGroup.Link", "source": { "x": 100, "y": 50 }, "target": { "x": 500, "y": 50 } @@ -200,9 +189,9 @@

Name

});

- As you can see, type is very important, especially if you want to import a graph from JSON. + As you can see, type is very important, especially if you want to import a graph from JSON. In the example above, graph looks at the customNamespace.shapeGroup.Link path to find the correct constructor. - If we were to use the incorrect type in graph.fromJSON(), that would mean graph is unable to find the correct constructor, + If we were to use the incorrect type in graph.fromJSON(), that would mean graph is unable to find the correct constructor, and we wouldn't see our custom link.

diff --git a/packages/joint-core/tutorials/element-tools.html b/packages/joint-core/tutorials/element-tools.html index 45f7eb64f..5adb6c1f8 100644 --- a/packages/joint-core/tutorials/element-tools.html +++ b/packages/joint-core/tutorials/element-tools.html @@ -1,17 +1,13 @@ - + - - - - @@ -20,12 +16,6 @@ - -

Element Tools

diff --git a/packages/joint-core/tutorials/elements.html b/packages/joint-core/tutorials/elements.html index 4a9aef8da..adca1997d 100644 --- a/packages/joint-core/tutorials/elements.html +++ b/packages/joint-core/tutorials/elements.html @@ -1,7 +1,7 @@ - + @@ -10,10 +10,6 @@ - - - - @@ -22,12 +18,6 @@ - -

Elements

@@ -47,7 +37,7 @@

Elements

more advanced topics are covered later in the tutorial series. We will continue with the code we modified in the previous section:

-
<!DOCTYPE html>
+            
<!DOCTYPE html>
 <html>
 <head>
     <link rel="stylesheet" type="text/css" href="node_modules/jointjs/dist/joint.css" />
@@ -57,8 +47,6 @@ 

Elements

<div id="myholder"></div> <!-- dependencies --> - <script src="node_modules/jquery/dist/jquery.js"></script> - <script src="node_modules/lodash/lodash.js"></script> <script src="node_modules/jointjs/dist/joint.js"></script> <!-- code --> @@ -234,7 +222,7 @@

Example

-
<!DOCTYPE html>
+            
<!DOCTYPE html>
 <html>
 <head>
     <link rel="stylesheet" type="text/css" href="node_modules/jointjs/dist/joint.css" />
@@ -244,8 +232,6 @@ 

Example

<div id="myholder"></div> <!-- dependencies --> - <script src="node_modules/jquery/dist/jquery.js"></script> - <script src="node_modules/lodash/lodash.js"></script> <script src="node_modules/jointjs/dist/joint.js"></script> <!-- code --> diff --git a/packages/joint-core/tutorials/event-handling.html b/packages/joint-core/tutorials/event-handling.html index 5515d5949..4c0b62ccc 100644 --- a/packages/joint-core/tutorials/event-handling.html +++ b/packages/joint-core/tutorials/event-handling.html @@ -1,18 +1,13 @@ - + - - - - - @@ -21,12 +16,6 @@ - -

Event handling

diff --git a/packages/joint-core/tutorials/events.html b/packages/joint-core/tutorials/events.html index a53dd1e58..1b827a15b 100644 --- a/packages/joint-core/tutorials/events.html +++ b/packages/joint-core/tutorials/events.html @@ -8,10 +8,6 @@ - - - - @@ -20,12 +16,6 @@ - -

Events

@@ -62,25 +52,25 @@

Built-in Paper Events

paper.on('blank:pointerdblclick', function() {
-    resetAll(this);
+    resetAll(paper);
 
     info.attr('body/visibility', 'hidden');
     info.attr('label/visibility', 'hidden');
 
-    this.drawBackground({
+    paper.drawBackground({
         color: 'orange'
     });
 });
 
 paper.on('element:pointerdblclick', function(elementView) {
-    resetAll(this);
+    resetAll(paper);
 
     var currentElement = elementView.model;
     currentElement.attr('body/stroke', 'orange');
 });
 
 paper.on('link:pointerdblclick', function(linkView) {
-    resetAll(this);
+    resetAll(paper);
 
     var currentLink = linkView.model;
     currentLink.attr('line/stroke', 'orange');
diff --git a/packages/joint-core/tutorials/filters-gradients.html b/packages/joint-core/tutorials/filters-gradients.html
index 2eff25b37..120d6f255 100644
--- a/packages/joint-core/tutorials/filters-gradients.html
+++ b/packages/joint-core/tutorials/filters-gradients.html
@@ -8,11 +8,6 @@
         
         
 
-        
-        
-        
-
-
         
         
 
@@ -21,12 +16,6 @@
     
     
 
-        
-
         

Filters and gradients in elements and links

diff --git a/packages/joint-core/tutorials/foreign-object.html b/packages/joint-core/tutorials/foreign-object.html index a12b93560..b4cb64f11 100644 --- a/packages/joint-core/tutorials/foreign-object.html +++ b/packages/joint-core/tutorials/foreign-object.html @@ -8,11 +8,6 @@ - - - - - @@ -27,8 +22,8 @@

Foreign Object

- In the wonderful world of SVG elements, - foreignObject + In the wonderful world of SVG elements, + foreignObject stands out from the rest as it provides some unique behaviour that other SVG elements do not. SVG, like other XML dialects, is namespaced. That means if you want to include elements from a different XML namespace right in your SVG, you need some mechanism to enable this functionality. That's where foreignObject comes into play. @@ -40,20 +35,20 @@

Foreign Object

Historically, recommending foreignObject to users of JointJS was a little bit tricky, the main reason for this was the inherent lack of support for foreignObject in Internet Explorer. Due to the necessity of supporting all our users, - including those who were still using IE, there was a hesitancy about integrating support into the library fully. Luckily for us, + including those who were still using IE, there was a hesitancy about integrating support into the library fully. Luckily for us, the days in which we had to support IE are now at an end, and all other major browsers have full support, as illustrated by this caniuse reference table.

- Now, that we can more confidently recommend the use of foreignObject with JointJS, embedding HTML text in SVG, - creating basic interactive elements like buttons, or working with HTML inputs should be a more straightforward process. - With this addition, combining the power of JointJS with foreignObject opens up a world of possibilities for + Now, that we can more confidently recommend the use of foreignObject with JointJS, embedding HTML text in SVG, + creating basic interactive elements like buttons, or working with HTML inputs should be a more straightforward process. + With this addition, combining the power of JointJS with foreignObject opens up a world of possibilities for interactivity within your JointJS diagrams.

- In order to get a general idea of how foreignObject can be utilized in SVG, let's start with a simple + In order to get a general idea of how foreignObject can be utilized in SVG, let's start with a simple example without using JointJS.

@@ -118,7 +113,7 @@

Using foreignObject

rect.card { fill: url(#gradient); } .stop1 { stop-color: #ff5c69; } .stop2 { stop-color: #ff4252; } - .stop3 { stop-color: #ed2637; } + .stop3 { stop-color: #ed2637; } @@ -136,8 +131,8 @@

Using foreignObject

- Now that we have a better understanding of what foreignObject is all about, how would we create - an equivalent example with JointJS? Using foreignObject with JointJS is much the same as creating any + Now that we have a better understanding of what foreignObject is all about, how would we create + an equivalent example with JointJS? Using foreignObject with JointJS is much the same as creating any custom element which you can see in the following code example.

@@ -218,14 +213,14 @@

Using foreignObject

In order for our JointJS example to have the equivalent functionality as the first example, we need to make selecting text possible. To do that, we use the paper - preventDefaultViewAction + preventDefaultViewAction option which prevents the default action when a Cell is clicked.

- While preventDefaultViewAction handles clicking, we also need to allow the user to select text via CSS. As the default CSS + While preventDefaultViewAction handles clicking, we also need to allow the user to select text via CSS. As the default CSS in JointJS sets the user-select property to 'none', we need to override this on our element. - The preventDefaultViewAction option combined with the following CSS override enables users to select text in the same manner + The preventDefaultViewAction option combined with the following CSS override enables users to select text in the same manner as the vanilla SVG example from earlier. We can also adjust the cursor value in order to see the text cursor.

@@ -253,9 +248,9 @@

Using foreignObject

- Since our foreignObject contains quite a lot of HTML, we can take advantage of the - util.svg method to make our - markup object more concise. + Since our foreignObject contains quite a lot of HTML, we can take advantage of the + util.svg method to make our + markup object more concise. The resulting custom element definition will be more compact, and might prove easier to read for some developers.

@@ -303,15 +298,15 @@

A more interactive example

One alternative method which diagram libraries utilize to allow users work with HTML is to render HTML on top of an underlying element. - While this approach can be successful, it comes with a lot of additional complexity such as the need to keep dimensions and position + While this approach can be successful, it comes with a lot of additional complexity such as the need to keep dimensions and position of the HTML in sync with the element itself. To this day, this approach is used by many competing diagram libraries - especially those that use HTML Canvas rendering.

- It's possible to use the HTML overlay approach in JointJS, however since JointJS primarily works with SVG - and SVG was designed to work - well with other web standards such as HTML - taking advantage of foreignObject can allow users of JointJS create HTML-rich + It's possible to use the HTML overlay approach in JointJS, however since JointJS primarily works with SVG - and SVG was designed to work + well with other web standards such as HTML - taking advantage of foreignObject can allow users of JointJS create HTML-rich elements while avoiding some of the difficulties of other approaches.

@@ -324,7 +319,7 @@

A more interactive example

In our previous example, we created an SVG rect element alongside our foreignObject. If your shape requires - other SVG elements, it's possible to add them in the same manner, but it's also not a requirement. You may find that + other SVG elements, it's possible to add them in the same manner, but it's also not a requirement. You may find that foreignObject is sufficient, and it's the only SVG element you wish to define explicitly. In our form example, that's exactly the route we will take, and you can see it demonstrated in the following code example.

@@ -358,10 +353,10 @@

A more interactive example

- As the default styles for our form are a little boring, we will also add the following CSS just to make our elements a - little more presentable. It's also possible to add CSS via an SVG - style element, or inline - styles via the style attribute + As the default styles for our form are a little boring, we will also add the following CSS just to make our elements a + little more presentable. It's also possible to add CSS via an SVG + style element, or inline + styles via the style attribute if you prefer, but as we are adding a substantial amount of CSS, we will use a separate stylesheet.

@@ -394,7 +389,7 @@

A more interactive example

color: white; cursor: text; font-size: 1rem; - height: 56px; + height: 56px; outline-color: hsl(355, 100%, 63%); outline-width: thin; padding: 0 32px; @@ -427,7 +422,7 @@

A more interactive example

button span { background: linear-gradient(92.05deg, hsl(355, 100%, 68%) 12.09%, hsl(355, 100%, 63%) 42.58%, hsl(355, 85%, 54%) 84.96%); -webkit-background-clip: text; - background-clip: text; + background-clip: text; -webkit-text-fill-color: hsl(0deg 0% 0% / 0%); font-size: 1.2rem; } @@ -437,8 +432,8 @@

A more interactive example

JointJS source code: foreign-object.js

- When working with JointJS, you will have to make decisions about how some HTML elements lose focus. Notably, the default behavior of an - HTML form is that when a user clicks on a blank area, the active input field loses focus. In order to mimic + When working with JointJS, you will have to make decisions about how some HTML elements lose focus. Notably, the default behavior of an + HTML form is that when a user clicks on a blank area, the active input field loses focus. In order to mimic this behaviour in JointJS, we can create an event to remove focus when the user clicks on a blank paper area, or even on any JointJS element.

@@ -449,10 +444,10 @@

A more interactive example

- Alternatively, setting the + Alternatively, setting the preventDefaultViewAction - and - preventDefaultBlankAction + and + preventDefaultBlankAction paper options to false would have the same effect on focus.

@@ -465,7 +460,7 @@

Preventing default JointJS

The simple explanation is that JointJS prevents its own default interactions when working with HTML form controls. That means for example, - if you try to drag an input, the element doesn't move as a whole, but it selects the text inside the input. The elements + if you try to drag an input, the element doesn't move as a whole, but it selects the text inside the input. The elements where JointJS prevents its default interaction are as follows:

@@ -478,15 +473,15 @@

Preventing default JointJS

- In the example above, we created a paper event with the aim of managing focus. One detail you may not have noticed is that the - button text is actually contained within a span element. If we had not applied the paper event, - and the input was in focus, clicking on the span element won't actually cause the input to lose focus. - However, clicking on the button itself will make the input lose focus, as button is one of the + In the example above, we created a paper event with the aim of managing focus. One detail you may not have noticed is that the + button text is actually contained within a span element. If we had not applied the paper event, + and the input was in focus, clicking on the span element won't actually cause the input to lose focus. + However, clicking on the button itself will make the input lose focus, as button is one of the elements where JointJS prevents its default interaction.

- If we wanted the input to lose focus when a user clicks on the span element, utilizing the + If we wanted the input to lose focus when a user clicks on the span element, utilizing the preventDefaultViewAction option would accomplish this. A stronger measure would be to use the paper guard option as follows guard: (evt) => ['SPAN'].includes(evt.target.tagName). When using this option, it's important to note that @@ -496,16 +491,16 @@

Preventing default JointJS

- One of the final items you may wish to take care of when using a form in JointJS is to prevent the default browser behaviour - when submitting user data. In order to achieve this, we will create a custom - CellView for our element. It will contain an events hash - which specifies a DOM event that will be bound to a method on the view. The key is made up of the event name plus a CSS selector, + One of the final items you may wish to take care of when using a form in JointJS is to prevent the default browser behaviour + when submitting user data. In order to achieve this, we will create a custom + CellView for our element. It will contain an events hash + which specifies a DOM event that will be bound to a method on the view. The key is made up of the event name plus a CSS selector, and the value is a method on our custom view.

- In the following example, we specify the event name 'submit', plus our CSS element selector 'form', and lastly - the name of our method 'onSubmit'. We can prevent that browser refresh by using evt.preventDefault(), and clear + In the following example, we specify the event name 'submit', plus our CSS element selector 'form', and lastly + the name of our method 'onSubmit'. We can prevent that browser refresh by using evt.preventDefault(), and clear the value of the HTML input value afterwards if we wish to do so.

@@ -531,15 +526,15 @@

Preventing default JointJS

Props, a special attribute

- The last point which we would like to cover when discussing HTML form controls is the special + The last point which we would like to cover when discussing HTML form controls is the special props attribute. When creating HTML elements, it's - possible to define various attributes to initialize certain DOM properties. In some cases (such as 'id'), + possible to define various attributes to initialize certain DOM properties. In some cases (such as 'id'), this is a one-to-one relationship, but in others (such as 'value'), the attribute doesn't reflect the property, and it serves more like an initial and current state. - When working with JointJS, it wouldn't make sense that users can only set an initial 'value' attribute for an - input, and then have to access DOM elements themselves to update the 'value' property. If using - foreignObject, users should be able to set the current 'value' of an input through the model at - any time they want. It's for this exact reason that we created the special props attribute, and it can be utilized as + When working with JointJS, it wouldn't make sense that users can only set an initial 'value' attribute for an + input, and then have to access DOM elements themselves to update the 'value' property. If using + foreignObject, users should be able to set the current 'value' of an input through the model at + any time they want. It's for this exact reason that we created the special props attribute, and it can be utilized as follows:

@@ -595,16 +590,16 @@
Boolea

Boolean attributes are those data types where the presence or absence of the attribute represents its truthy or falsy - value respectively. Some common examples are - - required, - disabled, + value respectively. Some common examples are + + required, + disabled, and readonly.

Usually, boolean attributes can be utilized in 3 different ways: you can omit the value, use an empty string, or set the value as a - case-insensitive match for the attribute's name. In our case, we cannot omit the value, so we must use the 2nd or 3rd option. This is + case-insensitive match for the attribute's name. In our case, we cannot omit the value, so we must use the 2nd or 3rd option. This is demonstrated in the following example which uses the required attribute.

@@ -621,17 +616,17 @@
Boolea
Closing Tags

- In the past, developers traditionally used start and end tags for HTML elements. If we wanted some text on the page, we might - create the following paragraph element <p>Lorem ipsum dolor sit amet consectetur.</p>. With the advent - of HTML5, it's not strictly necessary to close certain elements which are considered - void, i.e., elements which can't have + In the past, developers traditionally used start and end tags for HTML elements. If we wanted some text on the page, we might + create the following paragraph element <p>Lorem ipsum dolor sit amet consectetur.</p>. With the advent + of HTML5, it's not strictly necessary to close certain elements which are considered + void, i.e., elements which can't have child nodes.

In HTML, it's possible to write a line-break element as <br> or <br />. The trailing slash - in the tag has no meaning, and browsers simply ignore it. However, in XML, XHTML, and SVG, self closing tags are required in void elements, - so a trailing slash is necessary. When working with tagged templates in JointJS, you must use a trailing slash. This can be + in the tag has no meaning, and browsers simply ignore it. However, in XML, XHTML, and SVG, self closing tags are required in void elements, + so a trailing slash is necessary. When working with tagged templates in JointJS, you must use a trailing slash. This can be observed in the following example:

@@ -658,7 +653,7 @@
HTML Entiti HTML Entities are used in place of some characters that are reserved depending on the language. For example, the greater than (>) or less than (<) sign cannot be used in HTML as it would cause a conflict with tags. This is also one area to be careful with when using tagged templates. You must use the entity number rather than - the entity name. Entity numbers are the ones which use the # symbol. That means using &#169; + the entity name. Entity numbers are the ones which use the # symbol. That means using &#169; is preferable over &copy;.

@@ -677,27 +672,27 @@
HTML Entiti
IDs

- Since having more than one ID of the same value in the DOM is considered invalid according to the + Since having more than one ID of the same value in the DOM is considered invalid according to the HTML - specification, we recommend not including an ID attribute in your HTML Elements. The first scenario where this may be relevant is when + specification, we recommend not including an ID attribute in your HTML Elements. The first scenario where this may be relevant is when choosing CSS selectors. Using a class attribute in your markup rather than an ID is advised.

- The second situation where this proves important is programmatically associating a label with an + The second situation where this proves important is programmatically associating a label with an input element. One method of making this association is by providing an 'id' attribute to an input, and a 'for' attribute to its label. Each of which would have the same value. This has - a number of advantages such as screen readers reading the label when the associated input is focused, and also that the focus is + a number of advantages such as screen readers reading the label when the associated input is focused, and also that the focus is passed to the input when the associated label is clicked.

- As we don't want to use an ID, we should use an alternative method to make this association such as nesting an input in its + As we don't want to use an ID, we should use an alternative method to make this association such as nesting an input in its respective label which will have the same effect.

// Do not use ID attributes in HTML markup ❌
-<p id="paragraph"> 
+<p id="paragraph">
     Lorem ipsum dolor sit amet, consectetur adipiscing elit.
 </p>
 
@@ -717,7 +712,7 @@ 
IDs
<input @selector="firstname" type="text"/> </label>
- +

@@ -726,9 +721,9 @@

- Our experience with both Chrome and Firefox has been very positive, but we have ran into some quirks when using Safari. - In this section, we will cover some issues we discovered, and some related - webkit bugs, but this also isn't an exhaustive list, so you + Our experience with both Chrome and Firefox has been very positive, but we have ran into some quirks when using Safari. + In this section, we will cover some issues we discovered, and some related + webkit bugs, but this also isn't an exhaustive list, so you might run into an issue with Safari that isn't mentioned here.

@@ -748,18 +743,18 @@ Naturally, we also searched the same bug report for any potential solutions, and found suggestions that adding a style of 'position: fixed' to the outermost div element fixed some of the issues that people had. Once again, the information proved to be helpful, and the elements seemed to be positioned correctly again. We did notice when transforming the - JointJS paper with a method such as - transformToFitContent, - 'position:fixed' again caused issues with element position. Therefore, if you are using paper transforms, + JointJS paper with a method such as + transformToFitContent, + 'position:fixed' again caused issues with element position. Therefore, if you are using paper transforms, the default 'position:static' might be preferable for some use cases.

On further inspection, we realized that we still had one major issue with the video. After dragging our JointJS shape, the video - was still rendered in the incorrect position which was disappointing. The silver lining was that the opacity and - transform applied to our label and input respectively were working correctly, and those - elements seemed to maintain the correct position. The following is some example markup we had issues with in Safari. + was still rendered in the incorrect position which was disappointing. The silver lining was that the opacity and + transform applied to our label and input respectively were working correctly, and those + elements seemed to maintain the correct position. The following is some example markup we had issues with in Safari. Your mileage may vary.

@@ -782,8 +777,8 @@

The situation described above, and the resulting issues were discovered mostly through trial and error. That's all well and good, but - can we learn anything from the webkit bug reports? It seems that when HTML inside a foreignObject gets a - RenderLayer, the hierarchial position of the RenderLayer is inaccurate which results in the HTML being positioned incorrectly. + can we learn anything from the webkit bug reports? It seems that when HTML inside a foreignObject gets a + RenderLayer, the hierarchial position of the RenderLayer is inaccurate which results in the HTML being positioned incorrectly. Let's try to reduce this information to some more actionable points.

@@ -802,10 +797,10 @@

- If you've never tested which events are triggered when a user clicks on a select element, don't worry, we've done it, so - you don't have to. It turns out, the events that get triggered are quite inconsistent across all major browsers when interacting with + If you've never tested which events are triggered when a user clicks on a select element, don't worry, we've done it, so + you don't have to. It turns out, the events that get triggered are quite inconsistent across all major browsers when interacting with select. Safari, for example, only triggers 'pointerdown' when you open select. As a result of these - inconsistencies, JointJS includes select in the paper guard option by default. Therefore, if you + inconsistencies, JointJS includes select in the paper guard option by default. Therefore, if you interact with a select element, JointJS will not trigger its paper events. You as a user are not obliged to do something about this, but it's something you should be aware of.

@@ -821,17 +816,17 @@
  • video
  • select
  • - +

    As stated already, this isn't an exhaustive list of issues, so it's possible you may run into some other inconsistencies with Safari. - It's unfortunate that Safari still lags behind other modern browsers in relation to foreignObject, but there are also - reasons to be positive. One reason to have a brighter outlook is that some of the major issues we experienced here are currently being - worked on according to this bug report, so hopefully in the + It's unfortunate that Safari still lags behind other modern browsers in relation to foreignObject, but there are also + reasons to be positive. One reason to have a brighter outlook is that some of the major issues we experienced here are currently being + worked on according to this bug report, so hopefully in the not too distant future, the majority of these issues will cease to exist.

    - This is a section we would like to keep updated as much as possible, so if you encounter any other interesting behaviour, you can let us + This is a section we would like to keep updated as much as possible, so if you encounter any other interesting behaviour, you can let us know.

    @@ -839,14 +834,14 @@

    Conclusion

    We are very happy that we can now confidently recommend the use of foreignObject to users of JointJS, and that it's - well-supported in all major browsers. We consider it a big step forward for creating diagrams with JointJS, and believe it will + well-supported in all major browsers. We consider it a big step forward for creating diagrams with JointJS, and believe it will allow the creation of even more innovative and interactive diagramming solutions. If you want to start using HTML with JointJS, there is no better time to do so, and we can't wait to see what you create.

    - That's all we will cover in this tutorial. Thanks for staying with us if you got this far. If you would like - to explore any of the features mentioned here in more detail, you can find extra information in our + That's all we will cover in this tutorial. Thanks for staying with us if you got this far. If you would like + to explore any of the features mentioned here in more detail, you can find extra information in our JointJS documentation.

    diff --git a/packages/joint-core/tutorials/graph-and-paper.html b/packages/joint-core/tutorials/graph-and-paper.html index 562c093db..1e68b81b1 100644 --- a/packages/joint-core/tutorials/graph-and-paper.html +++ b/packages/joint-core/tutorials/graph-and-paper.html @@ -10,10 +10,6 @@ - - - - @@ -22,11 +18,6 @@ -

    Graph & Paper

    @@ -43,7 +34,7 @@

    Graph & Paper

    and linking them to our HTML. We will be looking at these portions of the original Hello, World! application:

    -
    <!DOCTYPE html>
    +            
    <!DOCTYPE html>
     <html>
     <head>
         <link rel="stylesheet" type="text/css" href="node_modules/jointjs/dist/joint.css" />
    @@ -53,15 +44,13 @@ 

    Graph & Paper

    <div id="myholder"></div> <!-- dependencies --> - <script src="node_modules/jquery/dist/jquery.js"></script> - <script src="node_modules/lodash/lodash.js"></script> <script src="node_modules/jointjs/dist/joint.js"></script> <!-- code --> <script type="text/javascript"> - + var namespace = joint.shapes; - + var graph = new joint.dia.Graph({}, { cellNamespace: namespace }); var paper = new joint.dia.Paper({ @@ -174,7 +163,7 @@

    Paper Styling

    The code is presented below. The changes we made are highlighted:

    -
    <!DOCTYPE html>
    +            
    <!DOCTYPE html>
     <html>
     <head>
         <link rel="stylesheet" type="text/css" href="node_modules/jointjs/dist/joint.css" />
    @@ -184,8 +173,6 @@ 

    Paper Styling

    <div id="myholder"></div> <!-- dependencies --> - <script src="node_modules/jquery/dist/jquery.js"></script> - <script src="node_modules/lodash/lodash.js"></script> <script src="node_modules/jointjs/dist/joint.js"></script> <!-- code --> diff --git a/packages/joint-core/tutorials/hello-world.html b/packages/joint-core/tutorials/hello-world.html index 96ccb7b97..d77ec3176 100644 --- a/packages/joint-core/tutorials/hello-world.html +++ b/packages/joint-core/tutorials/hello-world.html @@ -9,10 +9,6 @@ - - - - @@ -21,11 +17,6 @@ -

    Hello world!

    @@ -40,16 +31,14 @@

    Hello world!

    <!DOCTYPE html>
     <html>
     <head>
    -    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jointjs/3.5.5/joint.css" />
    +    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jointjs/4.0.0/joint.css" />
     </head>
     <body>
         <!-- content -->
         <div id="myholder"></div>
     
         <!-- dependencies -->
    -    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.js"></script>
    -    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.js"></script>
    -    <script src="https://cdnjs.cloudflare.com/ajax/libs/jointjs/3.5.5/joint.js"></script>
    +    <script src="https://cdnjs.cloudflare.com/ajax/libs/jointjs/4.0.0/joint.js"></script>
     
         <!-- code -->
         <script type="text/javascript">
    diff --git a/packages/joint-core/tutorials/hierarchy.html b/packages/joint-core/tutorials/hierarchy.html
    deleted file mode 100644
    index 158a1406d..000000000
    --- a/packages/joint-core/tutorials/hierarchy.html
    +++ /dev/null
    @@ -1,137 +0,0 @@
    -
    -
    -    
    -
    -        
    -        
    -
    -        
    -        
    -
    -        
    -        
    -        
    -
    -
    -        
    -        
    -
    -        JointJS - JavaScript diagramming library - Getting started.
    -
    -    
    -    
    -
    -        
    -
    -        
    - -

    Tips on hierarchical diagrams

    - -

    - Disclaimer - - - - The following tutorial was created with a past version of JointJS. The tutorial is still provided for - those who may face a similar problem, but it may no longer show the best practices of JointJS. You may - encounter the following issues: - -

    - -
      -
    • Use of outdated/deprecated API calls, or inheritance from superseded shape collections.
    • -
    • Use of SVG string markup for custom Element/Link shape definitions; we have since started - recommending using JSON markup instead.
    • -
    • The Element and Link types defined may not serialize properly.
    • -
    • Other unexpected problems.
    • -
    - -

    - Our current recommendations on best practices can be found in the appropriate sections of the - basic and intermediate tutorials. -

    - -

    - JointJS provides a facility to create hierarchy in your diagrams. The API is simple and - contains three methods and two properties dealing with parent-child relationships between elements. - The methods are embed(), - unembed() and - getEmbeddedCells(). - The properties are embeds and parent (Please refer to the Nesting - section - of the joint.dia.Element model reference). -

    - -

    This tutorial shows how to take advantage of these methods in order to implement three functionalities - common to parent-child relationships: child movement restriction to - the parent area, - expanding parent area to cover its children and - reparenting. -

    - -

    Restricting child movement to the parent area

    - -

    The goal is to restrict the movement of an element embedded in a parent in order disallow - the user to drag the element outside the parent element area. -

    -

    The trick here is to detect when the child element bounding box gets outside the bounding box - of the parent and revert the child position if that happens.

    - -

    Try to move the child element outside the parent element area.

    - -
    - -
    
    -
    -            

    Expanding parent area to cover its children

    - -

    This section shows how to make the parent element automatically resizable so that it coveres - its children.

    - -

    Again, we'll react on the change:position event on the graph but this time we resize the parent - element based on the position and size of its children. We also store the original position and size of the - parent element so that we can shrink the parent element back if the child element we manipulate - fits into the original parent element area.

    - -

    Try to move the child element outside the parent element area and see how the - parent element automatically expands/shirnks.

    - -
    - -
    
    -
    -
    -            

    Reparenting

    - -

    Another useful technique when dealing with parent-child relationships is being able to drop an element - above another element and let the element below become a new parent of the dropped element. This way - we alow the user to change the parentage via the UI.

    - -

    First, we register a handler for the cell:pointerdown event on the paper that is triggered - whenever a mousedown (touchstart) above a cell is emitted. This is where the dragging begins. In this - handler, - we unembed the dragged element if it was a child of a parent. Note that we also show the dragged element - above all the other cells (toFront()) so that we always see it in the front while dragging. - Second, we register a handler for the cell:pointerup event which is triggered when we - drop the dragged element. In this handler, we find all the cells that are below the center of the - dragged element. In this example, we pick the first one that is not the dragged element itself - and make it a new parent of the dragged element. If you have more than one level of hierarchy in - your application, you might want to find an element the most in the front (by looking at the z - property) instead. We left this out of this example for simplicity.

    - -

    Try to move the El B over El A, then move the El A. You should see - the El B moves as well as it became a child of El A.

    - -
    - -
    
    -
    -        
    - - - - - diff --git a/packages/joint-core/tutorials/html-elements.html b/packages/joint-core/tutorials/html-elements.html deleted file mode 100644 index a44899367..000000000 --- a/packages/joint-core/tutorials/html-elements.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - JointJS - JavaScript diagramming library - Getting started. - - - - - - -
    - -

    Using HTML in JointJS elements

    - -

    - Disclaimer - - - - The following tutorial was created with a past version of JointJS. The tutorial is still provided for - those who may face a similar problem, but it may no longer show the best practices of JointJS. You may - encounter the following issues: - -

    - -
      -
    • Use of outdated/deprecated API calls, or inheritance from superseded shape collections.
    • -
    • Use of SVG string markup for custom Element/Link shape definitions; we have since started - recommending using JSON markup instead.
    • -
    • The Element and Link types defined may not serialize properly.
    • -
    • Other unexpected problems.
    • -
    - -

    - Our current recommendations on best practices can be found in the appropriate sections of the - basic and intermediate tutorials. -

    - -

    Many times, you might want to use HTML inputs or other HTML elements inside your JointJS graphs. This - tutorial describes a way of doing this. The technique used in this tutorial is creating a custom - view that renders your HTML and takes care of the interaction with the HTML. A different approach might - be to use the - foreignObject and - embed it in the markup of your JointJS elements. - This technique is however problematic due to a poor browser support. (However, this seems to be the right - way - of combining HTML with SVG in JointJS in the future.)

    - -

    The good news is that if you setup your custom HTML view properly, you can take advantage - of many of the features JointJS has to offer.

    - -
    - -

    The code below shows how you can create a custom JointJS view that renders HTML (including - functional inputs). The trick is to update the HTML element position and dimension so that it follows - the underlying JointJS element. Additionally, we observe changes on the embedded inputs and update - the JointJS model accordingly. This also works the other way round, if the model changes, we - reflect the changes in the HTML.

    - - - - -

    JavaScript code

    -
    
    -            

    CSS stylesheet

    -
    
    -        
    - - - - - diff --git a/packages/joint-core/tutorials/hyperlinks.html b/packages/joint-core/tutorials/hyperlinks.html index 41eabf52e..013dbbffc 100644 --- a/packages/joint-core/tutorials/hyperlinks.html +++ b/packages/joint-core/tutorials/hyperlinks.html @@ -8,11 +8,6 @@ - - - - - @@ -21,12 +16,6 @@ - -
    + The callback function is expected to have the signature function(evt, elementView, buttonView) where evt is a DOM event. The element view is available inside the function as this; the element model is available as this.model. diff --git a/packages/joint-core/docs/src/joint/api/linkTools/Button.html b/packages/joint-core/docs/src/joint/api/linkTools/Button.html index 1a821217b..7765a43a9 100644 --- a/packages/joint-core/docs/src/joint/api/linkTools/Button.html +++ b/packages/joint-core/docs/src/joint/api/linkTools/Button.html @@ -26,7 +26,7 @@ + The callback function is expected to have the signature function(evt, linkView, buttonView) where evt is a DOM event. The related link view is available inside the function as this. The link model is available as this.model. diff --git a/packages/joint-core/docs/src/joint/api/linkTools/Remove.html b/packages/joint-core/docs/src/joint/api/linkTools/Remove.html index 58aaba92c..ae66671db 100644 --- a/packages/joint-core/docs/src/joint/api/linkTools/Remove.html +++ b/packages/joint-core/docs/src/joint/api/linkTools/Remove.html @@ -30,7 +30,7 @@ linkView.model.remove({ ui: true, tool: toolView.cid }); } - The callback function is expected to have the signature function(evt) where evt is a mvc.Event object. The button view is available inside the function as this; the button model is available as this.model.

    + The callback function is expected to have the signature function(evt) where evt is a DOM event. The button view is available inside the function as this; the button model is available as this.model.

    From 9311a7b12e0e7afb7b8d09a15e739fc54b7f03d8 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 8 Dec 2023 12:56:07 +0100 Subject: [PATCH 54/58] update --- packages/joint-core/demo/shapes/src/table.js | 2 +- .../api/dia/CellView/prototype/findNodes.html | 9 ++++++ .../ElementView/prototype/findPortNode.html | 8 +++-- .../ElementView/prototype/findPortNodes.html | 5 ++++ .../dia/LinkView/prototype/findLabelNode.html | 4 ++- .../LinkView/prototype/findLabelNodes.html | 5 ++++ .../joint-core/src/connectionPoints/index.mjs | 2 +- packages/joint-core/src/dia/CellView.mjs | 13 +++++--- packages/joint-core/src/dia/ElementView.mjs | 2 +- .../joint-core/src/dia/HighlighterView.mjs | 4 +-- packages/joint-core/src/dia/LinkView.mjs | 13 ++++---- .../joint-core/src/dia/attributes/index.mjs | 2 +- packages/joint-core/src/dia/ports.mjs | 12 +++++--- .../joint-core/src/elementTools/Control.mjs | 2 +- packages/joint-core/src/linkTools/Connect.mjs | 2 +- packages/joint-core/test/jointjs/cellView.js | 2 +- .../test/jointjs/connectionPoints.js | 4 +-- .../joint-core/test/jointjs/dia/attributes.js | 30 +++++++++---------- .../test/jointjs/dia/elementTools.js | 4 +-- .../joint-core/test/jointjs/dia/linkTools.js | 4 +-- .../joint-core/test/jointjs/elementView.js | 6 ++-- packages/joint-core/types/joint.d.ts | 14 +++++++-- 22 files changed, 96 insertions(+), 53 deletions(-) create mode 100644 packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html create mode 100644 packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html create mode 100644 packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html diff --git a/packages/joint-core/demo/shapes/src/table.js b/packages/joint-core/demo/shapes/src/table.js index 08c5f70e3..0d8b7bbed 100644 --- a/packages/joint-core/demo/shapes/src/table.js +++ b/packages/joint-core/demo/shapes/src/table.js @@ -235,7 +235,7 @@ joint.shapes.basic.TableView = joint.dia.ElementView.extend({ this._elements = []; var info = this.model.prop('table/metadata'); var tableEl = this.findNode(info.element); - this.tableVel = tableEl ? V(tableEl[0]) : this.vel; + this.tableVel = tableEl ? V(tableEl) : this.vel; this._renderFills(); this._renderBorders(); diff --git a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html new file mode 100644 index 000000000..33b674a0d --- /dev/null +++ b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html @@ -0,0 +1,9 @@ +
    cellView.findNode(selector)
    + +

    The method returns an array of DOM nodes matching the selector.

    + +

    The method searches for matching sub-elements among the descendants of this.el. If no such sub-elements are found, an empty array is returned.

    + +

    The available selectors are defined by the markup attribute of the Cell model from which the CellView was initialized.

    + +

    (Deprecated) If no matching sub-element JSON selector is found then this.el.querySelectorAll(selector) is used to try and find an element through CSS selectors. You may disable this functionality to increase performance by setting useCSSSelectors = false in the global config.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html index 5d31bcf11..42d23aa48 100644 --- a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html +++ b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html @@ -1,9 +1,11 @@
    elementView.findPortNode(portId)
    -

    Return the port element of this ElementView that is identified by portId (i.e. an SVGElement within this.el which has 'port': portId, an SVGElement referenced by portRoot selector).

    + +

    Return the port DOM node of this ElementView that is identified by portId (i.e. an SVGElement within this.el which has 'port': portId, an SVGElement referenced by portRoot selector).

    If the ElementView does not have a port identified by portId, return null.

    elementView.findPortNode(portId, selector)
    -

    If selector is also specified, return the subelement of the port element that is identified by selector, according to the rules of the elementView.findBySelector() function.

    -

    If the port element does not have a subelement that matches selector, return null.

    +

    Return an SVGElement referenced by selector of the port identified by portId. If there is no port withportId or no SVGElement|HTMLElement was found by the selector, null is returned.

    + +

    The available selectors are defined by the markup attribute of the port from which the port was built.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html new file mode 100644 index 000000000..5bc93eb6b --- /dev/null +++ b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html @@ -0,0 +1,5 @@ +
    elementView.findPortNodes(portId, groupSelector)
    + +

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the port identified by portId. If there is no port withportId or no SVGElement|HTMLElement was found by the groupSelector, null is returned.

    + +

    The available groupSelectors are defined by the markup attribute of the port from which the port was built.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNode.html b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNode.html index 9827dff76..1f201351c 100644 --- a/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNode.html +++ b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNode.html @@ -4,4 +4,6 @@
    linkView.findLabelNode(index, selector)
    -

    Return an SVGElement referenced by selector of the label at given index. If there is no label at index or no SVGElement was found by the selector, null is returned.

    +

    Return an SVGElement|HTMLElement referenced by selector of the label at given index. If there is no label at index or no DOM node was found by the selector, null is returned.

    + +

    The available selectors are defined by the markup attribute of the label from which the label was built.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html new file mode 100644 index 000000000..d56f7c63a --- /dev/null +++ b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html @@ -0,0 +1,5 @@ +
    linkView.findLabelNodes(index, groupSelector)
    + +

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the label at given index. If there is no label at index or no DOM node was found by the groupSelector, null is returned.

    + +

    The available groupSelectors are defined by the markup attribute of the label from which the label was built.

    diff --git a/packages/joint-core/src/connectionPoints/index.mjs b/packages/joint-core/src/connectionPoints/index.mjs index ff5b31388..5998c488a 100644 --- a/packages/joint-core/src/connectionPoints/index.mjs +++ b/packages/joint-core/src/connectionPoints/index.mjs @@ -131,7 +131,7 @@ function boundaryIntersection(line, view, magnet, opt) { var anchor = line.end; if (typeof selector === 'string') { - node = view.findNode(selector)[0]; + node = view.findNode(selector); } else if (selector === false) { node = magnet; } else if (Array.isArray(selector)) { diff --git a/packages/joint-core/src/dia/CellView.mjs b/packages/joint-core/src/dia/CellView.mjs index 019c77479..02d440fa1 100644 --- a/packages/joint-core/src/dia/CellView.mjs +++ b/packages/joint-core/src/dia/CellView.mjs @@ -220,10 +220,15 @@ export const CellView = View.extend({ return []; }, - findNode: function(selector) { + findNodes: function(selector) { return this.findBySelector(selector, this.el, this.selectors); }, + findNode: function(selector) { + const [node = null] = this.findNodes(selector); + return node; + }, + notify: function(eventName) { if (this.paper) { @@ -303,7 +308,7 @@ export const CellView = View.extend({ const { el: rootNode } = this; let node; if (typeof el === 'string') { - [node = rootNode] = this.findNode(el); + node = this.findNode(el) || rootNode; } else { [node = rootNode] = this.$(el); } @@ -376,7 +381,7 @@ export const CellView = View.extend({ el || (el = this.el); const nodeSelector = el.getAttribute(`${type}-selector`); if (nodeSelector) { - const [proxyNode] = this.findNode(nodeSelector); + const proxyNode = this.findNode(nodeSelector); if (proxyNode) return proxyNode; } return el; @@ -474,7 +479,7 @@ export const CellView = View.extend({ // a port created via the `port` attribute (not API). selector = '[port="' + port + '"]'; } - magnet = this.findNode(selector)[0]; + magnet = this.findNode(selector); } return this.findProxyNode(magnet, 'magnet'); diff --git a/packages/joint-core/src/dia/ElementView.mjs b/packages/joint-core/src/dia/ElementView.mjs index badb8a7dd..467154a27 100644 --- a/packages/joint-core/src/dia/ElementView.mjs +++ b/packages/joint-core/src/dia/ElementView.mjs @@ -566,7 +566,7 @@ export const ElementView = CellView.extend({ const proxyPortNode = this.findPortNode(port, nodeSelector); if (proxyPortNode) return proxyPortNode; } else { - const [proxyNode] = this.findNode(nodeSelector); + const proxyNode = this.findNode(nodeSelector); if (proxyNode) return proxyNode; } } diff --git a/packages/joint-core/src/dia/HighlighterView.mjs b/packages/joint-core/src/dia/HighlighterView.mjs index 9ae256216..e1c885bd8 100644 --- a/packages/joint-core/src/dia/HighlighterView.mjs +++ b/packages/joint-core/src/dia/HighlighterView.mjs @@ -55,7 +55,7 @@ export const HighlighterView = mvc.View.extend({ findNode(cellView, nodeSelector = null) { let el; if (typeof nodeSelector === 'string') { - [el] = cellView.findNode(nodeSelector); + el = cellView.findNode(nodeSelector); } else if (isPlainObject(nodeSelector)) { const isLink = cellView.model.isLink(); const { label = null, port, selector } = nodeSelector; @@ -67,7 +67,7 @@ export const HighlighterView = mvc.View.extend({ el = cellView.findPortNode(port, selector); } else { // Cell Selector - [el] = cellView.findNode(selector); + el = cellView.findNode(selector); } } else if (nodeSelector) { el = V.toNode(nodeSelector); diff --git a/packages/joint-core/src/dia/LinkView.mjs b/packages/joint-core/src/dia/LinkView.mjs index 0b30cb283..7b799e21c 100644 --- a/packages/joint-core/src/dia/LinkView.mjs +++ b/packages/joint-core/src/dia/LinkView.mjs @@ -440,14 +440,17 @@ export const LinkView = CellView.extend({ } }, - findLabelNode: function(labelIndex, selector) { + findLabelNodes: function(labelIndex, selector) { const labelRoot = this._labelCache[labelIndex]; - if (!labelRoot) return null; + if (!labelRoot) return []; const labelSelectors = this._labelSelectors[labelIndex]; - const [node = null] = this.findBySelector(selector, labelRoot, labelSelectors); - return node; + return this.findBySelector(selector, labelRoot, labelSelectors); }, + findLabelNode: function(labelIndex, selector) { + const [node = null] = this.findLabelNodes(labelIndex, selector); + return node; + }, // merge default label attrs into label attrs (or use built-in default label attrs if neither is provided) // keep `undefined` or `null` because `{}` means something else @@ -1363,7 +1366,7 @@ export const LinkView = CellView.extend({ var connection; if (typeof selector === 'string') { // Use custom connection path. - connection = this.findNode(selector)[0]; + connection = this.findNode(selector); } else { // Select connection path automatically. var cache = this._V; diff --git a/packages/joint-core/src/dia/attributes/index.mjs b/packages/joint-core/src/dia/attributes/index.mjs index 80fd03089..9a337d339 100644 --- a/packages/joint-core/src/dia/attributes/index.mjs +++ b/packages/joint-core/src/dia/attributes/index.mjs @@ -342,7 +342,7 @@ const attributesNS = { if (isObject(textPath)) { const pathSelector = textPath.selector; if (typeof pathSelector === 'string') { - const [pathNode] = this.findNode(pathSelector); + const pathNode = this.findNode(pathSelector); if (pathNode instanceof SVGPathElement) { textPath = assign({ 'xlink:href': '#' + pathNode.id }, textPath); } diff --git a/packages/joint-core/src/dia/ports.mjs b/packages/joint-core/src/dia/ports.mjs index 2a6ffa318..d3186f0ca 100644 --- a/packages/joint-core/src/dia/ports.mjs +++ b/packages/joint-core/src/dia/ports.mjs @@ -658,13 +658,17 @@ export const elementViewPortPrototype = { return this._createPortElement(port); }, - findPortNode: function(portId, selector) { + findPortNodes: function(portId, selector) { const portCache = this._portElementsCache[portId]; - if (!portCache) return null; - if (!selector) return portCache.portContentElement.node; + if (!portCache) return []; + if (!selector) return [portCache.portContentElement.node]; const portRoot = portCache.portElement.node; const portSelectors = portCache.portSelectors; - const [node = null] = this.findBySelector(selector, portRoot, portSelectors); + return this.findBySelector(selector, portRoot, portSelectors); + }, + + findPortNode: function(portId, selector) { + const [node = null] = this.findPortNodes(portId, selector); return node; }, diff --git a/packages/joint-core/src/elementTools/Control.mjs b/packages/joint-core/src/elementTools/Control.mjs index 2804960e7..95d45f802 100644 --- a/packages/joint-core/src/elementTools/Control.mjs +++ b/packages/joint-core/src/elementTools/Control.mjs @@ -95,7 +95,7 @@ export const Control = ToolView.extend({ this.toggleExtras(false); return; } - const [magnet] = relatedView.findNode(selector); + const magnet = relatedView.findNode(selector); if (!magnet) throw new Error('Control: invalid selector.'); let padding = options.padding; if (!isFinite(padding)) padding = 0; diff --git a/packages/joint-core/src/linkTools/Connect.mjs b/packages/joint-core/src/linkTools/Connect.mjs index d58ffe029..194210a10 100644 --- a/packages/joint-core/src/linkTools/Connect.mjs +++ b/packages/joint-core/src/linkTools/Connect.mjs @@ -45,7 +45,7 @@ export const Connect = Button.extend({ break; } case 'string': { - [magnetNode] = relatedView.findNode(magnet); + magnetNode = relatedView.findNode(magnet); break; } default: { diff --git a/packages/joint-core/test/jointjs/cellView.js b/packages/joint-core/test/jointjs/cellView.js index dda32bf65..92cd415e5 100644 --- a/packages/joint-core/test/jointjs/cellView.js +++ b/packages/joint-core/test/jointjs/cellView.js @@ -155,7 +155,7 @@ QUnit.module('cellView', function(hooks) { ` }].forEach(attributes => { cell.set(attributes); - const [a] = cellView.findNode('a'); + const a = cellView.findNode('a'); const bbox = V(a).getBBox({ target: cellView.el }); assert.equal(bbox.x, ax + gx); assert.equal(bbox.y, ay + gy); diff --git a/packages/joint-core/test/jointjs/connectionPoints.js b/packages/joint-core/test/jointjs/connectionPoints.js index 4f5b7f671..b61c22c94 100644 --- a/packages/joint-core/test/jointjs/connectionPoints.js +++ b/packages/joint-core/test/jointjs/connectionPoints.js @@ -282,11 +282,11 @@ QUnit.module('connectionPoints', function(hooks) { }]); // lookup off line = new g.Line(tp.clone(), sp.clone()); - cp = connectionPointFn.call(lv1, line, rv1, rv1.findNode('wrapper')[0], { selector: false }); + cp = connectionPointFn.call(lv1, line, rv1, rv1.findNode('wrapper'), { selector: false }); assert.ok(cp.round().equals(r1.getBBox().rightMiddle())); // lookup on line = new g.Line(tp.clone(), sp.clone()); - cp = connectionPointFn.call(lv1, line, rv1, rv1.findNode('wrapper')[0], { selector: undefined }); + cp = connectionPointFn.call(lv1, line, rv1, rv1.findNode('wrapper'), { selector: undefined }); assert.ok(cp.round().equals(r1.getBBox().center().offset(25, 0))); }); diff --git a/packages/joint-core/test/jointjs/dia/attributes.js b/packages/joint-core/test/jointjs/dia/attributes.js index 4b3ec8c5d..02fdc78b4 100644 --- a/packages/joint-core/test/jointjs/dia/attributes.js +++ b/packages/joint-core/test/jointjs/dia/attributes.js @@ -134,7 +134,7 @@ QUnit.module('Attributes', function() { var el = new TestElement(); el.addTo(graph); var view = el.findView(paper); - var text = view.findNode('text')[0]; + var text = view.findNode('text'); var tspans = text.childNodes; assert.equal(text.getAttribute('x'), '51'); assert.equal(tspans[0].getAttribute('x'), null); @@ -170,7 +170,7 @@ QUnit.module('Attributes', function() { paper.options.embeddingMode = true; cell.attr(['root', 'containerSelector'], 'body'); - var body = cellView.findNode('body')[0]; + var body = cellView.findNode('body'); var highlightSpy = sinon.spy(); var unhighlightSpy = sinon.spy(); @@ -201,7 +201,7 @@ QUnit.module('Attributes', function() { QUnit.test('highlighting, magnet, validation', function(assert) { cell.attr(['root', 'magnetSelector'], 'body'); - var body = cellView.findNode('body')[0]; + var body = cellView.findNode('body'); var highlightSpy = sinon.spy(); var unhighlightSpy = sinon.spy(); @@ -242,7 +242,7 @@ QUnit.module('Attributes', function() { QUnit.test('highlighting, magnet, validation', function(assert) { cell.attr(['root', 'highlighterSelector'], 'body'); - var body = cellView.findNode('body')[0]; + var body = cellView.findNode('body'); var highlightSpy = sinon.spy(); var unhighlightSpy = sinon.spy(); @@ -528,7 +528,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-start'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -561,7 +561,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-start'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -588,7 +588,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -615,7 +615,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -657,7 +657,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -700,7 +700,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -743,7 +743,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -788,7 +788,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-end'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -823,7 +823,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('marker-mid'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -851,7 +851,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('fill'); var match = idRegex.exec(markerAttribute); assert.ok(match); @@ -880,7 +880,7 @@ QUnit.module('Attributes', function() { } }); - var bodyNode = cellView.findNode('body')[0]; + var bodyNode = cellView.findNode('body'); var markerAttribute = bodyNode.getAttribute('stroke'); var match = idRegex.exec(markerAttribute); assert.ok(match); diff --git a/packages/joint-core/test/jointjs/dia/elementTools.js b/packages/joint-core/test/jointjs/dia/elementTools.js index 8d1c8626c..fc1959f56 100644 --- a/packages/joint-core/test/jointjs/dia/elementTools.js +++ b/packages/joint-core/test/jointjs/dia/elementTools.js @@ -184,7 +184,7 @@ QUnit.module('elementTools', function(hooks) { }); // magnet defined as a function var magnetSpy = sinon.spy(function(view) { - return view.findNode('body')[0]; + return view.findNode('body'); }); paper.options.defaultLink = defaultLinkSpy; var connect = new joint.elementTools.Connect({ magnet: magnetSpy }); @@ -200,7 +200,7 @@ QUnit.module('elementTools', function(hooks) { assert.deepEqual(newLink.source(), { id: element.id, magnet: 'body' }); assert.ok(magnetSpy.calledOn(connect)); // magnet defined as an SVGElement - connect.options.magnet = elementView.findNode('label')[0]; + connect.options.magnet = elementView.findNode('label'); evt = {}; connect.dragstart(evt); connect.drag(evt); diff --git a/packages/joint-core/test/jointjs/dia/linkTools.js b/packages/joint-core/test/jointjs/dia/linkTools.js index 14f61d83d..b95dd7866 100644 --- a/packages/joint-core/test/jointjs/dia/linkTools.js +++ b/packages/joint-core/test/jointjs/dia/linkTools.js @@ -200,7 +200,7 @@ QUnit.module('linkTools', function(hooks) { }); // magnet defined as a function var magnetSpy = sinon.spy(function(view) { - return view.findNode('line')[0]; + return view.findNode('line'); }); paper.options.defaultLink = defaultLinkSpy; var connect = new joint.linkTools.Connect({ magnet: magnetSpy }); @@ -216,7 +216,7 @@ QUnit.module('linkTools', function(hooks) { assert.deepEqual(newLink.source(), { id: link.id, magnet: 'line' }); assert.ok(magnetSpy.calledOn(connect)); // magnet defined as an SVGElement - connect.options.magnet = linkView.findNode('wrapper')[0]; + connect.options.magnet = linkView.findNode('wrapper'); evt = {}; connect.dragstart(evt); connect.drag(evt); diff --git a/packages/joint-core/test/jointjs/elementView.js b/packages/joint-core/test/jointjs/elementView.js index a2308b757..1019f13a7 100644 --- a/packages/joint-core/test/jointjs/elementView.js +++ b/packages/joint-core/test/jointjs/elementView.js @@ -249,7 +249,7 @@ QUnit.module('elementView', function(hooks) { elementView.model.resize(100, 100).translate(100, 100).rotate(90); - var rectInside = elementView.findNode('rectInside')[0]; + var rectInside = elementView.findNode('rectInside'); assert.checkBboxApproximately(1, elementView.getNodeBBox(rectInside), { x: 177, y: 121, @@ -259,7 +259,7 @@ QUnit.module('elementView', function(hooks) { assert.equal(V.matrixToTransformString(elementView.getNodeMatrix(rectInside)), 'matrix(1,0,0,1,0,0)'); - var rectOutside = elementView.findNode('rectOutside')[0]; + var rectOutside = elementView.findNode('rectOutside'); assert.checkBboxApproximately(1, elementView.getNodeBBox(rectOutside), { x: 121, y: 113, @@ -269,7 +269,7 @@ QUnit.module('elementView', function(hooks) { assert.equal(V.matrixToTransformString(elementView.getNodeMatrix(rectOutside)), 'matrix(1,0,0,1,0,0)'); - var circle = elementView.findNode('circle')[0]; + var circle = elementView.findNode('circle'); assert.checkBboxApproximately(1, elementView.getNodeBBox(circle), { x: 182, y: 106, diff --git a/packages/joint-core/types/joint.d.ts b/packages/joint-core/types/joint.d.ts index 5e76a2515..25e116ae5 100644 --- a/packages/joint-core/types/joint.d.ts +++ b/packages/joint-core/types/joint.d.ts @@ -765,7 +765,9 @@ export namespace dia { findMagnet(el: SVGElement | Dom | string): SVGElement | undefined; - findNode(selector: string): Element[]; + findNode(selector: string): Element | null; + + findNodes(groupSelector: string): Element[]; findProxyNode(el: SVGElement | null, type: string): SVGElement; @@ -920,7 +922,10 @@ export namespace dia { getDelegatedView(): ElementView | null; - findPortNode(portId: string | number, selector?: string): SVGElement | null; + findPortNode(portId: string | number): SVGElement | null; + findPortNode(portId: string | number, selector: string): Element | null; + + findPortNodes(portId: string | number, groupSelector: string): Element[]; protected renderMarkup(): void; @@ -1084,7 +1089,10 @@ export namespace dia { getEndMagnet(endType: dia.LinkEnd): SVGElement | null; - findLabelNode(labelIndex: string | number, selector?: string): SVGElement | null; + findLabelNode(labelIndex: string | number): SVGElement | null; + findLabelNode(labelIndex: string | number, selector: string): Element | null; + + findLabelNodes(labelIndex: string | number, groupSelector: string): Element[]; removeRedundantLinearVertices(opt?: dia.ModelSetOptions): number; From 9d7349e317b9beac9a6af1d79337eca0859eb56d Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 8 Dec 2023 13:00:15 +0100 Subject: [PATCH 55/58] update --- .../docs/src/joint/api/dia/CellView/prototype/findNode.html | 6 +++--- .../src/joint/api/dia/CellView/prototype/findNodes.html | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNode.html b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNode.html index 33b674a0d..5140347cf 100644 --- a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNode.html +++ b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNode.html @@ -1,9 +1,9 @@
    cellView.findNode(selector)
    -

    The method returns an array of DOM nodes matching the selector.

    +

    The method returns a DOM node matching the selector.

    -

    The method searches for matching sub-elements among the descendants of this.el. If no such sub-elements are found, an empty array is returned.

    +

    The method searches for matching sub-element among the descendants of this.el. If no such sub-element is found, null is returned.

    The available selectors are defined by the markup attribute of the Cell model from which the CellView was initialized.

    -

    (Deprecated) If no matching sub-element JSON selector is found then this.el.querySelectorAll(selector) is used to try and find an element through CSS selectors. You may disable this functionality to increase performance by setting useCSSSelectors = false in the global config.

    +

    (Deprecated) If no matching sub-element JSON selector is found then this.el.querySelector(selector) is used to try and find an element through CSS selectors. You may disable this functionality to increase performance by setting useCSSSelectors = false in the global config.

    diff --git a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html index 33b674a0d..dbfd6e721 100644 --- a/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html +++ b/packages/joint-core/docs/src/joint/api/dia/CellView/prototype/findNodes.html @@ -1,9 +1,9 @@ -
    cellView.findNode(selector)
    +
    cellView.findNodes(groupSelector)
    -

    The method returns an array of DOM nodes matching the selector.

    +

    The method returns an array of DOM nodes matching the groupSelector.

    The method searches for matching sub-elements among the descendants of this.el. If no such sub-elements are found, an empty array is returned.

    -

    The available selectors are defined by the markup attribute of the Cell model from which the CellView was initialized.

    +

    The available groupSelectors are defined by the markup attribute of the Cell model from which the CellView was initialized.

    (Deprecated) If no matching sub-element JSON selector is found then this.el.querySelectorAll(selector) is used to try and find an element through CSS selectors. You may disable this functionality to increase performance by setting useCSSSelectors = false in the global config.

    From 308a77d7ae925570c14d2eece0ae7a1db96fbbf6 Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 8 Dec 2023 13:51:29 +0100 Subject: [PATCH 56/58] Update packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html Co-authored-by: Zbynek Stara --- .../src/joint/api/dia/ElementView/prototype/findPortNode.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html index 42d23aa48..00655fb52 100644 --- a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html +++ b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNode.html @@ -6,6 +6,6 @@
    elementView.findPortNode(portId, selector)
    -

    Return an SVGElement referenced by selector of the port identified by portId. If there is no port withportId or no SVGElement|HTMLElement was found by the selector, null is returned.

    +

    Return an SVGElement referenced by selector of the port identified by portId. If there is no port with portId or no SVGElement|HTMLElement was found by the selector, null is returned.

    The available selectors are defined by the markup attribute of the port from which the port was built.

    From 0b3ee8a43174b785493ea9cf32494ab7b26b5e1a Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 8 Dec 2023 13:51:43 +0100 Subject: [PATCH 57/58] Update packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html Co-authored-by: Zbynek Stara --- .../src/joint/api/dia/ElementView/prototype/findPortNodes.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html index 5bc93eb6b..de636d19b 100644 --- a/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html +++ b/packages/joint-core/docs/src/joint/api/dia/ElementView/prototype/findPortNodes.html @@ -1,5 +1,5 @@
    elementView.findPortNodes(portId, groupSelector)
    -

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the port identified by portId. If there is no port withportId or no SVGElement|HTMLElement was found by the groupSelector, null is returned.

    +

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the port identified by portId. If there is no port with portId or no SVGElement|HTMLElement was found by the groupSelector, an empty array is returned.

    The available groupSelectors are defined by the markup attribute of the port from which the port was built.

    From 3fa33f561239b064ee1241855bbc97c23b54addb Mon Sep 17 00:00:00 2001 From: Roman Bruckner Date: Fri, 8 Dec 2023 13:51:51 +0100 Subject: [PATCH 58/58] Update packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html Co-authored-by: Zbynek Stara --- .../src/joint/api/dia/LinkView/prototype/findLabelNodes.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html index d56f7c63a..a18f6e7b1 100644 --- a/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html +++ b/packages/joint-core/docs/src/joint/api/dia/LinkView/prototype/findLabelNodes.html @@ -1,5 +1,5 @@
    linkView.findLabelNodes(index, groupSelector)
    -

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the label at given index. If there is no label at index or no DOM node was found by the groupSelector, null is returned.

    +

    Return an array of SVGElement|HTMLElement referenced by groupSelector of the label at given index. If there is no label at index or no DOM node was found by the groupSelector, an empty array is returned.

    The available groupSelectors are defined by the markup attribute of the label from which the label was built.

    function What should happen when the user clicks the button? Default is undefined (no interaction).

    - The callback function is expected to have the signature function(evt, elementView, buttonView) where evt is a jQuery.Event object. The element view is available inside the function as this; the element model is available as this.model.
    markupfunction What should happen when the user clicks the button? Default is undefined (no interaction).

    - The callback function is expected to have the signature function(evt, linkView, buttonView) where evt is a jQuery.Event object. The related link view is available inside the function as this. The link model is available as this.model.
    markup
    function What should happen when the user clicks the button? Default is undefined (no interaction).

    - The callback function is expected to have the signature function(evt, elementView, buttonView) where evt is a mvc.Event object. The element view is available inside the function as this; the element model is available as this.model.
    markupfunction What should happen when the user clicks the button? Default is undefined (no interaction).

    - The callback function is expected to have the signature function(evt, linkView, buttonView) where evt is a mvc.Event object. The related link view is available inside the function as this. The link model is available as this.model.
    markup