diff --git a/.eslintignore b/.eslintignore index 45e036d9c2c..26e22adb55d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -17,3 +17,4 @@ /externs/* /closure/* /scripts/gulpfiles/* +/typings/* diff --git a/.eslintrc.json b/.eslintrc.json index 5a98b4b4312..4f28defcc92 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -39,7 +39,7 @@ "strict": ["off"], // Closure style allows redeclarations. "no-redeclare": ["off"], - "valid-jsdoc": ["error", {"requireReturn": false}], + "valid-jsdoc": ["error"], "no-console": ["off"], "no-multi-spaces": ["error", { "ignoreEOLComments": true }], "operator-linebreak": ["error", "after"], @@ -78,11 +78,89 @@ "browser": true }, "globals": { - "Blockly": true, "goog": true, "exports": true }, "extends": [ "eslint:recommended", "google" - ] + ], + // TypeScript-specific config. Uses above rules plus these. + "overrides": [{ + "files": ["**/*.ts", "**/*.tsx"], + "plugins": [ + "@typescript-eslint/eslint-plugin", + "jsdoc" + ], + "settings": { + "jsdoc": { + "mode": "typescript" + } + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "tsconfigRootDir": ".", + "ecmaVersion": 2020, + "sourceType": "module" + }, + "extends": [ + "plugin:@typescript-eslint/recommended", + "plugin:jsdoc/recommended" + ], + "rules": { + // TS rules + // Blockly uses namespaces to do declaration merging in some cases. + "@typescript-eslint/no-namespace": ["off"], + // Use the updated TypeScript-specific rule. + "no-invalid-this": ["off"], + "@typescript-eslint/no-invalid-this": ["error"], + // Needs decision. 601 problems. + "@typescript-eslint/no-non-null-assertion": ["off"], + // Use TS-specific rule. + "no-unused-vars": ["off"], + "@typescript-eslint/no-unused-vars": ["warn", { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + }], + "func-call-spacing": ["off"], + "@typescript-eslint/func-call-spacing": ["warn"], + // Temporarily disable. 23 problems. + "@typescript-eslint/no-explicit-any": ["off"], + // Temporarily disable. 128 problems. + "require-jsdoc": ["off"], + // Temporarily disable. 55 problems. + "@typescript-eslint/ban-types": ["off"], + // Temporarily disable. 33 problems. + "@typescript-eslint/no-empty-function": ["off"], + // Temporarily disable. 3 problems. + "@typescript-eslint/no-empty-interface": ["off"], + + // TsDoc rules (using JsDoc plugin) + // Disable built-in jsdoc verifier. + "valid-jsdoc": ["off"], + // Don't require types in params and returns docs. + "jsdoc/require-param-type": ["off"], + "jsdoc/require-returns-type": ["off"], + // params and returns docs are optional. + "jsdoc/require-param-description": ["off"], + "jsdoc/require-returns": ["off"], + // Disable for now (breaks on `this` which is not really a param). + "jsdoc/require-param": ["off"], + // Don't auto-add missing jsdoc. Only required on exported items. + "jsdoc/require-jsdoc": ["warn", {"enableFixer": false, "publicOnly": true}], + // Disable because of false alarms with Closure-supported tags. + // Re-enable after Closure is removed. + "jsdoc/check-tag-names": ["off"], + // Re-enable after Closure is removed. There shouldn't even be types in the TsDoc. + // These are "types" because of Closure's @suppress {warningName} + "jsdoc/no-undefined-types": ["off"], + "jsdoc/valid-types": ["off"], + // Disabled due to not handling `this`. If re-enabled, checkDestructured option + // should be left as false. + "jsdoc/check-param-names": ["off", {"checkDestructured": false}], + // Allow any text in the license tag. Other checks are not relevant. + "jsdoc/check-values": ["off"] + + } + }] } diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index fcd866043f5..f66aaaa602f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -29,9 +29,9 @@ All submissions, including submissions by project members, require review. We use Github pull requests for this purpose. ### Browser compatibility -We care strongly about making Blockly work on all browsers. As of 2017 we -support IE 10 and 11, Edge, Chrome, Safari, and Firefox. We will not accept -changes that only work on a subset of those browsers. You can check [caniuse.com](https://caniuse.com/) +We care strongly about making Blockly work on all browsers. As of 2022 we +support Edge, Chrome, Safari, and Firefox. We will not accept changes that only +work on a subset of those browsers. You can check [caniuse.com](https://caniuse.com/) for compatibility information. ### The small print diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 94e643cfa03..d26d698d7d8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -35,11 +35,11 @@ ### Test Coverage - + ### Documentation diff --git a/.github/release-please.yml b/.github/release-please.yml index 0115689b288..f18bc7a70b2 100644 --- a/.github/release-please.yml +++ b/.github/release-please.yml @@ -4,3 +4,4 @@ packageName: blockly manifest: true manifestConfig: release-please-config.json manifestFile: .release-please-manifest.json +handleGHRelease: true diff --git a/.github/workflows/appengine_deploy.yml b/.github/workflows/appengine_deploy.yml index f768874a31e..5b8868aa50f 100644 --- a/.github/workflows/appengine_deploy.yml +++ b/.github/workflows/appengine_deploy.yml @@ -15,7 +15,7 @@ jobs: steps: # Checks-out the repository under $GITHUB_WORKSPACE. # When running manually this checks out the master branch. - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Prepare demo files # Install all dependencies, then copy all the files needed for demos. @@ -24,7 +24,7 @@ jobs: npm run prepareDemos - name: Upload - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v3 with: name: appengine_files path: _deploy/ @@ -36,13 +36,13 @@ jobs: needs: prepare steps: - name: Download prepared files - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: appengine_files path: _deploy/ - name: Deploy to App Engine - uses: google-github-actions/deploy-appengine@v0.2.0 + uses: google-github-actions/deploy-appengine@v0.8.0 # For parameters see: # https://github.com/google-github-actions/deploy-appengine#inputs with: diff --git a/.github/workflows/assign_reviewers.yml b/.github/workflows/assign_reviewers.yml index 2395a085d4f..8facfc743bb 100644 --- a/.github/workflows/assign_reviewers.yml +++ b/.github/workflows/assign_reviewers.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Assign requested reviewer - uses: actions/github-script@v5 + uses: actions/github-script@v6 with: script: | try { diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 289542ecef6..754aa4c11e5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,11 +17,11 @@ jobs: # TODO (#2114): re-enable osx build. # os: [ubuntu-latest, macos-latest] os: [ubuntu-latest] - node-version: [12.x, 14.x, 16.x] + node-version: [14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: persist-credentials: false @@ -31,7 +31,7 @@ jobs: ssh://git@github.com/ - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -55,10 +55,10 @@ jobs: lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js 16.x - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: 16.x diff --git a/.github/workflows/check_clang_format.yml b/.github/workflows/check_clang_format.yml index 58fd73b2ca5..93150984aec 100644 --- a/.github/workflows/check_clang_format.yml +++ b/.github/workflows/check_clang_format.yml @@ -11,9 +11,9 @@ jobs: clang-formatter: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - uses: DoozyX/clang-format-lint-action@v0.13 + - uses: DoozyX/clang-format-lint-action@v0.14 with: source: 'core' extensions: 'js,ts' diff --git a/.github/workflows/tag_module_cleanup.yml b/.github/workflows/tag_module_cleanup.yml index 0265070af9c..a6b68c3fc69 100644 --- a/.github/workflows/tag_module_cleanup.yml +++ b/.github/workflows/tag_module_cleanup.yml @@ -16,7 +16,7 @@ jobs: # Add the type: cleanup label runs-on: ubuntu-latest steps: - - uses: actions/github-script@a3e7071a34d7e1f219a8a4de9a5e0a34d1ee1293 + - uses: actions/github-script@v6 with: script: | // Note that pull requests are considered issues and "shared" diff --git a/.github/workflows/update_metadata.yml b/.github/workflows/update_metadata.yml index 3ca15405786..c1100b2905d 100644 --- a/.github/workflows/update_metadata.yml +++ b/.github/workflows/update_metadata.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Check Out Blockly - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: ref: 'develop' - name: Use Node.js 16.x - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: 16.x @@ -36,7 +36,7 @@ jobs: run: source ./tests/scripts/update_metadata.sh - name: Create Pull Request - uses: peter-evans/create-pull-request@9825ae65b1cb54b543b938503728b432a0176d29 + uses: peter-evans/create-pull-request@171dd555b9ab6b18fa02519fdfacbb8bf671e1b4 with: commit-message: Update build artifact sizes in check_metadata.sh delete-branch: true diff --git a/.gitignore b/.gitignore index 844805ddb47..3c1938f17d9 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ build-debug.log *.pyc *.komodoproject /nbproject/private/ +tsdoc-metadata.json tests/compile/main_compressed.js tests/compile/main_compressed.js.map @@ -18,3 +19,4 @@ local_build/local_*_compressed.js chromedriver build/ dist/ +temp/ diff --git a/README.md b/README.md index 03528f62bc7..eacfc89664b 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Blockly [![Build Status]( https://travis-ci.org/google/blockly.svg?branch=master)](https://travis-ci.org/google/blockly) +# Blockly Google's Blockly is a library that adds a visual code editor to web and mobile apps. The Blockly editor uses interlocking, graphical blocks to represent code concepts like variables, logical expressions, loops, and more. It allows users to apply programming principles without having to worry about syntax or the intimidation of a blinking cursor on the command line. All code is free and open source. @@ -41,11 +41,9 @@ Want to make Blockly better? We welcome contributions to Blockly in the form of ## Releases -The next major release will be during the last week of **March 2022**. - We release by pushing the latest code to the master branch, followed by updating the npm package, our [docs](https://developers.google.com/blockly), and [demo pages](https://google.github.io/blockly-samples/). We typically release a new version of Blockly once a quarter (every 3 months). If there are breaking bugs, such as a crash when performing a standard action or a rendering issue that makes Blockly unusable, we will cherry-pick fixes to master between releases to fix them. The [releases page](https://github.com/google/blockly/releases) has a list of all releases. -Releases are tagged by the release date (YYYYMMDD) with a leading major version number and a trailing '.0' in case we ever need a major or patch version (such as [2.20190722.1](https://github.com/google/blockly/tree/2.20190722.1)). Releases that have breaking changes or are otherwise not backwards compatible will have a new major version. Patch versions are reserved for bug-fix patches between scheduled releases. +We use [semantic versioning](https://semver.org/). Releases that have breaking changes or are otherwise not backwards compatible will have a new major version. Patch versions are reserved for bug-fix patches between scheduled releases. We now have a [beta release on npm](https://www.npmjs.com/package/blockly?activeTab=versions). If you'd like to test the upcoming release, or try out a not-yet-released new API, you can use the beta channel with: diff --git a/api-extractor.json b/api-extractor.json new file mode 100644 index 00000000000..649528e7e0f --- /dev/null +++ b/api-extractor.json @@ -0,0 +1,385 @@ +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "dist/index.d.ts", + + /** + * A list of NPM package names whose exports should be treated as part of this package. + * + * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1", + * and another NPM package "library2" is embedded in this bundle. Some types from library2 may become part + * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly + * imports library2. To avoid this, we can specify: + * + * "bundledPackages": [ "library2" ], + * + * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been + * local files for library1. + */ + "bundledPackages": [], + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": false, + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportFolder": "/temp/", + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + // "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": true, + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + "untrimmedFilePath": "/dist/_rollup.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for an "alpha" release. + * This file will include only declarations that are marked as "@public", "@beta", or "@alpha". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "alphaTrimmedFilePath": "/dist/-alpha.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "betaTrimmedFilePath": "/dist/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "publicTrimmedFilePath": "/dist/-public.d.ts", + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files + * will be written with Windows-style newlines. To use POSIX-style newlines, specify "lf" instead. + * To use the OS's default newline kind, specify "os". + * + * DEFAULT VALUE: "crlf" + */ + // "newlineKind": "crlf", + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + }, + + // We don't use `@public`, that's just the default. + "ae-missing-release-tag": { + "logLevel": "none" + }, + + // Needs investigation. + "ae-forgotten-export": { + "logLevel": "none" + } + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + }, + + "tsdoc-param-tag-missing-hyphen": { + "logLevel": "none" + }, + + // These two are due to "type-like" tags in JsDoc like + // `@suppress {warningName}`. The braces are unexpected in TsDoc. + "tsdoc-malformed-inline-tag": { + "logLevel": "none" + }, + "tsdoc-escape-right-brace": { + "logLevel": "none" + } + } + } +} diff --git a/appengine/redirect.html b/appengine/redirect.html index 110a56aa327..63d892d712a 100644 --- a/appengine/redirect.html +++ b/appengine/redirect.html @@ -61,6 +61,39 @@ loc = loc.replace('/apps/', '/demos/'); } +// Demos without saved data were moved to Blockly Samples in 2021. +if (loc.match('/demos/fixed/')) { + loc = 'https://google.github.io/blockly-samples/examples/fixed-demo/'; +} else if (loc.match('/demos/resizable/')) { + loc = 'https://google.github.io/blockly-samples/examples/resizable-demo/'; +} else if (loc.match('/demos/toolbox/')) { + loc = 'https://google.github.io/blockly-samples/examples/toolbox-demo/'; +} else if (loc.match('/demos/maxBlocks/')) { + loc = 'https://google.github.io/blockly-samples/examples/max-blocks-demo/'; +} else if (loc.match('/demos/generator/')) { + loc = 'https://google.github.io/blockly-samples/examples/generator-demo/'; +} else if (loc.match('/demos/headless/')) { + loc = 'https://google.github.io/blockly-samples/examples/headless-demo/'; +} else if (loc.match('/demos/interpreter/step-execution')) { + loc = 'https://google.github.io/blockly-samples/examples/interpreter-demo/step-execution.html'; +} else if (loc.match('/demos/interpreter/async-execution')) { + loc = 'https://google.github.io/blockly-samples/examples/interpreter-demo/async-execution.html'; +} else if (loc.match('/demos/graph/')) { + loc = 'https://google.github.io/blockly-samples/examples/graph-demo/'; +} else if (loc.match('/demos/rtl/')) { + loc = 'https://google.github.io/blockly-samples/examples/rtl-demo/'; +} else if (loc.match('/demos/custom-dialogs/')) { + loc = 'https://google.github.io/blockly-samples/examples/custom-dialogs-demo'; +} else if (loc.match('/demos/custom-fields/turtle/')) { + loc = 'https://google.github.io/blockly-samples/examples/turtle-field-demo/'; +} else if (loc.match('/demos/custom-fields/pitch/')) { + loc = 'https://google.github.io/blockly-samples/examples/pitch-field-demo/'; +} else if (loc.match('/demos/mirror/')) { + loc = 'https://google.github.io/blockly-samples/examples/mirror-demo/'; +} else if (loc.match('/demos/plane/')) { + loc = 'https://google.github.io/blockly-samples/examples/plane-demo/'; +} + location = loc; diff --git a/blockly_compressed.js b/blockly_compressed.js index d4406364b1e..38803b30062 100644 --- a/blockly_compressed.js +++ b/blockly_compressed.js @@ -12,2004 +12,1525 @@ } }(this, function() { var $={}; -/* +var longStart$$module$build$src$core$touch=function(a,b){longStop$$module$build$src$core$touch();a.changedTouches&&1!==a.changedTouches.length||(longPid_$$module$build$src$core$touch=setTimeout(function(){a.changedTouches&&(a.button=2,a.clientX=a.changedTouches[0].clientX,a.clientY=a.changedTouches[0].clientY);b&&b.handleRightClick(a)},LONGPRESS$$module$build$src$core$touch))},longStop$$module$build$src$core$touch=function(){longPid_$$module$build$src$core$touch&&(clearTimeout(longPid_$$module$build$src$core$touch), +longPid_$$module$build$src$core$touch=0)},clearTouchIdentifier$$module$build$src$core$touch=function(){touchIdentifier_$$module$build$src$core$touch=null},shouldHandleEvent$$module$build$src$core$touch=function(a){return!isMouseOrTouchEvent$$module$build$src$core$touch(a)||checkTouchIdentifier$$module$build$src$core$touch(a)},getTouchIdentifierFromEvent$$module$build$src$core$touch=function(a){return a instanceof MouseEvent?"mouse":a instanceof PointerEvent?String(a.pointerId):a.changedTouches&&a.changedTouches[0]&& +void 0!==a.changedTouches[0].identifier&&null!==a.changedTouches[0].identifier?String(a.changedTouches[0].identifier):"mouse"},checkTouchIdentifier$$module$build$src$core$touch=function(a){const b=getTouchIdentifierFromEvent$$module$build$src$core$touch(a);return void 0!==touchIdentifier_$$module$build$src$core$touch&&null!==touchIdentifier_$$module$build$src$core$touch?touchIdentifier_$$module$build$src$core$touch===b:"mousedown"===a.type||"touchstart"===a.type||"pointerdown"===a.type?(touchIdentifier_$$module$build$src$core$touch= +b,!0):!1},setClientFromTouch$$module$build$src$core$touch=function(a){if(a.type.startsWith("touch")&&a.changedTouches){const b=a.changedTouches[0];a.clientX=b.clientX;a.clientY=b.clientY}},isMouseOrTouchEvent$$module$build$src$core$touch=function(a){return a.type.startsWith("touch")||a.type.startsWith("mouse")||a.type.startsWith("pointer")},isTouchEvent$$module$build$src$core$touch=function(a){return a.type.startsWith("touch")||a.type.startsWith("pointer")},splitEventByTouches$$module$build$src$core$touch= +function(a){const b=[];if(a.changedTouches)for(let c=0;c{g(n);const p=!f;h&&p&&n.preventDefault()},m=0;m{if(k instanceof +TouchEvent&&k.changedTouches&&1===k.changedTouches.length){const l=k.changedTouches[0];k.clientX=l.clientX;k.clientY=l.clientY}e(k);k.preventDefault()},h=0;ha.classList.contains(c)))return!1;a.classList.add(...b);return!0},removeClasses$$module$build$src$core$utils$dom=function(a,b){a.classList.remove(...b.split(" "))},removeClass$$module$build$src$core$utils$dom=function(a,b){b=b.split(" ");if(b.every(c=>!a.classList.contains(c)))return!1;a.classList.remove(...b);return!0},hasClass$$module$build$src$core$utils$dom= +function(a,b){return a.classList.contains(b)},removeNode$$module$build$src$core$utils$dom=function(a){return a&&a.parentNode?a.parentNode.removeChild(a):null},insertAfter$$module$build$src$core$utils$dom=function(a,b){const c=b.nextSibling;b=b.parentNode;if(!b)throw Error("Reference node has no parent.");c?b.insertBefore(a,c):b.appendChild(a)},containsNode$$module$build$src$core$utils$dom=function(a,b){return!!(a.compareDocumentPosition(b)&NodeType$$module$build$src$core$utils$dom.DOCUMENT_POSITION_CONTAINED_BY)}, +setCssTransform$$module$build$src$core$utils$dom=function(a,b){a.style.transform=b;a.style["-webkit-transform"]=b},startTextWidthCache$$module$build$src$core$utils$dom=function(){cacheReference$$module$build$src$core$utils$dom++;cacheWidths$$module$build$src$core$utils$dom||(cacheWidths$$module$build$src$core$utils$dom=Object.create(null))},stopTextWidthCache$$module$build$src$core$utils$dom=function(){cacheReference$$module$build$src$core$utils$dom--;cacheReference$$module$build$src$core$utils$dom|| +(cacheWidths$$module$build$src$core$utils$dom=null)},getTextWidth$$module$build$src$core$utils$dom=function(a){const b=a.textContent+"\n"+a.className.baseVal;let c;if(cacheWidths$$module$build$src$core$utils$dom&&(c=cacheWidths$$module$build$src$core$utils$dom[b]))return c;try{c=a.getComputedTextLength()}catch(d){return 8*a.textContent.length}cacheWidths$$module$build$src$core$utils$dom&&(cacheWidths$$module$build$src$core$utils$dom[b]=c);return c},getFastTextWidth$$module$build$src$core$utils$dom= +function(a,b,c,d){return getFastTextWidthWithSizeString$$module$build$src$core$utils$dom(a,b+"pt",c,d)},getFastTextWidthWithSizeString$$module$build$src$core$utils$dom=function(a,b,c,d){const e=a.textContent;a=e+"\n"+a.className.baseVal;var f;if(cacheWidths$$module$build$src$core$utils$dom&&(f=cacheWidths$$module$build$src$core$utils$dom[a]))return f;canvasContext$$module$build$src$core$utils$dom||(f=document.createElement("canvas"),f.className="blocklyComputeCanvas",document.body.appendChild(f), +canvasContext$$module$build$src$core$utils$dom=f.getContext("2d"));canvasContext$$module$build$src$core$utils$dom.font=c+" "+b+" "+d;f=e?canvasContext$$module$build$src$core$utils$dom.measureText(e).width:0;cacheWidths$$module$build$src$core$utils$dom&&(cacheWidths$$module$build$src$core$utils$dom[a]=f);return f},measureFontMetrics$$module$build$src$core$utils$dom=function(a,b,c,d){const e=document.createElement("span");e.style.font=c+" "+b+" "+d;e.textContent=a;a=document.createElement("div");a.style.width= +"1px";a.style.height="0";b=document.createElement("div");b.setAttribute("style","position: fixed; top: 0; left: 0; display: flex;");b.appendChild(e);b.appendChild(a);document.body.appendChild(b);c={height:0,baseline:0};try{b.style.alignItems="baseline",c.baseline=a.offsetTop-e.offsetTop,b.style.alignItems="flex-end",c.height=a.offsetTop-e.offsetTop}finally{document.body.removeChild(b)}return c},toRadians$$module$build$src$core$utils$math=function(a){return a*Math.PI/180},toDegrees$$module$build$src$core$utils$math= +function(a){return 180*a/Math.PI},clamp$$module$build$src$core$utils$math=function(a,b,c){if(c1'),d.appendChild(c),b.push(d));if(Blocks$$module$build$src$core$blocks.variables_get){a.sort(VariableModel$$module$build$src$core$variable_model.compareByName);for(let e=0,f;f=a[e];e++)c=createElement$$module$build$src$core$utils$xml("block"), +c.setAttribute("type","variables_get"),c.setAttribute("gap","8"),c.appendChild(generateVariableFieldDom$$module$build$src$core$variables(f)),b.push(c)}}return b},generateUniqueName$$module$build$src$core$variables=function(a){return TEST_ONLY$$module$build$src$core$variables.generateUniqueNameInternal(a)},generateUniqueNameInternal$$module$build$src$core$variables=function(a){return generateUniqueNameFromOptions$$module$build$src$core$variables(VAR_LETTER_OPTIONS$$module$build$src$core$variables.charAt(0), +a.getAllVariableNames())},generateUniqueNameFromOptions$$module$build$src$core$variables=function(a,b){if(!b.length)return a;const c=VAR_LETTER_OPTIONS$$module$build$src$core$variables;let d="",e=c.indexOf(a);for(;;){let f=!1;for(let g=0;g>>/g,a),content$$module$build$src$core$css="",a=document.createElement("style"),a.id="blockly-common-style",b=document.createTextNode(b),a.appendChild(b),document.head.insertBefore(a,document.head.firstChild)))},getRelativeXY$$module$build$src$core$utils$svg_math= +function(a){const b=new Coordinate$$module$build$src$core$utils$coordinate(0,0);var c=a.x&&a.getAttribute("x");const d=a.y&&a.getAttribute("y");c&&(b.x=parseInt(c));d&&(b.y=parseInt(d));if(c=(c=a.getAttribute("transform"))&&c.match(XY_REGEX$$module$build$src$core$utils$svg_math))b.x+=Number(c[1]),c[3]&&(b.y+=Number(c[3]));(a=a.getAttribute("style"))&&-1/g,"<$1$2>")},domToPrettyText$$module$build$src$core$xml=function(a){a=domToText$$module$build$src$core$xml(a).split("<");let b="";for(let c= +1;c"!==d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")},textToDom$$module$build$src$core$xml=function(a){const b=textToDomDocument$$module$build$src$core$utils$xml(a);if(!b||!b.documentElement||b.getElementsByTagName("parsererror").length)throw Error("textToDom was unable to parse: "+a);return b.documentElement},clearWorkspaceAndLoadFromXml$$module$build$src$core$xml= +function(a,b){b.setResizesEnabled(!1);b.clear();a=domToWorkspace$$module$build$src$core$xml(a,b);b.setResizesEnabled(!0);return a},domToWorkspace$$module$build$src$core$xml=function(a,b){let c=0;b.RTL&&(c=b.getWidth());const d=[];startTextWidthCache$$module$build$src$core$utils$dom();const e=getGroup$$module$build$src$core$events$utils();e||setGroup$$module$build$src$core$events$utils(!0);b.setResizesEnabled&&b.setResizesEnabled(!1);let f=!0;try{for(let g=0,h;h=a.childNodes[g];g++){const k=h.nodeName.toLowerCase(), +l=h;if("block"===k||"shadow"===k&&!getRecordUndo$$module$build$src$core$events$utils()){const m=domToBlock$$module$build$src$core$xml(l,b);d.push(m.id);const n=l.hasAttribute("x")?parseInt(l.getAttribute("x")):10,p=l.hasAttribute("y")?parseInt(l.getAttribute("y")):10;isNaN(n)||isNaN(p)||m.moveBy(b.RTL?c-n:n,p);f=!1}else{if("shadow"===k)throw TypeError("Shadow block cannot be a top-level block.");if("comment"===k)b.rendered?WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.fromXmlRendered(l, +b,c):WorkspaceComment$$module$build$src$core$workspace_comment.fromXml(l,b);else if("variables"===k){if(f)domToVariables$$module$build$src$core$xml(l,b);else throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location.");f=!1}}}}finally{e||setGroup$$module$build$src$core$events$utils(!1),stopTextWidthCache$$module$build$src$core$utils$dom()}b.setResizesEnabled&&b.setResizesEnabled(!0);fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(FINISHED_LOADING$$module$build$src$core$events$utils))(b)); +return d},appendDomToWorkspace$$module$build$src$core$xml=function(a,b){if(!b.getBlocksBoundingBox)return domToWorkspace$$module$build$src$core$xml(a,b);var c=b.getBlocksBoundingBox();a=domToWorkspace$$module$build$src$core$xml(a,b);if(c&&c.top!==c.bottom){var d=c.bottom;c=b.RTL?c.right:c.left;var e=Infinity;let f=-Infinity,g=Infinity;for(let h=0;hf&&(f=k.x)}d=d-g+10;c=b.RTL?c-f:c-e;for(e=0;eb&&(b=c[d].length);var e=-Infinity;let f,g=1;do{d=e;f=a;a=[];e=c.length/g;let h=1;for(let k= +0;kd);return f},wrapScore$$module$build$src$core$utils$string=function(a,b,c){const d=[0],e=[];for(var f=0;fd&&(d=h,e=g)}return e?wrapMutate$$module$build$src$core$utils$string(a, +e,c):b},wrapToText$$module$build$src$core$utils$string=function(a,b){const c=[];for(let d=0;dRADIUS_OK$$module$build$src$core$tooltip&&hide$$module$build$src$core$tooltip()}else poisonedElement$$module$build$src$core$tooltip!==element$$module$build$src$core$tooltip&&(clearTimeout(showPid$$module$build$src$core$tooltip),lastX$$module$build$src$core$tooltip=a.pageX,lastY$$module$build$src$core$tooltip=a.pageY,showPid$$module$build$src$core$tooltip=setTimeout(show$$module$build$src$core$tooltip, +HOVER_MS$$module$build$src$core$tooltip))},dispose$$module$build$src$core$tooltip=function(){poisonedElement$$module$build$src$core$tooltip=element$$module$build$src$core$tooltip=null;hide$$module$build$src$core$tooltip()},hide$$module$build$src$core$tooltip=function(){visible$$module$build$src$core$tooltip&&(visible$$module$build$src$core$tooltip=!1,containerDiv$$module$build$src$core$tooltip&&(containerDiv$$module$build$src$core$tooltip.style.display="none"));showPid$$module$build$src$core$tooltip&& +clearTimeout(showPid$$module$build$src$core$tooltip)},block$$module$build$src$core$tooltip=function(){hide$$module$build$src$core$tooltip();blocked$$module$build$src$core$tooltip=!0},unblock$$module$build$src$core$tooltip=function(){blocked$$module$build$src$core$tooltip=!1},renderContent$$module$build$src$core$tooltip=function(){containerDiv$$module$build$src$core$tooltip&&element$$module$build$src$core$tooltip&&("function"===typeof customTooltip$$module$build$src$core$tooltip?customTooltip$$module$build$src$core$tooltip(containerDiv$$module$build$src$core$tooltip, +element$$module$build$src$core$tooltip):renderDefaultContent$$module$build$src$core$tooltip())},renderDefaultContent$$module$build$src$core$tooltip=function(){var a=getTooltipOfObject$$module$build$src$core$tooltip(element$$module$build$src$core$tooltip);a=wrap$$module$build$src$core$utils$string(a,LIMIT$$module$build$src$core$tooltip);a=a.split("\n");for(let b=0;bc+window.scrollY&&(e-=containerDiv$$module$build$src$core$tooltip.offsetHeight+ +2*OFFSET_Y$$module$build$src$core$tooltip);a?d=Math.max(MARGINS$$module$build$src$core$tooltip-window.scrollX,d):d+containerDiv$$module$build$src$core$tooltip.offsetWidth>b+window.scrollX-2*MARGINS$$module$build$src$core$tooltip&&(d=b-containerDiv$$module$build$src$core$tooltip.offsetWidth-2*MARGINS$$module$build$src$core$tooltip);return{x:d,y:e}},show$$module$build$src$core$tooltip=function(){if(!blocked$$module$build$src$core$tooltip&&(poisonedElement$$module$build$src$core$tooltip=element$$module$build$src$core$tooltip, +containerDiv$$module$build$src$core$tooltip)){containerDiv$$module$build$src$core$tooltip.textContent="";renderContent$$module$build$src$core$tooltip();var a=element$$module$build$src$core$tooltip.RTL;containerDiv$$module$build$src$core$tooltip.style.direction=a?"rtl":"ltr";containerDiv$$module$build$src$core$tooltip.style.display="block";visible$$module$build$src$core$tooltip=!0;var {x:b,y:c}=getPosition$$module$build$src$core$tooltip(a);containerDiv$$module$build$src$core$tooltip.style.left=b+"px"; +containerDiv$$module$build$src$core$tooltip.style.top=c+"px"}},getHsvSaturation$$module$build$src$core$utils$colour=function(){return hsvSaturation$$module$build$src$core$utils$colour},setHsvSaturation$$module$build$src$core$utils$colour=function(a){hsvSaturation$$module$build$src$core$utils$colour=a},getHsvValue$$module$build$src$core$utils$colour=function(){return hsvValue$$module$build$src$core$utils$colour},setHsvValue$$module$build$src$core$utils$colour=function(a){hsvValue$$module$build$src$core$utils$colour= +a},parse$$module$build$src$core$utils$colour=function(a){a=String(a).toLowerCase().trim();var b=names$$module$build$src$core$utils$colour[a];if(b)return b;b="0x"===a.substring(0,2)?"#"+a.substring(2):a;b="#"===b[0]?b:"#"+b;if(/^#[0-9a-f]{6}$/.test(b))return b;if(/^#[0-9a-f]{3}$/.test(b))return["#",b[1],b[1],b[2],b[2],b[3],b[3]].join("");var c=a.match(/^(?:rgb)?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/);return c&&(a=Number(c[1]),b=Number(c[2]),c=Number(c[3]),0<=a&&256>a&&0<=b&&256>b&&0<=c&&256> +c)?rgbToHex$$module$build$src$core$utils$colour(a,b,c):null},rgbToHex$$module$build$src$core$utils$colour=function(a,b,c){b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).substr(1):"#"+b.toString(16)},hexToRgb$$module$build$src$core$utils$colour=function(a){a=parse$$module$build$src$core$utils$colour(a);if(!a)return[0,0,0];a=parseInt(a.substr(1),16);return[a>>16,a>>8&255,a&255]},hsvToHex$$module$build$src$core$utils$colour=function(a,b,c){let d=0,e=0,f=0;if(0===b)f=e=d=c;else{const g=Math.floor(a/ +60),h=a/60-g;a=c*(1-b);const k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return rgbToHex$$module$build$src$core$utils$colour(Math.floor(d),Math.floor(e),Math.floor(f))},blend$$module$build$src$core$utils$colour=function(a,b,c){a=parse$$module$build$src$core$utils$colour(a);if(!a)return null;b=parse$$module$build$src$core$utils$colour(b);if(!b)return null; +a=hexToRgb$$module$build$src$core$utils$colour(a);b=hexToRgb$$module$build$src$core$utils$colour(b);return rgbToHex$$module$build$src$core$utils$colour(Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2])))},hueToHex$$module$build$src$core$utils$colour=function(a){return hsvToHex$$module$build$src$core$utils$colour(a,hsvSaturation$$module$build$src$core$utils$colour,255*hsvValue$$module$build$src$core$utils$colour)},tokenizeInterpolationInternal$$module$build$src$core$utils$parsing= +function(a,b){const c=[];var d=a.split("");d.push("");var e=0;a=[];let f=null;for(let k=0;k=g?(e=2,f=g,(g=a.join(""))&&c.push(g),a.length=0):"{"===g?e=3:(a.push("%",g),e=0);else if(2===e)if("0"<=g&&"9">=g)f+=g;else{var h=void 0;c.push(parseInt(null!=(h=f)?h:"",10));k--;e=0}else 3===e&&(""===g?(a.splice(0,0,"%{"),k--,e=0):"}"!==g?a.push(g):(e=a.join(""), +/[A-Z]\w*/i.test(e)?(g=e.toUpperCase(),(g=g.startsWith("BKY_")?g.substring(4):null)&&g in Msg$$module$build$src$core$msg?(e=Msg$$module$build$src$core$msg[g],"string"===typeof e?Array.prototype.push.apply(c,tokenizeInterpolationInternal$$module$build$src$core$utils$parsing(e,b)):b?c.push(String(e)):c.push(e)):c.push("%{"+e+"}")):c.push("%{"+e+"}"),e=a.length=0))}(b=a.join(""))&&c.push(b);h=[];a.length=0;for(d=0;d=c)return{hue:c,hex:hsvToHex$$module$build$src$core$utils$colour(c,getHsvSaturation$$module$build$src$core$utils$colour(), +255*getHsvValue$$module$build$src$core$utils$colour())};if(c=parse$$module$build$src$core$utils$colour(b))return{hue:null,hex:c};c='Invalid colour: "'+b+'"';a!==b&&(c+=' (from "'+a+'")');throw Error(c);},getDiv$$module$build$src$core$widgetdiv=function(){return containerDiv$$module$build$src$core$widgetdiv},testOnly_setDiv$$module$build$src$core$widgetdiv=function(a){containerDiv$$module$build$src$core$widgetdiv=a},createDom$$module$build$src$core$widgetdiv=function(){containerDiv$$module$build$src$core$widgetdiv|| +(containerDiv$$module$build$src$core$widgetdiv=document.createElement("div"),containerDiv$$module$build$src$core$widgetdiv.className="blocklyWidgetDiv",(getParentContainer$$module$build$src$core$common()||document.body).appendChild(containerDiv$$module$build$src$core$widgetdiv))},show$$module$build$src$core$widgetdiv=function(a,b,c){hide$$module$build$src$core$widgetdiv();owner$$module$build$src$core$widgetdiv=a;dispose$$module$build$src$core$widgetdiv=c;if(a=containerDiv$$module$build$src$core$widgetdiv)a.style.direction= +b?"rtl":"ltr",a.style.display="block",b=getMainWorkspace$$module$build$src$core$common(),rendererClassName$$module$build$src$core$widgetdiv=b.getRenderer().getClassName(),themeClassName$$module$build$src$core$widgetdiv=b.getTheme().getClassName(),rendererClassName$$module$build$src$core$widgetdiv&&addClass$$module$build$src$core$utils$dom(a,rendererClassName$$module$build$src$core$widgetdiv),themeClassName$$module$build$src$core$widgetdiv&&addClass$$module$build$src$core$utils$dom(a,themeClassName$$module$build$src$core$widgetdiv)}, +hide$$module$build$src$core$widgetdiv=function(){if(isVisible$$module$build$src$core$widgetdiv()){owner$$module$build$src$core$widgetdiv=null;var a=containerDiv$$module$build$src$core$widgetdiv;a&&(a.style.display="none",a.style.left="",a.style.top="",dispose$$module$build$src$core$widgetdiv&&dispose$$module$build$src$core$widgetdiv(),dispose$$module$build$src$core$widgetdiv=null,a.textContent="",rendererClassName$$module$build$src$core$widgetdiv&&(removeClass$$module$build$src$core$utils$dom(a,rendererClassName$$module$build$src$core$widgetdiv), +rendererClassName$$module$build$src$core$widgetdiv=""),themeClassName$$module$build$src$core$widgetdiv&&(removeClass$$module$build$src$core$utils$dom(a,themeClassName$$module$build$src$core$widgetdiv),themeClassName$$module$build$src$core$widgetdiv=""),getMainWorkspace$$module$build$src$core$common().markFocused())}},isVisible$$module$build$src$core$widgetdiv=function(){return!!owner$$module$build$src$core$widgetdiv},hideIfOwner$$module$build$src$core$widgetdiv=function(a){owner$$module$build$src$core$widgetdiv=== +a&&hide$$module$build$src$core$widgetdiv()},positionInternal$$module$build$src$core$widgetdiv=function(a,b,c){containerDiv$$module$build$src$core$widgetdiv.style.left=a+"px";containerDiv$$module$build$src$core$widgetdiv.style.top=b+"px";containerDiv$$module$build$src$core$widgetdiv.style.height=c+"px"},positionWithAnchor$$module$build$src$core$widgetdiv=function(a,b,c,d){const e=calculateY$$module$build$src$core$widgetdiv(a,b,c);a=calculateX$$module$build$src$core$widgetdiv(a,b,c,d);0>e?positionInternal$$module$build$src$core$widgetdiv(a, +0,c.height+e):positionInternal$$module$build$src$core$widgetdiv(a,e,c.height)},calculateX$$module$build$src$core$widgetdiv=function(a,b,c,d){return d?Math.min(Math.max(b.right-c.width,a.left),a.right-c.width):Math.max(Math.min(b.left,a.right-c.width),a.left)},calculateY$$module$build$src$core$widgetdiv=function(a,b,c){return b.bottom+c.height>=a.bottom?b.top-c.height:b.bottom},register$$module$build$src$core$field_registry=function(a,b){register$$module$build$src$core$registry(Type$$module$build$src$core$registry.FIELD, +a,b)},unregister$$module$build$src$core$field_registry=function(a){unregister$$module$build$src$core$registry(Type$$module$build$src$core$registry.FIELD,a)},fromJson$$module$build$src$core$field_registry=function(a){return TEST_ONLY$$module$build$src$core$field_registry.fromJsonInternal(a)},fromJsonInternal$$module$build$src$core$field_registry=function(a){const b=getObject$$module$build$src$core$registry(Type$$module$build$src$core$registry.FIELD,a.type);if(b){if("function"!==typeof b.fromJson)throw new TypeError("returned Field was not a IRegistrableField"); +return b.fromJson(a)}console.warn("Blockly could not create a field of type "+a.type+". The field is probably not being registered. This could be because the file is not loaded, the field does not register itself (Issue #1584), or the registration is not being reached.");return null},setRole$$module$build$src$core$utils$aria=function(a,b){a.setAttribute(ROLE_ATTRIBUTE$$module$build$src$core$utils$aria,b)},setState$$module$build$src$core$utils$aria=function(a,b,c){Array.isArray(c)&&(c=c.join(" ")); +a.setAttribute(ARIA_PREFIX$$module$build$src$core$utils$aria+b,`${c}`)},validateOptions$$module$build$src$core$field_dropdown=function(a){if(!Array.isArray(a))throw TypeError("FieldDropdown options must be an array.");if(!a.length)throw TypeError("FieldDropdown options must not be an empty array.");let b=!1;for(let c=0;c document.");}else a instanceof Element&&(b=a);return b},register$$module$build$src$core$extensions=function(a,b){if("string"!==typeof a||""===a.trim())throw Error('Error: Invalid extension name "'+ +a+'"');if(allExtensions$$module$build$src$core$extensions[a])throw Error('Error: Extension "'+a+'" is already registered.');if("function"!==typeof b)throw Error('Error: Extension "'+a+'" must be a function');allExtensions$$module$build$src$core$extensions[a]=b},registerMixin$$module$build$src$core$extensions=function(a,b){if(!b||"object"!==typeof b)throw Error('Error: Mixin "'+a+'" must be a object');register$$module$build$src$core$extensions(a,function(){this.mixin(b)})},registerMutator$$module$build$src$core$extensions= +function(a,b,c,d){const e='Error when registering mutator "'+a+'": ';checkHasMutatorProperties$$module$build$src$core$extensions(e,b);const f=checkMutatorDialog$$module$build$src$core$extensions(b,e);if(c&&"function"!==typeof c)throw Error(e+'Extension "'+a+'" is not a function');register$$module$build$src$core$extensions(a,function(){f&&this.setMutator(new $.Mutator$$module$build$src$core$mutator(d||[],this));this.mixin(b);c&&c.apply(this)})},unregister$$module$build$src$core$extensions=function(a){isRegistered$$module$build$src$core$extensions(a)? +delete allExtensions$$module$build$src$core$extensions[a]:console.warn('No extension mapping for name "'+a+'" found to unregister')},isRegistered$$module$build$src$core$extensions=function(a){return!!allExtensions$$module$build$src$core$extensions[a]},apply$$module$build$src$core$extensions=function(a,b,c){const d=allExtensions$$module$build$src$core$extensions[a];if("function"!==typeof d)throw Error('Error: Extension "'+a+'" not found.');let e;c?checkNoMutatorProperties$$module$build$src$core$extensions(a, +b):e=getMutatorProperties$$module$build$src$core$extensions(b);d.apply(b);if(c)checkHasMutatorProperties$$module$build$src$core$extensions('Error after applying mutator "'+a+'": ',b);else if(!mutatorPropertiesMatch$$module$build$src$core$extensions(e,b))throw Error('Error when applying extension "'+a+'": mutation properties changed when applying a non-mutator extension.');},checkNoMutatorProperties$$module$build$src$core$extensions=function(a,b){if(getMutatorProperties$$module$build$src$core$extensions(b).length)throw Error('Error: tried to apply mutation "'+ +a+'" to a block that already has mutator functions. Block id: '+b.id);},checkXmlHooks$$module$build$src$core$extensions=function(a,b){return checkHasFunctionPair$$module$build$src$core$extensions(a.mutationToDom,a.domToMutation,b+" mutationToDom/domToMutation")},checkJsonHooks$$module$build$src$core$extensions=function(a,b){return checkHasFunctionPair$$module$build$src$core$extensions(a.saveExtraState,a.loadExtraState,b+" saveExtraState/loadExtraState")},checkMutatorDialog$$module$build$src$core$extensions= +function(a,b){return checkHasFunctionPair$$module$build$src$core$extensions(a.compose,a.decompose,b+" compose/decompose")},checkHasFunctionPair$$module$build$src$core$extensions=function(a,b,c){if(a&&b){if("function"!==typeof a||"function"!==typeof b)throw Error(c+" must be a function");return!0}if(!a&&!b)return!1;throw Error(c+"Must have both or neither functions");},checkHasMutatorProperties$$module$build$src$core$extensions=function(a,b){const c=checkXmlHooks$$module$build$src$core$extensions(b, +a),d=checkJsonHooks$$module$build$src$core$extensions(b,a);if(!c&&!d)throw Error(a+"Mutations must contain either XML hooks, or JSON hooks, or both");checkMutatorDialog$$module$build$src$core$extensions(b,a)},getMutatorProperties$$module$build$src$core$extensions=function(a){const b=[];void 0!==a.domToMutation&&b.push(a.domToMutation);void 0!==a.mutationToDom&&b.push(a.mutationToDom);void 0!==a.saveExtraState&&b.push(a.saveExtraState);void 0!==a.loadExtraState&&b.push(a.loadExtraState);void 0!==a.compose&& +b.push(a.compose);void 0!==a.decompose&&b.push(a.decompose);return b},mutatorPropertiesMatch$$module$build$src$core$extensions=function(a,b){b=getMutatorProperties$$module$build$src$core$extensions(b);if(b.length!==a.length)return!1;for(let c=0;c{g.disposed||g.setConnectionTracking(!0)},1);return g},appendPrivate$$module$build$src$core$serialization$blocks=function(a,b,{parentConnection:c,isShadow:d=!1}={}){if(!a.type)throw new MissingBlockType$$module$build$src$core$serialization$exceptions(a); +const e=b.newBlock(a.type,a.id);e.setShadow(d);loadCoords$$module$build$src$core$serialization$blocks(e,a);loadAttributes$$module$build$src$core$serialization$blocks(e,a);loadExtraState$$module$build$src$core$serialization$blocks(e,a);tryToConnectParent$$module$build$src$core$serialization$blocks(c,e,a);loadIcons$$module$build$src$core$serialization$blocks(e,a);loadFields$$module$build$src$core$serialization$blocks(e,a);loadInputBlocks$$module$build$src$core$serialization$blocks(e,a);loadNextBlocks$$module$build$src$core$serialization$blocks(e, +a);initBlock$$module$build$src$core$serialization$blocks(e,b.rendered);return e},loadCoords$$module$build$src$core$serialization$blocks=function(a,b){let c=void 0===b.x?0:b.x;b=void 0===b.y?0:b.y;const d=a.workspace;c=d.RTL?d.getWidth()-c:c;a.moveBy(c,b)},loadAttributes$$module$build$src$core$serialization$blocks=function(a,b){b.collapsed&&a.setCollapsed(!0);!1===b.enabled&&a.setEnabled(!1);void 0!==b.inline&&a.setInputsInline(b.inline);void 0!==b.data&&(a.data=b.data)},loadExtraState$$module$build$src$core$serialization$blocks= +function(a,b){b.extraState&&(a.loadExtraState?a.loadExtraState(b.extraState):a.domToMutation&&a.domToMutation(textToDom$$module$build$src$core$xml(b.extraState)))},tryToConnectParent$$module$build$src$core$serialization$blocks=function(a,b,c){if(a){if(a.getSourceBlock().isShadow()&&!b.isShadow())throw new RealChildOfShadow$$module$build$src$core$serialization$exceptions(c);if(a.type===inputTypes$$module$build$src$core$input_types.VALUE){var d=b.outputConnection;if(!d)throw new MissingConnection$$module$build$src$core$serialization$exceptions("output", +b,c);}else if(d=b.previousConnection,!d)throw new MissingConnection$$module$build$src$core$serialization$exceptions("previous",b,c);if(!a.connect(d)){const e=b.workspace.connectionChecker;throw new BadConnectionCheck$$module$build$src$core$serialization$exceptions(e.getErrorMessage(e.canConnectWithReason(d,a,!1),d,a),a.type===inputTypes$$module$build$src$core$input_types.VALUE?"output connection":"previous connection",b,c);}}},loadIcons$$module$build$src$core$serialization$blocks=function(a,b){b.icons&& +(b=b.icons.comment)&&(a.setCommentText(b.text),"pinned"in b&&(a.commentModel.pinned=b.pinned),"width"in b&&"height"in b&&(a.commentModel.size=new Size$$module$build$src$core$utils$size(b.width,b.height)),b.pinned&&a.rendered&&!a.isInFlyout&&setTimeout(()=>a.getCommentIcon().setVisible(!0),1))},loadFields$$module$build$src$core$serialization$blocks=function(a,b){if(b.fields){var c=Object.keys(b.fields);for(let d=0;dc)){var d=b.getSvgXY(a.getSvgRoot());a.outputConnection?(d.x+=(a.RTL?3:-3)*c,d.y+=13*c):a.previousConnection&&(d.x+=(a.RTL?-23:23)*c,d.y+=3*c);a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CIRCLE,{cx:d.x,cy:d.y,r:0,fill:"none", +stroke:"#888","stroke-width":10},b.getParentSvg());connectionUiStep$$module$build$src$core$block_animations(a,new Date,c)}},connectionUiStep$$module$build$src$core$block_animations=function(a,b,c){const d=((new Date).getTime()-b.getTime())/150;1a.workspace.scale)){var b=a.getHeightWidth().height;b=Math.atan(10/b)/Math.PI*180;a.RTL||(b*=-1);disconnectGroup$$module$build$src$core$block_animations=a.getSvgRoot();disconnectUiStep$$module$build$src$core$block_animations(disconnectGroup$$module$build$src$core$block_animations,b,new Date)}},disconnectUiStep$$module$build$src$core$block_animations= +function(a,b,c){const d=((new Date).getTime()-c.getTime())/200;let e="";1>=d&&(e=`skewX(${Math.round(Math.sin(d*Math.PI*3)*(1-d)*b)})`,disconnectPid$$module$build$src$core$block_animations=setTimeout(disconnectUiStep$$module$build$src$core$block_animations,10,a,b,c));a.setAttribute("transform",e)},disconnectUiStop$$module$build$src$core$block_animations=function(){disconnectGroup$$module$build$src$core$block_animations&&(disconnectPid$$module$build$src$core$block_animations&&clearTimeout(disconnectPid$$module$build$src$core$block_animations), +disconnectGroup$$module$build$src$core$block_animations.setAttribute("transform",""),disconnectGroup$$module$build$src$core$block_animations=null)},copy$$module$build$src$core$clipboard=function(a){TEST_ONLY$$module$build$src$core$clipboard.copyInternal(a)},copyInternal$$module$build$src$core$clipboard=function(a){copyData$$module$build$src$core$clipboard=a.toCopyData()},paste$$module$build$src$core$clipboard=function(){if(!copyData$$module$build$src$core$clipboard)return null;let a=copyData$$module$build$src$core$clipboard.source; +a.isFlyout&&(a=a.targetWorkspace);return copyData$$module$build$src$core$clipboard.typeCounts&&a.isCapacityAvailable(copyData$$module$build$src$core$clipboard.typeCounts)?a.paste(copyData$$module$build$src$core$clipboard.saveInfo):null},duplicate$$module$build$src$core$clipboard=function(a){return TEST_ONLY$$module$build$src$core$clipboard.duplicateInternal(a)},duplicateInternal$$module$build$src$core$clipboard=function(a){const b=copyData$$module$build$src$core$clipboard;copy$$module$build$src$core$clipboard(a); +let c,d,e;a=null!=(e=null==(c=a.toCopyData())?void 0:null==(d=c.source)?void 0:d.paste(copyData$$module$build$src$core$clipboard.saveInfo))?e:null;copyData$$module$build$src$core$clipboard=b;return a},getCurrentBlock$$module$build$src$core$contextmenu=function(){return currentBlock$$module$build$src$core$contextmenu},setCurrentBlock$$module$build$src$core$contextmenu=function(a){currentBlock$$module$build$src$core$contextmenu=a},show$$module$build$src$core$contextmenu=function(a,b,c){show$$module$build$src$core$widgetdiv(dummyOwner$$module$build$src$core$contextmenu, +c,dispose$$module$build$src$core$contextmenu);if(b.length){var d=populate_$$module$build$src$core$contextmenu(b,c);menu_$$module$build$src$core$contextmenu=d;position_$$module$build$src$core$contextmenu(d,a,c);setTimeout(function(){d.focus()},1);currentBlock$$module$build$src$core$contextmenu=null}else hide$$module$build$src$core$contextmenu()},populate_$$module$build$src$core$contextmenu=function(a,b){const c=new Menu$$module$build$src$core$menu;c.setRole(Role$$module$build$src$core$utils$aria.MENU); +for(let d=0;d{disable$$module$build$src$core$events$utils();let c;try{c=domToBlock$$module$build$src$core$xml(b,a.workspace);const d=a.getRelativeToSurfaceXY();d.x=a.RTL?d.x-$.config$$module$build$src$core$config.snapRadius:d.x+$.config$$module$build$src$core$config.snapRadius;d.y+=2*$.config$$module$build$src$core$config.snapRadius; +c.moveBy(d.x,d.y)}finally{enable$$module$build$src$core$events$utils()}isEnabled$$module$build$src$core$events$utils()&&!c.isShadow()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CREATE$$module$build$src$core$events$utils))(c));c.select()}},commentDeleteOption$$module$build$src$core$contextmenu=function(a){return{text:Msg$$module$build$src$core$msg.REMOVE_COMMENT,enabled:!0,callback:function(){setGroup$$module$build$src$core$events$utils(!0);a.dispose();setGroup$$module$build$src$core$events$utils(!1)}}}, +commentDuplicateOption$$module$build$src$core$contextmenu=function(a){return{text:Msg$$module$build$src$core$msg.DUPLICATE_COMMENT,enabled:!0,callback:function(){duplicate$$module$build$src$core$clipboard(a)}}},workspaceCommentOption$$module$build$src$core$contextmenu=function(a,b){const c={enabled:!0};c.text=Msg$$module$build$src$core$msg.ADD_COMMENT;c.callback=function(){const d=new WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg(a,Msg$$module$build$src$core$msg.WORKSPACE_COMMENT_DEFAULT_TEXT, +WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.DEFAULT_SIZE,WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.DEFAULT_SIZE);var e=a.getInjectionDiv().getBoundingClientRect();e=new Coordinate$$module$build$src$core$utils$coordinate(b.clientX-e.left,b.clientY-e.top);const f=a.getOriginOffsetInPixels();e=Coordinate$$module$build$src$core$utils$coordinate.difference(e,f);e.scale(1/a.scale);d.moveBy(e.x,e.y);a.rendered&&(d.initSvg(),d.render(),d.select())};return c},getStartPositionRect$$module$build$src$core$positionable_helpers= +function(a,b,c,d,e,f){const g=f.scrollbar&&f.scrollbar.canScrollVertically();a.horizontal===horizontalPosition$$module$build$src$core$positionable_helpers.LEFT?(c=e.absoluteMetrics.left+c,g&&f.RTL&&(c+=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness)):(c=e.absoluteMetrics.left+e.viewMetrics.width-b.width-c,g&&!f.RTL&&(c-=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness));a.vertical===verticalPosition$$module$build$src$core$positionable_helpers.TOP?a=e.absoluteMetrics.top+ +d:(a=e.absoluteMetrics.top+e.viewMetrics.height-b.height-d,f.scrollbar&&f.scrollbar.canScrollHorizontally()&&(a-=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness));return new Rect$$module$build$src$core$utils$rect(a,a+b.height,c,c+b.width)},getCornerOppositeToolbox$$module$build$src$core$positionable_helpers=function(a,b){return{horizontal:b.toolboxMetrics.position===Position$$module$build$src$core$utils$toolbox.LEFT||a.horizontalLayout&&!a.RTL?horizontalPosition$$module$build$src$core$positionable_helpers.RIGHT: +horizontalPosition$$module$build$src$core$positionable_helpers.LEFT,vertical:b.toolboxMetrics.position===Position$$module$build$src$core$utils$toolbox.BOTTOM?verticalPosition$$module$build$src$core$positionable_helpers.TOP:verticalPosition$$module$build$src$core$positionable_helpers.BOTTOM}},bumpPositionRect$$module$build$src$core$positionable_helpers=function(a,b,c,d){const e=a.left,f=a.right-a.left,g=a.bottom-a.top;for(let h=0;hg[1].priority-f[1].priority);var e=getRecordUndo$$module$build$src$core$events$utils();setRecordUndo$$module$build$src$core$events$utils(c);(c=getGroup$$module$build$src$core$events$utils())|| +setGroup$$module$build$src$core$events$utils(!0);startTextWidthCache$$module$build$src$core$utils$dom();b instanceof WorkspaceSvg$$module$build$src$core$workspace_svg&&b.setResizesEnabled(!1);for(const [,f]of d.reverse()){let g;null==(g=f)||g.clear(b)}for(let [f,g]of d.reverse())if(a[f]){let h;null==(h=g)||h.load(a[f],b)}b instanceof WorkspaceSvg$$module$build$src$core$workspace_svg&&b.setResizesEnabled(!0);stopTextWidthCache$$module$build$src$core$utils$dom();fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(FINISHED_LOADING$$module$build$src$core$events$utils))(b)); +setGroup$$module$build$src$core$events$utils(c);setRecordUndo$$module$build$src$core$events$utils(e)}},bumpObjectIntoBounds$$module$build$src$core$bump_objects=function(a,b,c){const d=c.getBoundingRectangle(),e=d.right-d.left,f=clamp$$module$build$src$core$utils$math(b.top,d.top,b.top+b.height-(d.bottom-d.top))-d.top;let g=b.left;b=b.left+b.width-e;a.RTL?g=Math.min(b,g):b=Math.max(g,b);return(a=clamp$$module$build$src$core$utils$math(g,d.left,b)-d.left)||f?(c.moveBy(a,f),!0):!1},bumpIntoBoundsHandler$$module$build$src$core$bump_objects= +function(a){return b=>{var c=a.getMetricsManager();if(c.hasFixedEdges()&&!a.isDragging()){var d;if(-1!==BUMP_EVENTS$$module$build$src$core$events$utils.indexOf(null!=(d=b.type)?d:"")){d=c.getScrollMetrics(!0);const e=extractObjectFromEvent$$module$build$src$core$bump_objects(a,b);e&&(c=getGroup$$module$build$src$core$events$utils(),setGroup$$module$build$src$core$events$utils(b.group),bumpObjectIntoBounds$$module$build$src$core$bump_objects(a,d,e)&&!b.group&&console.warn("Moved object in bounds but there was no event group. This may break undo."), +null!==c&&setGroup$$module$build$src$core$events$utils(c))}else b.type===VIEWPORT_CHANGE$$module$build$src$core$events$utils&&b.scale&&b.oldScale&&b.scale>b.oldScale&&bumpTopObjectsIntoBounds$$module$build$src$core$bump_objects(a)}}},extractObjectFromEvent$$module$build$src$core$bump_objects=function(a,b){let c=null;switch(b.type){case CREATE$$module$build$src$core$events$utils:case MOVE$$module$build$src$core$events$utils:(c=a.getBlockById(b.blockId))&&(c=c.getRootBlock());break;case COMMENT_CREATE$$module$build$src$core$events$utils:case COMMENT_MOVE$$module$build$src$core$events$utils:c= +a.getCommentById(b.commentId)}return c},bumpTopObjectsIntoBounds$$module$build$src$core$bump_objects=function(a){var b=a.getMetricsManager();if(b.hasFixedEdges()&&!a.isDragging()){b=b.getScrollMetrics(!0);var c=a.getTopBoundedElements();for(let d=0,e;e=c[d];d++)bumpObjectIntoBounds$$module$build$src$core$bump_objects(a,b,e)}},inject$$module$build$src$core$inject=function(a,b){"string"===typeof a&&(a=document.getElementById(a)||document.querySelector(a));if(!a||!containsNode$$module$build$src$core$utils$dom(document, +a))throw Error("Error: container is not in current document.");b=new Options$$module$build$src$core$options(b||{});const c=document.createElement("div");c.className="injectionDiv";c.tabIndex=0;setState$$module$build$src$core$utils$aria(c,State$$module$build$src$core$utils$aria.LABEL,Msg$$module$build$src$core$msg.WORKSPACE_ARIA_LABEL);a.appendChild(c);a=createDom$$module$build$src$core$inject(c,b);const d=new BlockDragSurfaceSvg$$module$build$src$core$block_drag_surface(c),e=new WorkspaceDragSurfaceSvg$$module$build$src$core$workspace_drag_surface_svg(c), +f=createMainWorkspace$$module$build$src$core$inject(a,b,d,e);init$$module$build$src$core$inject(f);setMainWorkspace$$module$build$src$core$common(f);svgResize$$module$build$src$core$common(f);c.addEventListener("focusin",function(){setMainWorkspace$$module$build$src$core$common(f)});return f},createDom$$module$build$src$core$inject=function(a,b){a.setAttribute("dir","LTR");inject$$module$build$src$core$css(b.hasCss,b.pathToMedia);a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.SVG, +{xmlns:SVG_NS$$module$build$src$core$utils$dom,"xmlns:html":HTML_NS$$module$build$src$core$utils$dom,"xmlns:xlink":XLINK_NS$$module$build$src$core$utils$dom,version:"1.1","class":"blocklySvg",tabindex:"0"},a);const c=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.DEFS,{},a),d=String(Math.random()).substring(2);b.gridPattern=Grid$$module$build$src$core$grid.createDom(d,b.gridOptions,c);return a},createMainWorkspace$$module$build$src$core$inject=function(a,b, +c,d){b.parentWorkspace=null;b=new WorkspaceSvg$$module$build$src$core$workspace_svg(b,c,d);c=b.options;b.scale=c.zoomOptions.startScale;a.appendChild(b.createDom("blocklyMainBackground"));d=b.getInjectionDiv();var e=b.getRenderer().getClassName();e&&addClass$$module$build$src$core$utils$dom(d,e);(e=b.getTheme().getClassName())&&addClass$$module$build$src$core$utils$dom(d,e);!c.hasCategories&&c.languageTree&&(d=b.addFlyout(Svg$$module$build$src$core$utils$svg.SVG),insertAfter$$module$build$src$core$utils$dom(d, +a));c.hasTrashcan&&b.addTrashcan();c.zoomOptions&&c.zoomOptions.controls&&b.addZoomControls();b.getThemeManager().subscribe(a,"workspaceBackgroundColour","background-color");b.translate(0,0);b.addChangeListener(bumpIntoBoundsHandler$$module$build$src$core$bump_objects(b));svgResize$$module$build$src$core$common(b);createDom$$module$build$src$core$widgetdiv();createDom$$module$build$src$core$dropdowndiv();createDom$$module$build$src$core$tooltip();return b},init$$module$build$src$core$inject=function(a){const b= +a.options;var c=a.getParentSvg();conditionalBind$$module$build$src$core$browser_events(c.parentNode,"contextmenu",null,function(d){isTargetInput$$module$build$src$core$browser_events(d)||d.preventDefault()});c=conditionalBind$$module$build$src$core$browser_events(window,"resize",null,function(){a.hideChaff(!0);svgResize$$module$build$src$core$common(a);bumpTopObjectsIntoBounds$$module$build$src$core$bump_objects(a)});a.setResizeHandlerWrapper(c);bindDocumentEvents$$module$build$src$core$inject(); +if(b.languageTree){c=a.getToolbox();const d=a.getFlyout(!0);c?c.init():d&&(d.init(a),d.show(b.languageTree),"function"===typeof d.scrollToStart&&d.scrollToStart())}b.hasTrashcan&&a.trashcan.init();b.zoomOptions&&b.zoomOptions.controls&&a.zoomControls_.init();b.moveOptions&&b.moveOptions.scrollbars?(a.scrollbar=new ScrollbarPair$$module$build$src$core$scrollbar_pair(a,!0===b.moveOptions.scrollbars||!!b.moveOptions.scrollbars.horizontal,!0===b.moveOptions.scrollbars||!!b.moveOptions.scrollbars.vertical, +"blocklyMainWorkspaceScrollbar"),a.scrollbar.resize()):a.setMetrics({x:.5,y:.5});b.hasSounds&&loadSounds$$module$build$src$core$inject(b.pathToMedia,a)},onKeyDown$$module$build$src$core$inject=function(a){const b=getMainWorkspace$$module$build$src$core$common();if(b&&!(isTargetInput$$module$build$src$core$browser_events(a)||b.rendered&&!b.isVisible()))ShortcutRegistry$$module$build$src$core$shortcut_registry.registry.onKeyDown(b,a)},bindDocumentEvents$$module$build$src$core$inject=function(){documentEventsBound$$module$build$src$core$inject|| +(conditionalBind$$module$build$src$core$browser_events(document,"scroll",null,function(){const a=getAllWorkspaces$$module$build$src$core$common();for(let b=0,c;c=a[b];b++)c instanceof WorkspaceSvg$$module$build$src$core$workspace_svg&&c.updateInverseScreenCTM()}),conditionalBind$$module$build$src$core$browser_events(document,"keydown",null,onKeyDown$$module$build$src$core$inject),bind$$module$build$src$core$browser_events(document,"touchend",null,longStop$$module$build$src$core$touch),bind$$module$build$src$core$browser_events(document, +"touchcancel",null,longStop$$module$build$src$core$touch),IPAD$$module$build$src$core$utils$useragent&&conditionalBind$$module$build$src$core$browser_events(window,"orientationchange",document,function(){svgResize$$module$build$src$core$common(getMainWorkspace$$module$build$src$core$common())}));documentEventsBound$$module$build$src$core$inject=!0},loadSounds$$module$build$src$core$inject=function(a,b){function c(){for(;e.length;)unbind$$module$build$src$core$browser_events(e.pop());d.preload()}const d= +b.getAudioManager();d.load([a+"click.mp3",a+"click.wav",a+"click.ogg"],"click");d.load([a+"disconnect.wav",a+"disconnect.mp3",a+"disconnect.ogg"],"disconnect");d.load([a+"delete.mp3",a+"delete.ogg",a+"delete.wav"],"delete");const e=[];e.push(conditionalBind$$module$build$src$core$browser_events(document,"mousemove",null,c,!0));e.push(conditionalBind$$module$build$src$core$browser_events(document,"touchstart",null,c,!0))},registerUndo$$module$build$src$core$contextmenu_items=function(){ContextMenuRegistry$$module$build$src$core$contextmenu_registry.registry.register({displayText(){return Msg$$module$build$src$core$msg.UNDO}, +preconditionFn(a){return 0b.length?deleteNext_$$module$build$src$core$contextmenu_items(b,c):confirm$$module$build$src$core$dialog(Msg$$module$build$src$core$msg.DELETE_ALL_BLOCKS.replace("%1",String(b.length)),function(d){d&&deleteNext_$$module$build$src$core$contextmenu_items(b,c)})}},scopeType:ContextMenuRegistry$$module$build$src$core$contextmenu_registry.ScopeType.WORKSPACE,id:"workspaceDelete", +weight:6})},registerWorkspaceOptions_$$module$build$src$core$contextmenu_items=function(){registerUndo$$module$build$src$core$contextmenu_items();registerRedo$$module$build$src$core$contextmenu_items();registerCleanup$$module$build$src$core$contextmenu_items();registerCollapse$$module$build$src$core$contextmenu_items();registerExpand$$module$build$src$core$contextmenu_items();registerDeleteAll$$module$build$src$core$contextmenu_items()},registerDuplicate$$module$build$src$core$contextmenu_items=function(){ContextMenuRegistry$$module$build$src$core$contextmenu_registry.registry.register({displayText(){return Msg$$module$build$src$core$msg.DUPLICATE_BLOCK}, +preconditionFn(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback(a){a.block&&duplicate$$module$build$src$core$clipboard(a.block)},scopeType:ContextMenuRegistry$$module$build$src$core$contextmenu_registry.ScopeType.BLOCK,id:"blockDuplicate",weight:1})},registerComment$$module$build$src$core$contextmenu_items=function(){ContextMenuRegistry$$module$build$src$core$contextmenu_registry.registry.register({displayText(a){return a.block.getCommentIcon()? +Msg$$module$build$src$core$msg.REMOVE_COMMENT:Msg$$module$build$src$core$msg.ADD_COMMENT},preconditionFn(a){a=a.block;return!a.isInFlyout&&a.workspace.options.comments&&!a.isCollapsed()&&a.isEditable()?"enabled":"hidden"},callback(a){a=a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:ContextMenuRegistry$$module$build$src$core$contextmenu_registry.ScopeType.BLOCK,id:"blockComment",weight:2})},registerInline$$module$build$src$core$contextmenu_items=function(){ContextMenuRegistry$$module$build$src$core$contextmenu_registry.registry.register({displayText(a){return a.block.getInputsInline()? +Msg$$module$build$src$core$msg.EXTERNAL_INPUTS:Msg$$module$build$src$core$msg.INLINE_INPUTS},preconditionFn(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(let b=1;b>>0,$jscomp.propertyToPolyfillSymbol[e]=$jscomp.IS_SYMBOL_NATIVE? +$jscomp.global.Symbol(e):$jscomp.POLYFILL_PREFIX+c+"$"+e),$jscomp.defineProperty(d,$jscomp.propertyToPolyfillSymbol[e],{configurable:!0,writable:!0,value:b})))};$jscomp.polyfill("globalThis",function(a){return a||$jscomp.global},"es_2020","es3");$jscomp.arrayIteratorImpl=function(a){var b=0;return function(){return b>>0,$.$jscomp.propertyToPolyfillSymbol[e]= -$.$jscomp.IS_SYMBOL_NATIVE?$.$jscomp.global.Symbol(e):$.$jscomp.POLYFILL_PREFIX+c+"$"+e),$.$jscomp.defineProperty(d,$.$jscomp.propertyToPolyfillSymbol[e],{configurable:!0,writable:!0,value:b})))};$.$jscomp.assign=$.$jscomp.TRUST_ES6_POLYFILLS&&"function"==typeof Object.assign?Object.assign:function(a,b){for(var c=1;c=f}},"es6","es3");$.$jscomp.initSymbol=function(){}; -$.$jscomp.polyfill("Symbol",function(a){if(a)return a;var b=function(f,g){this.$jscomp$symbol$id_=f;$.$jscomp.defineProperty(this,"description",{configurable:!0,writable:!0,value:g})};b.prototype.toString=function(){return this.$jscomp$symbol$id_};var c="jscomp_symbol_"+(1E9*Math.random()>>>0)+"_",d=0,e=function(f){if(this instanceof e)throw new TypeError("Symbol is not a constructor");return new b(c+(f||"")+"_"+d++,f)};return e},"es6","es3"); -$.$jscomp.polyfill("Symbol.iterator",function(a){if(a)return a;a=Symbol("Symbol.iterator");for(var b="Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array".split(" "),c=0;cc&&(c=Math.max(0,e+c));if(null==d||d>e)d=e;d=Number(d);0>d&&(d=Math.max(0,e+d));for(c=Number(c||0);c>>/g,a),module$exports$Blockly$Css.content="",a=document.createElement("style"),a.id="blockly-common-style",b=document.createTextNode(b),a.appendChild(b),document.head.insertBefore(a,document.head.firstChild)))};module$exports$Blockly$Css.content='\n.blocklySvg {\n background-color: #fff;\n outline: none;\n overflow: hidden; /* IE overflows by default. */\n position: absolute;\n display: block;\n}\n\n.blocklyWidgetDiv {\n display: none;\n position: absolute;\n z-index: 99999; /* big value for bootstrap3 compatibility */\n}\n\n.injectionDiv {\n height: 100%;\n position: relative;\n overflow: hidden; /* So blocks in drag surface disappear at edges */\n touch-action: none;\n}\n\n.blocklyNonSelectable {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n\n.blocklyWsDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n/* Added as a separate rule with multiple classes to make it more specific\n than a bootstrap rule that selects svg:root. See issue #1275 for context.\n*/\n.blocklyWsDragSurface.blocklyOverflowVisible {\n overflow: visible;\n}\n\n.blocklyBlockDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: visible !important;\n z-index: 50; /* Display below toolbox, but above everything else. */\n}\n\n.blocklyBlockCanvas.blocklyCanvasTransitioning,\n.blocklyBubbleCanvas.blocklyCanvasTransitioning {\n transition: transform .5s;\n}\n\n.blocklyTooltipDiv {\n background-color: #ffffc7;\n border: 1px solid #ddc;\n box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);\n color: #000;\n display: none;\n font: 9pt sans-serif;\n opacity: .9;\n padding: 2px;\n position: absolute;\n z-index: 100000; /* big value for bootstrap3 compatibility */\n}\n\n.blocklyDropDownDiv {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1000;\n display: none;\n border: 1px solid;\n border-color: #dadce0;\n background-color: #fff;\n border-radius: 2px;\n padding: 4px;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownContent {\n max-height: 300px; // @todo: spec for maximum height.\n overflow: auto;\n overflow-x: hidden;\n position: relative;\n}\n\n.blocklyDropDownArrow {\n position: absolute;\n left: 0;\n top: 0;\n width: 16px;\n height: 16px;\n z-index: -1;\n background-color: inherit;\n border-color: inherit;\n}\n\n.blocklyDropDownButton {\n display: inline-block;\n float: left;\n padding: 0;\n margin: 4px;\n border-radius: 4px;\n outline: none;\n border: 1px solid;\n transition: box-shadow .1s;\n cursor: pointer;\n}\n\n.blocklyArrowTop {\n border-top: 1px solid;\n border-left: 1px solid;\n border-top-left-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyArrowBottom {\n border-bottom: 1px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyResizeSE {\n cursor: se-resize;\n fill: #aaa;\n}\n\n.blocklyResizeSW {\n cursor: sw-resize;\n fill: #aaa;\n}\n\n.blocklyResizeLine {\n stroke: #515A5A;\n stroke-width: 1;\n}\n\n.blocklyHighlightedConnectionPath {\n fill: none;\n stroke: #fc3;\n stroke-width: 4px;\n}\n\n.blocklyPathLight {\n fill: none;\n stroke-linecap: round;\n stroke-width: 1;\n}\n\n.blocklySelected>.blocklyPathLight {\n display: none;\n}\n\n.blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don\'t support grab */\n cursor: url("<<>>/handopen.cur"), auto;\n cursor: grab;\n cursor: -webkit-grab;\n}\n\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n.blocklyDragging {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n /* Changes cursor on mouse down. Not effective in Firefox because of\n https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */\n.blocklyDraggable:active {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Change the cursor on the whole drag surface in case the mouse gets\n ahead of block during a drag. This way the cursor is still a closed hand.\n */\n.blocklyBlockDragSurface .blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n.blocklyDragging.blocklyDraggingDelete {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyDragging>.blocklyPath,\n.blocklyDragging>.blocklyPathLight {\n fill-opacity: .8;\n stroke-opacity: .8;\n}\n\n.blocklyDragging>.blocklyPathDark {\n display: none;\n}\n\n.blocklyDisabled>.blocklyPath {\n fill-opacity: .5;\n stroke-opacity: .5;\n}\n\n.blocklyDisabled>.blocklyPathLight,\n.blocklyDisabled>.blocklyPathDark {\n display: none;\n}\n\n.blocklyInsertionMarker>.blocklyPath,\n.blocklyInsertionMarker>.blocklyPathLight,\n.blocklyInsertionMarker>.blocklyPathDark {\n fill-opacity: .2;\n stroke: none;\n}\n\n.blocklyMultilineText {\n font-family: monospace;\n}\n\n.blocklyNonEditableText>text {\n pointer-events: none;\n}\n\n.blocklyFlyout {\n position: absolute;\n z-index: 20;\n}\n\n.blocklyText text {\n cursor: default;\n}\n\n/*\n Don\'t allow users to select text. It gets annoying when trying to\n drag a block and selected text moves instead.\n*/\n.blocklySvg text,\n.blocklyBlockDragSurface text {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n cursor: inherit;\n}\n\n.blocklyHidden {\n display: none;\n}\n\n.blocklyFieldDropdown:not(.blocklyHidden) {\n display: block;\n}\n\n.blocklyIconGroup {\n cursor: default;\n}\n\n.blocklyIconGroup:not(:hover),\n.blocklyIconGroupReadonly {\n opacity: .6;\n}\n\n.blocklyIconShape {\n fill: #00f;\n stroke: #fff;\n stroke-width: 1px;\n}\n\n.blocklyIconSymbol {\n fill: #fff;\n}\n\n.blocklyMinimalBody {\n margin: 0;\n padding: 0;\n}\n\n.blocklyHtmlInput {\n border: none;\n border-radius: 4px;\n height: 100%;\n margin: 0;\n outline: none;\n padding: 0;\n width: 100%;\n text-align: center;\n display: block;\n box-sizing: border-box;\n}\n\n/* Edge and IE introduce a close icon when the input value is longer than a\n certain length. This affects our sizing calculations of the text input.\n Hiding the close icon to avoid that. */\n.blocklyHtmlInput::-ms-clear {\n display: none;\n}\n\n.blocklyMainBackground {\n stroke-width: 1;\n stroke: #c6c6c6; /* Equates to #ddd due to border being off-pixel. */\n}\n\n.blocklyMutatorBackground {\n fill: #fff;\n stroke: #ddd;\n stroke-width: 1;\n}\n\n.blocklyFlyoutBackground {\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyMainWorkspaceScrollbar {\n z-index: 20;\n}\n\n.blocklyFlyoutScrollbar {\n z-index: 30;\n}\n\n.blocklyScrollbarHorizontal,\n.blocklyScrollbarVertical {\n position: absolute;\n outline: none;\n}\n\n.blocklyScrollbarBackground {\n opacity: 0;\n}\n\n.blocklyScrollbarHandle {\n fill: #ccc;\n}\n\n.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyScrollbarHandle:hover {\n fill: #bbb;\n}\n\n/* Darken flyout scrollbars due to being on a grey background. */\n/* By contrast, workspace scrollbars are on a white background. */\n.blocklyFlyout .blocklyScrollbarHandle {\n fill: #bbb;\n}\n\n.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyFlyout .blocklyScrollbarHandle:hover {\n fill: #aaa;\n}\n\n.blocklyInvalidInput {\n background: #faa;\n}\n\n.blocklyVerticalMarker {\n stroke-width: 3px;\n fill: rgba(255,255,255,.5);\n pointer-events: none;\n}\n\n.blocklyComputeCanvas {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.blocklyNoPointerEvents {\n pointer-events: none;\n}\n\n.blocklyContextMenu {\n border-radius: 4px;\n max-height: 100%;\n}\n\n.blocklyDropdownMenu {\n border-radius: 2px;\n padding: 0 !important;\n}\n\n.blocklyDropdownMenu .blocklyMenuItem {\n /* 28px on the left for icon or checkbox. */\n padding-left: 28px;\n}\n\n/* BiDi override for the resting state. */\n.blocklyDropdownMenu .blocklyMenuItemRtl {\n /* Flip left/right padding for BiDi. */\n padding-left: 5px;\n padding-right: 28px;\n}\n\n.blocklyWidgetDiv .blocklyMenu {\n background: #fff;\n border: 1px solid transparent;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n font: normal 13px Arial, sans-serif;\n margin: 0;\n outline: none;\n padding: 4px 0;\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n.blocklyWidgetDiv .blocklyMenu.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv .blocklyMenu {\n background: inherit; /* Compatibility with gapi, reset from goog-menu */\n border: inherit; /* Compatibility with gapi, reset from goog-menu */\n font: normal 13px "Helvetica Neue", Helvetica, sans-serif;\n outline: none;\n position: relative; /* Compatibility with gapi, reset from goog-menu */\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n/* State: resting. */\n.blocklyMenuItem {\n border: none;\n color: #000;\n cursor: pointer;\n list-style: none;\n margin: 0;\n /* 7em on the right for shortcut. */\n min-width: 7em;\n padding: 6px 15px;\n white-space: nowrap;\n}\n\n/* State: disabled. */\n.blocklyMenuItemDisabled {\n color: #ccc;\n cursor: inherit;\n}\n\n/* State: hover. */\n.blocklyMenuItemHighlight {\n background-color: rgba(0,0,0,.1);\n}\n\n/* State: selected/checked. */\n.blocklyMenuItemCheckbox {\n height: 16px;\n position: absolute;\n width: 16px;\n}\n\n.blocklyMenuItemSelected .blocklyMenuItemCheckbox {\n background: url(<<>>/sprites.png) no-repeat -48px -16px;\n float: left;\n margin-left: -24px;\n position: static; /* Scroll with the menu. */\n}\n\n.blocklyMenuItemRtl .blocklyMenuItemCheckbox {\n float: right;\n margin-right: -24px;\n}\n';var module$contents$Blockly$utils$string_wrapLine,module$contents$Blockly$utils$string_wrapScore,module$contents$Blockly$utils$string_wrapMutate,module$contents$Blockly$utils$string_wrapToText; -$.module$exports$Blockly$utils$string={startsWith:function(a,b){return 0===a.lastIndexOf(b,0)},shortestStringLength:function(a){return a.length?a.reduce(function(b,c){return b.lengthb&&(b=c[d].length);var e=-Infinity,f=1;do{d=e;var g=a;a=[];e=c.length/f;for(var h=1,k=0;kd);return g}; -module$contents$Blockly$utils$string_wrapScore=function(a,b,c){for(var d=[0],e=[],f=0;fd&&(d=h,e=g)}return e?module$contents$Blockly$utils$string_wrapMutate(a,e,c):b};module$contents$Blockly$utils$string_wrapToText=function(a,b){for(var c=[],d=0;dmodule$exports$Blockly$Tooltip.RADIUS_OK&&(0,module$exports$Blockly$Tooltip.hide)()}else module$contents$Blockly$Tooltip_poisonedElement!==module$contents$Blockly$Tooltip_element&&(clearTimeout(module$contents$Blockly$Tooltip_showPid),module$contents$Blockly$Tooltip_lastX=a.pageX,module$contents$Blockly$Tooltip_lastY=a.pageY,module$contents$Blockly$Tooltip_showPid=setTimeout(module$contents$Blockly$Tooltip_show, -module$exports$Blockly$Tooltip.HOVER_MS))};module$exports$Blockly$Tooltip.dispose=function(){module$contents$Blockly$Tooltip_poisonedElement=module$contents$Blockly$Tooltip_element=null;(0,module$exports$Blockly$Tooltip.hide)()};module$exports$Blockly$Tooltip.hide=function(){module$contents$Blockly$Tooltip_visible&&(module$contents$Blockly$Tooltip_visible=!1,module$contents$Blockly$Tooltip_DIV&&(module$contents$Blockly$Tooltip_DIV.style.display="none"));module$contents$Blockly$Tooltip_showPid&&clearTimeout(module$contents$Blockly$Tooltip_showPid)}; -module$exports$Blockly$Tooltip.block=function(){(0,module$exports$Blockly$Tooltip.hide)();module$contents$Blockly$Tooltip_blocked=!0};module$exports$Blockly$Tooltip.unblock=function(){module$contents$Blockly$Tooltip_blocked=!1}; -var module$contents$Blockly$Tooltip_renderContent=function(){module$contents$Blockly$Tooltip_DIV&&module$contents$Blockly$Tooltip_element&&("function"===typeof module$contents$Blockly$Tooltip_customTooltip?module$contents$Blockly$Tooltip_customTooltip(module$contents$Blockly$Tooltip_DIV,module$contents$Blockly$Tooltip_element):module$contents$Blockly$Tooltip_renderDefaultContent())},module$contents$Blockly$Tooltip_renderDefaultContent=function(){var a=(0,module$exports$Blockly$Tooltip.getTooltipOfObject)(module$contents$Blockly$Tooltip_element); -a=(0,$.module$exports$Blockly$utils$string.wrap)(a,module$exports$Blockly$Tooltip.LIMIT);a=a.split("\n");for(var b=0;bc+window.scrollY&&(e-=module$contents$Blockly$Tooltip_DIV.offsetHeight+2*module$exports$Blockly$Tooltip.OFFSET_Y);a?d=Math.max(module$exports$Blockly$Tooltip.MARGINS-window.scrollX,d):d+module$contents$Blockly$Tooltip_DIV.offsetWidth>b+window.scrollX-2*module$exports$Blockly$Tooltip.MARGINS&&(d=b-module$contents$Blockly$Tooltip_DIV.offsetWidth- -2*module$exports$Blockly$Tooltip.MARGINS);return{x:d,y:e}},module$contents$Blockly$Tooltip_show=function(){if(!module$contents$Blockly$Tooltip_blocked&&(module$contents$Blockly$Tooltip_poisonedElement=module$contents$Blockly$Tooltip_element,module$contents$Blockly$Tooltip_DIV)){module$contents$Blockly$Tooltip_DIV.textContent="";module$contents$Blockly$Tooltip_renderContent();var a=module$contents$Blockly$Tooltip_element.RTL;module$contents$Blockly$Tooltip_DIV.style.direction=a?"rtl":"ltr";module$contents$Blockly$Tooltip_DIV.style.display= -"block";module$contents$Blockly$Tooltip_visible=!0;a=module$contents$Blockly$Tooltip_getPosition(a);var b=a.y;module$contents$Blockly$Tooltip_DIV.style.left=a.x+"px";module$contents$Blockly$Tooltip_DIV.style.top=b+"px"}};var module$exports$Blockly$utils$dom={SVG_NS:"http://www.w3.org/2000/svg",HTML_NS:"http://www.w3.org/1999/xhtml",XLINK_NS:"http://www.w3.org/1999/xlink",NodeType:{ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_POSITION_CONTAINED_BY:16}},module$contents$Blockly$utils$dom_cacheWidths=null,module$contents$Blockly$utils$dom_cacheReference=0,module$contents$Blockly$utils$dom_canvasContext=null; -module$exports$Blockly$utils$dom.createSvgElement=function(a,b,c){a=document.createElementNS(module$exports$Blockly$utils$dom.SVG_NS,String(a));for(var d in b)a.setAttribute(d,b[d]);document.body.runtimeStyle&&(a.runtimeStyle=a.currentStyle=a.style);c&&c.appendChild(a);return a};module$exports$Blockly$utils$dom.addClass=function(a,b){var c=a.getAttribute("class")||"";if(-1!==(" "+c+" ").indexOf(" "+b+" "))return!1;c&&(c+=" ");a.setAttribute("class",c+b);return!0}; -module$exports$Blockly$utils$dom.removeClasses=function(a,b){b=b.split(" ");for(var c=0;ce?module$contents$Blockly$WidgetDiv_positionInternal(a,0,c.height+e):module$contents$Blockly$WidgetDiv_positionInternal(a,e,c.height)}; -var module$contents$Blockly$WidgetDiv_calculateX=function(a,b,c,d){return d?Math.min(Math.max(b.right-c.width,a.left),a.right-c.width):Math.max(Math.min(b.left,a.right-c.width),a.left)},module$contents$Blockly$WidgetDiv_calculateY=function(a,b,c){return b.bottom+c.height>=a.bottom?b.top-c.height:b.bottom};var module$exports$Blockly$utils$aria={},module$contents$Blockly$utils$aria_ARIA_PREFIX="aria-",module$contents$Blockly$utils$aria_ROLE_ATTRIBUTE="role";module$exports$Blockly$utils$aria.Role={GRID:"grid",GRIDCELL:"gridcell",GROUP:"group",LISTBOX:"listbox",MENU:"menu",MENUITEM:"menuitem",MENUITEMCHECKBOX:"menuitemcheckbox",OPTION:"option",PRESENTATION:"presentation",ROW:"row",TREE:"tree",TREEITEM:"treeitem"}; -module$exports$Blockly$utils$aria.State={ACTIVEDESCENDANT:"activedescendant",COLCOUNT:"colcount",DISABLED:"disabled",EXPANDED:"expanded",INVALID:"invalid",LABEL:"label",LABELLEDBY:"labelledby",LEVEL:"level",ORIENTATION:"orientation",POSINSET:"posinset",ROWCOUNT:"rowcount",SELECTED:"selected",SETSIZE:"setsize",VALUEMAX:"valuemax",VALUEMIN:"valuemin"};module$exports$Blockly$utils$aria.setRole=function(a,b){a.setAttribute(module$contents$Blockly$utils$aria_ROLE_ATTRIBUTE,b)}; -module$exports$Blockly$utils$aria.setState=function(a,b,c){Array.isArray(c)&&(c=c.join(" "));a.setAttribute(module$contents$Blockly$utils$aria_ARIA_PREFIX+b,c)};var module$exports$Blockly$utils$idGenerator={TEST_ONLY:{}},module$contents$Blockly$utils$idGenerator_nextId=0;module$exports$Blockly$utils$idGenerator.getNextUniqueId=function(){return"blockly-"+(module$contents$Blockly$utils$idGenerator_nextId++).toString(36)};var module$contents$Blockly$utils$idGenerator_soup="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; -module$exports$Blockly$utils$idGenerator.TEST_ONLY.genUid=function(){for(var a=module$contents$Blockly$utils$idGenerator_soup.length,b=[],c=0;20>c;c++)b[c]=module$contents$Blockly$utils$idGenerator_soup.charAt(Math.random()*a);return b.join("")};module$exports$Blockly$utils$idGenerator.genUid=function(){return module$exports$Blockly$utils$idGenerator.TEST_ONLY.genUid()};var module$exports$Blockly$registry={},module$contents$Blockly$registry_typeMap=Object.create(null);module$exports$Blockly$registry.TEST_ONLY={typeMap:module$contents$Blockly$registry_typeMap};var module$contents$Blockly$registry_nameMap=Object.create(null);module$exports$Blockly$registry.DEFAULT="default";module$exports$Blockly$registry.Type=function(a){this.name_=a};module$exports$Blockly$registry.Type.prototype.toString=function(){return this.name_}; -module$exports$Blockly$registry.Type.CONNECTION_CHECKER=new module$exports$Blockly$registry.Type("connectionChecker");module$exports$Blockly$registry.Type.CURSOR=new module$exports$Blockly$registry.Type("cursor");module$exports$Blockly$registry.Type.EVENT=new module$exports$Blockly$registry.Type("event");module$exports$Blockly$registry.Type.FIELD=new module$exports$Blockly$registry.Type("field");module$exports$Blockly$registry.Type.RENDERER=new module$exports$Blockly$registry.Type("renderer"); -module$exports$Blockly$registry.Type.TOOLBOX=new module$exports$Blockly$registry.Type("toolbox");module$exports$Blockly$registry.Type.THEME=new module$exports$Blockly$registry.Type("theme");module$exports$Blockly$registry.Type.TOOLBOX_ITEM=new module$exports$Blockly$registry.Type("toolboxItem");module$exports$Blockly$registry.Type.FLYOUTS_VERTICAL_TOOLBOX=new module$exports$Blockly$registry.Type("flyoutsVerticalToolbox");module$exports$Blockly$registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX=new module$exports$Blockly$registry.Type("flyoutsHorizontalToolbox"); -module$exports$Blockly$registry.Type.METRICS_MANAGER=new module$exports$Blockly$registry.Type("metricsManager");module$exports$Blockly$registry.Type.BLOCK_DRAGGER=new module$exports$Blockly$registry.Type("blockDragger");module$exports$Blockly$registry.Type.SERIALIZER=new module$exports$Blockly$registry.Type("serializer"); -module$exports$Blockly$registry.register=function(a,b,c,d){if(!(a instanceof module$exports$Blockly$registry.Type)&&"string"!==typeof a||""===String(a).trim())throw Error('Invalid type "'+a+'". The type must be a non-empty string or a Blockly.registry.Type.');a=String(a).toLowerCase();if("string"!==typeof b||""===b.trim())throw Error('Invalid name "'+b+'". The name must be a non-empty string.');var e=b.toLowerCase();if(!c)throw Error("Can not register a null value");var f=module$contents$Blockly$registry_typeMap[a], -g=module$contents$Blockly$registry_nameMap[a];f||(f=module$contents$Blockly$registry_typeMap[a]=Object.create(null),g=module$contents$Blockly$registry_nameMap[a]=Object.create(null));module$contents$Blockly$registry_validate(a,c);if(!d&&f[e])throw Error('Name "'+e+'" with type "'+a+'" already registered.');f[e]=c;g[e]=b}; -var module$contents$Blockly$registry_validate=function(a,b){switch(a){case String(module$exports$Blockly$registry.Type.FIELD):if("function"!==typeof b.fromJson)throw Error('Type "'+a+'" must have a fromJson function');}}; -module$exports$Blockly$registry.unregister=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();var c=module$contents$Blockly$registry_typeMap[a];c&&c[b]?(delete module$contents$Blockly$registry_typeMap[a][b],delete module$contents$Blockly$registry_nameMap[a][b]):console.warn("Unable to unregister ["+b+"]["+a+"] from the registry.")}; -var module$contents$Blockly$registry_getItem=function(a,b,c){a=String(a).toLowerCase();b=b.toLowerCase();var d=module$contents$Blockly$registry_typeMap[a];if(!d||!d[b]){b="Unable to find ["+b+"]["+a+"] in the registry.";if(c)throw Error(b+" You must require or register a "+a+" plugin.");console.warn(b);return null}return d[b]};module$exports$Blockly$registry.hasItem=function(a,b){a=String(a).toLowerCase();b=b.toLowerCase();return(a=module$contents$Blockly$registry_typeMap[a])?!!a[b]:!1}; -module$exports$Blockly$registry.getClass=function(a,b,c){return module$contents$Blockly$registry_getItem(a,b,c)};module$exports$Blockly$registry.getObject=function(a,b,c){return module$contents$Blockly$registry_getItem(a,b,c)}; -module$exports$Blockly$registry.getAllItems=function(a,b,c){a=String(a).toLowerCase();var d=module$contents$Blockly$registry_typeMap[a];if(!d){d="Unable to find ["+a+"] in the registry.";if(c)throw Error(d+" You must require or register a "+a+" plugin.");console.warn(d);return null}if(!b)return d;a=module$contents$Blockly$registry_nameMap[a];c=Object.create(null);b=Object.keys(d);for(var e=0;eb.oldScale&&(0,module$exports$Blockly$bumpObjects.bumpTopObjectsIntoBounds)(a)}}},module$contents$Blockly$bumpObjects_extractObjectFromEvent=function(a,b){var c=null;switch(b.type){case module$exports$Blockly$Events$utils.CREATE:case module$exports$Blockly$Events$utils.MOVE:(c=a.getBlockById(b.blockId))&&(c=c.getRootBlock());break;case module$exports$Blockly$Events$utils.COMMENT_CREATE:case module$exports$Blockly$Events$utils.COMMENT_MOVE:c= -a.getCommentById(b.commentId)}return c};module$exports$Blockly$bumpObjects.bumpTopObjectsIntoBounds=function(a){var b=a.getMetricsManager();if(b.hasFixedEdges()&&!a.isDragging()){b=b.getScrollMetrics(!0);for(var c=a.getTopBoundedElements(),d=0,e;e=c[d];d++)(0,module$exports$Blockly$bumpObjects.bumpIntoBounds)(a,b,e)}};var module$exports$Blockly$utils$Coordinate={Coordinate:function(a,b){this.x=a;this.y=b}};module$exports$Blockly$utils$Coordinate.Coordinate.prototype.clone=function(){return new module$exports$Blockly$utils$Coordinate.Coordinate(this.x,this.y)};module$exports$Blockly$utils$Coordinate.Coordinate.prototype.scale=function(a){this.x*=a;this.y*=a;return this};module$exports$Blockly$utils$Coordinate.Coordinate.prototype.translate=function(a,b){this.x+=a;this.y+=b;return this}; -module$exports$Blockly$utils$Coordinate.Coordinate.equals=function(a,b){return a===b?!0:a&&b?a.x===b.x&&a.y===b.y:!1};module$exports$Blockly$utils$Coordinate.Coordinate.distance=function(a,b){var c=a.x-b.x;a=a.y-b.y;return Math.sqrt(c*c+a*a)};module$exports$Blockly$utils$Coordinate.Coordinate.magnitude=function(a){return Math.sqrt(a.x*a.x+a.y*a.y)}; -module$exports$Blockly$utils$Coordinate.Coordinate.difference=function(a,b){return new module$exports$Blockly$utils$Coordinate.Coordinate(a.x-b.x,a.y-b.y)};module$exports$Blockly$utils$Coordinate.Coordinate.sum=function(a,b){return new module$exports$Blockly$utils$Coordinate.Coordinate(a.x+b.x,a.y+b.y)};var module$exports$Blockly$utils$Size={Size:function(a,b){this.width=a;this.height=b}};module$exports$Blockly$utils$Size.Size.equals=function(a,b){return a===b?!0:a&&b?a.width===b.width&&a.height===b.height:!1};var module$exports$Blockly$utils$style={getSize:function(a){if("none"!==module$contents$Blockly$utils$style_getStyle(a,"display"))return module$contents$Blockly$utils$style_getSizeWithDisplay(a);var b=a.style,c=b.display,d=b.visibility,e=b.position;b.visibility="hidden";b.position="absolute";b.display="inline";var f=a.offsetWidth;a=a.offsetHeight;b.display=c;b.position=e;b.visibility=d;return new module$exports$Blockly$utils$Size.Size(f,a)}},module$contents$Blockly$utils$style_getSizeWithDisplay= -function(a){return new module$exports$Blockly$utils$Size.Size(a.offsetWidth,a.offsetHeight)},module$contents$Blockly$utils$style_getStyle=function(a,b){return(0,module$exports$Blockly$utils$style.getComputedStyle)(a,b)||(0,module$exports$Blockly$utils$style.getCascadedStyle)(a,b)||a.style&&a.style[b]}; -module$exports$Blockly$utils$style.getComputedStyle=function(a,b){return document.defaultView&&document.defaultView.getComputedStyle&&(a=document.defaultView.getComputedStyle(a,null))?a[b]||a.getPropertyValue(b)||"":""};module$exports$Blockly$utils$style.getCascadedStyle=function(a,b){return a.currentStyle?a.currentStyle[b]:null}; -module$exports$Blockly$utils$style.getPageOffset=function(a){var b=new module$exports$Blockly$utils$Coordinate.Coordinate(0,0);a=a.getBoundingClientRect();var c=document.documentElement;c=new module$exports$Blockly$utils$Coordinate.Coordinate(window.pageXOffset||c.scrollLeft,window.pageYOffset||c.scrollTop);b.x=a.left+c.x;b.y=a.top+c.y;return b}; -module$exports$Blockly$utils$style.getViewportPageOffset=function(){var a=document.body,b=document.documentElement;return new module$exports$Blockly$utils$Coordinate.Coordinate(a.scrollLeft||b.scrollLeft,a.scrollTop||b.scrollTop)};module$exports$Blockly$utils$style.setElementShown=function(a,b){a.style.display=b?"":"none"};module$exports$Blockly$utils$style.isRightToLeft=function(a){return"rtl"===module$contents$Blockly$utils$style_getStyle(a,"direction")}; -module$exports$Blockly$utils$style.getBorderBox=function(a){var b=(0,module$exports$Blockly$utils$style.getComputedStyle)(a,"borderLeftWidth"),c=(0,module$exports$Blockly$utils$style.getComputedStyle)(a,"borderRightWidth"),d=(0,module$exports$Blockly$utils$style.getComputedStyle)(a,"borderTopWidth");a=(0,module$exports$Blockly$utils$style.getComputedStyle)(a,"borderBottomWidth");return{top:parseFloat(d),right:parseFloat(c),bottom:parseFloat(a),left:parseFloat(b)}}; -module$exports$Blockly$utils$style.scrollIntoContainerView=function(a,b,c){a=(0,module$exports$Blockly$utils$style.getContainerOffsetToScrollInto)(a,b,c);b.scrollLeft=a.x;b.scrollTop=a.y}; -module$exports$Blockly$utils$style.getContainerOffsetToScrollInto=function(a,b,c){var d=(0,module$exports$Blockly$utils$style.getPageOffset)(a),e=(0,module$exports$Blockly$utils$style.getPageOffset)(b),f=(0,module$exports$Blockly$utils$style.getBorderBox)(b),g=d.x-e.x-f.left;d=d.y-e.y-f.top;e=module$contents$Blockly$utils$style_getSizeWithDisplay(a);a=b.clientWidth-e.width;e=b.clientHeight-e.height;f=b.scrollLeft;b=b.scrollTop;c?(f+=g-a/2,b+=d-e/2):(f+=Math.min(g,Math.max(g-a,0)),b+=Math.min(d,Math.max(d- -e,0)));return new module$exports$Blockly$utils$Coordinate.Coordinate(f,b)};var module$exports$Blockly$utils$Rect={Rect:function(a,b,c,d){this.top=a;this.bottom=b;this.left=c;this.right=d}};module$exports$Blockly$utils$Rect.Rect.prototype.contains=function(a,b){return a>=this.left&&a<=this.right&&b>=this.top&&b<=this.bottom};module$exports$Blockly$utils$Rect.Rect.prototype.intersects=function(a){return!(this.left>a.right||this.righta.bottom||this.bottome.top?module$contents$Blockly$dropDownDiv_getPositionAboveMetrics(c,d,e,f):b+f.heightdocument.documentElement.clientTop?module$contents$Blockly$dropDownDiv_getPositionAboveMetrics(c,d,e,f):module$contents$Blockly$dropDownDiv_getPositionTopOfPageMetrics(a,e,f)}; -var module$contents$Blockly$dropDownDiv_getPositionBelowMetrics=function(a,b,c,d){a=(0,module$exports$Blockly$dropDownDiv.getPositionX)(a,c.left,c.right,d.width);return{initialX:a.divX,initialY:b,finalX:a.divX,finalY:b+module$exports$Blockly$dropDownDiv.PADDING_Y,arrowX:a.arrowX,arrowY:-(module$exports$Blockly$dropDownDiv.ARROW_SIZE/2+module$exports$Blockly$dropDownDiv.BORDER_SIZE),arrowAtTop:!0,arrowVisible:!0}},module$contents$Blockly$dropDownDiv_getPositionAboveMetrics=function(a,b,c,d){a=(0,module$exports$Blockly$dropDownDiv.getPositionX)(a, -c.left,c.right,d.width);return{initialX:a.divX,initialY:b-d.height,finalX:a.divX,finalY:b-d.height-module$exports$Blockly$dropDownDiv.PADDING_Y,arrowX:a.arrowX,arrowY:d.height-2*module$exports$Blockly$dropDownDiv.BORDER_SIZE-module$exports$Blockly$dropDownDiv.ARROW_SIZE/2,arrowAtTop:!1,arrowVisible:!0}},module$contents$Blockly$dropDownDiv_getPositionTopOfPageMetrics=function(a,b,c){a=(0,module$exports$Blockly$dropDownDiv.getPositionX)(a,b.left,b.right,c.width);return{initialX:a.divX,initialY:0,finalX:a.divX, -finalY:0,arrowAtTop:null,arrowX:null,arrowY:null,arrowVisible:!1}};module$exports$Blockly$dropDownDiv.getPositionX=function(a,b,c,d){b=(0,module$exports$Blockly$utils$math.clamp)(b,a-d/2,c-d);a=a-module$exports$Blockly$dropDownDiv.ARROW_SIZE/2-b;c=module$exports$Blockly$dropDownDiv.ARROW_HORIZONTAL_PADDING;a=(0,module$exports$Blockly$utils$math.clamp)(c,a,d-c-module$exports$Blockly$dropDownDiv.ARROW_SIZE);return{arrowX:a,divX:b}};module$exports$Blockly$dropDownDiv.isVisible=function(){return!!module$contents$Blockly$dropDownDiv_owner}; -module$exports$Blockly$dropDownDiv.hideIfOwner=function(a,b){return module$contents$Blockly$dropDownDiv_owner===a?(b?(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)():(0,module$exports$Blockly$dropDownDiv.hide)(),!0):!1}; -module$exports$Blockly$dropDownDiv.hide=function(){module$contents$Blockly$dropDownDiv_div.style.transform="translate(0, 0)";module$contents$Blockly$dropDownDiv_div.style.opacity=0;module$contents$Blockly$dropDownDiv_animateOutTimer=setTimeout(function(){(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)()},1E3*module$exports$Blockly$dropDownDiv.ANIMATION_TIME);module$contents$Blockly$dropDownDiv_onHide&&(module$contents$Blockly$dropDownDiv_onHide(),module$contents$Blockly$dropDownDiv_onHide= -null)}; -module$exports$Blockly$dropDownDiv.hideWithoutAnimation=function(){(0,module$exports$Blockly$dropDownDiv.isVisible)()&&(module$contents$Blockly$dropDownDiv_animateOutTimer&&clearTimeout(module$contents$Blockly$dropDownDiv_animateOutTimer),module$contents$Blockly$dropDownDiv_div.style.transform="",module$contents$Blockly$dropDownDiv_div.style.left="",module$contents$Blockly$dropDownDiv_div.style.top="",module$contents$Blockly$dropDownDiv_div.style.opacity=0,module$contents$Blockly$dropDownDiv_div.style.display="none", -module$contents$Blockly$dropDownDiv_div.style.backgroundColor="",module$contents$Blockly$dropDownDiv_div.style.borderColor="",module$contents$Blockly$dropDownDiv_onHide&&(module$contents$Blockly$dropDownDiv_onHide(),module$contents$Blockly$dropDownDiv_onHide=null),(0,module$exports$Blockly$dropDownDiv.clearContent)(),module$contents$Blockly$dropDownDiv_owner=null,module$contents$Blockly$dropDownDiv_renderedClassName&&((0,module$exports$Blockly$utils$dom.removeClass)(module$contents$Blockly$dropDownDiv_div, -module$contents$Blockly$dropDownDiv_renderedClassName),module$contents$Blockly$dropDownDiv_renderedClassName=""),module$contents$Blockly$dropDownDiv_themeClassName&&((0,module$exports$Blockly$utils$dom.removeClass)(module$contents$Blockly$dropDownDiv_div,module$contents$Blockly$dropDownDiv_themeClassName),module$contents$Blockly$dropDownDiv_themeClassName=""),(0,$.module$exports$Blockly$common.getMainWorkspace)().markFocused())}; -var module$contents$Blockly$dropDownDiv_positionInternal=function(a,b,c,d){a=module$exports$Blockly$dropDownDiv.TEST_ONLY.getPositionMetrics(a,b,c,d);a.arrowVisible?(module$contents$Blockly$dropDownDiv_arrow.style.display="",module$contents$Blockly$dropDownDiv_arrow.style.transform="translate("+a.arrowX+"px,"+a.arrowY+"px) rotate(45deg)",module$contents$Blockly$dropDownDiv_arrow.setAttribute("class",a.arrowAtTop?"blocklyDropDownArrow blocklyArrowTop":"blocklyDropDownArrow blocklyArrowBottom")):module$contents$Blockly$dropDownDiv_arrow.style.display= -"none";b=Math.floor(a.initialX);c=Math.floor(a.initialY);d=Math.floor(a.finalX);var e=Math.floor(a.finalY);module$contents$Blockly$dropDownDiv_div.style.left=b+"px";module$contents$Blockly$dropDownDiv_div.style.top=c+"px";module$contents$Blockly$dropDownDiv_div.style.display="block";module$contents$Blockly$dropDownDiv_div.style.opacity=1;module$contents$Blockly$dropDownDiv_div.style.transform="translate("+(d-b)+"px,"+(e-c)+"px)";return!!a.arrowAtTop}; -module$exports$Blockly$dropDownDiv.repositionForWindowResize=function(){if(module$contents$Blockly$dropDownDiv_owner){var a=module$contents$Blockly$dropDownDiv_owner,b=a.getSourceBlock();a=module$contents$Blockly$dropDownDiv_positionToField?module$contents$Blockly$dropDownDiv_getScaledBboxOfField(a):module$contents$Blockly$dropDownDiv_getScaledBboxOfBlock(b);b=a.left+(a.right-a.left)/2;module$contents$Blockly$dropDownDiv_positionInternal(b,a.bottom,b,a.top)}else(0,module$exports$Blockly$dropDownDiv.hide)()};var module$exports$Blockly$utils$svgMath={},module$contents$Blockly$utils$svgMath_XY_REGEX=/translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*)?/,module$contents$Blockly$utils$svgMath_XY_STYLE_REGEX=/transform:\s*translate(?:3d)?\(\s*([-+\d.e]+)\s*px([ ,]\s*([-+\d.e]+)\s*px)?/; -module$exports$Blockly$utils$svgMath.getRelativeXY=function(a){var b=new module$exports$Blockly$utils$Coordinate.Coordinate(0,0),c=a.getAttribute("x");c&&(b.x=parseInt(c,10));if(c=a.getAttribute("y"))b.y=parseInt(c,10);if(c=(c=a.getAttribute("transform"))&&c.match(module$contents$Blockly$utils$svgMath_XY_REGEX))b.x+=Number(c[1]),c[3]&&(b.y+=Number(c[3]));(a=a.getAttribute("style"))&&-1/g,"<$1$2>")};$.module$exports$Blockly$Xml.domToPrettyText=function(a){a=(0,$.module$exports$Blockly$Xml.domToText)(a).split("<");for(var b="",c=1;c"!==d.slice(-2)&&(b+=" ")}a=a.join("\n");a=a.replace(/(<(\w+)\b[^>]*>[^\n]*)\n *<\/\2>/g,"$1");return a.replace(/^\n/,"")}; -$.module$exports$Blockly$Xml.textToDom=function(a){var b=(0,$.module$exports$Blockly$utils$xml.textToDomDocument)(a);if(!b||!b.documentElement||b.getElementsByTagName("parsererror").length)throw Error("textToDom was unable to parse: "+a);return b.documentElement};$.module$exports$Blockly$Xml.clearWorkspaceAndLoadFromXml=function(a,b){b.setResizesEnabled(!1);b.clear();a=(0,$.module$exports$Blockly$Xml.domToWorkspace)(a,b);b.setResizesEnabled(!0);return a}; -$.module$exports$Blockly$Xml.domToWorkspace=function(a,b){if(a instanceof module$exports$Blockly$Workspace.Workspace){var c=a;a=b;b=c;console.warn("Deprecated call to domToWorkspace, swap the arguments.")}var d;b.RTL&&(d=b.getWidth());c=[];(0,module$exports$Blockly$utils$dom.startTextWidthCache)();var e=(0,module$exports$Blockly$Events$utils.getGroup)();e||(0,module$exports$Blockly$Events$utils.setGroup)(!0);b.setResizesEnabled&&b.setResizesEnabled(!1);var f=!0;try{for(var g=0,h=void 0;h=a.childNodes[g];g++){var k= -h.nodeName.toLowerCase(),l=h;if("block"===k||"shadow"===k&&!(0,module$exports$Blockly$Events$utils.getRecordUndo)()){var m=(0,$.module$exports$Blockly$Xml.domToBlock)(l,b);c.push(m.id);var n=l.hasAttribute("x")?parseInt(l.getAttribute("x"),10):10,p=l.hasAttribute("y")?parseInt(l.getAttribute("y"),10):10;isNaN(n)||isNaN(p)||m.moveBy(b.RTL?d-n:n,p);f=!1}else{if("shadow"===k)throw TypeError("Shadow block cannot be a top-level block.");if("comment"===k)if(b.rendered){var q=module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg; -q?q.fromXmlRendered(l,b,d):console.warn("Missing require for Blockly.WorkspaceCommentSvg, ignoring workspace comment.")}else{var r=module$exports$Blockly$WorkspaceComment.WorkspaceComment;r?r.fromXml(l,b):console.warn("Missing require for Blockly.WorkspaceComment, ignoring workspace comment.")}else if("variables"===k){if(f)(0,$.module$exports$Blockly$Xml.domToVariables)(l,b);else throw Error("'variables' tag must exist once before block and shadow tag elements in the workspace XML, but it was found in another location."); -f=!1}}}}finally{e||(0,module$exports$Blockly$Events$utils.setGroup)(!1),(0,module$exports$Blockly$utils$dom.stopTextWidthCache)()}b.setResizesEnabled&&b.setResizesEnabled(!0);(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.FINISHED_LOADING))(b));return c}; -$.module$exports$Blockly$Xml.appendDomToWorkspace=function(a,b){if(!b.getBlocksBoundingBox)return(0,$.module$exports$Blockly$Xml.domToWorkspace)(a,b);var c=b.getBlocksBoundingBox();a=(0,$.module$exports$Blockly$Xml.domToWorkspace)(a,b);if(c&&c.top!==c.bottom){var d=c.bottom;c=b.RTL?c.right:c.left;for(var e=Infinity,f=-Infinity,g=Infinity,h=0;hf&&(f=k.x)}d=d-g+10;c=b.RTL?c-f:c-e;for(e=0;e document.");}else a=null;return a};$.module$exports$Blockly$utils$object={inherits:function(a,b){a.superClass_=b.prototype;Object.setPrototypeOf(a,b);a.prototype=Object.create(b.prototype);a.prototype.constructor=a},mixin:function(a,b){for(var c in b)a[c]=b[c]},deepMerge:function(a,b){for(var c in b)a[c]=null!==b[c]&&"object"===typeof b[c]?(0,$.module$exports$Blockly$utils$object.deepMerge)(a[c]||Object.create(null),b[c]):b[c];return a},values:function(a){return Object.values?Object.values(a):Object.keys(a).map(function(b){return a[b]})}};var module$exports$Blockly$Theme={Theme:function(a,b,c,d){this.name=a;this.blockStyles=b||Object.create(null);this.categoryStyles=c||Object.create(null);this.componentStyles=d||Object.create(null);this.fontStyle=Object.create(null);this.startHats=null;(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.THEME,a,this)}};module$exports$Blockly$Theme.Theme.prototype.getClassName=function(){return this.name+"-theme"}; -module$exports$Blockly$Theme.Theme.prototype.setBlockStyle=function(a,b){this.blockStyles[a]=b};module$exports$Blockly$Theme.Theme.prototype.setCategoryStyle=function(a,b){this.categoryStyles[a]=b};module$exports$Blockly$Theme.Theme.prototype.getComponentStyle=function(a){return(a=this.componentStyles[a])&&"string"===typeof a&&this.getComponentStyle(a)?this.getComponentStyle(a):a?String(a):null};module$exports$Blockly$Theme.Theme.prototype.setComponentStyle=function(a,b){this.componentStyles[a]=b}; -module$exports$Blockly$Theme.Theme.prototype.setFontStyle=function(a){this.fontStyle=a};module$exports$Blockly$Theme.Theme.prototype.setStartHats=function(a){this.startHats=a}; -module$exports$Blockly$Theme.Theme.defineTheme=function(a,b){var c=new module$exports$Blockly$Theme.Theme(a),d=b.base;d&&("string"===typeof d&&(d=(0,module$exports$Blockly$registry.getObject)(module$exports$Blockly$registry.Type.THEME,d)),d instanceof module$exports$Blockly$Theme.Theme&&((0,$.module$exports$Blockly$utils$object.deepMerge)(c,d),c.name=a));(0,$.module$exports$Blockly$utils$object.deepMerge)(c.blockStyles,b.blockStyles);(0,$.module$exports$Blockly$utils$object.deepMerge)(c.categoryStyles, -b.categoryStyles);(0,$.module$exports$Blockly$utils$object.deepMerge)(c.componentStyles,b.componentStyles);(0,$.module$exports$Blockly$utils$object.deepMerge)(c.fontStyle,b.fontStyle);null!==b.startHats&&(c.startHats=b.startHats);return c};var module$exports$Blockly$Themes$Classic={},module$contents$Blockly$Themes$Classic_defaultBlockStyles={colour_blocks:{colourPrimary:"20"},list_blocks:{colourPrimary:"260"},logic_blocks:{colourPrimary:"210"},loop_blocks:{colourPrimary:"120"},math_blocks:{colourPrimary:"230"},procedure_blocks:{colourPrimary:"290"},text_blocks:{colourPrimary:"160"},variable_blocks:{colourPrimary:"330"},variable_dynamic_blocks:{colourPrimary:"310"},hat_blocks:{colourPrimary:"330",hat:"cap"}},module$contents$Blockly$Themes$Classic_categoryStyles= -{colour_category:{colour:"20"},list_category:{colour:"260"},logic_category:{colour:"210"},loop_category:{colour:"120"},math_category:{colour:"230"},procedure_category:{colour:"290"},text_category:{colour:"160"},variable_category:{colour:"330"},variable_dynamic_category:{colour:"310"}};module$exports$Blockly$Themes$Classic.Classic=new module$exports$Blockly$Theme.Theme("classic",module$contents$Blockly$Themes$Classic_defaultBlockStyles,module$contents$Blockly$Themes$Classic_categoryStyles);var module$exports$Blockly$Options={Options:function(a){var b=null,c=!1,d=!1,e=!1,f=!1,g=!1,h=!1,k=!!a.readOnly;k||(b=(0,module$exports$Blockly$utils$toolbox.convertToolboxDefToJson)(a.toolbox),c=(0,module$exports$Blockly$utils$toolbox.hasCategories)(b),d=a.trashcan,void 0===d&&(d=c),e=a.collapse,void 0===e&&(e=c),f=a.comments,void 0===f&&(f=c),g=a.disable,void 0===g&&(g=c),h=a.sounds,void 0===h&&(h=!0));var l=a.maxTrashcanContents;d?void 0===l&&(l=32):l=0;var m=!!a.rtl,n=a.horizontalLayout;void 0=== -n&&(n=!1);var p=a.toolboxPosition;p="end"!==p;p=n?p?module$exports$Blockly$utils$toolbox.Position.TOP:module$exports$Blockly$utils$toolbox.Position.BOTTOM:p===m?module$exports$Blockly$utils$toolbox.Position.RIGHT:module$exports$Blockly$utils$toolbox.Position.LEFT;var q=a.css;void 0===q&&(q=!0);var r="https://blockly-demo.appspot.com/static/media/";a.media?r=a.media:a.path&&(r=a.path+"media/");var t=void 0===a.oneBasedIndex?!0:!!a.oneBasedIndex;var u=a.renderer||"geras",v=a.plugins||{};this.RTL=m; -this.oneBasedIndex=t;this.collapse=e;this.comments=f;this.disable=g;this.readOnly=k;this.maxBlocks=a.maxBlocks||Infinity;this.maxInstances=a.maxInstances;this.pathToMedia=r;this.hasCategories=c;this.moveOptions=module$exports$Blockly$Options.Options.parseMoveOptions_(a,c);this.hasScrollbars=!!this.moveOptions.scrollbars;this.hasTrashcan=d;this.maxTrashcanContents=l;this.hasSounds=h;this.hasCss=q;this.horizontalLayout=n;this.languageTree=b;this.gridOptions=module$exports$Blockly$Options.Options.parseGridOptions_(a); -this.zoomOptions=module$exports$Blockly$Options.Options.parseZoomOptions_(a);this.toolboxPosition=p;this.theme=module$exports$Blockly$Options.Options.parseThemeOptions_(a);this.renderer=u;this.rendererOverrides=a.rendererOverrides;this.gridPattern=null;this.parentWorkspace=a.parentWorkspace;this.plugins=v;this.getMetrics=this.setMetrics=void 0}}; -module$exports$Blockly$Options.Options.parseMoveOptions_=function(a,b){var c=a.move||{},d={};void 0===c.scrollbars&&void 0===a.scrollbars?d.scrollbars=b:"object"===typeof c.scrollbars?(d.scrollbars={},d.scrollbars.horizontal=!!c.scrollbars.horizontal,d.scrollbars.vertical=!!c.scrollbars.vertical,d.scrollbars.horizontal&&d.scrollbars.vertical?d.scrollbars=!0:d.scrollbars.horizontal||d.scrollbars.vertical||(d.scrollbars=!1)):d.scrollbars=!!c.scrollbars||!!a.scrollbars;d.wheel=d.scrollbars&&void 0!== -c.wheel?!!c.wheel:"object"===typeof d.scrollbars;d.drag=d.scrollbars?void 0===c.drag?!0:!!c.drag:!1;return d}; -module$exports$Blockly$Options.Options.parseZoomOptions_=function(a){a=a.zoom||{};var b={};b.controls=void 0===a.controls?!1:!!a.controls;b.wheel=void 0===a.wheel?!1:!!a.wheel;b.startScale=void 0===a.startScale?1:Number(a.startScale);b.maxScale=void 0===a.maxScale?3:Number(a.maxScale);b.minScale=void 0===a.minScale?.3:Number(a.minScale);b.scaleSpeed=void 0===a.scaleSpeed?1.2:Number(a.scaleSpeed);b.pinch=void 0===a.pinch?b.wheel||b.controls:!!a.pinch;return b}; -module$exports$Blockly$Options.Options.parseGridOptions_=function(a){a=a.grid||{};var b={};b.spacing=Number(a.spacing)||0;b.colour=a.colour||"#888";b.length=void 0===a.length?1:Number(a.length);b.snap=0=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_)};module$exports$Blockly$Scrollbar.Scrollbar.prototype.setHandleLength_=function(a){this.handleLength_=a;this.svgHandle_.setAttribute(this.lengthAttribute_,this.handleLength_)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.constrainHandlePosition_=function(a){return a=0>=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_-this.handleLength_)};module$exports$Blockly$Scrollbar.Scrollbar.prototype.setHandlePosition=function(a){this.handlePosition_=a;this.svgHandle_.setAttribute(this.positionAttribute_,this.handlePosition_)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.setScrollbarLength_=function(a){this.scrollbarLength_=a;this.outerSvg_.setAttribute(this.lengthAttribute_,this.scrollbarLength_);this.svgBackground_.setAttribute(this.lengthAttribute_,this.scrollbarLength_)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.setPosition=function(a,b){this.position.x=a;this.position.y=b;(0,module$exports$Blockly$utils$dom.setCssTransform)(this.outerSvg_,"translate("+(this.position.x+this.origin_.x)+"px,"+(this.position.y+this.origin_.y)+"px)")}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.resize=function(a){if(!a&&(a=this.workspace_.getMetrics(),!a))return;this.oldHostMetrics_&&module$exports$Blockly$Scrollbar.Scrollbar.metricsAreEquivalent_(a,this.oldHostMetrics_)||(this.horizontal_?this.resizeHorizontal_(a):this.resizeVertical_(a),this.oldHostMetrics_=a,this.updateMetrics_())}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.requiresViewResize_=function(a){return this.oldHostMetrics_?this.oldHostMetrics_.viewWidth!==a.viewWidth||this.oldHostMetrics_.viewHeight!==a.viewHeight||this.oldHostMetrics_.absoluteLeft!==a.absoluteLeft||this.oldHostMetrics_.absoluteTop!==a.absoluteTop:!0};module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeHorizontal_=function(a){this.requiresViewResize_(a)?this.resizeViewHorizontal(a):this.resizeContentHorizontal(a)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeViewHorizontal=function(a){var b=a.viewWidth-2*this.margin_;this.pair_&&(b-=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));b=a.absoluteLeft+this.margin_;this.pair_&&this.workspace_.RTL&&(b+=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness);this.setPosition(b,a.absoluteTop+a.viewHeight-module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness-this.margin_);this.resizeContentHorizontal(a)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeContentHorizontal=function(a){if(a.viewWidth>=a.scrollWidth)this.setHandleLength_(this.scrollbarLength_),this.setHandlePosition(0),this.pair_||this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewWidth/a.scrollWidth;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollWidth-a.viewWidth;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewLeft-a.scrollLeft)/b*c;a=this.constrainHandlePosition_(a); -this.setHandlePosition(a);this.ratio=c/b}};module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeVertical_=function(a){this.requiresViewResize_(a)?this.resizeViewVertical(a):this.resizeContentVertical(a)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeViewVertical=function(a){var b=a.viewHeight-2*this.margin_;this.pair_&&(b-=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));this.setPosition(this.workspace_.RTL?a.absoluteLeft+this.margin_:a.absoluteLeft+a.viewWidth-module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness-this.margin_,a.absoluteTop+this.margin_);this.resizeContentVertical(a)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.resizeContentVertical=function(a){if(a.viewHeight>=a.scrollHeight)this.setHandleLength_(this.scrollbarLength_),this.setHandlePosition(0),this.pair_||this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewHeight/a.scrollHeight;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollHeight-a.viewHeight;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewTop-a.scrollTop)/b*c;a=this.constrainHandlePosition_(a); -this.setHandlePosition(a);this.ratio=c/b}}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.createDom_=function(a){var b="blocklyScrollbar"+(this.horizontal_?"Horizontal":"Vertical");a&&(b+=" "+a);this.outerSvg_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.SVG,{"class":b},null);this.svgGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{},this.outerSvg_);this.svgBackground_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyScrollbarBackground"}, -this.svgGroup_);a=Math.floor((module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness-5)/2);this.svgHandle_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyScrollbarHandle",rx:a,ry:a},this.svgGroup_);this.workspace_.getThemeManager().subscribe(this.svgHandle_,"scrollbarColour","fill");this.workspace_.getThemeManager().subscribe(this.svgHandle_,"scrollbarOpacity","fill-opacity");(0,module$exports$Blockly$utils$dom.insertAfter)(this.outerSvg_, -this.workspace_.getParentSvg())};module$exports$Blockly$Scrollbar.Scrollbar.prototype.isVisible=function(){return this.isVisible_};module$exports$Blockly$Scrollbar.Scrollbar.prototype.setContainerVisible=function(a){var b=a!==this.containerVisible_;this.containerVisible_=a;b&&this.updateDisplay_()}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.setVisible=function(a){var b=a!==this.isVisible();if(this.pair_)throw Error("Unable to toggle visibility of paired scrollbars.");this.isVisible_=a;b&&this.updateDisplay_()};module$exports$Blockly$Scrollbar.Scrollbar.prototype.updateDisplay_=function(){this.containerVisible_&&this.isVisible()?this.outerSvg_.setAttribute("display","block"):this.outerSvg_.setAttribute("display","none")}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.onMouseDownBar_=function(a){this.workspace_.markFocused();(0,module$exports$Blockly$Touch.clearTouchIdentifier)();this.cleanUp_();if((0,module$exports$Blockly$browserEvents.isRightButton)(a))a.stopPropagation();else{var b=(0,module$exports$Blockly$browserEvents.mouseToSvg)(a,this.workspace_.getParentSvg(),this.workspace_.getInverseScreenCTM());b=this.horizontal_?b.x:b.y;var c=(0,module$exports$Blockly$utils$svgMath.getInjectionDivXY)(this.svgHandle_); -c=this.horizontal_?c.x:c.y;var d=this.handlePosition_,e=.95*this.handleLength_;b<=c?d-=e:b>=c+this.handleLength_&&(d+=e);this.setHandlePosition(this.constrainHandlePosition_(d));this.updateMetrics_();a.stopPropagation();a.preventDefault()}}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.onMouseDownHandle_=function(a){this.workspace_.markFocused();this.cleanUp_();(0,module$exports$Blockly$browserEvents.isRightButton)(a)?a.stopPropagation():(this.startDragHandle=this.handlePosition_,this.workspace_.setupDragSurface(),this.startDragMouse_=this.horizontal_?a.clientX:a.clientY,module$exports$Blockly$Scrollbar.Scrollbar.onMouseUpWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document,"mouseup",this,this.onMouseUpHandle_), -module$exports$Blockly$Scrollbar.Scrollbar.onMouseMoveWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document,"mousemove",this,this.onMouseMoveHandle_),a.stopPropagation(),a.preventDefault())};module$exports$Blockly$Scrollbar.Scrollbar.prototype.onMouseMoveHandle_=function(a){this.setHandlePosition(this.constrainHandlePosition_(this.startDragHandle+((this.horizontal_?a.clientX:a.clientY)-this.startDragMouse_)));this.updateMetrics_()}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.onMouseUpHandle_=function(){this.workspace_.resetDragSurface();(0,module$exports$Blockly$Touch.clearTouchIdentifier)();this.cleanUp_()}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.cleanUp_=function(){this.workspace_.hideChaff(!0);module$exports$Blockly$Scrollbar.Scrollbar.onMouseUpWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(module$exports$Blockly$Scrollbar.Scrollbar.onMouseUpWrapper_),module$exports$Blockly$Scrollbar.Scrollbar.onMouseUpWrapper_=null);module$exports$Blockly$Scrollbar.Scrollbar.onMouseMoveWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(module$exports$Blockly$Scrollbar.Scrollbar.onMouseMoveWrapper_), -module$exports$Blockly$Scrollbar.Scrollbar.onMouseMoveWrapper_=null)};module$exports$Blockly$Scrollbar.Scrollbar.prototype.getRatio_=function(){var a=this.handlePosition_/(this.scrollbarLength_-this.handleLength_);isNaN(a)&&(a=0);return a};module$exports$Blockly$Scrollbar.Scrollbar.prototype.updateMetrics_=function(){var a=this.getRatio_(),b={};this.horizontal_?b.x=a:b.y=a;this.workspace_.setMetrics(b)}; -module$exports$Blockly$Scrollbar.Scrollbar.prototype.set=function(a,b){this.setHandlePosition(this.constrainHandlePosition_(a*this.ratio));(b||void 0===b)&&this.updateMetrics_()};module$exports$Blockly$Scrollbar.Scrollbar.prototype.setOrigin=function(a,b){this.origin_=new module$exports$Blockly$utils$Coordinate.Coordinate(a,b)}; -module$exports$Blockly$Scrollbar.Scrollbar.metricsAreEquivalent_=function(a,b){return a.viewWidth===b.viewWidth&&a.viewHeight===b.viewHeight&&a.viewLeft===b.viewLeft&&a.viewTop===b.viewTop&&a.absoluteTop===b.absoluteTop&&a.absoluteLeft===b.absoluteLeft&&a.scrollWidth===b.scrollWidth&&a.scrollHeight===b.scrollHeight&&a.scrollLeft===b.scrollLeft&&a.scrollTop===b.scrollTop};module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness=15; -module$exports$Blockly$Touch.TOUCH_ENABLED&&(module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness=25);module$exports$Blockly$Scrollbar.Scrollbar.DEFAULT_SCROLLBAR_MARGIN=.5;var module$exports$Blockly$ScrollbarPair={ScrollbarPair:function(a,b,c,d,e){this.workspace_=a;b=void 0===b?!0:b;c=void 0===c?!0:c;var f=b&&c;b&&(this.hScroll=new module$exports$Blockly$Scrollbar.Scrollbar(a,!0,f,d,e));c&&(this.vScroll=new module$exports$Blockly$Scrollbar.Scrollbar(a,!1,f,d,e));f&&(this.corner_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{height:module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness,width:module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness, -"class":"blocklyScrollbarBackground"},null),(0,module$exports$Blockly$utils$dom.insertAfter)(this.corner_,a.getBubbleCanvas()));this.oldHostMetrics_=null}};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.dispose=function(){(0,module$exports$Blockly$utils$dom.removeNode)(this.corner_);this.oldHostMetrics_=this.workspace_=this.corner_=null;this.hScroll&&(this.hScroll.dispose(),this.hScroll=null);this.vScroll&&(this.vScroll.dispose(),this.vScroll=null)}; -module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.resize=function(){var a=this.workspace_.getMetrics();if(a){var b=!1,c=!1;this.oldHostMetrics_&&this.oldHostMetrics_.viewWidth===a.viewWidth&&this.oldHostMetrics_.viewHeight===a.viewHeight&&this.oldHostMetrics_.absoluteTop===a.absoluteTop&&this.oldHostMetrics_.absoluteLeft===a.absoluteLeft?(this.oldHostMetrics_&&this.oldHostMetrics_.scrollWidth===a.scrollWidth&&this.oldHostMetrics_.viewLeft===a.viewLeft&&this.oldHostMetrics_.scrollLeft=== -a.scrollLeft||(b=!0),this.oldHostMetrics_&&this.oldHostMetrics_.scrollHeight===a.scrollHeight&&this.oldHostMetrics_.viewTop===a.viewTop&&this.oldHostMetrics_.scrollTop===a.scrollTop||(c=!0)):c=b=!0;if(b||c){try{(0,module$exports$Blockly$Events$utils.disable)(),this.hScroll&&b&&this.hScroll.resize(a),this.vScroll&&c&&this.vScroll.resize(a)}finally{(0,module$exports$Blockly$Events$utils.enable)()}this.workspace_.maybeFireViewportChangeEvent()}this.hScroll&&this.vScroll&&(this.oldHostMetrics_&&this.oldHostMetrics_.viewWidth=== -a.viewWidth&&this.oldHostMetrics_.absoluteLeft===a.absoluteLeft||this.corner_.setAttribute("x",this.vScroll.position.x),this.oldHostMetrics_&&this.oldHostMetrics_.viewHeight===a.viewHeight&&this.oldHostMetrics_.absoluteTop===a.absoluteTop||this.corner_.setAttribute("y",this.hScroll.position.y));this.oldHostMetrics_=a}};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.canScrollHorizontally=function(){return!!this.hScroll}; -module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.canScrollVertically=function(){return!!this.vScroll};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.setOrigin=function(a,b){this.hScroll&&this.hScroll.setOrigin(a,b);this.vScroll&&this.vScroll.setOrigin(a,b)}; -module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.set=function(a,b,c){this.hScroll&&this.hScroll.set(a,!1);this.vScroll&&this.vScroll.set(b,!1);if(c||void 0===c)a={},this.hScroll&&(a.x=this.hScroll.getRatio_()),this.vScroll&&(a.y=this.vScroll.getRatio_()),this.workspace_.setMetrics(a)};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.setX=function(a){this.hScroll&&this.hScroll.set(a,!0)}; -module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.setY=function(a){this.vScroll&&this.vScroll.set(a,!0)};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.setContainerVisible=function(a){this.hScroll&&this.hScroll.setContainerVisible(a);this.vScroll&&this.vScroll.setContainerVisible(a)};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.isVisible=function(){var a=!1;this.hScroll&&(a=this.hScroll.isVisible());this.vScroll&&(a=a||this.vScroll.isVisible());return a}; -module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.resizeContent=function(a){this.hScroll&&this.hScroll.resizeContentHorizontal(a);this.vScroll&&this.vScroll.resizeContentVertical(a)};module$exports$Blockly$ScrollbarPair.ScrollbarPair.prototype.resizeView=function(a){this.hScroll&&this.hScroll.resizeViewHorizontal(a);this.vScroll&&this.vScroll.resizeViewVertical(a)};var module$exports$Blockly$utils$KeyCodes={KeyCodes:{WIN_KEY_FF_LINUX:0,MAC_ENTER:3,BACKSPACE:8,TAB:9,NUM_CENTER:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,PAUSE:19,CAPS_LOCK:20,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,PLUS_SIGN:43,PRINT_SCREEN:44,INSERT:45,DELETE:46,ZERO:48,ONE:49,TWO:50,THREE:51,FOUR:52,FIVE:53,SIX:54,SEVEN:55,EIGHT:56,NINE:57,FF_SEMICOLON:59,FF_EQUALS:61,FF_DASH:173,FF_HASH:163,QUESTION_MARK:63,AT_SIGN:64,A:65,B:66,C:67,D:68,E:69,F:70,G:71, -H:72,I:73,J:74,K:75,L:76,M:77,N:78,O:79,P:80,Q:81,R:82,S:83,T:84,U:85,V:86,W:87,X:88,Y:89,Z:90,META:91,WIN_KEY_RIGHT:92,CONTEXT_MENU:93,NUM_ZERO:96,NUM_ONE:97,NUM_TWO:98,NUM_THREE:99,NUM_FOUR:100,NUM_FIVE:101,NUM_SIX:102,NUM_SEVEN:103,NUM_EIGHT:104,NUM_NINE:105,NUM_MULTIPLY:106,NUM_PLUS:107,NUM_MINUS:109,NUM_PERIOD:110,NUM_DIVISION:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,NUMLOCK:144,SCROLL_LOCK:145,FIRST_MEDIA_KEY:166,LAST_MEDIA_KEY:183,SEMICOLON:186, -DASH:189,EQUALS:187,COMMA:188,PERIOD:190,SLASH:191,APOSTROPHE:192,TILDE:192,SINGLE_QUOTE:222,OPEN_SQUARE_BRACKET:219,BACKSLASH:220,CLOSE_SQUARE_BRACKET:221,WIN_KEY:224,MAC_FF_META:224,MAC_WK_CMD_LEFT:91,MAC_WK_CMD_RIGHT:93,WIN_IME:229,VK_NONAME:252,PHANTOM:255}};var module$exports$Blockly$ShortcutRegistry={ShortcutRegistry:function(){this.reset()}};module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.reset=function(){this.registry_=Object.create(null);this.keyMap_=Object.create(null)};module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.register=function(a,b){if(this.registry_[a.name]&&!b)throw Error('Shortcut with name "'+a.name+'" already exists.');this.registry_[a.name]=a}; -module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.unregister=function(a){if(!this.registry_[a])return console.warn('Keyboard shortcut with name "'+a+'" not found.'),!1;this.removeAllKeyMappings(a);delete this.registry_[a];return!0}; -module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.addKeyMapping=function(a,b,c){a=String(a);var d=this.keyMap_[a];if(d&&!c)throw Error('Shortcut with name "'+b+'" collides with shortcuts '+d.toString());d&&c?d.unshift(b):this.keyMap_[a]=[b]}; -module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.removeKeyMapping=function(a,b,c){var d=this.keyMap_[a];if(!d&&!c)return console.warn('No keyboard shortcut with name "'+b+'" registered with key code "'+a+'"'),!1;var e=d.indexOf(b);if(-1b.indexOf(d))throw Error(d+" is not a valid modifier key.");}; -module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.prototype.createSerializedKey=function(a,b){var c="";if(b){this.checkModifiers_(b);for(var d in module$exports$Blockly$ShortcutRegistry.ShortcutRegistry.modifierKeys)-1a?this.menuItems_.length:a,-1)};module$exports$Blockly$Menu.Menu.prototype.highlightFirst_=function(){this.highlightHelper_(-1,1)}; -module$exports$Blockly$Menu.Menu.prototype.highlightLast_=function(){this.highlightHelper_(this.menuItems_.length,-1)};module$exports$Blockly$Menu.Menu.prototype.highlightHelper_=function(a,b){a+=b;for(var c;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}};module$exports$Blockly$Menu.Menu.prototype.handleMouseOver_=function(a){(a=this.getMenuItem_(a.target))&&(a.isEnabled()?this.highlightedItem_!==a&&this.setHighlighted(a):this.setHighlighted(null))}; -module$exports$Blockly$Menu.Menu.prototype.handleClick_=function(a){var b=this.openingCoords;this.openingCoords=null;if(b&&"number"===typeof a.clientX){var c=new module$exports$Blockly$utils$Coordinate.Coordinate(a.clientX,a.clientY);if(1>module$exports$Blockly$utils$Coordinate.Coordinate.distance(b,c))return}(a=this.getMenuItem_(a.target))&&a.performAction()};module$exports$Blockly$Menu.Menu.prototype.handleMouseEnter_=function(a){this.focus()}; -module$exports$Blockly$Menu.Menu.prototype.handleMouseLeave_=function(a){this.getElement()&&(this.blur_(),this.setHighlighted(null))}; -module$exports$Blockly$Menu.Menu.prototype.handleKeyEvent_=function(a){if(this.menuItems_.length&&!(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)){var b=this.highlightedItem_;switch(a.keyCode){case module$exports$Blockly$utils$KeyCodes.KeyCodes.ENTER:case module$exports$Blockly$utils$KeyCodes.KeyCodes.SPACE:b&&b.performAction();break;case module$exports$Blockly$utils$KeyCodes.KeyCodes.UP:this.highlightPrevious();break;case module$exports$Blockly$utils$KeyCodes.KeyCodes.DOWN:this.highlightNext();break; -case module$exports$Blockly$utils$KeyCodes.KeyCodes.PAGE_UP:case module$exports$Blockly$utils$KeyCodes.KeyCodes.HOME:this.highlightFirst_();break;case module$exports$Blockly$utils$KeyCodes.KeyCodes.PAGE_DOWN:case module$exports$Blockly$utils$KeyCodes.KeyCodes.END:this.highlightLast_();break;default:return}a.preventDefault();a.stopPropagation()}}; -module$exports$Blockly$Menu.Menu.prototype.getSize=function(){var a=this.getElement(),b=(0,module$exports$Blockly$utils$style.getSize)(a);b.height=a.scrollHeight;return b};var module$exports$Blockly$serialization$priorities={VARIABLES:100,BLOCKS:50};var module$exports$Blockly$serialization$registry={register:function(a,b){(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.SERIALIZER,a,b)},unregister:function(a){(0,module$exports$Blockly$registry.unregister)(module$exports$Blockly$registry.Type.SERIALIZER,a)}};var module$exports$Blockly$serialization$exceptions={DeserializationError:function(){var a=Error.apply(this,arguments);this.message=a.message;"stack"in a&&(this.stack=a.stack)}};$.$jscomp.inherits(module$exports$Blockly$serialization$exceptions.DeserializationError,Error); -module$exports$Blockly$serialization$exceptions.MissingBlockType=function(a){module$exports$Blockly$serialization$exceptions.DeserializationError.call(this,"Expected to find a 'type' property, defining the block type");this.state=a};$.$jscomp.inherits(module$exports$Blockly$serialization$exceptions.MissingBlockType,module$exports$Blockly$serialization$exceptions.DeserializationError); -module$exports$Blockly$serialization$exceptions.MissingConnection=function(a,b,c){module$exports$Blockly$serialization$exceptions.DeserializationError.call(this,"The block "+b.toDevString()+" is missing a(n) "+a+"\nconnection");this.block=b;this.state=c};$.$jscomp.inherits(module$exports$Blockly$serialization$exceptions.MissingConnection,module$exports$Blockly$serialization$exceptions.DeserializationError); -module$exports$Blockly$serialization$exceptions.BadConnectionCheck=function(a,b,c,d){module$exports$Blockly$serialization$exceptions.DeserializationError.call(this,"The block "+c.toDevString()+" could not connect its\n"+b+" to its parent, because: "+a);this.childBlock=c;this.childState=d};$.$jscomp.inherits(module$exports$Blockly$serialization$exceptions.BadConnectionCheck,module$exports$Blockly$serialization$exceptions.DeserializationError); -module$exports$Blockly$serialization$exceptions.RealChildOfShadow=function(a){module$exports$Blockly$serialization$exceptions.DeserializationError.call(this,"Encountered a real block which is defined as a child of a shadow\nblock. It is an invariant of Blockly that shadow blocks only have shadow\nchildren");this.state=a};$.$jscomp.inherits(module$exports$Blockly$serialization$exceptions.RealChildOfShadow,module$exports$Blockly$serialization$exceptions.DeserializationError);var module$exports$Blockly$serialization$ISerializer={ISerializer:function(){}};module$exports$Blockly$serialization$ISerializer.ISerializer.prototype.save=function(a){};module$exports$Blockly$serialization$ISerializer.ISerializer.prototype.load=function(a,b){};module$exports$Blockly$serialization$ISerializer.ISerializer.prototype.clear=function(a){};var module$exports$Blockly$serialization$blocks={save:function(a,b){var c=void 0===b?{}:b;b=void 0===c.addCoordinates?!1:c.addCoordinates;var d=void 0===c.addInputBlocks?!0:c.addInputBlocks,e=void 0===c.addNextBlocks?!0:c.addNextBlocks;c=void 0===c.doFullSerialization?!0:c.doFullSerialization;if(a.isInsertionMarker())return null;var f={type:a.type,id:a.id};b&&module$contents$Blockly$serialization$blocks_saveCoords(a,f);module$contents$Blockly$serialization$blocks_saveAttributes(a,f);module$contents$Blockly$serialization$blocks_saveExtraState(a, -f);module$contents$Blockly$serialization$blocks_saveIcons(a,f);module$contents$Blockly$serialization$blocks_saveFields(a,f,c);d&&module$contents$Blockly$serialization$blocks_saveInputBlocks(a,f,c);e&&module$contents$Blockly$serialization$blocks_saveNextBlocks(a,f,c);return f}},module$contents$Blockly$serialization$blocks_saveAttributes=function(a,b){a.isCollapsed()&&(b.collapsed=!0);a.isEnabled()||(b.enabled=!1);void 0!==a.inputsInline&&a.inputsInline!==a.inputsInlineDefault&&(b.inline=a.inputsInline); -a.data&&(b.data=a.data)},module$contents$Blockly$serialization$blocks_saveCoords=function(a,b){var c=a.workspace;a=a.getRelativeToSurfaceXY();b.x=Math.round(c.RTL?c.getWidth()-a.x:a.x);b.y=Math.round(a.y)},module$contents$Blockly$serialization$blocks_saveExtraState=function(a,b){a.saveExtraState?(a=a.saveExtraState(),null!==a&&(b.extraState=a)):a.mutationToDom&&(a=a.mutationToDom(),null!==a&&(b.extraState=(0,$.module$exports$Blockly$Xml.domToText)(a).replace(' xmlns="https://developers.google.com/blockly/xml"', -"")))},module$contents$Blockly$serialization$blocks_saveIcons=function(a,b){a.getCommentText()&&(b.icons={comment:{text:a.getCommentText(),pinned:a.commentModel.pinned,height:Math.round(a.commentModel.size.height),width:Math.round(a.commentModel.size.width)}})},module$contents$Blockly$serialization$blocks_saveFields=function(a,b,c){for(var d=Object.create(null),e=0;ea&&0<=b&&256>b&&0<=c&&256>c)? -(0,module$exports$Blockly$utils$colour.rgbToHex)(a,b,c):null};module$exports$Blockly$utils$colour.rgbToHex=function(a,b,c){b=a<<16|b<<8|c;return 16>a?"#"+(16777216|b).toString(16).substr(1):"#"+b.toString(16)};module$exports$Blockly$utils$colour.hexToRgb=function(a){a=(0,module$exports$Blockly$utils$colour.parse)(a);if(!a)return[0,0,0];a=parseInt(a.substr(1),16);return[a>>16,a>>8&255,a&255]}; -module$exports$Blockly$utils$colour.hsvToHex=function(a,b,c){var d=0,e=0,f=0;if(0===b)f=e=d=c;else{var g=Math.floor(a/60),h=a/60-g;a=c*(1-b);var k=c*(1-b*h);b=c*(1-b*(1-h));switch(g){case 1:d=k;e=c;f=a;break;case 2:d=a;e=c;f=b;break;case 3:d=a;e=k;f=c;break;case 4:d=b;e=a;f=c;break;case 5:d=c;e=a;f=k;break;case 6:case 0:d=c,e=b,f=a}}return(0,module$exports$Blockly$utils$colour.rgbToHex)(Math.floor(d),Math.floor(e),Math.floor(f))}; -module$exports$Blockly$utils$colour.blend=function(a,b,c){a=(0,module$exports$Blockly$utils$colour.parse)(a);if(!a)return null;b=(0,module$exports$Blockly$utils$colour.parse)(b);if(!b)return null;a=(0,module$exports$Blockly$utils$colour.hexToRgb)(a);b=(0,module$exports$Blockly$utils$colour.hexToRgb)(b);return(0,module$exports$Blockly$utils$colour.rgbToHex)(Math.round(b[0]+c*(a[0]-b[0])),Math.round(b[1]+c*(a[1]-b[1])),Math.round(b[2]+c*(a[2]-b[2])))}; -module$exports$Blockly$utils$colour.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"};module$exports$Blockly$utils$colour.hueToHex=function(a){return(0,module$exports$Blockly$utils$colour.hsvToHex)(a,module$contents$Blockly$utils$colour_hsvSaturation,255*module$contents$Blockly$utils$colour_hsvValue)};var module$exports$Blockly$utils$svgPaths={point:function(a,b){return" "+a+","+b+" "},curve:function(a,b){return" "+a+b.join("")},moveTo:function(a,b){return" M "+a+","+b+" "},moveBy:function(a,b){return" m "+a+","+b+" "},lineTo:function(a,b){return" l "+a+","+b+" "},line:function(a){return" l"+a.join("")},lineOnAxis:function(a,b){return" "+a+" "+b+" "},arc:function(a,b,c,d){return a+" "+c+" "+c+" "+b+d}};var module$exports$Blockly$utils$parsing={},module$contents$Blockly$utils$parsing_tokenizeInterpolationInternal=function(a,b){var c=[],d=a.split("");d.push("");var e=0;a=[];for(var f=null,g=0;g=h?(e=2,f=h,(h=a.join(""))&&c.push(h),a.length=0):"{"===h?e=3:(a.push("%",h),e=0):2===e?"0"<=h&&"9">=h?f+=h:(c.push(parseInt(f,10)),g--,e=0):3===e&&(""===h?(a.splice(0,0, -"%{"),g--,e=0):"}"!==h?a.push(h):(e=a.join(""),/[A-Z]\w*/i.test(e)?(h=e.toUpperCase(),(h=(0,$.module$exports$Blockly$utils$string.startsWith)(h,"BKY_")?h.substring(4):null)&&h in $.module$exports$Blockly$Msg.Msg?(e=$.module$exports$Blockly$Msg.Msg[h],"string"===typeof e?Array.prototype.push.apply(c,module$contents$Blockly$utils$parsing_tokenizeInterpolationInternal(e,b)):b?c.push(String(e)):c.push(e)):c.push("%{"+e+"}")):c.push("%{"+e+"}"),e=a.length=0))}(b=a.join(""))&&c.push(b);d=[];for(f=a.length= -0;f=c)return{hue:c,hex:(0,module$exports$Blockly$utils$colour.hsvToHex)(c,(0,module$exports$Blockly$utils$colour.getHsvSaturation)(),255*(0,module$exports$Blockly$utils$colour.getHsvValue)())};if(c=(0,module$exports$Blockly$utils$colour.parse)(b))return{hue:null,hex:c};c='Invalid colour: "'+b+'"';a!==b&& -(c+=' (from "'+a+'")');throw Error(c);};var module$exports$Blockly$blockRendering$ConstantProvider={ConstantProvider:function(){this.NO_PADDING=0;this.SMALL_PADDING=3;this.MEDIUM_PADDING=5;this.MEDIUM_LARGE_PADDING=8;this.LARGE_PADDING=10;this.TALL_INPUT_FIELD_OFFSET_Y=this.MEDIUM_PADDING;this.TAB_HEIGHT=15;this.TAB_OFFSET_FROM_TOP=5;this.TAB_VERTICAL_OVERLAP=2.5;this.TAB_WIDTH=8;this.NOTCH_WIDTH=15;this.NOTCH_HEIGHT=4;this.MIN_BLOCK_WIDTH=12;this.EMPTY_BLOCK_SPACER_HEIGHT=16;this.DUMMY_INPUT_SHADOW_MIN_HEIGHT=this.DUMMY_INPUT_MIN_HEIGHT= -this.TAB_HEIGHT;this.CORNER_RADIUS=8;this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT=15;this.STATEMENT_BOTTOM_SPACER=0;this.STATEMENT_INPUT_PADDING_LEFT=20;this.BETWEEN_STATEMENT_PADDING_Y=4;this.TOP_ROW_MIN_HEIGHT=this.MEDIUM_PADDING;this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING;this.BOTTOM_ROW_MIN_HEIGHT=this.MEDIUM_PADDING;this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING;this.ADD_START_HATS=!1;this.START_HAT_HEIGHT=15;this.START_HAT_WIDTH=100;this.SPACER_DEFAULT_HEIGHT= -15;this.MIN_BLOCK_HEIGHT=24;this.EMPTY_INLINE_INPUT_PADDING=14.5;this.EMPTY_INLINE_INPUT_HEIGHT=this.TAB_HEIGHT+11;this.EXTERNAL_VALUE_INPUT_PADDING=2;this.EMPTY_STATEMENT_INPUT_HEIGHT=this.MIN_BLOCK_HEIGHT;this.START_POINT=(0,module$exports$Blockly$utils$svgPaths.moveBy)(0,0);this.JAGGED_TEETH_HEIGHT=12;this.JAGGED_TEETH_WIDTH=6;this.FIELD_TEXT_FONTSIZE=11;this.FIELD_TEXT_FONTWEIGHT="normal";this.FIELD_TEXT_FONTFAMILY="sans-serif";this.FIELD_TEXT_BASELINE=this.FIELD_TEXT_HEIGHT=-1;this.FIELD_BORDER_RECT_RADIUS= -4;this.FIELD_BORDER_RECT_HEIGHT=16;this.FIELD_BORDER_RECT_X_PADDING=5;this.FIELD_BORDER_RECT_Y_PADDING=3;this.FIELD_BORDER_RECT_COLOUR="#fff";this.FIELD_TEXT_BASELINE_CENTER=!module$exports$Blockly$utils$userAgent.IE&&!module$exports$Blockly$utils$userAgent.EDGE;this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT;this.FIELD_DROPDOWN_SVG_ARROW=this.FIELD_DROPDOWN_COLOURED_DIV=this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW=!1;this.FIELD_DROPDOWN_SVG_ARROW_PADDING=this.FIELD_BORDER_RECT_X_PADDING; -this.FIELD_DROPDOWN_SVG_ARROW_SIZE=12;this.FIELD_DROPDOWN_SVG_ARROW_DATAURI="data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMi43MSIgaGVpZ2h0PSI4Ljc5IiB2aWV3Qm94PSIwIDAgMTIuNzEgOC43OSI+PHRpdGxlPmRyb3Bkb3duLWFycm93PC90aXRsZT48ZyBvcGFjaXR5PSIwLjEiPjxwYXRoIGQ9Ik0xMi43MSwyLjQ0QTIuNDEsMi40MSwwLDAsMSwxMiw0LjE2TDguMDgsOC4wOGEyLjQ1LDIuNDUsMCwwLDEtMy40NSwwTDAuNzIsNC4xNkEyLjQyLDIuNDIsMCwwLDEsMCwyLjQ0LDIuNDgsMi40OCwwLDAsMSwuNzEuNzFDMSwwLjQ3LDEuNDMsMCw2LjM2LDBTMTEuNzUsMC40NiwxMiwuNzFBMi40NCwyLjQ0LDAsMCwxLDEyLjcxLDIuNDRaIiBmaWxsPSIjMjMxZjIwIi8+PC9nPjxwYXRoIGQ9Ik02LjM2LDcuNzlhMS40MywxLjQzLDAsMCwxLTEtLjQyTDEuNDIsMy40NWExLjQ0LDEuNDQsMCwwLDEsMC0yYzAuNTYtLjU2LDkuMzEtMC41Niw5Ljg3LDBhMS40NCwxLjQ0LDAsMCwxLDAsMkw3LjM3LDcuMzdBMS40MywxLjQzLDAsMCwxLDYuMzYsNy43OVoiIGZpbGw9IiNmZmYiLz48L3N2Zz4="; -this.FIELD_COLOUR_FULL_BLOCK=this.FIELD_TEXTINPUT_BOX_SHADOW=!1;this.FIELD_COLOUR_DEFAULT_WIDTH=26;this.FIELD_COLOUR_DEFAULT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT;this.FIELD_CHECKBOX_X_OFFSET=this.FIELD_BORDER_RECT_X_PADDING-3;this.randomIdentifier=String(Math.random()).substring(2);this.defs_=null;this.embossFilterId="";this.embossFilter_=null;this.disabledPatternId="";this.disabledPattern_=null;this.debugFilterId="";this.cssNode_=this.debugFilter_=null;this.CURSOR_COLOUR="#cc0a0a";this.MARKER_COLOUR= -"#4286f4";this.CURSOR_WS_WIDTH=100;this.WS_CURSOR_HEIGHT=5;this.CURSOR_STACK_PADDING=10;this.CURSOR_BLOCK_PADDING=2;this.CURSOR_STROKE_WIDTH=4;this.FULL_BLOCK_FIELDS=!1;this.INSERTION_MARKER_COLOUR="#000000";this.INSERTION_MARKER_OPACITY=.2;this.SHAPES={PUZZLE:1,NOTCH:2}}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.init=function(){this.JAGGED_TEETH=this.makeJaggedTeeth();this.NOTCH=this.makeNotch();this.START_HAT=this.makeStartHat();this.PUZZLE_TAB=this.makePuzzleTab();this.INSIDE_CORNERS=this.makeInsideCorners();this.OUTSIDE_CORNERS=this.makeOutsideCorners()}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setTheme=function(a){this.blockStyles=Object.create(null);var b=a.blockStyles,c;for(c in b)this.blockStyles[c]=this.validatedBlockStyle_(b[c]);this.setDynamicProperties_(a)};module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setDynamicProperties_=function(a){this.setFontConstants_(a);this.setComponentConstants_(a);this.ADD_START_HATS=null!==a.startHats?a.startHats:this.ADD_START_HATS}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setFontConstants_=function(a){a.fontStyle&&a.fontStyle.family&&(this.FIELD_TEXT_FONTFAMILY=a.fontStyle.family);a.fontStyle&&a.fontStyle.weight&&(this.FIELD_TEXT_FONTWEIGHT=a.fontStyle.weight);a.fontStyle&&a.fontStyle.size&&(this.FIELD_TEXT_FONTSIZE=a.fontStyle.size);a=(0,module$exports$Blockly$utils$dom.measureFontMetrics)("Hg",this.FIELD_TEXT_FONTSIZE+"pt",this.FIELD_TEXT_FONTWEIGHT,this.FIELD_TEXT_FONTFAMILY);this.FIELD_TEXT_HEIGHT= -a.height;this.FIELD_TEXT_BASELINE=a.baseline}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setComponentConstants_=function(a){this.CURSOR_COLOUR=a.getComponentStyle("cursorColour")||this.CURSOR_COLOUR;this.MARKER_COLOUR=a.getComponentStyle("markerColour")||this.MARKER_COLOUR;this.INSERTION_MARKER_COLOUR=a.getComponentStyle("insertionMarkerColour")||this.INSERTION_MARKER_COLOUR;this.INSERTION_MARKER_OPACITY=Number(a.getComponentStyle("insertionMarkerOpacity"))||this.INSERTION_MARKER_OPACITY}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.getBlockStyleForColour=function(a){var b="auto_"+a;this.blockStyles[b]||(this.blockStyles[b]=this.createBlockStyle_(a));return{style:this.blockStyles[b],name:b}};module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.getBlockStyle=function(a){return this.blockStyles[a||""]||(a&&0===a.indexOf("auto_")?this.getBlockStyleForColour(a.substring(5)).style:this.createBlockStyle_("#000000"))}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.createBlockStyle_=function(a){return this.validatedBlockStyle_({colourPrimary:a})}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.validatedBlockStyle_=function(a){var b={};a&&(0,$.module$exports$Blockly$utils$object.mixin)(b,a);a=(0,module$exports$Blockly$utils$parsing.parseBlockColour)(b.colourPrimary||"#000");b.colourPrimary=a.hex;b.colourSecondary=b.colourSecondary?(0,module$exports$Blockly$utils$parsing.parseBlockColour)(b.colourSecondary).hex:this.generateSecondaryColour_(b.colourPrimary);b.colourTertiary=b.colourTertiary?(0,module$exports$Blockly$utils$parsing.parseBlockColour)(b.colourTertiary).hex: -this.generateTertiaryColour_(b.colourPrimary);b.hat=b.hat||"";return b};module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.generateSecondaryColour_=function(a){return(0,module$exports$Blockly$utils$colour.blend)("#fff",a,.6)||a};module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.generateTertiaryColour_=function(a){return(0,module$exports$Blockly$utils$colour.blend)("#fff",a,.3)||a}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.dispose=function(){this.embossFilter_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.embossFilter_);this.disabledPattern_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.disabledPattern_);this.debugFilter_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.debugFilter_);this.cssNode_=null}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makeJaggedTeeth=function(){var a=this.JAGGED_TEETH_HEIGHT,b=this.JAGGED_TEETH_WIDTH,c=(0,module$exports$Blockly$utils$svgPaths.line)([(0,module$exports$Blockly$utils$svgPaths.point)(b,a/4),(0,module$exports$Blockly$utils$svgPaths.point)(2*-b,a/2),(0,module$exports$Blockly$utils$svgPaths.point)(b,a/4)]);return{height:a,width:b,path:c}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makeStartHat=function(){var a=this.START_HAT_HEIGHT,b=this.START_HAT_WIDTH,c=(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(30,-a),(0,module$exports$Blockly$utils$svgPaths.point)(70,-a),(0,module$exports$Blockly$utils$svgPaths.point)(b,0)]);return{height:a,width:b,path:c}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makePuzzleTab=function(){function a(f){f=f?-1:1;var g=-f,h=c/2,k=h+2.5,l=h+.5,m=(0,module$exports$Blockly$utils$svgPaths.point)(-b,f*h);h=(0,module$exports$Blockly$utils$svgPaths.point)(b,f*h);return(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(0,f*k),(0,module$exports$Blockly$utils$svgPaths.point)(-b,g*l),m])+(0,module$exports$Blockly$utils$svgPaths.curve)("s", -[(0,module$exports$Blockly$utils$svgPaths.point)(b,2.5*g),h])}var b=this.TAB_WIDTH,c=this.TAB_HEIGHT,d=a(!0),e=a(!1);return{type:this.SHAPES.PUZZLE,width:b,height:c,pathDown:e,pathUp:d}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makeNotch=function(){function a(g){return(0,module$exports$Blockly$utils$svgPaths.line)([(0,module$exports$Blockly$utils$svgPaths.point)(g*d,c),(0,module$exports$Blockly$utils$svgPaths.point)(3*g,0),(0,module$exports$Blockly$utils$svgPaths.point)(g*d,-c)])}var b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=(b-3)/2,e=a(1),f=a(-1);return{type:this.SHAPES.NOTCH,width:b,height:c,pathLeft:e,pathRight:f}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makeInsideCorners=function(){var a=this.CORNER_RADIUS,b=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a,(0,module$exports$Blockly$utils$svgPaths.point)(-a,a)),c=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a,(0,module$exports$Blockly$utils$svgPaths.point)(a,a));return{width:a,height:a,pathTop:b,pathBottom:c}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.makeOutsideCorners=function(){var a=this.CORNER_RADIUS,b=(0,module$exports$Blockly$utils$svgPaths.moveBy)(0,a)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(a,-a)),c=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(a,a)),d=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(-a, --a)),e=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(-a,a));return{topLeft:b,topRight:c,bottomRight:e,bottomLeft:d,rightHeight:a}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.shapeFor=function(a){switch(a.type){case $.module$exports$Blockly$ConnectionType.ConnectionType.INPUT_VALUE:case $.module$exports$Blockly$ConnectionType.ConnectionType.OUTPUT_VALUE:return this.PUZZLE_TAB;case $.module$exports$Blockly$ConnectionType.ConnectionType.PREVIOUS_STATEMENT:case $.module$exports$Blockly$ConnectionType.ConnectionType.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown connection type"); -}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.createDom=function(a,b,c){this.injectCSS_(b,c);this.defs_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.DEFS,{},a);a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FILTER,{id:"blocklyEmbossFilter"+this.randomIdentifier},this.defs_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEGAUSSIANBLUR,{"in":"SourceAlpha", -stdDeviation:1,result:"blur"},a);b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FESPECULARLIGHTING,{"in":"blur",surfaceScale:1,specularConstant:.5,specularExponent:10,"lighting-color":"white",result:"specOut"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEPOINTLIGHT,{x:-5E3,y:-1E4,z:2E4},b);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"specOut", -in2:"SourceAlpha",operator:"in",result:"specOut"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"SourceGraphic",in2:"specOut",operator:"arithmetic",k1:0,k2:1,k3:1,k4:0},a);this.embossFilterId=a.id;this.embossFilter_=a;a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATTERN,{id:"blocklyDisabledPattern"+this.randomIdentifier,patternUnits:"userSpaceOnUse",width:10,height:10},this.defs_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT, -{width:10,height:10,fill:"#aaa"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATH,{d:"M 0 0 L 10 10 M 10 0 L 0 10",stroke:"#cc0"},a);this.disabledPatternId=a.id;this.disabledPattern_=a;this.createDebugFilter()}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.createDebugFilter=function(){if(!this.debugFilter_){var a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FILTER,{id:"blocklyDebugFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},this.defs_),b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFUNCA, -{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFLOOD,{"flood-color":"#ff0000","flood-opacity":.5,result:"outColor"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);this.debugFilterId=a.id;this.debugFilter_=a}}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.injectCSS_=function(a,b){b=this.getCSS_(b);a="blockly-renderer-style-"+a;this.cssNode_=document.getElementById(a);var c=b.join("\n");this.cssNode_?this.cssNode_.firstChild.textContent=c:(b=document.createElement("style"),b.id=a,a=document.createTextNode(c),b.appendChild(a),document.head.insertBefore(b,document.head.firstChild),this.cssNode_=b)}; -module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.getCSS_=function(a){return[a+" .blocklyText, ",a+" .blocklyFlyoutLabelText {","font: "+this.FIELD_TEXT_FONTWEIGHT+" "+this.FIELD_TEXT_FONTSIZE+"pt "+this.FIELD_TEXT_FONTFAMILY+";","}",a+" .blocklyText {","fill: #fff;","}",a+" .blocklyNonEditableText>rect,",a+" .blocklyEditableText>rect {","fill: "+this.FIELD_BORDER_RECT_COLOUR+";","fill-opacity: .6;","stroke: none;","}",a+" .blocklyNonEditableText>text,",a+" .blocklyEditableText>text {", -"fill: #000;","}",a+" .blocklyFlyoutLabelText {","fill: #000;","}",a+" .blocklyText.blocklyBubbleText {","fill: #000;","}",a+" .blocklyEditableText:not(.editing):hover>rect {","stroke: #fff;","stroke-width: 2;","}",a+" .blocklyHtmlInput {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","font-weight: "+this.FIELD_TEXT_FONTWEIGHT+";","}",a+" .blocklySelected>.blocklyPath {","stroke: #fc3;","stroke-width: 3px;","}",a+" .blocklyHighlightedConnectionPath {","stroke: #fc3;","}",a+" .blocklyReplaceable .blocklyPath {", -"fill-opacity: .5;","}",a+" .blocklyReplaceable .blocklyPathLight,",a+" .blocklyReplaceable .blocklyPathDark {","display: none;","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};var module$exports$Blockly$blockRendering$Field={Field:function(a,b,c){module$exports$Blockly$blockRendering$Measurable.Measurable.call(this,a);this.field=b;this.isEditable=b.EDITABLE;this.flipRtl=b.getFlipRtl();this.type|=module$exports$Blockly$blockRendering$Types.Types.FIELD;a=this.field.getSize();this.height=a.height;this.width=a.width;this.parentInput=c}};$.$jscomp.inherits(module$exports$Blockly$blockRendering$Field.Field,module$exports$Blockly$blockRendering$Measurable.Measurable);var module$exports$Blockly$fieldRegistry={register:function(a,b){(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.FIELD,a,b)},unregister:function(a){(0,module$exports$Blockly$registry.unregister)(module$exports$Blockly$registry.Type.FIELD,a)},fromJson:function(a){var b=(0,module$exports$Blockly$registry.getObject)(module$exports$Blockly$registry.Type.FIELD,a.type);return b?b.fromJson(a):(console.warn("Blockly could not create a field of type "+a.type+". The field is probably not being registered. This could be because the file is not loaded, the field does not register itself (Issue #1584), or the registration is not being reached."), -null)}};var module$exports$Blockly$IASTNodeLocation={IASTNodeLocation:function(){}};var module$exports$Blockly$IASTNodeLocationSvg={IASTNodeLocationSvg:function(){}};var module$exports$Blockly$IASTNodeLocationWithBlock={IASTNodeLocationWithBlock:function(){}};var module$exports$Blockly$IKeyboardAccessible={IKeyboardAccessible:function(){}};var module$exports$Blockly$IRegistrable={IRegistrable:function(){}};var module$exports$Blockly$MarkerManager={MarkerManager:function(a){this.cursorSvg_=this.cursor_=null;this.markers_=Object.create(null);this.workspace_=a;this.markerSvg_=null}};module$exports$Blockly$MarkerManager.MarkerManager.prototype.registerMarker=function(a,b){this.markers_[a]&&this.unregisterMarker(a);b.setDrawer(this.workspace_.getRenderer().makeMarkerDrawer(this.workspace_,b));this.setMarkerSvg(b.getDrawer().createDom());this.markers_[a]=b}; -module$exports$Blockly$MarkerManager.MarkerManager.prototype.unregisterMarker=function(a){var b=this.markers_[a];if(b)b.dispose(),delete this.markers_[a];else throw Error("Marker with ID "+a+" does not exist. Can only unregister markers that exist.");};module$exports$Blockly$MarkerManager.MarkerManager.prototype.getCursor=function(){return this.cursor_};module$exports$Blockly$MarkerManager.MarkerManager.prototype.getMarker=function(a){return this.markers_[a]||null}; -module$exports$Blockly$MarkerManager.MarkerManager.prototype.setCursor=function(a){this.cursor_&&this.cursor_.getDrawer()&&this.cursor_.getDrawer().dispose();if(this.cursor_=a)a=this.workspace_.getRenderer().makeMarkerDrawer(this.workspace_,this.cursor_),this.cursor_.setDrawer(a),this.setCursorSvg(this.cursor_.getDrawer().createDom())}; -module$exports$Blockly$MarkerManager.MarkerManager.prototype.setCursorSvg=function(a){a?(this.workspace_.getBlockCanvas().appendChild(a),this.cursorSvg_=a):this.cursorSvg_=null};module$exports$Blockly$MarkerManager.MarkerManager.prototype.setMarkerSvg=function(a){a?this.workspace_.getBlockCanvas()&&(this.cursorSvg_?this.workspace_.getBlockCanvas().insertBefore(a,this.cursorSvg_):this.workspace_.getBlockCanvas().appendChild(a)):this.markerSvg_=null}; -module$exports$Blockly$MarkerManager.MarkerManager.prototype.updateMarkers=function(){this.workspace_.keyboardAccessibilityMode&&this.cursorSvg_&&this.workspace_.getCursor().draw()};module$exports$Blockly$MarkerManager.MarkerManager.prototype.dispose=function(){for(var a=Object.keys(this.markers_),b=0,c;c=a[b];b++)this.unregisterMarker(c);this.markers_=null;this.cursor_&&(this.cursor_.dispose(),this.cursor_=null)};module$exports$Blockly$MarkerManager.MarkerManager.LOCAL_MARKER="local_marker_1";var module$exports$Blockly$utils$Sentinel={Sentinel:function(){}};var module$exports$Blockly$Events$BlockChange={BlockChange:function(a,b,c,d,e){module$exports$Blockly$Events$BlockBase.BlockBase.call(this,a);this.type=module$exports$Blockly$Events$utils.CHANGE;a&&(this.element="undefined"===typeof b?"":b,this.name="undefined"===typeof c?"":c,this.oldValue="undefined"===typeof d?"":d,this.newValue="undefined"===typeof e?"":e)}};$.$jscomp.inherits(module$exports$Blockly$Events$BlockChange.BlockChange,module$exports$Blockly$Events$BlockBase.BlockBase); -module$exports$Blockly$Events$BlockChange.BlockChange.prototype.toJson=function(){var a=module$exports$Blockly$Events$BlockBase.BlockBase.prototype.toJson.call(this);a.element=this.element;this.name&&(a.name=this.name);a.oldValue=this.oldValue;a.newValue=this.newValue;return a}; -module$exports$Blockly$Events$BlockChange.BlockChange.prototype.fromJson=function(a){module$exports$Blockly$Events$BlockBase.BlockBase.prototype.fromJson.call(this,a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue};module$exports$Blockly$Events$BlockChange.BlockChange.prototype.isNull=function(){return this.oldValue===this.newValue}; -module$exports$Blockly$Events$BlockChange.BlockChange.prototype.run=function(a){var b=this.getEventWorkspace_().getBlockById(this.blockId);if(b)switch(b.mutator&&b.mutator.setVisible(!1),a=a?this.newValue:this.oldValue,this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a); -break;case "mutation":var c=module$exports$Blockly$Events$BlockChange.BlockChange.getExtraBlockState_(b);b.loadExtraState?b.loadExtraState(JSON.parse(a||"{}")):b.domToMutation&&b.domToMutation((0,$.module$exports$Blockly$Xml.textToDom)(a||""));(0,module$exports$Blockly$Events$utils.fire)(new module$exports$Blockly$Events$BlockChange.BlockChange(b,"mutation",null,c,a));break;default:console.warn("Unknown change type: "+this.element)}else console.warn("Can't change non-existent block: "+ -this.blockId)};module$exports$Blockly$Events$BlockChange.BlockChange.getExtraBlockState_=function(a){return a.saveExtraState?(a=a.saveExtraState())?JSON.stringify(a):"":a.mutationToDom?(a=a.mutationToDom())?(0,$.module$exports$Blockly$Xml.domToText)(a):"":""};(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.EVENT,module$exports$Blockly$Events$utils.CHANGE,module$exports$Blockly$Events$BlockChange.BlockChange);var module$exports$Blockly$blockAnimations={},module$contents$Blockly$blockAnimations_disconnectPid=0,module$contents$Blockly$blockAnimations_disconnectGroup=null; -module$exports$Blockly$blockAnimations.disposeUiEffect=function(a){var b=a.workspace,c=a.getSvgRoot();b.getAudioManager().play("delete");a=b.getSvgXY(c);c=c.cloneNode(!0);c.translateX_=a.x;c.translateY_=a.y;c.setAttribute("transform","translate("+a.x+","+a.y+")");b.getParentSvg().appendChild(c);c.bBox_=c.getBBox();module$contents$Blockly$blockAnimations_disposeUiStep(c,b.RTL,new Date,b.scale)}; -var module$contents$Blockly$blockAnimations_disposeUiStep=function(a,b,c,d){var e=(new Date-c)/150;1c)){var d=b.getSvgXY(a.getSvgRoot());a.outputConnection?(d.x+=(a.RTL?3:-3)*c,d.y+=13*c):a.previousConnection&&(d.x+=(a.RTL?-23:23)*c,d.y+=3*c);a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CIRCLE,{cx:d.x,cy:d.y,r:0,fill:"none",stroke:"#888","stroke-width":10},b.getParentSvg());module$contents$Blockly$blockAnimations_connectionUiStep(a, -new Date,c)}};var module$contents$Blockly$blockAnimations_connectionUiStep=function(a,b,c){var d=(new Date-b)/150;1a.workspace.scale)){var b=a.getHeightWidth().height;b=Math.atan(10/b)/Math.PI*180;a.RTL||(b*=-1);module$contents$Blockly$blockAnimations_disconnectUiStep(a.getSvgRoot(),b,new Date)}}; -var module$contents$Blockly$blockAnimations_disconnectUiStep=function(a,b,c){var d=(new Date-c)/200;11'),d.appendChild(c),b.push(d));if(module$exports$Blockly$blocks.Blocks.variables_get)for(a.sort(module$exports$Blockly$VariableModel.VariableModel.compareByName), -c=0;d=a[c];c++){var e=(0,$.module$exports$Blockly$utils$xml.createElement)("block");e.setAttribute("type","variables_get");e.setAttribute("gap",8);e.appendChild((0,$.module$exports$Blockly$Variables.generateVariableFieldDom)(d));b.push(e)}}return b};$.module$exports$Blockly$Variables.VAR_LETTER_OPTIONS="ijkmnopqrstuvwxyzabcdefgh"; -$.module$exports$Blockly$Variables.generateUniqueName=function(a){return(0,$.module$exports$Blockly$Variables.generateUniqueNameFromOptions)($.module$exports$Blockly$Variables.VAR_LETTER_OPTIONS.charAt(0),a.getAllVariableNames())}; -$.module$exports$Blockly$Variables.generateUniqueNameFromOptions=function(a,b){if(!b.length)return a;for(var c=$.module$exports$Blockly$Variables.VAR_LETTER_OPTIONS,d="",e=c.indexOf(a);;){for(var f=!1,g=0;gc||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case $.module$exports$Blockly$ConnectionType.ConnectionType.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case $.module$exports$Blockly$ConnectionType.ConnectionType.OUTPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case $.module$exports$Blockly$ConnectionType.ConnectionType.INPUT_VALUE:if(b.isConnected()&& -!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case $.module$exports$Blockly$ConnectionType.ConnectionType.NEXT_STATEMENT:if(b.isConnected()&&!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!==$.module$exports$Blockly$common.draggingConnections.indexOf(b)?!1:!0}; -module$exports$Blockly$ConnectionChecker.ConnectionChecker.prototype.canConnectToPrevious_=function(a,b){if(a.targetConnection||-1!==$.module$exports$Blockly$common.draggingConnections.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1};(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.CONNECTION_CHECKER,module$exports$Blockly$registry.DEFAULT,module$exports$Blockly$ConnectionChecker.ConnectionChecker);var module$exports$Blockly$Workspace={},module$contents$Blockly$Workspace_WorkspaceDB_=Object.create(null); -module$exports$Blockly$Workspace.Workspace=function(a){this.id=(0,module$exports$Blockly$utils$idGenerator.genUid)();module$contents$Blockly$Workspace_WorkspaceDB_[this.id]=this;this.options=a||new module$exports$Blockly$Options.Options({});this.RTL=!!this.options.RTL;this.horizontalLayout=!!this.options.horizontalLayout;this.toolboxPosition=this.options.toolboxPosition;this.isClearing=this.isMutator=this.isFlyout=this.rendered=!1;this.MAX_UNDO=1024;this.connectionDBList=null;this.connectionChecker= -new ((0,module$exports$Blockly$registry.getClassFromOptions)(module$exports$Blockly$registry.Type.CONNECTION_CHECKER,this.options,!0))(this);this.topBlocks_=[];this.topComments_=[];this.commentDB_=Object.create(null);this.listeners_=[];this.undoStack_=[];this.redoStack_=[];this.blockDB_=Object.create(null);this.typedBlocksDB_=Object.create(null);this.variableMap_=new module$exports$Blockly$VariableMap.VariableMap(this);this.potentialVariableMap_=null}; -module$exports$Blockly$Workspace.Workspace.prototype.dispose=function(){this.listeners_.length=0;this.clear();delete module$contents$Blockly$Workspace_WorkspaceDB_[this.id]};module$exports$Blockly$Workspace.Workspace.prototype.sortObjects_=function(a,b){a=a.getRelativeToSurfaceXY();b=b.getRelativeToSurfaceXY();return a.y+module$exports$Blockly$Workspace.Workspace.prototype.sortObjects_.offset*a.x-(b.y+module$exports$Blockly$Workspace.Workspace.prototype.sortObjects_.offset*b.x)}; -module$exports$Blockly$Workspace.Workspace.prototype.addTopBlock=function(a){this.topBlocks_.push(a)};module$exports$Blockly$Workspace.Workspace.prototype.removeTopBlock=function(a){if(!(0,module$exports$Blockly$utils$array.removeElem)(this.topBlocks_,a))throw Error("Block not present in workspace's list of top-most blocks.");}; -module$exports$Blockly$Workspace.Workspace.prototype.getTopBlocks=function(a){var b=[].concat(this.topBlocks_);a&&1this.remainingCapacityOfType(c))return!1;b+=a[c]}return b>this.remainingCapacity()?!1:!0};module$exports$Blockly$Workspace.Workspace.prototype.hasBlockLimits=function(){return Infinity!==this.options.maxBlocks||!!this.options.maxInstances};module$exports$Blockly$Workspace.Workspace.prototype.getUndoStack=function(){return this.undoStack_}; -module$exports$Blockly$Workspace.Workspace.prototype.getRedoStack=function(){return this.redoStack_}; -module$exports$Blockly$Workspace.Workspace.prototype.undo=function(a){var b=a?this.redoStack_:this.undoStack_,c=a?this.undoStack_:this.redoStack_,d=b.pop();if(d){for(var e=[d];b.length&&d.group&&d.group===b[b.length-1].group;)e.push(b.pop());for(b=0;bthis.MAX_UNDO&&0<=this.MAX_UNDO;)this.undoStack_.shift();for(var b=0;ba.width)return b;if(this.workspace_.RTL){var c=this.anchorXY_.x-b,d=a.left+a.width;a=a.left+module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness/this.workspace_.scale;c-this.width_d&&(b=-(d-this.anchorXY_.x))}else{c=b+this.anchorXY_.x;d=c+this.width_;var e=a.left;a=a.left+a.width-module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness/ -this.workspace_.scale;ca&&(b=a-this.anchorXY_.x-this.width_)}return b};module$exports$Blockly$Bubble.Bubble.prototype.getOptimalRelativeTop_=function(a){var b=-this.height_/4;if(this.height_>a.height)return b;var c=this.anchorXY_.y+b,d=c+this.height_,e=a.top;a=a.top+a.height-module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness/this.workspace_.scale;var f=this.anchorXY_.y;ca&&(b=a-f-this.height_);return b}; -module$exports$Blockly$Bubble.Bubble.prototype.positionBubble_=function(){var a=this.anchorXY_.x;a=this.workspace_.RTL?a-(this.relativeLeft_+this.width_):a+this.relativeLeft_;this.moveTo(a,this.relativeTop_+this.anchorXY_.y)};module$exports$Blockly$Bubble.Bubble.prototype.moveTo=function(a,b){this.bubbleGroup_.setAttribute("transform","translate("+a+","+b+")")};module$exports$Blockly$Bubble.Bubble.prototype.setDragging=function(a){!a&&this.moveCallback_&&this.moveCallback_()}; -module$exports$Blockly$Bubble.Bubble.prototype.getBubbleSize=function(){return new module$exports$Blockly$utils$Size.Size(this.width_,this.height_)}; -module$exports$Blockly$Bubble.Bubble.prototype.setBubbleSize=function(a,b){var c=2*module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH;a=Math.max(a,c+45);b=Math.max(b,c+20);this.width_=a;this.height_=b;this.bubbleBack_.setAttribute("width",a);this.bubbleBack_.setAttribute("height",b);this.resizeGroup_&&(this.workspace_.RTL?this.resizeGroup_.setAttribute("transform","translate("+2*module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH+","+(b-c)+") scale(-1 1)"):this.resizeGroup_.setAttribute("transform", -"translate("+(a-c)+","+(b-c)+")"));this.autoLayout_&&this.layoutBubble_();this.positionBubble_();this.renderArrow_();this.resizeCallback_&&this.resizeCallback_()}; -module$exports$Blockly$Bubble.Bubble.prototype.renderArrow_=function(){var a=[],b=this.width_/2,c=this.height_/2,d=-this.relativeLeft_,e=-this.relativeTop_;if(b===d&&c===e)a.push("M "+b+","+c);else{e-=c;d-=b;this.workspace_.RTL&&(d*=-1);var f=Math.sqrt(e*e+d*d),g=Math.acos(d/f);0>e&&(g=2*Math.PI-g);var h=g+Math.PI/2;h>2*Math.PI&&(h-=2*Math.PI);var k=Math.sin(h),l=Math.cos(h),m=this.getBubbleSize();h=(m.width+m.height)/module$exports$Blockly$Bubble.Bubble.ARROW_THICKNESS;h=Math.min(h,m.width,m.height)/ -4;m=1-module$exports$Blockly$Bubble.Bubble.ANCHOR_RADIUS/f;d=b+m*d;e=c+m*e;m=b+h*l;var n=c+h*k;b-=h*l;c-=h*k;k=g+this.arrow_radians_;k>2*Math.PI&&(k-=2*Math.PI);g=Math.sin(k)*f/module$exports$Blockly$Bubble.Bubble.ARROW_BEND;f=Math.cos(k)*f/module$exports$Blockly$Bubble.Bubble.ARROW_BEND;a.push("M"+m+","+n);a.push("C"+(m+f)+","+(n+g)+" "+d+","+e+" "+d+","+e);a.push("C"+d+","+e+" "+(b+f)+","+(c+g)+" "+b+","+c)}a.push("z");this.bubbleArrow_.setAttribute("d",a.join(" "))}; -module$exports$Blockly$Bubble.Bubble.prototype.setColour=function(a){this.bubbleBack_.setAttribute("fill",a);this.bubbleArrow_.setAttribute("fill",a)}; -module$exports$Blockly$Bubble.Bubble.prototype.dispose=function(){this.onMouseDownBubbleWrapper_&&(0,module$exports$Blockly$browserEvents.unbind)(this.onMouseDownBubbleWrapper_);this.onMouseDownResizeWrapper_&&(0,module$exports$Blockly$browserEvents.unbind)(this.onMouseDownResizeWrapper_);module$exports$Blockly$Bubble.Bubble.unbindDragEvents_();(0,module$exports$Blockly$utils$dom.removeNode)(this.bubbleGroup_);this.disposed=!0}; -module$exports$Blockly$Bubble.Bubble.prototype.moveDuringDrag=function(a,b){a?a.translateSurface(b.x,b.y):this.moveTo(b.x,b.y);this.relativeLeft_=this.workspace_.RTL?this.anchorXY_.x-b.x-this.width_:b.x-this.anchorXY_.x;this.relativeTop_=b.y-this.anchorXY_.y;this.renderArrow_()}; -module$exports$Blockly$Bubble.Bubble.prototype.getRelativeToSurfaceXY=function(){return new module$exports$Blockly$utils$Coordinate.Coordinate(this.workspace_.RTL?-this.relativeLeft_+this.anchorXY_.x-this.width_:this.anchorXY_.x+this.relativeLeft_,this.anchorXY_.y+this.relativeTop_)};module$exports$Blockly$Bubble.Bubble.prototype.setAutoLayout=function(a){this.autoLayout_=a}; -module$exports$Blockly$Bubble.Bubble.unbindDragEvents_=function(){module$exports$Blockly$Bubble.Bubble.onMouseUpWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(module$exports$Blockly$Bubble.Bubble.onMouseUpWrapper_),module$exports$Blockly$Bubble.Bubble.onMouseUpWrapper_=null);module$exports$Blockly$Bubble.Bubble.onMouseMoveWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(module$exports$Blockly$Bubble.Bubble.onMouseMoveWrapper_),module$exports$Blockly$Bubble.Bubble.onMouseMoveWrapper_= -null)};module$exports$Blockly$Bubble.Bubble.bubbleMouseUp_=function(a){(0,module$exports$Blockly$Touch.clearTouchIdentifier)();module$exports$Blockly$Bubble.Bubble.unbindDragEvents_()}; -module$exports$Blockly$Bubble.Bubble.textToDom=function(a){var b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.TEXT,{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH},null);a=a.split("\n");for(var c=0;cb-$.module$exports$Blockly$config.config.currentConnectionPreference)}if(this.localConnection_|| -this.closestConnection_)console.error("Only one of localConnection_ and closestConnection_ was set.");else return!0}else return!(!this.localConnection_||!this.closestConnection_);console.error("Returning true from shouldUpdatePreviews, but it's not clear why.");return!0}; -module$exports$Blockly$InsertionMarkerManager.InsertionMarkerManager.prototype.getCandidate_=function(a){var b=this.getStartRadius_(),c=null,d=null;this.markerConnection_&&this.markerConnection_.isConnected()||this.updateAvailableConnections();for(var e=0;e(this.flyout_?$.module$exports$Blockly$config.config.flyoutDragRadius:$.module$exports$Blockly$config.config.dragRadius)}; -module$exports$Blockly$Gesture.Gesture.prototype.updateIsDraggingFromFlyout_=function(){return this.targetBlock_&&this.flyout_.isBlockCreatable_(this.targetBlock_)?!this.flyout_.isScrollable()||this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)?(this.startWorkspace_=this.flyout_.targetWorkspace,this.startWorkspace_.updateScreenCalculationsIfScrolled(),(0,module$exports$Blockly$Events$utils.getGroup)()||(0,module$exports$Blockly$Events$utils.setGroup)(!0),this.startBlock_=null,this.targetBlock_= -this.flyout_.createBlock(this.targetBlock_),this.targetBlock_.select(),!0):!1:!1};module$exports$Blockly$Gesture.Gesture.prototype.updateIsDraggingBubble_=function(){if(!this.startBubble_)return!1;this.isDraggingBubble_=!0;this.startDraggingBubble_();return!0}; -module$exports$Blockly$Gesture.Gesture.prototype.updateIsDraggingBlock_=function(){if(!this.targetBlock_)return!1;this.flyout_?this.isDraggingBlock_=this.updateIsDraggingFromFlyout_():this.targetBlock_.isMovable()&&(this.isDraggingBlock_=!0);return this.isDraggingBlock_?(this.startDraggingBlock_(),!0):!1}; -module$exports$Blockly$Gesture.Gesture.prototype.updateIsDraggingWorkspace_=function(){if(this.flyout_?this.flyout_.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())this.workspaceDragger_=new module$exports$Blockly$WorkspaceDragger.WorkspaceDragger(this.startWorkspace_),this.isDraggingWorkspace_=!0,this.workspaceDragger_.startDrag()}; -module$exports$Blockly$Gesture.Gesture.prototype.updateIsDragging_=function(){if(this.calledUpdateIsDragging_)throw Error("updateIsDragging_ should only be called once per gesture.");this.calledUpdateIsDragging_=!0;this.updateIsDraggingBubble_()||this.updateIsDraggingBlock_()||this.updateIsDraggingWorkspace_()}; -module$exports$Blockly$Gesture.Gesture.prototype.startDraggingBlock_=function(){this.blockDragger_=new ((0,module$exports$Blockly$registry.getClassFromOptions)(module$exports$Blockly$registry.Type.BLOCK_DRAGGER,this.creatorWorkspace_.options,!0))(this.targetBlock_,this.startWorkspace_);this.blockDragger_.startDrag(this.currentDragDeltaXY_,this.healStack_);this.blockDragger_.drag(this.mostRecentEvent_,this.currentDragDeltaXY_)}; -module$exports$Blockly$Gesture.Gesture.prototype.startDraggingBubble_=function(){this.bubbleDragger_=new module$exports$Blockly$BubbleDragger.BubbleDragger(this.startBubble_,this.startWorkspace_);this.bubbleDragger_.startBubbleDrag();this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_)}; -module$exports$Blockly$Gesture.Gesture.prototype.doStart=function(a){(0,module$exports$Blockly$browserEvents.isTargetInput)(a)?this.cancel():(this.hasStarted_=!0,(0,module$exports$Blockly$blockAnimations.disconnectUiStop)(),this.startWorkspace_.updateScreenCalculationsIfScrolled(),this.startWorkspace_.isMutator&&this.startWorkspace_.resize(),this.startWorkspace_.hideChaff(!!this.flyout_),this.startWorkspace_.markFocused(),this.mostRecentEvent_=a,(0,module$exports$Blockly$Tooltip.block)(),this.targetBlock_&& -this.targetBlock_.select(),(0,module$exports$Blockly$browserEvents.isRightButton)(a)?this.handleRightClick(a):("touchstart"!==a.type.toLowerCase()&&"pointerdown"!==a.type.toLowerCase()||"mouse"===a.pointerType||(0,module$exports$Blockly$Touch.longStart)(a,this),this.mouseDownXY_=new module$exports$Blockly$utils$Coordinate.Coordinate(a.clientX,a.clientY),this.healStack_=a.altKey||a.ctrlKey||a.metaKey,this.bindMouseEvents(a)))}; -module$exports$Blockly$Gesture.Gesture.prototype.bindMouseEvents=function(a){this.onMoveWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document,"mousemove",null,this.handleMove.bind(this));this.onUpWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document,"mouseup",null,this.handleUp.bind(this));a.preventDefault();a.stopPropagation()}; -module$exports$Blockly$Gesture.Gesture.prototype.handleMove=function(a){this.updateFromEvent_(a);this.isDraggingWorkspace_?this.workspaceDragger_.drag(this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.drag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBubble_&&this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_);a.preventDefault();a.stopPropagation()}; -module$exports$Blockly$Gesture.Gesture.prototype.handleUp=function(a){this.updateFromEvent_(a);(0,module$exports$Blockly$Touch.longStop)();this.isEnding_?console.log("Trying to end a gesture recursively."):(this.isEnding_=!0,this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(a,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endDrag(a,this.currentDragDeltaXY_):this.isDraggingWorkspace_?this.workspaceDragger_.endDrag(this.currentDragDeltaXY_):this.isBubbleClick_()?this.doBubbleClick_(): -this.isFieldClick_()?this.doFieldClick_():this.isBlockClick_()?this.doBlockClick_():this.isWorkspaceClick_()&&this.doWorkspaceClick_(a),a.preventDefault(),a.stopPropagation(),this.dispose())}; -module$exports$Blockly$Gesture.Gesture.prototype.cancel=function(){this.isEnding_||((0,module$exports$Blockly$Touch.longStop)(),this.isDraggingBubble_?this.bubbleDragger_.endBubbleDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingBlock_?this.blockDragger_.endDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.isDraggingWorkspace_&&this.workspaceDragger_.endDrag(this.currentDragDeltaXY_),this.dispose())}; -module$exports$Blockly$Gesture.Gesture.prototype.handleRightClick=function(a){this.targetBlock_?(this.bringBlockToFront_(),this.targetBlock_.workspace.hideChaff(!!this.flyout_),this.targetBlock_.showContextMenu(a)):this.startBubble_?this.startBubble_.showContextMenu(a):this.startWorkspace_&&!this.flyout_&&(this.startWorkspace_.hideChaff(),this.startWorkspace_.showContextMenu(a));a.preventDefault();a.stopPropagation();this.dispose()}; -module$exports$Blockly$Gesture.Gesture.prototype.handleWsStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace_(b);this.mostRecentEvent_=a;this.doStart(a)};module$exports$Blockly$Gesture.Gesture.prototype.fireWorkspaceClick_=function(a){(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CLICK))(null,a.id,"workspace"))}; -module$exports$Blockly$Gesture.Gesture.prototype.handleFlyoutStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout_(b);this.handleWsStart(a,b.getWorkspace())}; -module$exports$Blockly$Gesture.Gesture.prototype.handleBlockStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(b);this.mostRecentEvent_=a};module$exports$Blockly$Gesture.Gesture.prototype.handleBubbleStart=function(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started.");this.setStartBubble(b);this.mostRecentEvent_=a}; -module$exports$Blockly$Gesture.Gesture.prototype.doBubbleClick_=function(){this.startBubble_.setFocus&&this.startBubble_.setFocus();this.startBubble_.select&&this.startBubble_.select()};module$exports$Blockly$Gesture.Gesture.prototype.doFieldClick_=function(){this.startField_.showEditor(this.mostRecentEvent_);this.bringBlockToFront_()}; -module$exports$Blockly$Gesture.Gesture.prototype.doBlockClick_=function(){if(this.flyout_&&this.flyout_.autoClose)this.targetBlock_.isEnabled()&&((0,module$exports$Blockly$Events$utils.getGroup)()||(0,module$exports$Blockly$Events$utils.setGroup)(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump());else{var a=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CLICK))(this.startBlock_,this.startWorkspace_.id,"block");(0,module$exports$Blockly$Events$utils.fire)(a)}this.bringBlockToFront_(); -(0,module$exports$Blockly$Events$utils.setGroup)(!1)};module$exports$Blockly$Gesture.Gesture.prototype.doWorkspaceClick_=function(a){a=this.creatorWorkspace_;(0,$.module$exports$Blockly$common.getSelected)()&&(0,$.module$exports$Blockly$common.getSelected)().unselect();this.fireWorkspaceClick_(this.startWorkspace_||a)};module$exports$Blockly$Gesture.Gesture.prototype.bringBlockToFront_=function(){this.targetBlock_&&!this.flyout_&&this.targetBlock_.bringToFront()}; -module$exports$Blockly$Gesture.Gesture.prototype.setStartField=function(a){if(this.hasStarted_)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField_||(this.startField_=a)};module$exports$Blockly$Gesture.Gesture.prototype.setStartBubble=function(a){this.startBubble_||(this.startBubble_=a)}; -module$exports$Blockly$Gesture.Gesture.prototype.setStartBlock=function(a){this.startBlock_||this.startBubble_||(this.startBlock_=a,a.isInFlyout&&a!==a.getRootBlock()?this.setTargetBlock_(a.getRootBlock()):this.setTargetBlock_(a))};module$exports$Blockly$Gesture.Gesture.prototype.setTargetBlock_=function(a){a.isShadow()?this.setTargetBlock_(a.getParent()):this.targetBlock_=a}; -module$exports$Blockly$Gesture.Gesture.prototype.setStartWorkspace_=function(a){this.startWorkspace_||(this.startWorkspace_=a)};module$exports$Blockly$Gesture.Gesture.prototype.setStartFlyout_=function(a){this.flyout_||(this.flyout_=a)};module$exports$Blockly$Gesture.Gesture.prototype.isBubbleClick_=function(){return!!this.startBubble_&&!this.hasExceededDragRadius_};module$exports$Blockly$Gesture.Gesture.prototype.isBlockClick_=function(){return!!this.startBlock_&&!this.hasExceededDragRadius_&&!this.isFieldClick_()}; -module$exports$Blockly$Gesture.Gesture.prototype.isFieldClick_=function(){return(this.startField_?this.startField_.isClickable():!1)&&!this.hasExceededDragRadius_&&(!this.flyout_||!this.flyout_.autoClose)};module$exports$Blockly$Gesture.Gesture.prototype.isWorkspaceClick_=function(){return!this.startBlock_&&!this.startBubble_&&!this.startField_&&!this.hasExceededDragRadius_}; -module$exports$Blockly$Gesture.Gesture.prototype.isDragging=function(){return this.isDraggingWorkspace_||this.isDraggingBlock_||this.isDraggingBubble_};module$exports$Blockly$Gesture.Gesture.prototype.hasStarted=function(){return this.hasStarted_};module$exports$Blockly$Gesture.Gesture.prototype.getInsertionMarkers=function(){return this.blockDragger_?this.blockDragger_.getInsertionMarkers():[]}; -module$exports$Blockly$Gesture.Gesture.prototype.getCurrentDragger=function(){return this.isDraggingBlock_?this.blockDragger_:this.isDraggingWorkspace_?this.workspaceDragger_:this.isDraggingBubble_?this.bubbleDragger_:null};module$exports$Blockly$Gesture.Gesture.inProgress=function(){for(var a=module$exports$Blockly$Workspace.Workspace.getAll(),b=0,c;c=a[b];b++)if(c.currentGesture_)return!0;return!1};var module$exports$Blockly$Field={Field:function(a,b,c){this.name=void 0;this.value_=this.constructor.prototype.DEFAULT_VALUE;this.tooltip_=this.validator_=null;this.size_=new module$exports$Blockly$utils$Size.Size(0,0);this.constants_=this.mouseDownWrapper_=this.textContent_=this.textElement_=this.borderRect_=this.fieldGroup_=this.markerSvg_=this.cursorSvg_=null;this.disposed=!1;this.maxDisplayLength=50;this.sourceBlock_=null;this.enabled_=this.visible_=this.isDirty_=!0;this.suffixField=this.prefixField= -this.clickTarget_=null;this.EDITABLE=!0;this.SERIALIZABLE=!1;this.CURSOR="";a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}};module$exports$Blockly$Field.Field.prototype.configure_=function(a){var b=a.tooltip;"string"===typeof b&&(b=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a.tooltip));b&&this.setTooltip(b)}; -module$exports$Blockly$Field.Field.prototype.setSourceBlock=function(a){if(this.sourceBlock_)throw Error("Field already bound to a block");this.sourceBlock_=a};module$exports$Blockly$Field.Field.prototype.getConstants=function(){!this.constants_&&this.sourceBlock_&&this.sourceBlock_.workspace&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants());return this.constants_};module$exports$Blockly$Field.Field.prototype.getSourceBlock=function(){return this.sourceBlock_}; -module$exports$Blockly$Field.Field.prototype.init=function(){this.fieldGroup_||(this.fieldGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{},null),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_),this.initView(),this.updateEditable(),this.setTooltip(this.tooltip_),this.bindEvents_(),this.initModel())}; -module$exports$Blockly$Field.Field.prototype.initView=function(){this.createBorderRect_();this.createTextElement_()};module$exports$Blockly$Field.Field.prototype.initModel=function(){}; -module$exports$Blockly$Field.Field.prototype.createBorderRect_=function(){this.borderRect_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,"class":"blocklyFieldRect"},this.fieldGroup_)}; -module$exports$Blockly$Field.Field.prototype.createTextElement_=function(){this.textElement_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.textElement_.setAttribute("dominant-baseline","central");this.textContent_=document.createTextNode("");this.textElement_.appendChild(this.textContent_)}; -module$exports$Blockly$Field.Field.prototype.bindEvents_=function(){(0,module$exports$Blockly$Tooltip.bindMouseEvents)(this.getClickTarget_());this.mouseDownWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(this.getClickTarget_(),"mousedown",this,this.onMouseDown_)};module$exports$Blockly$Field.Field.prototype.fromXml=function(a){this.setValue(a.textContent)};module$exports$Blockly$Field.Field.prototype.toXml=function(a){a.textContent=this.getValue();return a}; -module$exports$Blockly$Field.Field.prototype.saveState=function(a){a=this.saveLegacyState(module$exports$Blockly$Field.Field);return null!==a?a:this.getValue()};module$exports$Blockly$Field.Field.prototype.loadState=function(a){this.loadLegacyState(module$exports$Blockly$Field.Field,a)||this.setValue(a)}; -module$exports$Blockly$Field.Field.prototype.saveLegacyState=function(a){return a.prototype.saveState===this.saveState&&a.prototype.toXml!==this.toXml?(a=(0,$.module$exports$Blockly$utils$xml.createElement)("field"),a.setAttribute("name",this.name||""),(0,$.module$exports$Blockly$Xml.domToText)(this.toXml(a)).replace(' xmlns="https://developers.google.com/blockly/xml"',"")):null}; -module$exports$Blockly$Field.Field.prototype.loadLegacyState=function(a,b){return a.prototype.loadState===this.loadState&&a.prototype.fromXml!==this.fromXml?(this.fromXml((0,$.module$exports$Blockly$Xml.textToDom)(b)),!0):!1}; -module$exports$Blockly$Field.Field.prototype.dispose=function(){(0,module$exports$Blockly$dropDownDiv.hideIfOwner)(this);(0,module$exports$Blockly$WidgetDiv.hideIfOwner)(this);(0,module$exports$Blockly$Tooltip.unbindMouseEvents)(this.getClickTarget_());this.mouseDownWrapper_&&(0,module$exports$Blockly$browserEvents.unbind)(this.mouseDownWrapper_);(0,module$exports$Blockly$utils$dom.removeNode)(this.fieldGroup_);this.disposed=!0}; -module$exports$Blockly$Field.Field.prototype.updateEditable=function(){var a=this.fieldGroup_;this.EDITABLE&&a&&(this.enabled_&&this.sourceBlock_.isEditable()?((0,module$exports$Blockly$utils$dom.addClass)(a,"blocklyEditableText"),(0,module$exports$Blockly$utils$dom.removeClass)(a,"blocklyNonEditableText"),a.style.cursor=this.CURSOR):((0,module$exports$Blockly$utils$dom.addClass)(a,"blocklyNonEditableText"),(0,module$exports$Blockly$utils$dom.removeClass)(a,"blocklyEditableText"),a.style.cursor=""))}; -module$exports$Blockly$Field.Field.prototype.setEnabled=function(a){this.enabled_=a;this.updateEditable()};module$exports$Blockly$Field.Field.prototype.isEnabled=function(){return this.enabled_};module$exports$Blockly$Field.Field.prototype.isClickable=function(){return this.enabled_&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&this.showEditor_!==module$exports$Blockly$Field.Field.prototype.showEditor_}; -module$exports$Blockly$Field.Field.prototype.isCurrentlyEditable=function(){return this.enabled_&&this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()};module$exports$Blockly$Field.Field.prototype.isSerializable=function(){var a=!1;this.name&&(this.SERIALIZABLE?a=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),a=!0));return a}; -module$exports$Blockly$Field.Field.prototype.isVisible=function(){return this.visible_};module$exports$Blockly$Field.Field.prototype.setVisible=function(a){if(this.visible_!==a){this.visible_=a;var b=this.getSvgRoot();b&&(b.style.display=a?"block":"none")}};module$exports$Blockly$Field.Field.prototype.setValidator=function(a){this.validator_=a};module$exports$Blockly$Field.Field.prototype.getValidator=function(){return this.validator_};module$exports$Blockly$Field.Field.prototype.getSvgRoot=function(){return this.fieldGroup_}; -module$exports$Blockly$Field.Field.prototype.applyColour=function(){};module$exports$Blockly$Field.Field.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_()};module$exports$Blockly$Field.Field.prototype.showEditor=function(a){this.isClickable()&&this.showEditor_(a)};module$exports$Blockly$Field.Field.prototype.showEditor_=function(a){}; -module$exports$Blockly$Field.Field.prototype.updateSize_=function(a){var b=this.getConstants();a=void 0!==a?a:this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;var c=2*a,d=b.FIELD_TEXT_HEIGHT,e=0;this.textElement_&&(e=(0,module$exports$Blockly$utils$dom.getFastTextWidth)(this.textElement_,b.FIELD_TEXT_FONTSIZE,b.FIELD_TEXT_FONTWEIGHT,b.FIELD_TEXT_FONTFAMILY),c+=e);this.borderRect_&&(d=Math.max(d,b.FIELD_BORDER_RECT_HEIGHT));this.size_.height=d;this.size_.width=c;this.positionTextElement_(a, -e);this.positionBorderRect_()};module$exports$Blockly$Field.Field.prototype.positionTextElement_=function(a,b){if(this.textElement_){var c=this.getConstants(),d=this.size_.height/2;this.textElement_.setAttribute("x",this.sourceBlock_.RTL?this.size_.width-b-a:a);this.textElement_.setAttribute("y",c.FIELD_TEXT_BASELINE_CENTER?d:d-c.FIELD_TEXT_HEIGHT/2+c.FIELD_TEXT_BASELINE)}}; -module$exports$Blockly$Field.Field.prototype.positionBorderRect_=function(){this.borderRect_&&(this.borderRect_.setAttribute("width",this.size_.width),this.borderRect_.setAttribute("height",this.size_.height),this.borderRect_.setAttribute("rx",this.getConstants().FIELD_BORDER_RECT_RADIUS),this.borderRect_.setAttribute("ry",this.getConstants().FIELD_BORDER_RECT_RADIUS))}; -module$exports$Blockly$Field.Field.prototype.getSize=function(){if(!this.isVisible())return new module$exports$Blockly$utils$Size.Size(0,0);this.isDirty_?(this.render_(),this.isDirty_=!1):this.visible_&&0===this.size_.width&&(console.warn("Deprecated use of setting size_.width to 0 to rerender a field. Set field.isDirty_ to true instead."),this.render_());return this.size_}; -module$exports$Blockly$Field.Field.prototype.getScaledBBox=function(){if(this.borderRect_){var a=this.borderRect_.getBoundingClientRect();var b=(0,module$exports$Blockly$utils$style.getPageOffset)(this.borderRect_);var c=a.width;var d=a.height}else d=this.sourceBlock_.getHeightWidth(),a=this.sourceBlock_.workspace.scale,b=this.getAbsoluteXY_(),c=d.width*a,d=d.height*a,module$exports$Blockly$utils$userAgent.GECKO?(b.x+=1.5*a,b.y+=1.5*a):module$exports$Blockly$utils$userAgent.EDGE||module$exports$Blockly$utils$userAgent.IE|| -(b.x-=.5*a,b.y-=.5*a),c+=1*a,d+=1*a;return new module$exports$Blockly$utils$Rect.Rect(b.y,b.y+d,b.x,b.x+c)};module$exports$Blockly$Field.Field.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return module$exports$Blockly$Field.Field.NBSP;a.length>this.maxDisplayLength&&(a=a.substring(0,this.maxDisplayLength-2)+"\u2026");a=a.replace(/\s/g,module$exports$Blockly$Field.Field.NBSP);this.sourceBlock_&&this.sourceBlock_.RTL&&(a+="\u200f");return a}; -module$exports$Blockly$Field.Field.prototype.getText=function(){var a=this.getText_();return null!==a?String(a):String(this.getValue())};module$exports$Blockly$Field.Field.prototype.getText_=function(){return null};module$exports$Blockly$Field.Field.prototype.markDirty=function(){this.isDirty_=!0;this.constants_=null}; -module$exports$Blockly$Field.Field.prototype.forceRerender=function(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}; -module$exports$Blockly$Field.Field.prototype.setValue=function(a){if(null!==a){var b=this.doClassValidation_(a);a=this.processValidation_(a,b);if(!(a instanceof Error)){if(b=this.getValidator())if(b=b.call(this,a),a=this.processValidation_(a,b),a instanceof Error)return;b=this.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(this.doValueUpdate_(a),b&&(0,module$exports$Blockly$Events$utils.isEnabled)()&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CHANGE))(b, -"field",this.name||null,c,a)),this.isDirty_&&this.forceRerender())}}}};module$exports$Blockly$Field.Field.prototype.processValidation_=function(a,b){if(null===b)return this.doValueInvalid_(a),this.isDirty_&&this.forceRerender(),Error();void 0!==b&&(a=b);return a};module$exports$Blockly$Field.Field.prototype.getValue=function(){return this.value_};module$exports$Blockly$Field.Field.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:a}; -module$exports$Blockly$Field.Field.prototype.doValueUpdate_=function(a){this.value_=a;this.isDirty_=!0};module$exports$Blockly$Field.Field.prototype.doValueInvalid_=function(a){};module$exports$Blockly$Field.Field.prototype.onMouseDown_=function(a){this.sourceBlock_&&this.sourceBlock_.workspace&&(a=this.sourceBlock_.workspace.getGesture(a))&&a.setStartField(this)}; -module$exports$Blockly$Field.Field.prototype.setTooltip=function(a){a||""===a||(a=this.sourceBlock_);var b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a};module$exports$Blockly$Field.Field.prototype.getTooltip=function(){var a=this.getClickTarget_();return a?(0,module$exports$Blockly$Tooltip.getTooltipOfObject)(a):(0,module$exports$Blockly$Tooltip.getTooltipOfObject)({tooltip:this.tooltip_})}; -module$exports$Blockly$Field.Field.prototype.getClickTarget_=function(){return this.clickTarget_||this.getSvgRoot()};module$exports$Blockly$Field.Field.prototype.getAbsoluteXY_=function(){return(0,module$exports$Blockly$utils$style.getPageOffset)(this.getClickTarget_())};module$exports$Blockly$Field.Field.prototype.referencesVariables=function(){return!1};module$exports$Blockly$Field.Field.prototype.refreshVariableName=function(){}; -module$exports$Blockly$Field.Field.prototype.getParentInput=function(){for(var a=null,b=this.sourceBlock_,c=b.inputList,d=0;da.height;e&&(b-=d);this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"rowSpacerRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:b,width:a.width,height:d,stroke:e?"black":"blue",fill:"blue","fill-opacity":"0.5","stroke-width":"1px"}, -this.svgRoot_))}}; -module$exports$Blockly$blockRendering$Debug.Debug.prototype.drawSpacerElem=function(a,b,c){if(module$exports$Blockly$blockRendering$Debug.Debug.config.elemSpacers){b=Math.abs(a.width);var d=0>a.width,e=d?a.xPos-b:a.xPos;c&&(e=-(e+b));this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"elemSpacerRect blockRenderDebug",x:e,y:a.centerline-a.height/2,width:b,height:a.height,stroke:"pink",fill:d?"black":"pink","fill-opacity":"0.5", -"stroke-width":"1px"},this.svgRoot_))}}; -module$exports$Blockly$blockRendering$Debug.Debug.prototype.drawRenderedElem=function(a,b){if(module$exports$Blockly$blockRendering$Debug.Debug.config.elems){var c=a.xPos;b&&(c=-(c+a.width));b=a.centerline-a.height/2;this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"rowRenderingRect blockRenderDebug",x:c,y:b,width:a.width,height:a.height,stroke:"black",fill:"none","stroke-width":"1px"},this.svgRoot_));module$exports$Blockly$blockRendering$Types.Types.isField(a)&& -a instanceof module$exports$Blockly$blockRendering$Field.Field&&a.field instanceof $.module$exports$Blockly$FieldLabel.FieldLabel&&this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"rowRenderingRect blockRenderDebug",x:c,y:b+this.constants_.FIELD_TEXT_BASELINE,width:a.width,height:"0.1px",stroke:"red",fill:"none","stroke-width":"0.5px"},this.svgRoot_))}module$exports$Blockly$blockRendering$Types.Types.isInput(a)&&a instanceof -module$exports$Blockly$blockRendering$InputConnection.InputConnection&&module$exports$Blockly$blockRendering$Debug.Debug.config.connections&&this.drawConnection(a.connectionModel)}; -module$exports$Blockly$blockRendering$Debug.Debug.prototype.drawConnection=function(a){if(module$exports$Blockly$blockRendering$Debug.Debug.config.connections){if(a.type===$.module$exports$Blockly$ConnectionType.ConnectionType.INPUT_VALUE){var b=4;var c="magenta";var d="none"}else a.type===$.module$exports$Blockly$ConnectionType.ConnectionType.OUTPUT_VALUE?(b=2,d=c="magenta"):a.type===$.module$exports$Blockly$ConnectionType.ConnectionType.NEXT_STATEMENT?(b=4,c="goldenrod",d="none"):a.type===$.module$exports$Blockly$ConnectionType.ConnectionType.PREVIOUS_STATEMENT&& -(b=2,d=c="goldenrod");this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CIRCLE,{"class":"blockRenderDebug",cx:a.offsetInBlock_.x,cy:a.offsetInBlock_.y,r:b,fill:d,stroke:c},this.svgRoot_))}}; -module$exports$Blockly$blockRendering$Debug.Debug.prototype.drawRenderedRow=function(a,b,c){module$exports$Blockly$blockRendering$Debug.Debug.config.rows&&(this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"elemRenderingRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:a.yPos,width:a.width,height:a.height,stroke:"red",fill:"none","stroke-width":"1px"},this.svgRoot_)),module$exports$Blockly$blockRendering$Types.Types.isTopOrBottomRow(a)|| -module$exports$Blockly$blockRendering$Debug.Debug.config.connectedBlockBounds&&this.debugElements_.push((0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"connectedBlockWidth blockRenderDebug",x:c?-(a.xPos+a.widthWithConnectedBlocks):a.xPos,y:a.yPos,width:a.widthWithConnectedBlocks,height:a.height,stroke:this.randomColour_,fill:"none","stroke-width":"1px","stroke-dasharray":"3,3"},this.svgRoot_)))}; -module$exports$Blockly$blockRendering$Debug.Debug.prototype.drawRowWithElements=function(a,b,c){for(var d=0;da||a>this.fieldRow.length)throw Error("index "+a+" out of bounds.");if(!(b||""===b&&c))return a;"string"===typeof b&&(b=(0,module$exports$Blockly$fieldRegistry.fromJson)({type:"field_label",text:b}));b.setSourceBlock(this.sourceBlock_);this.sourceBlock_.rendered&&(b.init(),b.applyColour());b.name=c;b.setVisible(this.isVisible());b.prefixField&&(a=this.insertFieldAt(a,b.prefixField));this.fieldRow.splice(a,0,b);a++;b.suffixField&& -(a=this.insertFieldAt(a,b.suffixField));this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours());return a}; -$.module$exports$Blockly$Input.Input.prototype.removeField=function(a,b){for(var c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');};$.module$exports$Blockly$Input.Input.prototype.isVisible=function(){return this.visible_}; -$.module$exports$Blockly$Input.Input.prototype.setVisible=function(a){var b=[];if(this.visible_===a)return b;this.visible_=a;for(var c=0,d;d=this.fieldRow[c];c++)d.setVisible(a);this.connection&&(this.connection=this.connection,a?b=this.connection.startTrackingAll():this.connection.stopTrackingAll(),c=this.connection.targetBlock())&&(c.getSvgRoot().style.display=a?"block":"none");return b};$.module$exports$Blockly$Input.Input.prototype.markDirty=function(){for(var a=0,b;b=this.fieldRow[a];a++)b.markDirty()}; -$.module$exports$Blockly$Input.Input.prototype.setCheck=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setCheck(a);return this};$.module$exports$Blockly$Input.Input.prototype.setAlign=function(a){this.align=a;this.sourceBlock_.rendered&&(this.sourceBlock_=this.sourceBlock_,this.sourceBlock_.render());return this}; -$.module$exports$Blockly$Input.Input.prototype.setShadowDom=function(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this};$.module$exports$Blockly$Input.Input.prototype.getShadowDom=function(){if(!this.connection)throw Error("This input does not have a connection.");return this.connection.getShadowDom()};$.module$exports$Blockly$Input.Input.prototype.init=function(){if(this.sourceBlock_.workspace.rendered)for(var a=0;aa.length)){b=[];for(c=0;ca&&(e=e.substring(0,a-3)+"...");return e};module$exports$Blockly$Block.Block.prototype.appendValueInput=function(a){return this.appendInput_($.module$exports$Blockly$inputTypes.inputTypes.VALUE,a)}; -module$exports$Blockly$Block.Block.prototype.appendStatementInput=function(a){return this.appendInput_($.module$exports$Blockly$inputTypes.inputTypes.STATEMENT,a)};module$exports$Blockly$Block.Block.prototype.appendDummyInput=function(a){return this.appendInput_($.module$exports$Blockly$inputTypes.inputTypes.DUMMY,a||"")}; -module$exports$Blockly$Block.Block.prototype.jsonInit=function(a){var b=a.type?'Block "'+a.type+'": ':"";if(a.output&&a.previousStatement)throw Error(b+"Must not have both an output and a previousStatement.");a.style&&a.style.hat&&(this.hat=a.style.hat,a.style=null);if(a.style&&a.colour)throw Error(b+"Must not have both a colour and a style.");a.style?this.jsonInitStyle_(a,b):this.jsonInitColour_(a,b);for(var c=0;void 0!==a["message"+c];)this.interpolate_(a["message"+c],a["args"+c]||[],a["lastDummyAlign"+ -c],b),c++;void 0!==a.inputsInline&&this.setInputsInline(a.inputsInline);void 0!==a.output&&this.setOutput(!0,a.output);void 0!==a.outputShape&&this.setOutputShape(a.outputShape);void 0!==a.previousStatement&&this.setPreviousStatement(!0,a.previousStatement);void 0!==a.nextStatement&&this.setNextStatement(!0,a.nextStatement);void 0!==a.tooltip&&(c=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a.tooltip),this.setTooltip(c));void 0!==a.enableContextMenu&&(this.contextMenu=!!a.enableContextMenu); -void 0!==a.suppressPrefixSuffix&&(this.suppressPrefixSuffix=!!a.suppressPrefixSuffix);void 0!==a.helpUrl&&(c=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a.helpUrl),this.setHelpUrl(c));"string"===typeof a.extensions&&(console.warn(b+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+a.type+"' block."),a.extensions=[a.extensions]);void 0!==a.mutator&&(0,$.module$exports$Blockly$Extensions.apply)(a.mutator,this,!0);a=a.extensions;if(Array.isArray(a))for(b= -0;bf||f>b)throw Error('Block "'+this.type+'": Message index %'+f+" out of range.");if(c[f])throw Error('Block "'+this.type+'": Message index %'+f+" duplicated.");c[f]=!0;d++}}if(d!==b)throw Error('Block "'+this.type+'": Message does not reference all '+b+" arg(s).");}; -module$exports$Blockly$Block.Block.prototype.interpolateArguments_=function(a,b,c){for(var d=[],e=0;e=this.inputList.length)throw RangeError("Input index "+a+" out of bounds.");if(b>this.inputList.length)throw RangeError("Reference input "+b+" out of bounds.");var c=this.inputList[a];this.inputList.splice(a,1);a=this.connections_.length)return-1;b=a.y;for(var d=c;0<=d&&this.connections_[d].y===b;){if(this.connections_[d]===a)return d;d--}for(d=c;da)c=d;else{b=d;break}}return b}; -module$exports$Blockly$ConnectionDB.ConnectionDB.prototype.removeConnection=function(a,b){a=this.findIndexOfConnection_(a,b);if(-1===a)throw Error("Unable to find connection in connectionDB.");this.connections_.splice(a,1)}; -module$exports$Blockly$ConnectionDB.ConnectionDB.prototype.getNeighbours=function(a,b){function c(l){var m=e-d[l].x,n=f-d[l].y;Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return nthis.previousScale_){var c=b-this.previousScale_;c=0Object.keys(this.cachedPoints_).length&&(this.cachedPoints_=Object.create(null),this.previousScale_=0)}; -module$exports$Blockly$TouchGesture.TouchGesture.prototype.getTouchPoint=function(a){return this.startWorkspace_?new module$exports$Blockly$utils$Coordinate.Coordinate(a.changedTouches?a.changedTouches[0].pageX:a.pageX,a.changedTouches?a.changedTouches[0].pageY:a.pageY):null};var module$exports$Blockly$WorkspaceAudio={},module$contents$Blockly$WorkspaceAudio_SOUND_LIMIT=100;module$exports$Blockly$WorkspaceAudio.WorkspaceAudio=function(a){this.parentWorkspace_=a;this.SOUNDS_=Object.create(null);this.lastSound_=null};module$exports$Blockly$WorkspaceAudio.WorkspaceAudio.prototype.dispose=function(){this.SOUNDS_=this.parentWorkspace_=null}; -module$exports$Blockly$WorkspaceAudio.WorkspaceAudio.prototype.load=function(a,b){if(a.length){try{var c=new $.module$exports$Blockly$utils$global.globalThis.Audio}catch(h){return}for(var d,e=0;eMath.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_))){var d=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.VIEWPORT_CHANGE))(b,c,a,this.id,this.oldScale_);this.oldScale_=a;this.oldTop_=b;this.oldLeft_=c;(0,module$exports$Blockly$Events$utils.fire)(d)}}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.translate=function(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_)this.workspaceDragSurface_.translateSurface(a,b);else{var c="translate("+a+","+b+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",c);this.svgBubbleCanvas_.setAttribute("transform",c)}this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.resetDragSurface=function(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_=!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.setupDragSurface=function(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b=parseInt(this.getParentSvg().getAttribute("width"),10),c=parseInt(this.getParentSvg().getAttribute("height"),10),d=(0,module$exports$Blockly$utils$svgMath.getRelativeXY)(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,b, -c,this.scale);this.workspaceDragSurface_.translateSurface(d.x,d.y)}};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.getBlockDragSurface=function(){return this.blockDragSurface_};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.getWidth=function(){var a=this.getMetrics();return a?a.viewWidth/this.scale:0}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.setVisible=function(a){this.isVisible_=a;if(this.svgGroup_)if(this.scrollbar&&this.scrollbar.setContainerVisible(a),this.getFlyout()&&this.getFlyout().setContainerVisible(a),this.getParentSvg().style.display=a?"block":"none",this.toolbox_&&this.toolbox_.setVisible(a),a){a=this.getAllBlocks(!1);for(var b=a.length-1;0<=b;b--)a[b].markDirty();this.render();this.toolbox_&&this.toolbox_.position()}else this.hideChaff(!0)}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.render=function(){for(var a=this.getAllBlocks(!1),b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=Math.abs(c-h.x)&&1>=Math.abs(d-h.y)){f=!0;break}}if(!f){var k=e.getConnections_(!1);a=0;for(b=void 0;b=k[a];a++)if(b.closest($.module$exports$Blockly$config.config.snapRadius,new module$exports$Blockly$utils$Coordinate.Coordinate(c,d)).connection){f=!0;break}}f&&(c=this.RTL?c-$.module$exports$Blockly$config.config.snapRadius:c+$.module$exports$Blockly$config.config.snapRadius,d+=2*$.module$exports$Blockly$config.config.snapRadius)}while(f); -e.moveTo(new module$exports$Blockly$utils$Coordinate.Coordinate(c,d))}}finally{(0,module$exports$Blockly$Events$utils.enable)()}(0,module$exports$Blockly$Events$utils.isEnabled)()&&!e.isShadow()&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CREATE))(e));e.select();return e}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.pasteWorkspaceComment_=function(a){(0,module$exports$Blockly$Events$utils.disable)();try{var b=module$exports$Blockly$WorkspaceCommentSvg.fromXml(a,this);var c=parseInt(a.getAttribute("x"),10),d=parseInt(a.getAttribute("y"),10);isNaN(c)||isNaN(d)||(this.RTL&&(c=-c),b.moveBy(c+50,d+50))}finally{(0,module$exports$Blockly$Events$utils.enable)()}(0,module$exports$Blockly$Events$utils.isEnabled)()&&module$exports$Blockly$WorkspaceComment.fireCreateEvent(b); -b.select();return b};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.refreshToolboxSelection=function(){var a=this.isFlyout?this.targetWorkspace:this;a&&!a.currentGesture_&&a.toolbox_&&a.toolbox_.getFlyout()&&a.toolbox_.refreshSelection()};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.renameVariableById=function(a,b){module$exports$Blockly$Workspace.Workspace.prototype.renameVariableById.call(this,a,b);this.refreshToolboxSelection()}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.deleteVariableById=function(a){module$exports$Blockly$Workspace.Workspace.prototype.deleteVariableById.call(this,a);this.refreshToolboxSelection()};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.createVariable=function(a,b,c){a=module$exports$Blockly$Workspace.Workspace.prototype.createVariable.call(this,a,b,c);this.refreshToolboxSelection();return a}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.recordDeleteAreas=function(){module$exports$Blockly$utils.deprecation.warn("WorkspaceSvg.prototype.recordDeleteAreas","June 2021","June 2022","WorkspaceSvg.prototype.recordDragTargets");this.recordDragTargets()}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.recordDragTargets=function(){var a=this.componentManager_.getComponents(module$exports$Blockly$ComponentManager.ComponentManager.Capability.DRAG_TARGET,!0);this.dragTargetAreas_=[];for(var b=0,c;c=a[b];b++){var d=c.getClientRect();d&&this.dragTargetAreas_.push({component:c,clientRect:d})}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.getDragTarget=function(a){for(var b=0,c;c=this.dragTargetAreas_[b];b++)if(c.clientRect.contains(a.clientX,a.clientY))return c.component;return null};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.onMouseDown_=function(a){var b=this.getGesture(a);b&&b.handleWsStart(a,this)}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.startDrag=function(a,b){a=(0,module$exports$Blockly$browserEvents.mouseToSvg)(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;this.dragDeltaXY_=module$exports$Blockly$utils$Coordinate.Coordinate.difference(b,a)}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.moveDrag=function(a){a=(0,module$exports$Blockly$browserEvents.mouseToSvg)(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return module$exports$Blockly$utils$Coordinate.Coordinate.sum(this.dragDeltaXY_,a)};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.isDragging=function(){return null!==this.currentGesture_&&this.currentGesture_.isDragging()}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.isDraggable=function(){return this.options.moveOptions&&this.options.moveOptions.drag};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.isMovable=function(){return this.options.moveOptions&&!!this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.isMovableHorizontally=function(){var a=!!this.scrollbar;return this.isMovable()&&(!a||a&&this.scrollbar.canScrollHorizontally())};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.isMovableVertically=function(){var a=!!this.scrollbar;return this.isMovable()&&(!a||a&&this.scrollbar.canScrollVertically())}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.onMouseWheel_=function(a){if(module$exports$Blockly$Gesture.Gesture.inProgress())a.preventDefault(),a.stopPropagation();else{var b=this.options.zoomOptions&&this.options.zoomOptions.wheel,c=this.options.moveOptions&&this.options.moveOptions.wheel;if(b||c){var d=(0,module$exports$Blockly$browserEvents.getScrollDeltaPixels)(a);if(module$exports$Blockly$utils$userAgent.MAC)var e=a.metaKey;b&&(a.ctrlKey||e||!c)?(d=-d.y/50,b=(0,module$exports$Blockly$browserEvents.mouseToSvg)(a, -this.getParentSvg(),this.getInverseScreenCTM()),this.zoom(b.x,b.y,d)):(b=this.scrollX-d.x,c=this.scrollY-d.y,a.shiftKey&&!d.x&&(b=this.scrollX-d.y,c=this.scrollY),this.scroll(b,c));a.preventDefault()}}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.getBlocksBoundingBox=function(){var a=this.getTopBoundedElements();if(!a.length)return new module$exports$Blockly$utils$Rect.Rect(0,0,0,0);for(var b=a[0].getBoundingRectangle(),c=1;cb.bottom&&(b.bottom=d.bottom),d.leftb.right&&(b.right=d.right))}return b}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.cleanUp=function(){this.setResizesEnabled(!1);(0,module$exports$Blockly$Events$utils.setGroup)(!0);for(var a=this.getTopBlocks(!0),b=0,c=0,d;d=a[c];c++)if(d.isMovable()){var e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+this.renderer_.getConstants().MIN_BLOCK_HEIGHT}(0,module$exports$Blockly$Events$utils.setGroup)(!1);this.setResizesEnabled(!0)}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.showContextMenu=function(a){if(!this.options.readOnly&&!this.isFlyout){var b=module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.registry.getContextMenuOptions(module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);(0,$.module$exports$Blockly$ContextMenu.show)(a,b,this.RTL)}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.updateToolbox=function(a){if(a=(0,module$exports$Blockly$utils$toolbox.convertToolboxDefToJson)(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox.");if((0,module$exports$Blockly$utils$toolbox.hasCategories)(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode."); -this.options.languageTree=a;this.flyout_.show(a)}}else if(this.options.languageTree)throw Error("Can't nullify an existing toolbox.");};module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.markFocused=function(){this.options.parentWorkspace?this.options.parentWorkspace.markFocused():((0,$.module$exports$Blockly$common.setMainWorkspace)(this),this.setBrowserFocus())}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.setBrowserFocus=function(){document.activeElement&&document.activeElement.blur&&document.activeElement.blur();try{this.getParentSvg().focus({preventScroll:!0})}catch(a){try{this.getParentSvg().parentNode.setActive()}catch(b){this.getParentSvg().parentNode.focus({preventScroll:!0})}}}; -module$exports$Blockly$WorkspaceSvg.WorkspaceSvg.prototype.zoom=function(a,b,c){c=Math.pow(this.options.zoomOptions.scaleSpeed,c);var d=this.scale*c;if(this.scale!==d){d>this.options.zoomOptions.maxScale?c=this.options.zoomOptions.maxScale/this.scale:dthis.options.zoomOptions.maxScale?a=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&a-b||a<-180+b||a>180-b?!0:!1}; -module$exports$Blockly$VerticalFlyout.VerticalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.left;return this.toolboxPosition_===module$exports$Blockly$utils$toolbox.Position.LEFT?new module$exports$Blockly$utils$Rect.Rect(-1E9,1E9,-1E9,b+a.width):new module$exports$Blockly$utils$Rect.Rect(-1E9,1E9,b,1E9)}; -module$exports$Blockly$VerticalFlyout.VerticalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.getFlyoutScale();for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++){var e=d.getHeightWidth().width;d.outputConnection&&(e-=this.tabWidth_);a=Math.max(a,e)}for(c=0;d=this.buttons_[c];c++)a=Math.max(a,d.width);a+=1.5*this.MARGIN+this.tabWidth_;a*=this.workspace_.scale;a+=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness;if(this.width_!==a){for(c=0;d=b[c];c++){if(this.RTL){e= -d.getRelativeToSurfaceXY().x;var f=a/this.workspace_.scale-this.MARGIN;d.outputConnection||(f-=this.tabWidth_);d.moveBy(f-e,0)}this.rectMap_.has(d)&&this.moveRectToBlock_(this.rectMap_.get(d),d)}if(this.RTL)for(b=0;c=this.buttons_[b];b++)d=c.getPosition().y,c.moveTo(a/this.workspace_.scale-c.width-this.MARGIN-this.tabWidth_,d);this.targetWorkspace.toolboxPosition!==this.toolboxPosition_||this.toolboxPosition_!==module$exports$Blockly$utils$toolbox.Position.LEFT||this.targetWorkspace.getToolbox()|| -this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY);this.width_=a;this.position();this.targetWorkspace.recordDragTargets()}};module$exports$Blockly$VerticalFlyout.VerticalFlyout.registryName="verticalFlyout";(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.FLYOUTS_VERTICAL_TOOLBOX,module$exports$Blockly$registry.DEFAULT,module$exports$Blockly$VerticalFlyout.VerticalFlyout);var module$exports$Blockly$IToolboxItem={IToolboxItem:function(){}};var module$exports$Blockly$ISelectableToolboxItem={ISelectableToolboxItem:function(){}};var module$exports$Blockly$ICollapsibleToolboxItem={ICollapsibleToolboxItem:function(){}};var module$exports$Blockly$ToolboxItem={ToolboxItem:function(a,b,c){this.id_=a.toolboxitemid||(0,module$exports$Blockly$utils$idGenerator.getNextUniqueId)();this.level_=(this.parent_=c||null)?this.parent_.getLevel()+1:0;this.toolboxItemDef_=a;this.parentToolbox_=b;this.workspace_=this.parentToolbox_.getWorkspace()}};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.init=function(){};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.getDiv=function(){return null}; -module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.getClickTarget=function(){return null};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.getId=function(){return this.id_};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.getParent=function(){return null};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.getLevel=function(){return this.level_};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.isSelectable=function(){return!1}; -module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.isCollapsible=function(){return!1};module$exports$Blockly$ToolboxItem.ToolboxItem.prototype.dispose=function(){};var module$exports$Blockly$ToolboxCategory={ToolboxCategory:function(a,b,c){module$exports$Blockly$ToolboxItem.ToolboxItem.call(this,a,b,c);this.colour_=this.name_="";this.labelDom_=this.iconDom_=this.rowContents_=this.rowDiv_=this.htmlDiv_=null;this.cssConfig_=this.makeDefaultCssConfig_();this.isDisabled_=this.isHidden_=!1;this.flyoutItems_=[]}};$.$jscomp.inherits(module$exports$Blockly$ToolboxCategory.ToolboxCategory,module$exports$Blockly$ToolboxItem.ToolboxItem); -module$exports$Blockly$ToolboxCategory.ToolboxCategory.prototype.init=function(){this.parseCategoryDef_(this.toolboxItemDef_);this.parseContents_(this.toolboxItemDef_);this.createDom_();"true"===this.toolboxItemDef_.hidden&&this.hide()}; -module$exports$Blockly$ToolboxCategory.ToolboxCategory.prototype.makeDefaultCssConfig_=function(){return{container:"blocklyToolboxCategory",row:"blocklyTreeRow",rowcontentcontainer:"blocklyTreeRowContentContainer",icon:"blocklyTreeIcon",label:"blocklyTreeLabel",contents:"blocklyToolboxContents",selected:"blocklyTreeSelected",openicon:"blocklyTreeIconOpen",closedicon:"blocklyTreeIconClosed"}}; -module$exports$Blockly$ToolboxCategory.ToolboxCategory.prototype.parseContents_=function(a){var b=a.contents;if(a.custom)this.flyoutItems_=a.custom;else if(b)for(a=0;a>>/sprites.png);\n height: 16px;\n vertical-align: middle;\n visibility: hidden;\n width: 16px;\n}\n\n.blocklyTreeIconClosed {\n background-position: -32px -1px;\n}\n\n.blocklyToolboxDiv[dir="RTL"] .blocklyTreeIconClosed {\n background-position: 0 -1px;\n}\n\n.blocklyTreeSelected>.blocklyTreeIconClosed {\n background-position: -32px -17px;\n}\n\n.blocklyToolboxDiv[dir="RTL"] .blocklyTreeSelected>.blocklyTreeIconClosed {\n background-position: 0 -17px;\n}\n\n.blocklyTreeIconOpen {\n background-position: -16px -1px;\n}\n\n.blocklyTreeSelected>.blocklyTreeIconOpen {\n background-position: -16px -17px;\n}\n\n.blocklyTreeLabel {\n cursor: default;\n font: 16px sans-serif;\n padding: 0 3px;\n vertical-align: middle;\n}\n\n.blocklyToolboxDelete .blocklyTreeLabel {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyTreeSelected .blocklyTreeLabel {\n color: #fff;\n}\n'); -(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.TOOLBOX_ITEM,module$exports$Blockly$ToolboxCategory.ToolboxCategory.registrationName,module$exports$Blockly$ToolboxCategory.ToolboxCategory);var module$exports$Blockly$ToolboxSeparator={ToolboxSeparator:function(a,b){module$exports$Blockly$ToolboxItem.ToolboxItem.call(this,a,b);this.cssConfig_={container:"blocklyTreeSeparator"};this.htmlDiv_=null;(0,$.module$exports$Blockly$utils$object.mixin)(this.cssConfig_,a.cssconfig||a.cssConfig)}};$.$jscomp.inherits(module$exports$Blockly$ToolboxSeparator.ToolboxSeparator,module$exports$Blockly$ToolboxItem.ToolboxItem);module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.prototype.init=function(){this.createDom_()}; -module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.prototype.createDom_=function(){var a=document.createElement("div");(0,module$exports$Blockly$utils$dom.addClass)(a,this.cssConfig_.container);return this.htmlDiv_=a};module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.prototype.getDiv=function(){return this.htmlDiv_};module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.prototype.dispose=function(){(0,module$exports$Blockly$utils$dom.removeNode)(this.htmlDiv_)}; -module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.registrationName="sep";(0,module$exports$Blockly$Css.register)('\n.blocklyTreeSeparator {\n border-bottom: solid #e5e5e5 1px;\n height: 0;\n margin: 5px 0;\n}\n\n.blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {\n border-right: solid #e5e5e5 1px;\n border-bottom: none;\n height: auto;\n margin: 0 5px 0 5px;\n padding: 5px 0;\n width: 0;\n}\n'); -(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.TOOLBOX_ITEM,module$exports$Blockly$ToolboxSeparator.ToolboxSeparator.registrationName,module$exports$Blockly$ToolboxSeparator.ToolboxSeparator);var module$exports$Blockly$CollapsibleToolboxCategory={CollapsibleToolboxCategory:function(a,b,c){module$exports$Blockly$ToolboxCategory.ToolboxCategory.call(this,a,b,c);this.subcategoriesDiv_=null;this.expanded_=!1;this.toolboxItems_=[]}};$.$jscomp.inherits(module$exports$Blockly$CollapsibleToolboxCategory.CollapsibleToolboxCategory,module$exports$Blockly$ToolboxCategory.ToolboxCategory); -module$exports$Blockly$CollapsibleToolboxCategory.CollapsibleToolboxCategory.prototype.makeDefaultCssConfig_=function(){var a=module$exports$Blockly$ToolboxCategory.ToolboxCategory.prototype.makeDefaultCssConfig_.call(this);a.contents="blocklyToolboxContents";return a}; -module$exports$Blockly$CollapsibleToolboxCategory.CollapsibleToolboxCategory.prototype.parseContents_=function(a){var b=a.contents,c=!0;if(a.custom)this.flyoutItems_=a.custom;else if(b)for(a=0;a>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxGrab {\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Category tree in Toolbox. */\n.blocklyToolboxDiv {\n background-color: #ddd;\n overflow-x: visible;\n overflow-y: auto;\n padding: 4px 0 4px 0;\n position: absolute;\n z-index: 70; /* so blocks go under toolbox when dragging */\n -webkit-tap-highlight-color: transparent; /* issue #1345 */\n}\n\n.blocklyToolboxContents {\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n}\n\n.blocklyToolboxContents:focus {\n outline: none;\n}\n'); -(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.TOOLBOX,module$exports$Blockly$registry.DEFAULT,module$exports$Blockly$Toolbox.Toolbox);var module$exports$Blockly$HorizontalFlyout={HorizontalFlyout:function(a){module$exports$Blockly$Flyout.Flyout.call(this,a);this.horizontalLayout=!0}};$.$jscomp.inherits(module$exports$Blockly$HorizontalFlyout.HorizontalFlyout,module$exports$Blockly$Flyout.Flyout); -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.setMetrics_=function(a){if(this.isVisible()){var b=this.workspace_.getMetricsManager(),c=b.getScrollMetrics(),d=b.getViewMetrics();b=b.getAbsoluteMetrics();"number"===typeof a.x&&(this.workspace_.scrollX=-(c.left+(c.width-d.width)*a.x));this.workspace_.translate(this.workspace_.scrollX+b.left,this.workspace_.scrollY+b.top)}};module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.getX=function(){return 0}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.getY=function(){if(!this.isVisible())return 0;var a=this.targetWorkspace.getMetricsManager(),b=a.getAbsoluteMetrics(),c=a.getViewMetrics();a=a.getToolboxMetrics();var d=this.toolboxPosition_===module$exports$Blockly$utils$toolbox.Position.TOP;return this.targetWorkspace.toolboxPosition===this.toolboxPosition_?this.targetWorkspace.getToolbox()?d?a.height:c.height-this.height_:d?0:c.height:d?0:c.height+b.top-this.height_}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.position=function(){if(this.isVisible()&&this.targetWorkspace.isVisible()){var a=this.targetWorkspace.getMetricsManager().getViewMetrics();this.width_=a.width;this.setBackgroundPath_(a.width-2*this.CORNER_RADIUS,this.height_-this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.setBackgroundPath_=function(a,b){var c=this.toolboxPosition_===module$exports$Blockly$utils$toolbox.Position.TOP,d=["M 0,"+(c?0:this.CORNER_RADIUS)];c?(d.push("h",a+2*this.CORNER_RADIUS),d.push("v",b),d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,this.CORNER_RADIUS),d.push("h",-a),d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,-this.CORNER_RADIUS)):(d.push("a",this.CORNER_RADIUS, -this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,-this.CORNER_RADIUS),d.push("h",a),d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,this.CORNER_RADIUS),d.push("v",b),d.push("h",-a-2*this.CORNER_RADIUS));d.push("z");this.svgBackground_.setAttribute("d",d.join(" "))};module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.scrollToStart=function(){this.workspace_.scrollbar.setX(this.RTL?Infinity:0)}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.wheel_=function(a){var b=(0,module$exports$Blockly$browserEvents.getScrollDeltaPixels)(a);if(b=b.x||b.y){var c=this.workspace_.getMetricsManager(),d=c.getScrollMetrics();b=c.getViewMetrics().left-d.left+b;this.workspace_.scrollbar.setX(b);(0,module$exports$Blockly$WidgetDiv.hide)();(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)()}a.preventDefault();a.stopPropagation()}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.layout_=function(a,b){this.workspace_.scale=this.targetWorkspace.scale;var c=this.MARGIN,d=c+this.tabWidth_;this.RTL&&(a=a.reverse());for(var e=0,f;f=a[e];e++)if("block"===f.type){f=f.block;for(var g=f.getDescendants(!1),h=0,k;k=g[h];h++)k.isInFlyout=!0;f.render();g=f.getSvgRoot();h=f.getHeightWidth();k=f.outputConnection?this.tabWidth_:0;k=this.RTL?d+h.width:d-k;f.moveBy(k,c);k=this.createRect_(f,k,c,h,e);d+=h.width+b[e];this.addBlockListeners_(g, -f,k)}else"button"===f.type&&(this.initFlyoutButton_(f.button,d,c),d+=f.button.width+b[e])};module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.isDragTowardWorkspace=function(a){a=Math.atan2(a.y,a.x)/Math.PI*180;var b=this.dragAngleRange_;return a<90+b&&a>90-b||a>-90-b&&a<-90+b?!0:!1}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.getClientRect=function(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;var a=this.svgGroup_.getBoundingClientRect(),b=a.top;return this.toolboxPosition_===module$exports$Blockly$utils$toolbox.Position.TOP?new module$exports$Blockly$utils$Rect.Rect(-1E9,b+a.height,-1E9,1E9):new module$exports$Blockly$utils$Rect.Rect(b,1E9,-1E9,1E9)}; -module$exports$Blockly$HorizontalFlyout.HorizontalFlyout.prototype.reflowInternal_=function(){this.workspace_.scale=this.getFlyoutScale();for(var a=0,b=this.workspace_.getTopBlocks(!1),c=0,d;d=b[c];c++)a=Math.max(a,d.getHeightWidth().height);c=this.buttons_;d=0;for(var e;e=c[d];d++)a=Math.max(a,e.height);a+=1.5*this.MARGIN;a*=this.workspace_.scale;a+=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness;if(this.height_!==a){for(c=0;d=b[c];c++)this.rectMap_.has(d)&&this.moveRectToBlock_(this.rectMap_.get(d), -d);this.targetWorkspace.toolboxPosition!==this.toolboxPosition_||this.toolboxPosition_!==module$exports$Blockly$utils$toolbox.Position.TOP||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position();this.targetWorkspace.recordDragTargets()}};(0,module$exports$Blockly$registry.register)(module$exports$Blockly$registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX,module$exports$Blockly$registry.DEFAULT,module$exports$Blockly$HorizontalFlyout.HorizontalFlyout);$.module$exports$Blockly$Generator={Generator:function(a){this.name_=a;this.FUNCTION_NAME_PLACEHOLDER_="{leCUI8hutHZI4480Dc}";this.FUNCTION_NAME_PLACEHOLDER_REGEXP_=new RegExp(this.FUNCTION_NAME_PLACEHOLDER_,"g");this.STATEMENT_SUFFIX=this.STATEMENT_PREFIX=this.INFINITE_LOOP_TRAP=null;this.INDENT=" ";this.COMMENT_WRAP=60;this.ORDER_OVERRIDES=[];this.isInitialized=null;this.RESERVED_WORDS_="";this.nameDB_=this.functionNames_=this.definitions_=void 0}}; -$.module$exports$Blockly$Generator.Generator.prototype.workspaceToCode=function(a){a||(console.warn("No workspace specified in workspaceToCode call. Guessing."),a=(0,$.module$exports$Blockly$common.getMainWorkspace)());var b=[];this.init(a);a=a.getTopBlocks(!0);for(var c=0,d;d=a[c];c++){var e=this.blockToCode(d);Array.isArray(e)&&(e=e[0]);e&&(d.outputConnection&&(e=this.scrubNakedValue(e),this.STATEMENT_PREFIX&&!d.suppressPrefixSuffix&&(e=this.injectId(this.STATEMENT_PREFIX,d)+e),this.STATEMENT_SUFFIX&& -!d.suppressPrefixSuffix&&(e+=this.injectId(this.STATEMENT_SUFFIX,d))),b.push(e))}b=b.join("\n");b=this.finish(b);b=b.replace(/^\s+\n/,"");b=b.replace(/\n\s+$/,"\n");return b=b.replace(/[ \t]+\n/g,"\n")};$.module$exports$Blockly$Generator.Generator.prototype.prefixLines=function(a,b){return b+a.replace(/(?!\n$)\n/g,"\n"+b)}; -$.module$exports$Blockly$Generator.Generator.prototype.allNestedComments=function(a){var b=[];a=a.getDescendants(!0);for(var c=0;c=a&&this.sourceBlock_.outputConnection&&!b}else this.fullBlockClickTarget_=!1;this.fullBlockClickTarget_?this.clickTarget_=this.sourceBlock_.getSvgRoot():this.createBorderRect_();this.createTextElement_()}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.doClassValidation_=function(a){return null===a||void 0===a?null:String(a)}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.doValueInvalid_=function(a){this.isBeingEdited_&&(this.isTextValid_=!1,a=this.value_,this.value_=this.htmlInput_.untypedDefaultValue_,this.sourceBlock_&&(0,module$exports$Blockly$Events$utils.isEnabled)()&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CHANGE))(this.sourceBlock_,"field",this.name||null,a,this.value_)))}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.doValueUpdate_=function(a){this.isTextValid_=!0;this.value_=a;this.isBeingEdited_||(this.isDirty_=!0)};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.applyColour=function(){this.sourceBlock_&&this.getConstants().FULL_BLOCK_FIELDS&&(this.borderRect_?this.borderRect_.setAttribute("stroke",this.sourceBlock_.style.colourTertiary):this.sourceBlock_.pathObject.svgPath.setAttribute("fill",this.getConstants().FIELD_BORDER_RECT_COLOUR))}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.render_=function(){module$exports$Blockly$Field.Field.prototype.render_.call(this);if(this.isBeingEdited_){this.resizeEditor_();var a=this.htmlInput_;this.isTextValid_?((0,module$exports$Blockly$utils$dom.removeClass)(a,"blocklyInvalidInput"),(0,module$exports$Blockly$utils$aria.setState)(a,module$exports$Blockly$utils$aria.State.INVALID,!1)):((0,module$exports$Blockly$utils$dom.addClass)(a,"blocklyInvalidInput"),(0,module$exports$Blockly$utils$aria.setState)(a, -module$exports$Blockly$utils$aria.State.INVALID,!0))}};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.setSpellcheck=function(a){a!==this.spellcheck_&&(this.spellcheck_=a,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.showEditor_=function(a,b){this.workspace_=this.sourceBlock_.workspace;a=b||!1;!a&&(module$exports$Blockly$utils$userAgent.MOBILE||module$exports$Blockly$utils$userAgent.ANDROID||module$exports$Blockly$utils$userAgent.IPAD)?this.showPromptEditor_():this.showInlineEditor_(a)}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.showPromptEditor_=function(){(0,module$exports$Blockly$dialog.prompt)($.module$exports$Blockly$Msg.Msg.CHANGE_VALUE_TITLE,this.getText(),function(a){null!==a&&this.setValue(this.getValueFromEditorText_(a))}.bind(this))}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.showInlineEditor_=function(a){(0,module$exports$Blockly$WidgetDiv.show)(this,this.sourceBlock_.RTL,this.widgetDispose_.bind(this));this.htmlInput_=this.widgetCreate_();this.isBeingEdited_=!0;a||(this.htmlInput_.focus({preventScroll:!0}),this.htmlInput_.select())}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.widgetCreate_=function(){(0,module$exports$Blockly$Events$utils.setGroup)(!0);var a=(0,module$exports$Blockly$WidgetDiv.getDiv)();(0,module$exports$Blockly$utils$dom.addClass)(this.getClickTarget_(),"editing");var b=document.createElement("input");b.className="blocklyHtmlInput";b.setAttribute("spellcheck",this.spellcheck_);var c=this.workspace_.getScale(),d=this.getConstants().FIELD_TEXT_FONTSIZE*c+"pt";a.style.fontSize=d;b.style.fontSize= -d;d=$.module$exports$Blockly$FieldTextInput.FieldTextInput.BORDERRADIUS*c+"px";if(this.fullBlockClickTarget_){d=this.getScaledBBox();d=(d.bottom-d.top)/2+"px";var e=this.sourceBlock_.getParent()?this.sourceBlock_.getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;b.style.border=1*c+"px solid "+e;a.style.borderRadius=d;a.style.transition="box-shadow 0.25s ease 0s";this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW&&(a.style.boxShadow="rgba(255, 255, 255, 0.3) 0 0 0 "+4*c+"px")}b.style.borderRadius= -d;a.appendChild(b);b.value=b.defaultValue=this.getEditorText_(this.value_);b.untypedDefaultValue_=this.value_;b.oldValue_=null;this.resizeEditor_();this.bindInputEvents_(b);return b}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.widgetDispose_=function(){this.isBeingEdited_=!1;this.isTextValid_=!0;this.forceRerender();this.onFinishEditing_(this.value_);(0,module$exports$Blockly$Events$utils.setGroup)(!1);this.unbindInputEvents_();var a=(0,module$exports$Blockly$WidgetDiv.getDiv)().style;a.width="auto";a.height="auto";a.fontSize="";a.transition="";a.boxShadow="";this.htmlInput_=null;(0,module$exports$Blockly$utils$dom.removeClass)(this.getClickTarget_(),"editing")}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.onFinishEditing_=function(a){};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.bindInputEvents_=function(a){this.onKeyDownWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(a,"keydown",this,this.onHtmlInputKeyDown_);this.onKeyInputWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(a,"input",this,this.onHtmlInputChange_)}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.unbindInputEvents_=function(){this.onKeyDownWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onKeyDownWrapper_),this.onKeyDownWrapper_=null);this.onKeyInputWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onKeyInputWrapper_),this.onKeyInputWrapper_=null)}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.onHtmlInputKeyDown_=function(a){a.keyCode===module$exports$Blockly$utils$KeyCodes.KeyCodes.ENTER?((0,module$exports$Blockly$WidgetDiv.hide)(),(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)()):a.keyCode===module$exports$Blockly$utils$KeyCodes.KeyCodes.ESC?(this.setValue(this.htmlInput_.untypedDefaultValue_),(0,module$exports$Blockly$WidgetDiv.hide)(),(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)()):a.keyCode=== -module$exports$Blockly$utils$KeyCodes.KeyCodes.TAB&&((0,module$exports$Blockly$WidgetDiv.hide)(),(0,module$exports$Blockly$dropDownDiv.hideWithoutAnimation)(),this.sourceBlock_.tab(this,!a.shiftKey),a.preventDefault())};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.onHtmlInputChange_=function(a){a=this.htmlInput_.value;a!==this.htmlInput_.oldValue_&&(this.htmlInput_.oldValue_=a,a=this.getValueFromEditorText_(a),this.setValue(a),this.forceRerender(),this.resizeEditor_())}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.setEditorValue_=function(a){this.isDirty_=!0;this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(a));this.setValue(a)}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.resizeEditor_=function(){var a=(0,module$exports$Blockly$WidgetDiv.getDiv)(),b=this.getScaledBBox();a.style.width=b.right-b.left+"px";a.style.height=b.bottom-b.top+"px";b=new module$exports$Blockly$utils$Coordinate.Coordinate(this.sourceBlock_.RTL?b.right-a.offsetWidth:b.left,b.top);a.style.left=b.x+"px";a.style.top=b.y+"px"};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.isTabNavigable=function(){return!0}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.getText_=function(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.getEditorText_=function(a){return String(a)};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.getValueFromEditorText_=function(a){return a}; -$.module$exports$Blockly$FieldTextInput.FieldTextInput.fromJson=function(a){return new this((0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a.text),void 0,a)};$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.DEFAULT_VALUE="";$.module$exports$Blockly$FieldTextInput.FieldTextInput.BORDERRADIUS=4;(0,module$exports$Blockly$fieldRegistry.register)("field_input",$.module$exports$Blockly$FieldTextInput.FieldTextInput);var module$exports$Blockly$FieldNumber={FieldNumber:function(a,b,c,d,e,f){$.module$exports$Blockly$FieldTextInput.FieldTextInput.call(this,module$exports$Blockly$Field.Field.SKIP_SETUP);this.min_=-Infinity;this.max_=Infinity;this.precision_=0;this.decimalPlaces_=null;this.SERIALIZABLE=!0;a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(f?this.configure_(f):this.setConstraints(b,c,d),this.setValue(a),e&&this.setValidator(e))}};$.$jscomp.inherits(module$exports$Blockly$FieldNumber.FieldNumber,$.module$exports$Blockly$FieldTextInput.FieldTextInput); -module$exports$Blockly$FieldNumber.FieldNumber.prototype.configure_=function(a){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.configure_.call(this,a);this.setMinInternal_(a.min);this.setMaxInternal_(a.max);this.setPrecisionInternal_(a.precision)};module$exports$Blockly$FieldNumber.FieldNumber.prototype.setConstraints=function(a,b,c){this.setMinInternal_(a);this.setMaxInternal_(b);this.setPrecisionInternal_(c);this.setValue(this.getValue())}; -module$exports$Blockly$FieldNumber.FieldNumber.prototype.setMin=function(a){this.setMinInternal_(a);this.setValue(this.getValue())};module$exports$Blockly$FieldNumber.FieldNumber.prototype.setMinInternal_=function(a){null==a?this.min_=-Infinity:(a=Number(a),isNaN(a)||(this.min_=a))};module$exports$Blockly$FieldNumber.FieldNumber.prototype.getMin=function(){return this.min_};module$exports$Blockly$FieldNumber.FieldNumber.prototype.setMax=function(a){this.setMaxInternal_(a);this.setValue(this.getValue())}; -module$exports$Blockly$FieldNumber.FieldNumber.prototype.setMaxInternal_=function(a){null==a?this.max_=Infinity:(a=Number(a),isNaN(a)||(this.max_=a))};module$exports$Blockly$FieldNumber.FieldNumber.prototype.getMax=function(){return this.max_};module$exports$Blockly$FieldNumber.FieldNumber.prototype.setPrecision=function(a){this.setPrecisionInternal_(a);this.setValue(this.getValue())}; -module$exports$Blockly$FieldNumber.FieldNumber.prototype.setPrecisionInternal_=function(a){this.precision_=Number(a)||0;var b=String(this.precision_);-1!==b.indexOf("e")&&(b=this.precision_.toLocaleString("en-US",{maximumFractionDigits:20}));var c=b.indexOf(".");this.decimalPlaces_=-1===c?a?0:null:b.length-c-1};module$exports$Blockly$FieldNumber.FieldNumber.prototype.getPrecision=function(){return this.precision_}; -module$exports$Blockly$FieldNumber.FieldNumber.prototype.doClassValidation_=function(a){if(null===a)return null;a=String(a);a=a.replace(/O/ig,"0");a=a.replace(/,/g,"");a=a.replace(/infinity/i,"Infinity");a=Number(a||0);if(isNaN(a))return null;a=Math.min(Math.max(a,this.min_),this.max_);this.precision_&&isFinite(a)&&(a=Math.round(a/this.precision_)*this.precision_);null!==this.decimalPlaces_&&(a=Number(a.toFixed(this.decimalPlaces_)));return a}; -module$exports$Blockly$FieldNumber.FieldNumber.prototype.widgetCreate_=function(){var a=$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.widgetCreate_.call(this);-Infinitythis.max_&&(0,module$exports$Blockly$utils$aria.setState)(a,module$exports$Blockly$utils$aria.State.VALUEMAX,this.max_);return a}; -module$exports$Blockly$FieldNumber.FieldNumber.fromJson=function(a){return new this(a.value,void 0,void 0,void 0,void 0,a)};module$exports$Blockly$FieldNumber.FieldNumber.prototype.DEFAULT_VALUE=0;(0,module$exports$Blockly$fieldRegistry.register)("field_number",module$exports$Blockly$FieldNumber.FieldNumber);var module$exports$Blockly$FieldMultilineInput={FieldMultilineInput:function(a,b,c){$.module$exports$Blockly$FieldTextInput.FieldTextInput.call(this,module$exports$Blockly$Field.Field.SKIP_SETUP);this.textGroup_=null;this.maxLines_=Infinity;this.isOverflowedY_=!1;a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}};$.$jscomp.inherits(module$exports$Blockly$FieldMultilineInput.FieldMultilineInput,$.module$exports$Blockly$FieldTextInput.FieldTextInput); -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.configure_=function(a){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.configure_.call(this,a);a.maxLines&&this.setMaxLines(a.maxLines)};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.toXml=function(a){a.textContent=this.getValue().replace(/\n/g," ");return a}; -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.fromXml=function(a){this.setValue(a.textContent.replace(/ /g,"\n"))};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.saveState=function(){var a=this.saveLegacyState(module$exports$Blockly$FieldMultilineInput.FieldMultilineInput);return null!==a?a:this.getValue()}; -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.loadState=function(a){this.loadLegacyState(module$exports$Blockly$Field.Field,a)||this.setValue(a)};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.initView=function(){this.createBorderRect_();this.textGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}; -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.getDisplayText_=function(){var a=this.getText();if(!a)return module$exports$Blockly$Field.Field.NBSP;var b=a.split("\n");a="";for(var c=this.isOverflowedY_?this.maxLines_:b.length,d=0;dthis.maxDisplayLength?e=e.substring(0,this.maxDisplayLength-4)+"...":this.isOverflowedY_&&d===c-1&&(e=e.substring(0,e.length-3)+"...");e=e.replace(/\s/g,module$exports$Blockly$Field.Field.NBSP);a+=e;d!==c-1&&(a+="\n")}this.sourceBlock_.RTL&& -(a+="\u200f");return a};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.doValueUpdate_=function(a){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.doValueUpdate_.call(this,a);this.isOverflowedY_=this.value_.split("\n").length>this.maxLines_}; -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.render_=function(){for(var a;a=this.textGroup_.firstChild;)this.textGroup_.removeChild(a);a=this.getDisplayText_().split("\n");for(var b=0,c=0;cb&&(b=e);c+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.maxDisplayLength&&(a[h]=a[h].substring(0,this.maxDisplayLength));d.textContent=a[h];var k=(0,module$exports$Blockly$utils$dom.getFastTextWidth)(d,e,f,g);k>b&&(b=k)}b+=this.htmlInput_.offsetWidth-this.htmlInput_.clientWidth}this.borderRect_&&(c+=2*this.getConstants().FIELD_BORDER_RECT_Y_PADDING,b+=2*this.getConstants().FIELD_BORDER_RECT_X_PADDING, -this.borderRect_.setAttribute("width",b),this.borderRect_.setAttribute("height",c));this.size_.width=b;this.size_.height=c;this.positionBorderRect_()};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.showEditor_=function(a,b){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.showEditor_.call(this,a,b);this.forceRerender()}; -module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.widgetCreate_=function(){var a=(0,module$exports$Blockly$WidgetDiv.getDiv)(),b=this.workspace_.getScale(),c=document.createElement("textarea");c.className="blocklyHtmlInput blocklyHtmlTextAreaInput";c.setAttribute("spellcheck",this.spellcheck_);var d=this.getConstants().FIELD_TEXT_FONTSIZE*b+"pt";a.style.fontSize=d;c.style.fontSize=d;c.style.borderRadius=$.module$exports$Blockly$FieldTextInput.FieldTextInput.BORDERRADIUS*b+"px"; -d=this.getConstants().FIELD_BORDER_RECT_X_PADDING*b;var e=this.getConstants().FIELD_BORDER_RECT_Y_PADDING*b/2;c.style.padding=e+"px "+d+"px "+e+"px "+d+"px";d=this.getConstants().FIELD_TEXT_HEIGHT+this.getConstants().FIELD_BORDER_RECT_Y_PADDING;c.style.lineHeight=d*b+"px";a.appendChild(c);c.value=c.defaultValue=this.getEditorText_(this.value_);c.untypedDefaultValue_=this.value_;c.oldValue_=null;module$exports$Blockly$utils$userAgent.GECKO?setTimeout(this.resizeEditor_.bind(this),0):this.resizeEditor_(); -this.bindInputEvents_(c);return c};module$exports$Blockly$FieldMultilineInput.FieldMultilineInput.prototype.setMaxLines=function(a){"number"===typeof a&&0a?0>e&&0e&&(e=0):0d-1&&fd-1&&e--:0>b?0>f&&(f=0):0Math.floor(c.length/d)-1&&(f=Math.floor(c.length/d)-1);this.setHighlightedCell_(this.picker_.childNodes[f].childNodes[e], -f*d+e)};module$exports$Blockly$FieldColour.FieldColour.prototype.onMouseMove_=function(a){var b=(a=a.target)&&Number(a.getAttribute("data-index"));null!==b&&b!==this.highlightedIndex_&&this.setHighlightedCell_(a,b)};module$exports$Blockly$FieldColour.FieldColour.prototype.onMouseEnter_=function(){this.picker_.focus({preventScroll:!0})}; -module$exports$Blockly$FieldColour.FieldColour.prototype.onMouseLeave_=function(){this.picker_.blur();var a=this.getHighlighted_();a&&(0,module$exports$Blockly$utils$dom.removeClass)(a,"blocklyColourHighlighted")};module$exports$Blockly$FieldColour.FieldColour.prototype.getHighlighted_=function(){var a=this.columns_||module$exports$Blockly$FieldColour.FieldColour.COLUMNS,b=this.picker_.childNodes[Math.floor(this.highlightedIndex_/a)];return b?b.childNodes[this.highlightedIndex_%a]:null}; -module$exports$Blockly$FieldColour.FieldColour.prototype.setHighlightedCell_=function(a,b){var c=this.getHighlighted_();c&&(0,module$exports$Blockly$utils$dom.removeClass)(c,"blocklyColourHighlighted");(0,module$exports$Blockly$utils$dom.addClass)(a,"blocklyColourHighlighted");this.highlightedIndex_=b;(0,module$exports$Blockly$utils$aria.setState)(this.picker_,module$exports$Blockly$utils$aria.State.ACTIVEDESCENDANT,a.getAttribute("id"))}; -module$exports$Blockly$FieldColour.FieldColour.prototype.dropdownCreate_=function(){var a=this.columns_||module$exports$Blockly$FieldColour.FieldColour.COLUMNS,b=this.colours_||module$exports$Blockly$FieldColour.FieldColour.COLOURS,c=this.titles_||module$exports$Blockly$FieldColour.FieldColour.TITLES,d=this.getValue(),e=document.createElement("table");e.className="blocklyColourTable";e.tabIndex=0;e.dir="ltr";(0,module$exports$Blockly$utils$aria.setRole)(e,module$exports$Blockly$utils$aria.Role.GRID); -(0,module$exports$Blockly$utils$aria.setState)(e,module$exports$Blockly$utils$aria.State.EXPANDED,!0);(0,module$exports$Blockly$utils$aria.setState)(e,module$exports$Blockly$utils$aria.State.ROWCOUNT,Math.floor(b.length/a));(0,module$exports$Blockly$utils$aria.setState)(e,module$exports$Blockly$utils$aria.State.COLCOUNT,a);for(var f,g=0;gtr>td {\n border: .5px solid #888;\n box-sizing: border-box;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n padding: 0;\n width: 20px;\n}\n\n.blocklyColourTable>tr>td.blocklyColourHighlighted {\n border-color: #eee;\n box-shadow: 2px 2px 7px 2px rgba(0,0,0,.3);\n position: relative;\n}\n\n.blocklyColourSelected, .blocklyColourSelected:hover {\n border-color: #eee !important;\n outline: 1px solid #333;\n position: relative;\n}\n"); -(0,module$exports$Blockly$fieldRegistry.register)("field_colour",module$exports$Blockly$FieldColour.FieldColour);$.module$exports$Blockly$FieldCheckbox={FieldCheckbox:function(a,b,c){module$exports$Blockly$Field.Field.call(this,module$exports$Blockly$Field.Field.SKIP_SETUP);this.checkChar_=$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.CHECK_CHAR;this.SERIALIZABLE=!0;this.CURSOR="default";a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}};$.$jscomp.inherits($.module$exports$Blockly$FieldCheckbox.FieldCheckbox,module$exports$Blockly$Field.Field); -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.configure_=function(a){module$exports$Blockly$Field.Field.prototype.configure_.call(this,a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.saveState=function(){var a=this.saveLegacyState($.module$exports$Blockly$FieldCheckbox.FieldCheckbox);return null!==a?a:this.getValueBoolean()}; -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.initView=function(){module$exports$Blockly$Field.Field.prototype.initView.call(this);(0,module$exports$Blockly$utils$dom.addClass)(this.textElement_,"blocklyCheckbox");this.textElement_.style.display=this.value_?"block":"none"};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.render_=function(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)}; -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.getDisplayText_=function(){return this.checkChar_};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.setCheckCharacter=function(a){this.checkChar_=a||$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.CHECK_CHAR;this.forceRerender()};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.showEditor_=function(){this.setValue(!this.value_)}; -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.doClassValidation_=function(a){return!0===a||"TRUE"===a?"TRUE":!1===a||"FALSE"===a?"FALSE":null};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.doValueUpdate_=function(a){this.value_=this.convertValueToBool_(a);this.textElement_&&(this.textElement_.style.display=this.value_?"block":"none")};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.getValue=function(){return this.value_?"TRUE":"FALSE"}; -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.getValueBoolean=function(){return this.value_};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.getText=function(){return String(this.convertValueToBool_(this.value_))};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.convertValueToBool_=function(a){return"string"===typeof a?"TRUE"===a:!!a};$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.fromJson=function(a){return new this(a.checked,void 0,a)}; -$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.prototype.DEFAULT_VALUE=!1;$.module$exports$Blockly$FieldCheckbox.FieldCheckbox.CHECK_CHAR="\u2713";(0,module$exports$Blockly$fieldRegistry.register)("field_checkbox",$.module$exports$Blockly$FieldCheckbox.FieldCheckbox);var module$exports$Blockly$FieldAngle={FieldAngle:function(a,b,c){$.module$exports$Blockly$FieldTextInput.FieldTextInput.call(this,module$exports$Blockly$Field.Field.SKIP_SETUP);this.clockwise_=module$exports$Blockly$FieldAngle.FieldAngle.CLOCKWISE;this.offset_=module$exports$Blockly$FieldAngle.FieldAngle.OFFSET;this.wrap_=module$exports$Blockly$FieldAngle.FieldAngle.WRAP;this.round_=module$exports$Blockly$FieldAngle.FieldAngle.ROUND;this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_= -this.symbol_=this.line_=this.gauge_=this.editor_=null;this.SERIALIZABLE=!0;a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}};$.$jscomp.inherits(module$exports$Blockly$FieldAngle.FieldAngle,$.module$exports$Blockly$FieldTextInput.FieldTextInput); -module$exports$Blockly$FieldAngle.FieldAngle.prototype.configure_=function(a){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.configure_.call(this,a);switch(a.mode){case "compass":this.clockwise_=!0;this.offset_=90;break;case "protractor":this.clockwise_=!1,this.offset_=0}var b=a.clockwise;"boolean"===typeof b&&(this.clockwise_=b);b=a.offset;null!==b&&(b=Number(b),isNaN(b)||(this.offset_=b));b=a.wrap;null!==b&&(b=Number(b),isNaN(b)||(this.wrap_=b));a=a.round;null!==a&&(a=Number(a), -isNaN(a)||(this.round_=a))};module$exports$Blockly$FieldAngle.FieldAngle.prototype.initView=function(){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.initView.call(this);this.symbol_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.TSPAN,{},null);this.symbol_.appendChild(document.createTextNode("\u00b0"));this.textElement_.appendChild(this.symbol_)}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.render_=function(){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.render_.call(this);this.updateGraph_()}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.showEditor_=function(a){$.module$exports$Blockly$FieldTextInput.FieldTextInput.prototype.showEditor_.call(this,a,module$exports$Blockly$utils$userAgent.MOBILE||module$exports$Blockly$utils$userAgent.ANDROID||module$exports$Blockly$utils$userAgent.IPAD);this.dropdownCreate_();(0,module$exports$Blockly$dropDownDiv.getContentDiv)().appendChild(this.editor_);(0,module$exports$Blockly$dropDownDiv.setColour)(this.sourceBlock_.style.colourPrimary,this.sourceBlock_.style.colourTertiary); -(0,module$exports$Blockly$dropDownDiv.showPositionedByField)(this,this.dropdownDispose_.bind(this));this.updateGraph_()}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.dropdownCreate_=function(){var a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.SVG,{xmlns:module$exports$Blockly$utils$dom.SVG_NS,"xmlns:html":module$exports$Blockly$utils$dom.HTML_NS,"xmlns:xlink":module$exports$Blockly$utils$dom.XLINK_NS,version:"1.1",height:2*module$exports$Blockly$FieldAngle.FieldAngle.HALF+"px",width:2*module$exports$Blockly$FieldAngle.FieldAngle.HALF+"px",style:"touch-action: none"}, -null),b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CIRCLE,{cx:module$exports$Blockly$FieldAngle.FieldAngle.HALF,cy:module$exports$Blockly$FieldAngle.FieldAngle.HALF,r:module$exports$Blockly$FieldAngle.FieldAngle.RADIUS,"class":"blocklyAngleCircle"},a);this.gauge_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE, -{x1:module$exports$Blockly$FieldAngle.FieldAngle.HALF,y1:module$exports$Blockly$FieldAngle.FieldAngle.HALF,"class":"blocklyAngleLine"},a);for(var c=0;360>c;c+=15)(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE,{x1:module$exports$Blockly$FieldAngle.FieldAngle.HALF+module$exports$Blockly$FieldAngle.FieldAngle.RADIUS,y1:module$exports$Blockly$FieldAngle.FieldAngle.HALF,x2:module$exports$Blockly$FieldAngle.FieldAngle.HALF+module$exports$Blockly$FieldAngle.FieldAngle.RADIUS- -(0===c%45?10:5),y2:module$exports$Blockly$FieldAngle.FieldAngle.HALF,"class":"blocklyAngleMarks",transform:"rotate("+c+","+module$exports$Blockly$FieldAngle.FieldAngle.HALF+","+module$exports$Blockly$FieldAngle.FieldAngle.HALF+")"},a);this.clickWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(a,"click",this,this.hide_);this.clickSurfaceWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"click",this,this.onMouseMove_,!0,!0);this.moveSurfaceWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b, -"mousemove",this,this.onMouseMove_,!0,!0);this.editor_=a}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.dropdownDispose_=function(){this.clickWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.clickWrapper_),this.clickWrapper_=null);this.clickSurfaceWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.clickSurfaceWrapper_),this.clickSurfaceWrapper_=null);this.moveSurfaceWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.moveSurfaceWrapper_),this.moveSurfaceWrapper_=null);this.line_=this.gauge_=null}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.hide_=function(){(0,module$exports$Blockly$dropDownDiv.hideIfOwner)(this);(0,module$exports$Blockly$WidgetDiv.hide)()}; -module$exports$Blockly$FieldAngle.FieldAngle.prototype.onMouseMove_=function(a){var b=this.gauge_.ownerSVGElement.getBoundingClientRect(),c=a.clientX-b.left-module$exports$Blockly$FieldAngle.FieldAngle.HALF;a=a.clientY-b.top-module$exports$Blockly$FieldAngle.FieldAngle.HALF;b=Math.atan(-a/c);isNaN(b)||(b=(0,module$exports$Blockly$utils$math.toDegrees)(b),0>c?b+=180:0a&&(a+=360);a>this.wrap_&&(a-=360);return a}; -module$exports$Blockly$FieldAngle.FieldAngle.fromJson=function(a){return new this(a.angle,void 0,a)};module$exports$Blockly$FieldAngle.FieldAngle.prototype.DEFAULT_VALUE=0;module$exports$Blockly$FieldAngle.FieldAngle.ROUND=15;module$exports$Blockly$FieldAngle.FieldAngle.HALF=50;module$exports$Blockly$FieldAngle.FieldAngle.CLOCKWISE=!1;module$exports$Blockly$FieldAngle.FieldAngle.OFFSET=0;module$exports$Blockly$FieldAngle.FieldAngle.WRAP=360; -module$exports$Blockly$FieldAngle.FieldAngle.RADIUS=module$exports$Blockly$FieldAngle.FieldAngle.HALF-1;(0,module$exports$Blockly$Css.register)("\n.blocklyAngleCircle {\n stroke: #444;\n stroke-width: 1;\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyAngleMarks {\n stroke: #444;\n stroke-width: 1;\n}\n\n.blocklyAngleGauge {\n fill: #f88;\n fill-opacity: .8;\n pointer-events: none;\n}\n\n.blocklyAngleLine {\n stroke: #f00;\n stroke-width: 2;\n stroke-linecap: round;\n pointer-events: none;\n}\n"); -(0,module$exports$Blockly$fieldRegistry.register)("field_angle",module$exports$Blockly$FieldAngle.FieldAngle);var module$exports$Blockly$zelos$BottomRow={BottomRow:function(a){module$exports$Blockly$blockRendering$BottomRow.BottomRow.call(this,a)}};$.$jscomp.inherits(module$exports$Blockly$zelos$BottomRow.BottomRow,module$exports$Blockly$blockRendering$BottomRow.BottomRow);module$exports$Blockly$zelos$BottomRow.BottomRow.prototype.endsWithElemSpacer=function(){return!1};module$exports$Blockly$zelos$BottomRow.BottomRow.prototype.hasLeftSquareCorner=function(a){return!!a.outputConnection}; -module$exports$Blockly$zelos$BottomRow.BottomRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection};var module$exports$Blockly$zelos$ConstantProvider={ConstantProvider:function(){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.call(this);this.SMALL_PADDING=this.GRID_UNIT=4;this.MEDIUM_PADDING=2*this.GRID_UNIT;this.MEDIUM_LARGE_PADDING=3*this.GRID_UNIT;this.LARGE_PADDING=4*this.GRID_UNIT;this.CORNER_RADIUS=1*this.GRID_UNIT;this.NOTCH_WIDTH=9*this.GRID_UNIT;this.NOTCH_HEIGHT=2*this.GRID_UNIT;this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT=3*this.GRID_UNIT;this.MIN_BLOCK_WIDTH= -2*this.GRID_UNIT;this.MIN_BLOCK_HEIGHT=12*this.GRID_UNIT;this.EMPTY_STATEMENT_INPUT_HEIGHT=6*this.GRID_UNIT;this.TAB_OFFSET_FROM_TOP=0;this.TOP_ROW_MIN_HEIGHT=this.CORNER_RADIUS;this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING;this.BOTTOM_ROW_MIN_HEIGHT=this.CORNER_RADIUS;this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT=6*this.GRID_UNIT;this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT;this.STATEMENT_INPUT_SPACER_MIN_WIDTH=40*this.GRID_UNIT;this.STATEMENT_INPUT_PADDING_LEFT=4*this.GRID_UNIT; -this.EMPTY_INLINE_INPUT_PADDING=4*this.GRID_UNIT;this.EMPTY_INLINE_INPUT_HEIGHT=8*this.GRID_UNIT;this.DUMMY_INPUT_MIN_HEIGHT=8*this.GRID_UNIT;this.DUMMY_INPUT_SHADOW_MIN_HEIGHT=6*this.GRID_UNIT;this.CURSOR_WS_WIDTH=20*this.GRID_UNIT;this.CURSOR_COLOUR="#ffa200";this.CURSOR_RADIUS=5;this.JAGGED_TEETH_WIDTH=this.JAGGED_TEETH_HEIGHT=0;this.START_HAT_HEIGHT=22;this.START_HAT_WIDTH=96;this.SHAPES={HEXAGONAL:1,ROUND:2,SQUARE:3,PUZZLE:4,NOTCH:5};this.SHAPE_IN_SHAPE_PADDING={1:{0:5*this.GRID_UNIT,1:2*this.GRID_UNIT, -2:5*this.GRID_UNIT,3:5*this.GRID_UNIT},2:{0:3*this.GRID_UNIT,1:3*this.GRID_UNIT,2:1*this.GRID_UNIT,3:2*this.GRID_UNIT},3:{0:2*this.GRID_UNIT,1:2*this.GRID_UNIT,2:2*this.GRID_UNIT,3:2*this.GRID_UNIT}};this.FULL_BLOCK_FIELDS=!0;this.FIELD_TEXT_FONTSIZE=3*this.GRID_UNIT;this.FIELD_TEXT_FONTWEIGHT="bold";this.FIELD_TEXT_FONTFAMILY='"Helvetica Neue", "Segoe UI", Helvetica, sans-serif';this.FIELD_BORDER_RECT_RADIUS=this.CORNER_RADIUS;this.FIELD_BORDER_RECT_X_PADDING=2*this.GRID_UNIT;this.FIELD_BORDER_RECT_Y_PADDING= -1.625*this.GRID_UNIT;this.FIELD_BORDER_RECT_HEIGHT=8*this.GRID_UNIT;this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=8*this.GRID_UNIT;this.FIELD_DROPDOWN_SVG_ARROW=this.FIELD_DROPDOWN_COLOURED_DIV=this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW=!0;this.FIELD_DROPDOWN_SVG_ARROW_PADDING=this.FIELD_BORDER_RECT_X_PADDING;this.FIELD_COLOUR_FULL_BLOCK=this.FIELD_TEXTINPUT_BOX_SHADOW=!0;this.FIELD_COLOUR_DEFAULT_WIDTH=2*this.GRID_UNIT;this.FIELD_COLOUR_DEFAULT_HEIGHT=4*this.GRID_UNIT;this.FIELD_CHECKBOX_X_OFFSET=1*this.GRID_UNIT; -this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH=12*this.GRID_UNIT;this.SELECTED_GLOW_COLOUR="#fff200";this.SELECTED_GLOW_SIZE=.5;this.REPLACEMENT_GLOW_COLOUR="#fff200";this.REPLACEMENT_GLOW_SIZE=2;this.selectedGlowFilterId="";this.selectedGlowFilter_=null;this.replacementGlowFilterId="";this.SQUARED=this.ROUNDED=this.HEXAGONAL=this.replacementGlowFilter_=null}};$.$jscomp.inherits(module$exports$Blockly$zelos$ConstantProvider.ConstantProvider,module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider); -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.setFontConstants_=function(a){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setFontConstants_.call(this,a);this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT=this.FIELD_TEXT_HEIGHT+2*this.FIELD_BORDER_RECT_Y_PADDING}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.init=function(){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.init.call(this);this.HEXAGONAL=this.makeHexagonal();this.ROUNDED=this.makeRounded();this.SQUARED=this.makeSquared();this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT+this.INSIDE_CORNERS.rightWidth}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.setDynamicProperties_=function(a){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.setDynamicProperties_.call(this,a);this.SELECTED_GLOW_COLOUR=a.getComponentStyle("selectedGlowColour")||this.SELECTED_GLOW_COLOUR;var b=Number(a.getComponentStyle("selectedGlowSize"));this.SELECTED_GLOW_SIZE=b&&!isNaN(b)?b:this.SELECTED_GLOW_SIZE;this.REPLACEMENT_GLOW_COLOUR=a.getComponentStyle("replacementGlowColour")|| -this.REPLACEMENT_GLOW_COLOUR;this.REPLACEMENT_GLOW_SIZE=(a=Number(a.getComponentStyle("replacementGlowSize")))&&!isNaN(a)?a:this.REPLACEMENT_GLOW_SIZE};module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.dispose=function(){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.dispose.call(this);this.selectedGlowFilter_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.selectedGlowFilter_);this.replacementGlowFilter_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.replacementGlowFilter_)}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeStartHat=function(){var a=this.START_HAT_HEIGHT,b=this.START_HAT_WIDTH,c=(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(25,-a),(0,module$exports$Blockly$utils$svgPaths.point)(71,-a),(0,module$exports$Blockly$utils$svgPaths.point)(b,0)]);return{height:a,width:b,path:c}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeHexagonal=function(){function a(c,d,e){var f=c/2;f=f>b?b:f;e=e?-1:1;c=(d?-1:1)*c/2;return(0,module$exports$Blockly$utils$svgPaths.lineTo)(-e*f,c)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(e*f,c)}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width:function(c){c/=2;return c>b?b:c},height:function(c){return c},connectionOffsetY:function(c){return c/2},connectionOffsetX:function(c){return-c}, -pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c,!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeRounded=function(){function a(d,e,f){var g=d>c?d-c:0;d=(d>c?c:d)/2;return(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",d,(0,module$exports$Blockly$utils$svgPaths.point)((e?-1:1)*d,(e?-1:1)*d))+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",(f?1:-1)*g)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",d,(0,module$exports$Blockly$utils$svgPaths.point)((e?1:-1)*d,(e?-1:1)*d))}var b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH, -c=2*b;return{type:this.SHAPES.ROUND,isDynamic:!0,width:function(d){d/=2;return d>b?b:d},height:function(d){return d},connectionOffsetY:function(d){return d/2},connectionOffsetX:function(d){return-d},pathDown:function(d){return a(d,!1,!1)},pathUp:function(d){return a(d,!0,!1)},pathRightDown:function(d){return a(d,!1,!0)},pathRightUp:function(d){return a(d,!1,!0)}}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeSquared=function(){function a(c,d,e){c-=2*b;return(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",b,(0,module$exports$Blockly$utils$svgPaths.point)((d?-1:1)*b,(d?-1:1)*b))+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",(e?1:-1)*c)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",b,(0,module$exports$Blockly$utils$svgPaths.point)((d?1:-1)*b,(d?-1:1)*b))}var b=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE, -isDynamic:!0,width:function(c){return b},height:function(c){return c},connectionOffsetY:function(c){return c/2},connectionOffsetX:function(c){return-c},pathDown:function(c){return a(c,!1,!1)},pathUp:function(c){return a(c,!0,!1)},pathRightDown:function(c){return a(c,!1,!0)},pathRightUp:function(c){return a(c,!1,!0)}}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.shapeFor=function(a){var b=a.getCheck();!b&&a.targetConnection&&(b=a.targetConnection.getCheck());switch(a.type){case $.module$exports$Blockly$ConnectionType.ConnectionType.INPUT_VALUE:case $.module$exports$Blockly$ConnectionType.ConnectionType.OUTPUT_VALUE:a=a.getSourceBlock().getOutputShape();if(null!==a)switch(a){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}if(b&& --1!==b.indexOf("Boolean"))return this.HEXAGONAL;if(b&&-1!==b.indexOf("Number"))return this.ROUNDED;b&&b.indexOf("String");return this.ROUNDED;case $.module$exports$Blockly$ConnectionType.ConnectionType.PREVIOUS_STATEMENT:case $.module$exports$Blockly$ConnectionType.ConnectionType.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type");}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeNotch=function(){function a(l){return(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(l*e/2,0),(0,module$exports$Blockly$utils$svgPaths.point)(l*e*3/4,g/2),(0,module$exports$Blockly$utils$svgPaths.point)(l*e,g)])+(0,module$exports$Blockly$utils$svgPaths.line)([(0,module$exports$Blockly$utils$svgPaths.point)(l*e,f)])+(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(l* -e/4,g/2),(0,module$exports$Blockly$utils$svgPaths.point)(l*e/2,g),(0,module$exports$Blockly$utils$svgPaths.point)(l*e,g)])+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("h",l*d)+(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(l*e/2,0),(0,module$exports$Blockly$utils$svgPaths.point)(l*e*3/4,-(g/2)),(0,module$exports$Blockly$utils$svgPaths.point)(l*e,-g)])+(0,module$exports$Blockly$utils$svgPaths.line)([(0,module$exports$Blockly$utils$svgPaths.point)(l* -e,-f)])+(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(l*e/4,-(g/2)),(0,module$exports$Blockly$utils$svgPaths.point)(l*e/2,-g),(0,module$exports$Blockly$utils$svgPaths.point)(l*e,-g)])}var b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=b/3,e=d/3,f=c/2,g=f/2,h=a(1),k=a(-1);return{type:this.SHAPES.NOTCH,width:b,height:c,pathLeft:h,pathRight:k}}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.makeInsideCorners=function(){var a=this.CORNER_RADIUS,b=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a,(0,module$exports$Blockly$utils$svgPaths.point)(-a,a)),c=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(-a,a)),d=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a,(0,module$exports$Blockly$utils$svgPaths.point)(a,a)),e=(0,module$exports$Blockly$utils$svgPaths.arc)("a", -"0 0,1",a,(0,module$exports$Blockly$utils$svgPaths.point)(a,a));return{width:a,height:a,pathTop:b,pathBottom:d,rightWidth:a,rightHeight:a,pathTopRight:c,pathBottomRight:e}};module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.generateSecondaryColour_=function(a){return(0,module$exports$Blockly$utils$colour.blend)("#000",a,.15)||a}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.generateTertiaryColour_=function(a){return(0,module$exports$Blockly$utils$colour.blend)("#000",a,.25)||a}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.createDom=function(a,b,c){module$exports$Blockly$blockRendering$ConstantProvider.ConstantProvider.prototype.createDom.call(this,a,b,c);a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.DEFS,{},a);b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FILTER,{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%", -x:"-40%"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},b);c=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},b);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},c);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFLOOD, -{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},b);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},b);this.selectedGlowFilterId=b.id;this.selectedGlowFilter_=b;a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FILTER,{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%", -x:"-40%"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},a);b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFUNCA,{type:"table",tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FEFLOOD, -{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FECOMPOSITE,{"in":"SourceGraphic",in2:"outGlow",operator:"over"},a);this.replacementGlowFilterId=a.id;this.replacementGlowFilter_=a}; -module$exports$Blockly$zelos$ConstantProvider.ConstantProvider.prototype.getCSS_=function(a){return[a+" .blocklyText,",a+" .blocklyFlyoutLabelText {","font: "+this.FIELD_TEXT_FONTWEIGHT+" "+this.FIELD_TEXT_FONTSIZE+"pt "+this.FIELD_TEXT_FONTFAMILY+";","}",a+" .blocklyText {","fill: #fff;","}",a+" .blocklyNonEditableText>rect:not(.blocklyDropdownRect),",a+" .blocklyEditableText>rect:not(.blocklyDropdownRect) {","fill: "+this.FIELD_BORDER_RECT_COLOUR+";","}",a+" .blocklyNonEditableText>text,",a+" .blocklyEditableText>text,", -a+" .blocklyNonEditableText>g>text,",a+" .blocklyEditableText>g>text {","fill: #575E75;","}",a+" .blocklyFlyoutLabelText {","fill: #575E75;","}",a+" .blocklyText.blocklyBubbleText {","fill: #575E75;","}",a+" .blocklyDraggable:not(.blocklyDisabled)"," .blocklyEditableText:not(.editing):hover>rect,",a+" .blocklyDraggable:not(.blocklyDisabled)"," .blocklyEditableText:not(.editing):hover>.blocklyPath {","stroke: #fff;","stroke-width: 2;","}",a+" .blocklyHtmlInput {","font-family: "+this.FIELD_TEXT_FONTFAMILY+ -";","font-weight: "+this.FIELD_TEXT_FONTWEIGHT+";","color: #575E75;","}",a+" .blocklyDropdownText {","fill: #fff !important;","}",a+".blocklyWidgetDiv .goog-menuitem,",a+".blocklyDropDownDiv .goog-menuitem {","font-family: "+this.FIELD_TEXT_FONTFAMILY+";","}",a+".blocklyDropDownDiv .goog-menuitem-content {","color: #fff;","}",a+" .blocklyHighlightedConnectionPath {","stroke: "+this.SELECTED_GLOW_COLOUR+";","}",a+" .blocklyDisabled > .blocklyOutlinePath {","fill: url(#blocklyDisabledPattern"+this.randomIdentifier+ -")","}",a+" .blocklyInsertionMarker>.blocklyPath {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"]};var module$exports$Blockly$zelos$Drawer={Drawer:function(a,b){module$exports$Blockly$blockRendering$Drawer.Drawer.call(this,a,b)}};$.$jscomp.inherits(module$exports$Blockly$zelos$Drawer.Drawer,module$exports$Blockly$blockRendering$Drawer.Drawer); -module$exports$Blockly$zelos$Drawer.Drawer.prototype.draw=function(){var a=this.block_.pathObject;a.beginDrawing();this.hideHiddenIcons_();this.drawOutline_();this.drawInternals_();a.setPath(this.outlinePath_+"\n"+this.inlinePath_);this.info_.RTL&&a.flipRTL();(0,module$exports$Blockly$blockRendering$debug.isDebuggerEnabled)()&&this.block_.renderingDebugger.drawDebug(this.block_,this.info_);this.recordSizeOnBlock_();this.info_.outputConnection&&(a.outputShapeType=this.info_.outputConnection.shape.type); -a.endDrawing()};module$exports$Blockly$zelos$Drawer.Drawer.prototype.drawOutline_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape&&!this.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawOutline_.call(this)}; -module$exports$Blockly$zelos$Drawer.Drawer.prototype.drawLeft_=function(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape?this.drawLeftDynamicConnection_():module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawLeft_.call(this)}; -module$exports$Blockly$zelos$Drawer.Drawer.prototype.drawRightSideRow_=function(a){if(!(0>=a.height))if(module$exports$Blockly$blockRendering$Types.Types.isSpacer(a)&&(a.precedesStatement||a.followsStatement)){var b=this.constants_.INSIDE_CORNERS.rightHeight;b=a.height-(a.precedesStatement?b:0);this.outlinePath_+=(a.followsStatement?this.constants_.INSIDE_CORNERS.pathBottomRight:"")+(0=c||0>=b)throw Error("Height and width values of an image field must be greater than 0."); -this.size_=new module$exports$Blockly$utils$Size.Size(b,c+$.module$exports$Blockly$FieldImage.FieldImage.Y_PADDING);this.imageHeight_=c;this.clickHandler_=null;"function"===typeof e&&(this.clickHandler_=e);this.imageElement_=null;this.flipRtl_=this.isDirty_=this.EDITABLE=!1;this.altText_="";a!==module$exports$Blockly$Field.Field.SKIP_SETUP&&(g?this.configure_(g):(this.flipRtl_=!!f,this.altText_=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(d)||""),this.setValue((0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a)))}}; -$.$jscomp.inherits($.module$exports$Blockly$FieldImage.FieldImage,module$exports$Blockly$Field.Field);$.module$exports$Blockly$FieldImage.FieldImage.prototype.configure_=function(a){module$exports$Blockly$Field.Field.prototype.configure_.call(this,a);this.flipRtl_=!!a.flipRtl;this.altText_=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(a.alt)||""}; -$.module$exports$Blockly$FieldImage.FieldImage.prototype.initView=function(){this.imageElement_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.IMAGE,{height:this.imageHeight_+"px",width:this.size_.width+"px",alt:this.altText_},this.fieldGroup_);this.imageElement_.setAttributeNS(module$exports$Blockly$utils$dom.XLINK_NS,"xlink:href",this.value_);this.clickHandler_&&(this.imageElement_.style.cursor="pointer")}; -$.module$exports$Blockly$FieldImage.FieldImage.prototype.updateSize_=function(){};$.module$exports$Blockly$FieldImage.FieldImage.prototype.doClassValidation_=function(a){return"string"!==typeof a?null:a};$.module$exports$Blockly$FieldImage.FieldImage.prototype.doValueUpdate_=function(a){this.value_=a;this.imageElement_&&this.imageElement_.setAttributeNS(module$exports$Blockly$utils$dom.XLINK_NS,"xlink:href",String(this.value_))}; -$.module$exports$Blockly$FieldImage.FieldImage.prototype.getFlipRtl=function(){return this.flipRtl_};$.module$exports$Blockly$FieldImage.FieldImage.prototype.setAlt=function(a){a!==this.altText_&&(this.altText_=a||"",this.imageElement_&&this.imageElement_.setAttribute("alt",this.altText_))};$.module$exports$Blockly$FieldImage.FieldImage.prototype.showEditor_=function(){this.clickHandler_&&this.clickHandler_(this)}; -$.module$exports$Blockly$FieldImage.FieldImage.prototype.setOnClickHandler=function(a){this.clickHandler_=a};$.module$exports$Blockly$FieldImage.FieldImage.prototype.getText_=function(){return this.altText_};$.module$exports$Blockly$FieldImage.FieldImage.fromJson=function(a){return new this(a.src,a.width,a.height,void 0,void 0,void 0,a)};$.module$exports$Blockly$FieldImage.FieldImage.prototype.DEFAULT_VALUE="";$.module$exports$Blockly$FieldImage.FieldImage.Y_PADDING=1; -(0,module$exports$Blockly$fieldRegistry.register)("field_image",$.module$exports$Blockly$FieldImage.FieldImage);var module$exports$Blockly$zelos$RightConnectionShape={RightConnectionShape:function(a){module$exports$Blockly$blockRendering$Measurable.Measurable.call(this,a);this.type|=module$exports$Blockly$blockRendering$Types.Types.getType("RIGHT_CONNECTION");this.width=this.height=0}};$.$jscomp.inherits(module$exports$Blockly$zelos$RightConnectionShape.RightConnectionShape,module$exports$Blockly$blockRendering$Measurable.Measurable);var module$exports$Blockly$zelos$StatementInput={StatementInput:function(a,b){module$exports$Blockly$blockRendering$StatementInput.StatementInput.call(this,a,b);if(this.connectedBlock){for(a=this.connectedBlock;b=a.getNextBlock();)a=b;a.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}}};$.$jscomp.inherits(module$exports$Blockly$zelos$StatementInput.StatementInput,module$exports$Blockly$blockRendering$StatementInput.StatementInput);var module$exports$Blockly$zelos$TopRow={TopRow:function(a){module$exports$Blockly$blockRendering$TopRow.TopRow.call(this,a)}};$.$jscomp.inherits(module$exports$Blockly$zelos$TopRow.TopRow,module$exports$Blockly$blockRendering$TopRow.TopRow);module$exports$Blockly$zelos$TopRow.TopRow.prototype.endsWithElemSpacer=function(){return!1}; -module$exports$Blockly$zelos$TopRow.TopRow.prototype.hasLeftSquareCorner=function(a){var b=(a.hat?"cap"===a.hat:this.constants_.ADD_START_HATS)&&!a.outputConnection&&!a.previousConnection;return!!a.outputConnection||b};module$exports$Blockly$zelos$TopRow.TopRow.prototype.hasRightSquareCorner=function(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection};var module$exports$Blockly$zelos$RenderInfo={RenderInfo:function(a,b){module$exports$Blockly$blockRendering$RenderInfo.RenderInfo.call(this,a,b);this.topRow=new module$exports$Blockly$zelos$TopRow.TopRow(this.constants_);this.bottomRow=new module$exports$Blockly$zelos$BottomRow.BottomRow(this.constants_);this.isInline=!0;this.isMultiRow=!b.getInputsInline()||b.isCollapsed();this.hasStatementInput=0=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!f.precedesStatement;if(module$exports$Blockly$blockRendering$Types.Types.isInputRow(e)&&e.hasStatement)e.measure(),b=e.width-e.getLastInput().width+ -a;else if(d&&(2===c||f)&&module$exports$Blockly$blockRendering$Types.Types.isInputRow(e)&&!e.hasStatement){f=e.xPos;d=null;for(var g=0;gc?c:this.height/2,b-c*(1-Math.sin(Math.acos((c-this.constants_.SMALL_PADDING)/c)));default:return 0}if(module$exports$Blockly$blockRendering$Types.Types.isInlineInput(a)&& -a instanceof module$exports$Blockly$blockRendering$InputConnection.InputConnection){var e=a.connectedBlock;a=e?e.pathObject.outputShapeType:a.shape.type;return e&&e.outputConnection&&(e.statementInputCount||e.nextConnection)||c===d.SHAPES.HEXAGONAL&&c!==a?0:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][a]}return module$exports$Blockly$blockRendering$Types.Types.isField(a)&&a instanceof module$exports$Blockly$blockRendering$Field.Field?c===d.SHAPES.ROUND&&a.field instanceof $.module$exports$Blockly$FieldTextInput.FieldTextInput? -b-2.75*d.GRID_UNIT:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][0]:module$exports$Blockly$blockRendering$Types.Types.isIcon(a)?this.constants_.SMALL_PADDING:0}; -module$exports$Blockly$zelos$RenderInfo.RenderInfo.prototype.finalizeVerticalAlignment_=function(){if(!this.outputConnection)for(var a=2;a=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!d.precedesStatement;if(e?this.topRow.hasPreviousConnection:b.followsStatement){var g=c.elements[1];g=3===c.elements.length&&g instanceof module$exports$Blockly$blockRendering$Field.Field&&(g.field instanceof $.module$exports$Blockly$FieldLabel.FieldLabel|| -g.field instanceof $.module$exports$Blockly$FieldImage.FieldImage);if(!e&&g)b.height-=this.constants_.SMALL_PADDING,d.height-=this.constants_.SMALL_PADDING,c.height-=this.constants_.MEDIUM_PADDING;else if(!e&&!f)b.height+=this.constants_.SMALL_PADDING;else if(f){e=!1;for(f=0;f.blocklyPathLight,",a+" .blocklyInsertionMarker>.blocklyPathDark {","fill-opacity: "+this.INSERTION_MARKER_OPACITY+";","stroke: none;","}"])};var module$exports$Blockly$geras$InlineInput={InlineInput:function(a,b){module$exports$Blockly$blockRendering$InlineInput.InlineInput.call(this,a,b);this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)}};$.$jscomp.inherits(module$exports$Blockly$geras$InlineInput.InlineInput,module$exports$Blockly$blockRendering$InlineInput.InlineInput);var module$exports$Blockly$geras$Highlighter={Highlighter:function(a){this.info_=a;this.inlineSteps_=this.steps_="";this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_=this.highlightConstants_.NOTCH; -this.startPaths_=this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH}};module$exports$Blockly$geras$Highlighter.Highlighter.prototype.getPath=function(){return this.steps_+"\n"+this.inlineSteps_}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawTopCorner=function(a){this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveBy)(a.xPos,this.info_.startY);for(var b=0,c;c=a.elements[b];b++)module$exports$Blockly$blockRendering$Types.Types.isLeftSquareCorner(c)?this.steps_+=this.highlightConstants_.START_POINT:module$exports$Blockly$blockRendering$Types.Types.isLeftRoundedCorner(c)?this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):module$exports$Blockly$blockRendering$Types.Types.isPreviousConnection(c)? -this.steps_+=this.notchPaths_.pathLeft:module$exports$Blockly$blockRendering$Types.Types.isHat(c)?this.steps_+=this.startPaths_.path(this.RTL_):module$exports$Blockly$blockRendering$Types.Types.isSpacer(c)&&0!==c.width&&(this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("H",c.xPos+c.width-this.highlightOffset_));this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("H",a.xPos+a.width-this.highlightOffset_)}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawJaggedEdge_=function(a){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",a.height-this.jaggedTeethPaths_.height-this.highlightOffset_))}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawValueInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-b.connectionHeight;this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(b.xPos+b.width-this.highlightOffset_,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",c)}else this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(b.xPos+b.width,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawStatementInput=function(a){var b=a.getLastInput();if(this.RTL_){var c=a.height-2*this.insideCornerPaths_.height;this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(b.xPos,a.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",c)+this.insideCornerPaths_.pathBottom(this.RTL_)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(a.width-b.xPos-this.insideCornerPaths_.width,0)}else this.steps_+= -(0,module$exports$Blockly$utils$svgPaths.moveTo)(b.xPos,a.yPos+a.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(a.width-b.xPos-this.insideCornerPaths_.width,0)}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawRightSideRow=function(a){var b=a.xPos+a.width-this.highlightOffset_;a instanceof module$exports$Blockly$blockRendering$SpacerRow.SpacerRow&&a.followsStatement&&(this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("H",b));this.RTL_&&(this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("H",b),a.height>this.highlightOffset_&&(this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",a.yPos+a.height- -this.highlightOffset_)))}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawBottomRow=function(a){if(this.RTL_)this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",a.baseline-this.highlightOffset_);else{var b=this.info_.bottomRow.elements[0];module$exports$Blockly$blockRendering$Types.Types.isLeftSquareCorner(b)?this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(a.xPos+this.highlightOffset_,a.baseline-this.highlightOffset_):module$exports$Blockly$blockRendering$Types.Types.isLeftRoundedCorner(b)&&(this.steps_+= -(0,module$exports$Blockly$utils$svgPaths.moveTo)(a.xPos,a.baseline),this.steps_+=this.outsideCornerPaths_.bottomLeft())}}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawLeft=function(){var a=this.info_.outputConnection;a&&(a=a.connectionOffsetY+a.height,this.RTL_?this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(this.info_.startX,a):(this.steps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(this.info_.startX+this.highlightOffset_,this.info_.bottomRow.baseline-this.highlightOffset_),this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",a)),this.steps_+=this.puzzleTabPaths_.pathUp(this.RTL_)); -this.RTL_||(a=this.info_.topRow,module$exports$Blockly$blockRendering$Types.Types.isLeftRoundedCorner(a.elements[0])?this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",this.outsideCornerPaths_.height):this.steps_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",a.capline+this.highlightOffset_))}; -module$exports$Blockly$geras$Highlighter.Highlighter.prototype.drawInlineInput=function(a){var b=this.highlightOffset_,c=a.xPos+a.connectionWidth,d=a.centerline-a.height/2,e=a.width-a.connectionWidth,f=d+b;this.RTL_?(d=a.connectionOffsetY-b,a=a.height-(a.connectionOffsetY+a.connectionHeight)+b,this.inlineSteps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(c-b,f)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",d)+this.puzzleTabPaths_.pathDown(this.RTL_)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v", -a)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("h",e)):this.inlineSteps_+=(0,module$exports$Blockly$utils$svgPaths.moveTo)(a.xPos+a.width+b,f)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",a.height)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("h",-e)+(0,module$exports$Blockly$utils$svgPaths.moveTo)(c,d+a.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)};var module$exports$Blockly$geras$Drawer={Drawer:function(a,b){module$exports$Blockly$blockRendering$Drawer.Drawer.call(this,a,b);this.highlighter_=new module$exports$Blockly$geras$Highlighter.Highlighter(b)}};$.$jscomp.inherits(module$exports$Blockly$geras$Drawer.Drawer,module$exports$Blockly$blockRendering$Drawer.Drawer); -module$exports$Blockly$geras$Drawer.Drawer.prototype.draw=function(){this.hideHiddenIcons_();this.drawOutline_();this.drawInternals_();var a=this.block_.pathObject;a.setPath(this.outlinePath_+"\n"+this.inlinePath_);a.setHighlightPath(this.highlighter_.getPath());this.info_.RTL&&a.flipRTL();(0,module$exports$Blockly$blockRendering$debug.isDebuggerEnabled)()&&this.block_.renderingDebugger.drawDebug(this.block_,this.info_);this.recordSizeOnBlock_()}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.drawTop_=function(){this.highlighter_.drawTopCorner(this.info_.topRow);this.highlighter_.drawRightSideRow(this.info_.topRow);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawTop_.call(this)};module$exports$Blockly$geras$Drawer.Drawer.prototype.drawJaggedEdge_=function(a){this.highlighter_.drawJaggedEdge_(a);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawJaggedEdge_.call(this,a)}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.drawValueInput_=function(a){this.highlighter_.drawValueInput(a);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawValueInput_.call(this,a)};module$exports$Blockly$geras$Drawer.Drawer.prototype.drawStatementInput_=function(a){this.highlighter_.drawStatementInput(a);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawStatementInput_.call(this,a)}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.drawRightSideRow_=function(a){this.highlighter_.drawRightSideRow(a);this.outlinePath_+=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("H",a.xPos+a.width)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("V",a.yPos+a.height)};module$exports$Blockly$geras$Drawer.Drawer.prototype.drawBottom_=function(){this.highlighter_.drawBottomRow(this.info_.bottomRow);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawBottom_.call(this)}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.drawLeft_=function(){this.highlighter_.drawLeft();module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawLeft_.call(this)};module$exports$Blockly$geras$Drawer.Drawer.prototype.drawInlineInput_=function(a){this.highlighter_.drawInlineInput(a);module$exports$Blockly$blockRendering$Drawer.Drawer.prototype.drawInlineInput_.call(this,a)}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.positionInlineInputConnection_=function(a){var b=a.centerline-a.height/2;if(a.connectionModel){var c=a.xPos+a.connectionWidth+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(c*=-1);a.connectionModel.setOffsetInBlock(c,b+a.connectionOffsetY+this.constants_.DARK_PATH_OFFSET)}}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.positionStatementInputConnection_=function(a){var b=a.getLastInput();if(b.connectionModel){var c=a.xPos+a.statementEdge+b.notchOffset;c=this.info_.RTL?-1*c:c+this.constants_.DARK_PATH_OFFSET;b.connectionModel.setOffsetInBlock(c,a.yPos+this.constants_.DARK_PATH_OFFSET)}}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.positionExternalValueConnection_=function(a){var b=a.getLastInput();if(b.connectionModel){var c=a.xPos+a.width+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(c*=-1);b.connectionModel.setOffsetInBlock(c,a.yPos)}}; -module$exports$Blockly$geras$Drawer.Drawer.prototype.positionNextConnection_=function(){var a=this.info_.bottomRow;if(a.connection){var b=a.connection,c=b.xPos;b.connectionModel.setOffsetInBlock((this.info_.RTL?-c:c)+this.constants_.DARK_PATH_OFFSET/2,a.baseline+this.constants_.DARK_PATH_OFFSET)}};var module$exports$Blockly$geras$HighlightConstantProvider={HighlightConstantProvider:function(a){this.constantProvider=a;this.OFFSET=.5;this.START_POINT=(0,module$exports$Blockly$utils$svgPaths.moveBy)(this.OFFSET,this.OFFSET)}}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.init=function(){this.INSIDE_CORNER=this.makeInsideCorner();this.OUTSIDE_CORNER=this.makeOutsideCorner();this.PUZZLE_TAB=this.makePuzzleTab();this.NOTCH=this.makeNotch();this.JAGGED_TEETH=this.makeJaggedTeeth();this.START_HAT=this.makeStartHat()}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makeInsideCorner=function(){var a=this.constantProvider.CORNER_RADIUS,b=this.OFFSET,c=(1-Math.SQRT1_2)*(a+b)-b,d=(0,module$exports$Blockly$utils$svgPaths.moveBy)(c,c)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a,(0,module$exports$Blockly$utils$svgPaths.point)(-c-b,a-c)),e=(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a+b,(0,module$exports$Blockly$utils$svgPaths.point)(a+b,a+b)),f= -(0,module$exports$Blockly$utils$svgPaths.moveBy)(c,-c)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,0",a+b,(0,module$exports$Blockly$utils$svgPaths.point)(a-c,c+b));return{width:a+b,height:a,pathTop:function(g){return g?d:""},pathBottom:function(g){return g?e:f}}}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makeOutsideCorner=function(){var a=this.constantProvider.CORNER_RADIUS,b=this.OFFSET,c=(1-Math.SQRT1_2)*(a-b)+b,d=(0,module$exports$Blockly$utils$svgPaths.moveBy)(c,c)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a-b,(0,module$exports$Blockly$utils$svgPaths.point)(a-c,-c+b)),e=(0,module$exports$Blockly$utils$svgPaths.moveBy)(b,a)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a-b,(0,module$exports$Blockly$utils$svgPaths.point)(a, --a+b)),f=-c,g=(0,module$exports$Blockly$utils$svgPaths.moveBy)(c,f)+(0,module$exports$Blockly$utils$svgPaths.arc)("a","0 0,1",a-b,(0,module$exports$Blockly$utils$svgPaths.point)(-c+b,-f-a));return{height:a,topLeft:function(h){return h?d:e},bottomLeft:function(){return g}}}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makePuzzleTab=function(){var a=this.constantProvider.TAB_WIDTH,b=this.constantProvider.TAB_HEIGHT,c=(0,module$exports$Blockly$utils$svgPaths.moveBy)(-2,-b+3.4)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(-.45*a,-2.1),d=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",2.5)+(0,module$exports$Blockly$utils$svgPaths.moveBy)(.97*-a,2.5)+(0,module$exports$Blockly$utils$svgPaths.curve)("q",[(0,module$exports$Blockly$utils$svgPaths.point)(.05* --a,10),(0,module$exports$Blockly$utils$svgPaths.point)(.3*a,9.5)])+(0,module$exports$Blockly$utils$svgPaths.moveBy)(.67*a,-1.9)+(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",2.5),e=(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("v",-1.5)+(0,module$exports$Blockly$utils$svgPaths.moveBy)(-.92*a,-.5)+(0,module$exports$Blockly$utils$svgPaths.curve)("q",[(0,module$exports$Blockly$utils$svgPaths.point)(-.19*a,-5.5),(0,module$exports$Blockly$utils$svgPaths.point)(0,-11)])+(0,module$exports$Blockly$utils$svgPaths.moveBy)(.92* -a,1),f=(0,module$exports$Blockly$utils$svgPaths.moveBy)(-5,b-.7)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(.46*a,-2.1);return{width:a,height:b,pathUp:function(g){return g?c:e},pathDown:function(g){return g?d:f}}};module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makeNotch=function(){return{pathLeft:(0,module$exports$Blockly$utils$svgPaths.lineOnAxis)("h",this.OFFSET)+this.constantProvider.NOTCH.pathLeft}}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makeJaggedTeeth=function(){return{pathLeft:(0,module$exports$Blockly$utils$svgPaths.lineTo)(5.1,2.6)+(0,module$exports$Blockly$utils$svgPaths.moveBy)(-10.2,6.8)+(0,module$exports$Blockly$utils$svgPaths.lineTo)(5.1,2.6),height:12,width:10.2}}; -module$exports$Blockly$geras$HighlightConstantProvider.HighlightConstantProvider.prototype.makeStartHat=function(){var a=this.constantProvider.START_HAT.height,b=(0,module$exports$Blockly$utils$svgPaths.moveBy)(25,-8.7)+(0,module$exports$Blockly$utils$svgPaths.curve)("c",[(0,module$exports$Blockly$utils$svgPaths.point)(29.7,-6.2),(0,module$exports$Blockly$utils$svgPaths.point)(57.2,-.5),(0,module$exports$Blockly$utils$svgPaths.point)(75,8.7)]),c=(0,module$exports$Blockly$utils$svgPaths.curve)("c", -[(0,module$exports$Blockly$utils$svgPaths.point)(17.8,-9.2),(0,module$exports$Blockly$utils$svgPaths.point)(45.3,-14.9),(0,module$exports$Blockly$utils$svgPaths.point)(75,-8.7)])+(0,module$exports$Blockly$utils$svgPaths.moveTo)(100.5,a+.5);return{path:function(d){return d?b:c}}};var module$exports$Blockly$geras$RenderInfo={RenderInfo:function(a,b){module$exports$Blockly$blockRendering$RenderInfo.RenderInfo.call(this,a,b)}};$.$jscomp.inherits(module$exports$Blockly$geras$RenderInfo.RenderInfo,module$exports$Blockly$blockRendering$RenderInfo.RenderInfo);module$exports$Blockly$geras$RenderInfo.RenderInfo.prototype.getRenderer=function(){return this.renderer_}; -module$exports$Blockly$geras$RenderInfo.RenderInfo.prototype.populateBottomRow_=function(){module$exports$Blockly$blockRendering$RenderInfo.RenderInfo.prototype.populateBottomRow_.call(this);this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type===$.module$exports$Blockly$inputTypes.inputTypes.STATEMENT||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}; -module$exports$Blockly$geras$RenderInfo.RenderInfo.prototype.addInput_=function(a,b){this.isInline&&a.type===$.module$exports$Blockly$inputTypes.inputTypes.VALUE?(b.elements.push(new module$exports$Blockly$geras$InlineInput.InlineInput(this.constants_,a)),b.hasInlineInput=!0):a.type===$.module$exports$Blockly$inputTypes.inputTypes.STATEMENT?(b.elements.push(new module$exports$Blockly$geras$StatementInput.StatementInput(this.constants_,a)),b.hasStatement=!0):a.type===$.module$exports$Blockly$inputTypes.inputTypes.VALUE? -(b.elements.push(new module$exports$Blockly$blockRendering$ExternalValueInput.ExternalValueInput(this.constants_,a)),b.hasExternalInput=!0):a.type===$.module$exports$Blockly$inputTypes.inputTypes.DUMMY&&(b.minHeight=Math.max(b.minHeight,this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);this.isInline||null!==b.align||(b.align=a.align)}; -module$exports$Blockly$geras$RenderInfo.RenderInfo.prototype.addElemSpacing_=function(){for(var a=!1,b=0,c;c=this.rows[b];b++)c.hasExternalInput&&(a=!0);for(b=0;c=this.rows[b];b++){var d=c.elements;c.elements=[];c.startsWithElemSpacer()&&c.elements.push(new module$exports$Blockly$blockRendering$InRowSpacer.InRowSpacer(this.constants_,this.getInRowSpacing_(null,d[0])));if(d.length){for(var e=0;eb.length?module$contents$Blockly$ContextMenuItems_deleteNext_(b,c):(0,module$exports$Blockly$dialog.confirm)($.module$exports$Blockly$Msg.Msg.DELETE_ALL_BLOCKS.replace("%1",String(b.length)),function(d){d&&module$contents$Blockly$ContextMenuItems_deleteNext_(b,c)})}},scopeType:module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.ScopeType.WORKSPACE, -id:"workspaceDelete",weight:6})};var module$contents$Blockly$ContextMenuItems_registerWorkspaceOptions_=function(){(0,module$exports$Blockly$ContextMenuItems.registerUndo)();(0,module$exports$Blockly$ContextMenuItems.registerRedo)();(0,module$exports$Blockly$ContextMenuItems.registerCleanup)();(0,module$exports$Blockly$ContextMenuItems.registerCollapse)();(0,module$exports$Blockly$ContextMenuItems.registerExpand)();(0,module$exports$Blockly$ContextMenuItems.registerDeleteAll)()}; -module$exports$Blockly$ContextMenuItems.registerDuplicate=function(){module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.registry.register({displayText:function(){return $.module$exports$Blockly$Msg.Msg.DUPLICATE_BLOCK},preconditionFn:function(a){a=a.block;return!a.isInFlyout&&a.isDeletable()&&a.isMovable()?a.isDuplicatable()?"enabled":"disabled":"hidden"},callback:function(a){a.block&&(0,module$exports$Blockly$clipboard.duplicate)(a.block)},scopeType:module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.ScopeType.BLOCK, -id:"blockDuplicate",weight:1})}; -module$exports$Blockly$ContextMenuItems.registerComment=function(){module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getCommentIcon()?$.module$exports$Blockly$Msg.Msg.REMOVE_COMMENT:$.module$exports$Blockly$Msg.Msg.ADD_COMMENT},preconditionFn:function(a){a=a.block;return module$exports$Blockly$utils$userAgent.IE||a.isInFlyout||!a.workspace.options.comments||a.isCollapsed()||!a.isEditable()?"hidden":"enabled"},callback:function(a){a= -a.block;a.getCommentIcon()?a.setCommentText(null):a.setCommentText("")},scopeType:module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.ScopeType.BLOCK,id:"blockComment",weight:2})}; -module$exports$Blockly$ContextMenuItems.registerInline=function(){module$exports$Blockly$ContextMenuRegistry.ContextMenuRegistry.registry.register({displayText:function(a){return a.block.getInputsInline()?$.module$exports$Blockly$Msg.Msg.EXTERNAL_INPUTS:$.module$exports$Blockly$Msg.Msg.INLINE_INPUTS},preconditionFn:function(a){a=a.block;if(!a.isInFlyout&&a.isMovable()&&!a.isCollapsed())for(var b=1;ba||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+ -a,d+a),this.svgDialog_.setAttribute("width",this.workspaceWidth_),this.svgDialog_.setAttribute("height",this.workspaceHeight_),this.workspace_.setCachedParentSvgSize(this.workspaceWidth_,this.workspaceHeight_);this.block_.RTL&&(a="translate("+this.workspaceWidth_+",0)",this.workspace_.getCanvas().setAttribute("transform",a));this.workspace_.resize()};$.module$exports$Blockly$Mutator.Mutator.prototype.onBubbleMove_=function(){this.workspace_&&this.workspace_.recordDragTargets()}; -$.module$exports$Blockly$Mutator.Mutator.prototype.setVisible=function(a){var b=this;if(a!==this.isVisible())if((0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.BUBBLE_OPEN))(this.block_,a,"mutator")),a){this.bubble_=new module$exports$Blockly$Bubble.Bubble(this.block_.workspace,this.createEditor_(),this.block_.pathObject.svgPath,this.iconXY_,null,null);this.bubble_.setSvgId(this.block_.id);this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this)); -var c=this.workspace_.options.languageTree;a=this.workspace_.getFlyout();c&&(a.init(this.workspace_),a.show(c));this.rootBlock_=this.block_.decompose(this.workspace_);c=this.rootBlock_.getDescendants(!1);for(var d=0,e=void 0;e=c[d];d++)e.render();this.rootBlock_.setMovable(!1);this.rootBlock_.setDeletable(!1);a?(c=2*a.CORNER_RADIUS,a=this.rootBlock_.RTL?a.getWidth()+c:c):a=c=16;this.block_.RTL&&(a=-a);this.rootBlock_.moveBy(a,c);if(this.block_.saveConnections){var f=this.rootBlock_;this.block_.saveConnections(f); -this.sourceListener_=function(){b.block_&&b.block_.saveConnections(f)};this.block_.workspace.addChangeListener(this.sourceListener_)}this.resizeBubble_();this.workspace_.addChangeListener(this.workspaceChanged_.bind(this));this.updateWorkspace_();this.applyColour()}else this.svgDialog_=null,this.workspace_.dispose(),this.rootBlock_=this.workspace_=null,this.bubble_.dispose(),this.bubble_=null,this.workspaceHeight_=this.workspaceWidth_=0,this.sourceListener_&&(this.block_.workspace.removeChangeListener(this.sourceListener_), -this.sourceListener_=null)};$.module$exports$Blockly$Mutator.Mutator.prototype.workspaceChanged_=function(a){a.isUiEvent||a.type===module$exports$Blockly$Events$utils.CHANGE&&"disabled"===a.element||a.type===module$exports$Blockly$Events$utils.CREATE||this.updateWorkspace_()}; -$.module$exports$Blockly$Mutator.Mutator.prototype.updateWorkspace_=function(){if(!this.workspace_.isDragging())for(var a=this.workspace_.getTopBlocks(!1),b=0,c=void 0;c=a[b];b++){var d=c.getRelativeToSurfaceXY();20>d.y&&c.moveBy(0,20-d.y);if(c.RTL){var e=-20,f=this.workspace_.getFlyout();f&&(e-=f.getWidth());d.x>e&&c.moveBy(e-d.x,0)}else 20>d.x&&c.moveBy(20-d.x,0)}if(this.rootBlock_.workspace===this.workspace_){(a=(0,module$exports$Blockly$Events$utils.getGroup)())||(0,module$exports$Blockly$Events$utils.setGroup)(!0); -var g=this.block_;b=module$exports$Blockly$Events$BlockChange.BlockChange.getExtraBlockState_(g);c=g.rendered;g.rendered=!1;g.compose(this.rootBlock_);g.rendered=c;g.initSvg();g.rendered&&g.render();c=module$exports$Blockly$Events$BlockChange.BlockChange.getExtraBlockState_(g);if(b!==c){(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CHANGE))(g,"mutation",null,b,c));var h=(0,module$exports$Blockly$Events$utils.getGroup)(); -setTimeout(function(){var k=(0,module$exports$Blockly$Events$utils.getGroup)();(0,module$exports$Blockly$Events$utils.setGroup)(h);g.bumpNeighbours();(0,module$exports$Blockly$Events$utils.setGroup)(k)},$.module$exports$Blockly$config.config.bumpDelay)}this.workspace_.isDragging()||this.resizeBubble_();(0,module$exports$Blockly$Events$utils.setGroup)(a)}};$.module$exports$Blockly$Mutator.Mutator.prototype.dispose=function(){this.block_.mutator=null;module$exports$Blockly$Icon.Icon.prototype.dispose.call(this)}; -$.module$exports$Blockly$Mutator.Mutator.prototype.updateBlockStyle=function(){var a=this.workspace_;if(a&&a.getAllBlocks(!1)){for(var b=a.getAllBlocks(!1),c=0,d;d=b[c];c++)d.setStyle(d.getStyleName());if(a=a.getFlyout())for(a=a.workspace_.getAllBlocks(!1),b=0;c=a[b];b++)c.setStyle(c.getStyleName())}}; -$.module$exports$Blockly$Mutator.Mutator.reconnect=function(a,b,c){if(!a||!a.getSourceBlock().workspace)return!1;c=b.getInput(c).connection;var d=a.targetBlock();return d&&d!==b||c.targetConnection===a?!1:(c.isConnected()&&c.disconnect(),c.connect(a),!0)};$.module$exports$Blockly$Mutator.Mutator.findParentWs=function(a){var b=null;if(a&&a.options){var c=a.options.parentWorkspace;a.isFlyout?c&&c.options&&(b=c.options.parentWorkspace):c&&(b=c)}return b};var module$exports$Blockly$Warning={Warning:function(a){module$exports$Blockly$Icon.Icon.call(this,a);this.createIcon();this.text_=Object.create(null);this.paragraphElement_=null;this.collapseHidden=!1}};$.$jscomp.inherits(module$exports$Blockly$Warning.Warning,module$exports$Blockly$Icon.Icon); -module$exports$Blockly$Warning.Warning.prototype.drawIcon_=function(a){(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATH,{"class":"blocklyIconShape",d:"M2,15Q-1,15 0.5,12L6.5,1.7Q8,-1 9.5,1.7L15.5,12Q17,15 14,15z"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATH,{"class":"blocklyIconSymbol",d:"m7,4.8v3.16l0.27,2.27h1.46l0.27,-2.27v-3.16z"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT, -{"class":"blocklyIconSymbol",x:"7",y:"11",height:"2",width:"2"},a)};module$exports$Blockly$Warning.Warning.prototype.setVisible=function(a){a!==this.isVisible()&&((0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.BUBBLE_OPEN))(this.block_,a,"warning")),a?this.createBubble_():this.disposeBubble_())}; -module$exports$Blockly$Warning.Warning.prototype.createBubble_=function(){this.paragraphElement_=module$exports$Blockly$Bubble.Bubble.textToDom(this.getText());this.bubble_=module$exports$Blockly$Bubble.Bubble.createNonEditableBubble(this.paragraphElement_,this.block_,this.iconXY_);this.applyColour()};module$exports$Blockly$Warning.Warning.prototype.disposeBubble_=function(){this.bubble_.dispose();this.paragraphElement_=this.bubble_=null}; -module$exports$Blockly$Warning.Warning.prototype.setText=function(a,b){this.text_[b]!==a&&(a?this.text_[b]=a:delete this.text_[b],this.isVisible()&&(this.setVisible(!1),this.setVisible(!0)))};module$exports$Blockly$Warning.Warning.prototype.getText=function(){var a=[],b;for(b in this.text_)a.push(this.text_[b]);return a.join("\n")};module$exports$Blockly$Warning.Warning.prototype.dispose=function(){this.block_.warning=null;module$exports$Blockly$Icon.Icon.prototype.dispose.call(this)};var module$exports$Blockly$Comment={Comment:function(a){module$exports$Blockly$Icon.Icon.call(this,a);this.model_=a.commentModel;this.model_.text=this.model_.text||"";this.cachedText_="";this.paragraphElement_=this.textarea_=this.foreignObject_=this.onInputWrapper_=this.onChangeWrapper_=this.onWheelWrapper_=this.onMouseUpWrapper_=null;this.createIcon()}};$.$jscomp.inherits(module$exports$Blockly$Comment.Comment,module$exports$Blockly$Icon.Icon); -module$exports$Blockly$Comment.Comment.prototype.drawIcon_=function(a){(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CIRCLE,{"class":"blocklyIconShape",r:"8",cx:"8",cy:"8"},a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.PATH,{"class":"blocklyIconSymbol",d:"m6.8,10h2c0.003,-0.617 0.271,-0.962 0.633,-1.266 2.875,-2.4050.607,-5.534 -3.765,-3.874v1.7c3.12,-1.657 3.698,0.118 2.336,1.25-1.201,0.998 -1.201,1.528 -1.204,2.19z"}, -a);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyIconSymbol",x:"6.8",y:"10.78",height:"2",width:"2"},a)}; -module$exports$Blockly$Comment.Comment.prototype.createEditor_=function(){this.foreignObject_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FOREIGNOBJECT,{x:module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH,y:module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH},null);var a=document.createElementNS(module$exports$Blockly$utils$dom.HTML_NS,"body");a.setAttribute("xmlns",module$exports$Blockly$utils$dom.HTML_NS);a.className="blocklyMinimalBody";var b=this.textarea_= -document.createElementNS(module$exports$Blockly$utils$dom.HTML_NS,"textarea");b.className="blocklyCommentTextarea";b.setAttribute("dir",this.block_.RTL?"RTL":"LTR");b.value=this.model_.text;this.resizeTextarea_();a.appendChild(b);this.foreignObject_.appendChild(a);this.onMouseUpWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"mouseup",this,this.startEdit_,!0,!0);this.onWheelWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"wheel",this,function(c){c.stopPropagation()}); -this.onChangeWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"change",this,function(c){this.cachedText_!==this.model_.text&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.CHANGE))(this.block_,"comment",null,this.cachedText_,this.model_.text))});this.onInputWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"input",this,function(c){this.model_.text=b.value});setTimeout(b.focus.bind(b), -0);return this.foreignObject_};module$exports$Blockly$Comment.Comment.prototype.updateEditable=function(){module$exports$Blockly$Icon.Icon.prototype.updateEditable.call(this);this.isVisible()&&(this.disposeBubble_(),this.createBubble_())};module$exports$Blockly$Comment.Comment.prototype.onBubbleResize_=function(){this.isVisible()&&(this.model_.size=this.bubble_.getBubbleSize(),this.resizeTextarea_())}; -module$exports$Blockly$Comment.Comment.prototype.resizeTextarea_=function(){var a=this.model_.size,b=2*module$exports$Blockly$Bubble.Bubble.BORDER_WIDTH,c=a.width-b;a=a.height-b;this.foreignObject_.setAttribute("width",c);this.foreignObject_.setAttribute("height",a);this.textarea_.style.width=c-4+"px";this.textarea_.style.height=a-4+"px"}; -module$exports$Blockly$Comment.Comment.prototype.setVisible=function(a){a!==this.isVisible()&&((0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.BUBBLE_OPEN))(this.block_,a,"comment")),(this.model_.pinned=a)?this.createBubble_():this.disposeBubble_())}; -module$exports$Blockly$Comment.Comment.prototype.createBubble_=function(){!this.block_.isEditable()||module$exports$Blockly$utils$userAgent.IE?this.createNonEditableBubble_():this.createEditableBubble_()}; -module$exports$Blockly$Comment.Comment.prototype.createEditableBubble_=function(){this.bubble_=new module$exports$Blockly$Bubble.Bubble(this.block_.workspace,this.createEditor_(),this.block_.pathObject.svgPath,this.iconXY_,this.model_.size.width,this.model_.size.height);this.bubble_.setSvgId(this.block_.id);this.bubble_.registerResizeEvent(this.onBubbleResize_.bind(this));this.applyColour()}; -module$exports$Blockly$Comment.Comment.prototype.createNonEditableBubble_=function(){this.paragraphElement_=module$exports$Blockly$Bubble.Bubble.textToDom(this.block_.getCommentText());this.bubble_=module$exports$Blockly$Bubble.Bubble.createNonEditableBubble(this.paragraphElement_,this.block_,this.iconXY_);this.applyColour()}; -module$exports$Blockly$Comment.Comment.prototype.disposeBubble_=function(){this.onMouseUpWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null);this.onWheelWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onWheelWrapper_),this.onWheelWrapper_=null);this.onChangeWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onChangeWrapper_),this.onChangeWrapper_=null);this.onInputWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onInputWrapper_), -this.onInputWrapper_=null);this.bubble_.dispose();this.paragraphElement_=this.foreignObject_=this.textarea_=this.bubble_=null};module$exports$Blockly$Comment.Comment.prototype.startEdit_=function(a){this.bubble_.promote()&&this.textarea_.focus();this.cachedText_=this.model_.text};module$exports$Blockly$Comment.Comment.prototype.getBubbleSize=function(){return this.model_.size}; -module$exports$Blockly$Comment.Comment.prototype.setBubbleSize=function(a,b){this.bubble_?this.bubble_.setBubbleSize(a,b):(this.model_.size.width=a,this.model_.size.height=b)};module$exports$Blockly$Comment.Comment.prototype.updateText=function(){this.textarea_?this.textarea_.value=this.model_.text:this.paragraphElement_&&(this.paragraphElement_.firstChild.textContent=this.model_.text)};module$exports$Blockly$Comment.Comment.prototype.dispose=function(){this.block_.comment=null;module$exports$Blockly$Icon.Icon.prototype.dispose.call(this)}; -(0,module$exports$Blockly$Css.register)("\n.blocklyCommentTextarea {\n background-color: #fef49c;\n border: 0;\n display: block;\n margin: 0;\n outline: 0;\n padding: 3px;\n resize: none;\n text-overflow: hidden;\n}\n");var module$exports$Blockly$sprite={SPRITE:{width:96,height:124,url:"sprites.png"}};var module$exports$Blockly$uiPosition={verticalPosition:{TOP:0,BOTTOM:1},horizontalPosition:{LEFT:0,RIGHT:1},bumpDirection:{UP:0,DOWN:1},getStartPositionRect:function(a,b,c,d,e,f){var g=f.scrollbar&&f.scrollbar.canScrollVertically();a.horizontal===module$exports$Blockly$uiPosition.horizontalPosition.LEFT?(c=e.absoluteMetrics.left+c,g&&f.RTL&&(c+=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness)):(c=e.absoluteMetrics.left+e.viewMetrics.width-b.width-c,g&&!f.RTL&&(c-=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness)); -a.vertical===module$exports$Blockly$uiPosition.verticalPosition.TOP?a=e.absoluteMetrics.top+d:(a=e.absoluteMetrics.top+e.viewMetrics.height-b.height-d,f.scrollbar&&f.scrollbar.canScrollHorizontally()&&(a-=module$exports$Blockly$Scrollbar.Scrollbar.scrollbarThickness));return new module$exports$Blockly$utils$Rect.Rect(a,a+b.height,c,c+b.width)},getCornerOppositeToolbox:function(a,b){return{horizontal:b.toolboxMetrics.position===module$exports$Blockly$utils$toolbox.Position.LEFT||a.horizontalLayout&& -!a.RTL?module$exports$Blockly$uiPosition.horizontalPosition.RIGHT:module$exports$Blockly$uiPosition.horizontalPosition.LEFT,vertical:b.toolboxMetrics.position===module$exports$Blockly$utils$toolbox.Position.BOTTOM?module$exports$Blockly$uiPosition.verticalPosition.TOP:module$exports$Blockly$uiPosition.verticalPosition.BOTTOM}},bumpPositionRect:function(a,b,c,d){for(var e=a.left,f=a.right-a.left,g=a.bottom-a.top,h=0;himage, .blocklyZoom>svg>image {\n opacity: .4;\n}\n\n.blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {\n opacity: .6;\n}\n\n.blocklyZoom>image:active, .blocklyZoom>svg>image:active {\n opacity: .8;\n}\n");var module$exports$Blockly$WorkspaceComment={WorkspaceComment:function(a,b,c,d,e){this.id=e&&!a.getCommentById(e)?e:(0,module$exports$Blockly$utils$idGenerator.genUid)();a.addTopComment(this);this.xy_=new module$exports$Blockly$utils$Coordinate.Coordinate(0,0);this.height_=c;this.width_=d;this.workspace=a;this.RTL=a.RTL;this.editable_=this.movable_=this.deletable_=!0;this.content_=b;this.disposed_=!1;this.isComment=!0;module$exports$Blockly$WorkspaceComment.WorkspaceComment.fireCreateEvent(this)}}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.dispose=function(){this.disposed_||((0,module$exports$Blockly$Events$utils.isEnabled)()&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_DELETE))(this)),this.workspace.removeTopComment(this),this.disposed_=!0)};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.getHeight=function(){return this.height_}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setHeight=function(a){this.height_=a};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.getWidth=function(){return this.width_};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setWidth=function(a){this.width_=a};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.getXY=function(){return new module$exports$Blockly$utils$Coordinate.Coordinate(this.xy_.x,this.xy_.y)}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.moveBy=function(a,b){var c=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_MOVE))(this);this.xy_.translate(a,b);c.recordNew();(0,module$exports$Blockly$Events$utils.fire)(c)};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.isDeletable=function(){return this.deletable_&&!(this.workspace&&this.workspace.options.readOnly)}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setDeletable=function(a){this.deletable_=a};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.isMovable=function(){return this.movable_&&!(this.workspace&&this.workspace.options.readOnly)};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setMovable=function(a){this.movable_=a}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.isEditable=function(){return this.editable_&&!(this.workspace&&this.workspace.options.readOnly)};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setEditable=function(a){this.editable_=a};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.getContent=function(){return this.content_}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setContent=function(a){this.content_!==a&&((0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_CHANGE))(this,this.content_,a)),this.content_=a)}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.toXmlWithXY=function(a){a=this.toXml(a);a.setAttribute("x",Math.round(this.xy_.x));a.setAttribute("y",Math.round(this.xy_.y));a.setAttribute("h",this.height_);a.setAttribute("w",this.width_);return a};module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.toXml=function(a){var b=(0,$.module$exports$Blockly$utils$xml.createElement)("comment");a||(b.id=this.id);b.textContent=this.getContent();return b}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.fireCreateEvent=function(a){if((0,module$exports$Blockly$Events$utils.isEnabled)()){var b=(0,module$exports$Blockly$Events$utils.getGroup)();b||(0,module$exports$Blockly$Events$utils.setGroup)(!0);try{(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_CREATE))(a))}finally{b||(0,module$exports$Blockly$Events$utils.setGroup)(!1)}}}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.fromXml=function(a,b){var c=module$exports$Blockly$WorkspaceComment.WorkspaceComment.parseAttributes(a);b=new module$exports$Blockly$WorkspaceComment.WorkspaceComment(b,c.content,c.h,c.w,c.id);c=parseInt(a.getAttribute("x"),10);a=parseInt(a.getAttribute("y"),10);isNaN(c)||isNaN(a)||b.moveBy(c,a);module$exports$Blockly$WorkspaceComment.WorkspaceComment.fireCreateEvent(b);return b}; -module$exports$Blockly$WorkspaceComment.WorkspaceComment.parseAttributes=function(a){var b=a.getAttribute("h"),c=a.getAttribute("w");return{id:a.getAttribute("id"),h:b?parseInt(b,10):100,w:c?parseInt(c,10):100,x:parseInt(a.getAttribute("x"),10),y:parseInt(a.getAttribute("y"),10),content:a.textContent}};var module$exports$Blockly$WorkspaceCommentSvg={},module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE=8,module$contents$Blockly$WorkspaceCommentSvg_BORDER_RADIUS=3,module$contents$Blockly$WorkspaceCommentSvg_TEXTAREA_OFFSET=2; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg=function(a,b,c,d,e){module$exports$Blockly$WorkspaceComment.WorkspaceComment.call(this,a,b,c,d,e);this.onMouseMoveWrapper_=this.onMouseUpWrapper_=null;this.eventsInit_=!1;this.deleteIconBorder_=this.deleteGroup_=this.resizeGroup_=this.foreignObject_=this.svgHandleTarget_=this.svgRectTarget_=this.textarea_=null;this.autoLayout_=this.focused_=!1;this.svgGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G, -{"class":"blocklyComment"},null);this.svgGroup_.translate_="";this.svgRect_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyCommentRect",x:0,y:0,rx:module$contents$Blockly$WorkspaceCommentSvg_BORDER_RADIUS,ry:module$contents$Blockly$WorkspaceCommentSvg_BORDER_RADIUS});this.svgGroup_.appendChild(this.svgRect_);this.rendered_=!1;this.useDragSurface_=(0,module$exports$Blockly$utils$svgMath.is3dSupported)()&&!!a.getBlockDragSurface();this.render()}; -$.$jscomp.inherits(module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg,module$exports$Blockly$WorkspaceComment.WorkspaceComment); -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.dispose=function(){this.disposed_||((0,$.module$exports$Blockly$common.getSelected)()===this&&(this.unselect(),this.workspace.cancelCurrentGesture()),(0,module$exports$Blockly$Events$utils.isEnabled)()&&(0,module$exports$Blockly$Events$utils.fire)(new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_DELETE))(this)),(0,module$exports$Blockly$utils$dom.removeNode)(this.svgGroup_),this.disposeInternal_(), -(0,module$exports$Blockly$Events$utils.disable)(),module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.dispose.call(this),(0,module$exports$Blockly$Events$utils.enable)())}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.initSvg=function(a){if(!this.workspace.rendered)throw TypeError("Workspace is headless.");this.workspace.options.readOnly||this.eventsInit_||((0,module$exports$Blockly$browserEvents.conditionalBind)(this.svgRectTarget_,"mousedown",this,this.pathMouseDown_),(0,module$exports$Blockly$browserEvents.conditionalBind)(this.svgHandleTarget_,"mousedown",this,this.pathMouseDown_));this.eventsInit_=!0;this.updateMovable();this.getSvgRoot().parentNode|| -this.workspace.getBubbleCanvas().appendChild(this.getSvgRoot());!a&&this.textarea_&&this.textarea_.select()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.pathMouseDown_=function(a){var b=this.workspace.getGesture(a);b&&b.handleBubbleStart(a,this)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.showContextMenu=function(a){if(!this.workspace.options.readOnly){var b=[];this.isDeletable()&&this.isMovable()&&(b.push((0,$.module$exports$Blockly$ContextMenu.commentDuplicateOption)(this)),b.push((0,$.module$exports$Blockly$ContextMenu.commentDeleteOption)(this)));(0,$.module$exports$Blockly$ContextMenu.show)(a,b,this.RTL)}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.select=function(){if((0,$.module$exports$Blockly$common.getSelected)()!==this){var a=null;if((0,$.module$exports$Blockly$common.getSelected)()){a=(0,$.module$exports$Blockly$common.getSelected)().id;(0,module$exports$Blockly$Events$utils.disable)();try{(0,$.module$exports$Blockly$common.getSelected)().unselect()}finally{(0,module$exports$Blockly$Events$utils.enable)()}}a=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.SELECTED))(a, -this.id,this.workspace.id);(0,module$exports$Blockly$Events$utils.fire)(a);(0,$.module$exports$Blockly$common.setSelected)(this);this.addSelect()}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.unselect=function(){if((0,$.module$exports$Blockly$common.getSelected)()===this){var a=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.SELECTED))(this.id,null,this.workspace.id);(0,module$exports$Blockly$Events$utils.fire)(a);(0,$.module$exports$Blockly$common.setSelected)(null);this.removeSelect();this.blurFocus()}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.addSelect=function(){(0,module$exports$Blockly$utils$dom.addClass)(this.svgGroup_,"blocklySelected");this.setFocus()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.removeSelect=function(){(0,module$exports$Blockly$utils$dom.removeClass)(this.svgGroup_,"blocklySelected");this.blurFocus()}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.addFocus=function(){(0,module$exports$Blockly$utils$dom.addClass)(this.svgGroup_,"blocklyFocused")};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.removeFocus=function(){(0,module$exports$Blockly$utils$dom.removeClass)(this.svgGroup_,"blocklyFocused")}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.getRelativeToSurfaceXY=function(){var a=0,b=0,c=this.useDragSurface_?this.workspace.getBlockDragSurface().getGroup():null,d=this.getSvgRoot();if(d){do{var e=(0,module$exports$Blockly$utils$svgMath.getRelativeXY)(d);a+=e.x;b+=e.y;this.useDragSurface_&&this.workspace.getBlockDragSurface().getCurrentBlock()===d&&(e=this.workspace.getBlockDragSurface().getSurfaceTranslation(),a+=e.x,b+=e.y);d=d.parentNode}while(d&&d!==this.workspace.getBubbleCanvas()&& -d!==c)}return this.xy_=new module$exports$Blockly$utils$Coordinate.Coordinate(a,b)};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.moveBy=function(a,b){var c=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.COMMENT_MOVE))(this),d=this.getRelativeToSurfaceXY();this.translate(d.x+a,d.y+b);this.xy_=new module$exports$Blockly$utils$Coordinate.Coordinate(d.x+a,d.y+b);c.recordNew();(0,module$exports$Blockly$Events$utils.fire)(c);this.workspace.resizeContents()}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.translate=function(a,b){this.xy_=new module$exports$Blockly$utils$Coordinate.Coordinate(a,b);this.getSvgRoot().setAttribute("transform","translate("+a+","+b+")")};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.moveToDragSurface=function(){if(this.useDragSurface_){var a=this.getRelativeToSurfaceXY();this.clearTransformAttributes_();this.workspace.getBlockDragSurface().translateSurface(a.x,a.y);this.workspace.getBlockDragSurface().setBlocksAndShow(this.getSvgRoot())}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.moveDuringDrag=function(a,b){a?a.translateSurface(b.x,b.y):(this.svgGroup_.translate_="translate("+b.x+","+b.y+")",this.svgGroup_.setAttribute("transform",this.svgGroup_.translate_+this.svgGroup_.skew_))};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.moveTo=function(a,b){this.translate(a,b)};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.clearTransformAttributes_=function(){this.getSvgRoot().removeAttribute("transform")}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.getBoundingRectangle=function(){var a=this.getRelativeToSurfaceXY(),b=this.getHeightWidth(),c=a.y,d=a.y+b.height;if(this.RTL){var e=a.x-b.width;a=a.x}else e=a.x,a=a.x+b.width;return new module$exports$Blockly$utils$Rect.Rect(c,d,e,a)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.updateMovable=function(){this.isMovable()?(0,module$exports$Blockly$utils$dom.addClass)(this.svgGroup_,"blocklyDraggable"):(0,module$exports$Blockly$utils$dom.removeClass)(this.svgGroup_,"blocklyDraggable")};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setMovable=function(a){module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setMovable.call(this,a);this.updateMovable()}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setEditable=function(a){module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setEditable.call(this,a);this.textarea_&&(this.textarea_.readOnly=!a)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setDragging=function(a){a?(a=this.getSvgRoot(),a.translate_="",a.skew_="",(0,module$exports$Blockly$utils$dom.addClass)(this.svgGroup_,"blocklyDragging")):(0,module$exports$Blockly$utils$dom.removeClass)(this.svgGroup_,"blocklyDragging")};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.getSvgRoot=function(){return this.svgGroup_}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.getContent=function(){return this.textarea_?this.textarea_.value:this.content_};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setContent=function(a){module$exports$Blockly$WorkspaceComment.WorkspaceComment.prototype.setContent.call(this,a);this.textarea_&&(this.textarea_.value=a)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setDeleteStyle=function(a){a?(0,module$exports$Blockly$utils$dom.addClass)(this.svgGroup_,"blocklyDraggingDelete"):(0,module$exports$Blockly$utils$dom.removeClass)(this.svgGroup_,"blocklyDraggingDelete")};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setAutoLayout=function(a){}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.toXmlWithXY=function(a){var b;this.workspace.RTL&&(b=this.workspace.getWidth());a=this.toXml(a);var c=this.getRelativeToSurfaceXY();a.setAttribute("x",Math.round(this.workspace.RTL?b-c.x:c.x));a.setAttribute("y",Math.round(c.y));a.setAttribute("h",this.getHeight());a.setAttribute("w",this.getWidth());return a}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.toCopyData=function(){return{saveInfo:this.toXmlWithXY(),source:this.workspace,typeCounts:null}};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.getHeightWidth=function(){return{width:this.getWidth(),height:this.getHeight()}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.render=function(){if(!this.rendered_){var a=this.getHeightWidth();this.createEditor_();this.svgGroup_.appendChild(this.foreignObject_);this.svgHandleTarget_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyCommentHandleTarget",x:0,y:0});this.svgGroup_.appendChild(this.svgHandleTarget_);this.svgRectTarget_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT, -{"class":"blocklyCommentTarget",x:0,y:0,rx:module$contents$Blockly$WorkspaceCommentSvg_BORDER_RADIUS,ry:module$contents$Blockly$WorkspaceCommentSvg_BORDER_RADIUS});this.svgGroup_.appendChild(this.svgRectTarget_);this.addResizeDom_();this.isDeletable()&&this.addDeleteDom_();this.setSize_(a.width,a.height);this.textarea_.value=this.content_;this.rendered_=!0;this.resizeGroup_&&(0,module$exports$Blockly$browserEvents.conditionalBind)(this.resizeGroup_,"mousedown",this,this.resizeMouseDown_);this.isDeletable()&& -((0,module$exports$Blockly$browserEvents.conditionalBind)(this.deleteGroup_,"mousedown",this,this.deleteMouseDown_),(0,module$exports$Blockly$browserEvents.conditionalBind)(this.deleteGroup_,"mouseout",this,this.deleteMouseOut_),(0,module$exports$Blockly$browserEvents.conditionalBind)(this.deleteGroup_,"mouseup",this,this.deleteMouseUp_))}}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.createEditor_=function(){this.foreignObject_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.FOREIGNOBJECT,{x:0,y:module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.TOP_OFFSET,"class":"blocklyCommentForeignObject"},null);var a=document.createElementNS(module$exports$Blockly$utils$dom.HTML_NS,"body");a.setAttribute("xmlns",module$exports$Blockly$utils$dom.HTML_NS);a.className= -"blocklyMinimalBody";var b=document.createElementNS(module$exports$Blockly$utils$dom.HTML_NS,"textarea");b.className="blocklyCommentTextarea";b.setAttribute("dir",this.RTL?"RTL":"LTR");b.readOnly=!this.isEditable();a.appendChild(b);this.textarea_=b;this.foreignObject_.appendChild(a);(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"wheel",this,function(c){c.stopPropagation()});(0,module$exports$Blockly$browserEvents.conditionalBind)(b,"change",this,function(c){this.setContent(b.value)}); -return this.foreignObject_}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.addResizeDom_=function(){this.resizeGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{"class":this.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.svgGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g,module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE.toString())},this.resizeGroup_); -(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE,{"class":"blocklyResizeLine",x1:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE/3,y1:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE-1,x2:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE-1,y2:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE/3},this.resizeGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE,{"class":"blocklyResizeLine", -x1:2*module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE/3,y1:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE-1,x2:module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE-1,y2:2*module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE/3},this.resizeGroup_)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.addDeleteDom_=function(){this.deleteGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{"class":"blocklyCommentDeleteIcon"},this.svgGroup_);this.deleteIconBorder_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CIRCLE,{"class":"blocklyDeleteIconShape",r:"7",cx:"7.5",cy:"7.5"},this.deleteGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE, -{x1:"5",y1:"10",x2:"10",y2:"5",stroke:"#fff","stroke-width":"2"},this.deleteGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.LINE,{x1:"5",y1:"5",x2:"10",y2:"10",stroke:"#fff","stroke-width":"2"},this.deleteGroup_)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.resizeMouseDown_=function(a){this.unbindDragEvents_();(0,module$exports$Blockly$browserEvents.isRightButton)(a)||(this.workspace.startDrag(a,new module$exports$Blockly$utils$Coordinate.Coordinate(this.workspace.RTL?-this.width_:this.width_,this.height_)),this.onMouseUpWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document,"mouseup",this,this.resizeMouseUp_),this.onMouseMoveWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(document, -"mousemove",this,this.resizeMouseMove_),this.workspace.hideChaff());a.stopPropagation()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.deleteMouseDown_=function(a){(0,module$exports$Blockly$utils$dom.addClass)(this.deleteIconBorder_,"blocklyDeleteIconHighlighted");a.stopPropagation()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.deleteMouseOut_=function(a){(0,module$exports$Blockly$utils$dom.removeClass)(this.deleteIconBorder_,"blocklyDeleteIconHighlighted")}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.deleteMouseUp_=function(a){this.dispose();a.stopPropagation()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.unbindDragEvents_=function(){this.onMouseUpWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null);this.onMouseMoveWrapper_&&((0,module$exports$Blockly$browserEvents.unbind)(this.onMouseMoveWrapper_),this.onMouseMoveWrapper_=null)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.resizeMouseUp_=function(a){(0,module$exports$Blockly$Touch.clearTouchIdentifier)();this.unbindDragEvents_()};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.resizeMouseMove_=function(a){this.autoLayout_=!1;a=this.workspace.moveDrag(a);this.setSize_(this.RTL?-a.x:a.x,a.y)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.resizeComment_=function(){var a=this.getHeightWidth(),b=module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.TOP_OFFSET,c=2*module$contents$Blockly$WorkspaceCommentSvg_TEXTAREA_OFFSET;this.foreignObject_.setAttribute("width",a.width);this.foreignObject_.setAttribute("height",a.height-b);this.RTL&&this.foreignObject_.setAttribute("x",-a.width);this.textarea_.style.width=a.width-c+"px";this.textarea_.style.height=a.height- -c-b+"px"}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setSize_=function(a,b){a=Math.max(a,45);b=Math.max(b,20+module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.TOP_OFFSET);this.width_=a;this.height_=b;this.svgRect_.setAttribute("width",a);this.svgRect_.setAttribute("height",b);this.svgRectTarget_.setAttribute("width",a);this.svgRectTarget_.setAttribute("height",b);this.svgHandleTarget_.setAttribute("width",a);this.svgHandleTarget_.setAttribute("height",module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.TOP_OFFSET);this.RTL&& -(this.svgRect_.setAttribute("transform","scale(-1 1)"),this.svgRectTarget_.setAttribute("transform","scale(-1 1)"));this.resizeGroup_&&(this.RTL?(this.resizeGroup_.setAttribute("transform","translate("+(-a+module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+","+(b-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+") scale(-1 1)"),this.deleteGroup_.setAttribute("transform","translate("+(-a+module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+","+-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE+ -") scale(-1 1)")):(this.resizeGroup_.setAttribute("transform","translate("+(a-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+","+(b-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+")"),this.deleteGroup_.setAttribute("transform","translate("+(a-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE)+","+-module$contents$Blockly$WorkspaceCommentSvg_RESIZE_SIZE+")")));this.resizeComment_()}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.disposeInternal_=function(){this.svgHandleTarget_=this.svgRectTarget_=this.foreignObject_=this.textarea_=null;this.disposed_=!0}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.setFocus=function(){var a=this;this.focused_=!0;setTimeout(function(){a.disposed_||(a.textarea_.focus(),a.addFocus(),(0,module$exports$Blockly$utils$dom.addClass)(a.svgRectTarget_,"blocklyCommentTargetFocused"),(0,module$exports$Blockly$utils$dom.addClass)(a.svgHandleTarget_,"blocklyCommentHandleTargetFocused"))},0)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.prototype.blurFocus=function(){var a=this;this.focused_=!1;setTimeout(function(){a.disposed_||(a.textarea_.blur(),a.removeFocus(),(0,module$exports$Blockly$utils$dom.removeClass)(a.svgRectTarget_,"blocklyCommentTargetFocused"),(0,module$exports$Blockly$utils$dom.removeClass)(a.svgHandleTarget_,"blocklyCommentHandleTargetFocused"))},0)}; -module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.fromXmlRendered=function(a,b,c){(0,module$exports$Blockly$Events$utils.disable)();try{var d=module$exports$Blockly$WorkspaceComment.WorkspaceComment.parseAttributes(a);var e=new module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg(b,d.content,d.h,d.w,d.id);b.rendered&&(e.initSvg(!0),e.render());if(!isNaN(d.x)&&!isNaN(d.y))if(b.RTL){var f=c||b.getWidth();e.moveBy(f-d.x,d.y)}else e.moveBy(d.x,d.y)}finally{(0,module$exports$Blockly$Events$utils.enable)()}module$exports$Blockly$WorkspaceComment.WorkspaceComment.fireCreateEvent(e); -return e};module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.DEFAULT_SIZE=100;module$exports$Blockly$WorkspaceCommentSvg.WorkspaceCommentSvg.TOP_OFFSET=10;(0,module$exports$Blockly$Css.register)("\n.blocklyCommentForeignObject {\n position: relative;\n z-index: 0;\n}\n\n.blocklyCommentRect {\n fill: #E7DE8E;\n stroke: #bcA903;\n stroke-width: 1px;\n}\n\n.blocklyCommentTarget {\n fill: transparent;\n stroke: #bcA903;\n}\n\n.blocklyCommentTargetFocused {\n fill: none;\n}\n\n.blocklyCommentHandleTarget {\n fill: none;\n}\n\n.blocklyCommentHandleTargetFocused {\n fill: transparent;\n}\n\n.blocklyFocused>.blocklyCommentRect {\n fill: #B9B272;\n stroke: #B9B272;\n}\n\n.blocklySelected>.blocklyCommentTarget {\n stroke: #fc3;\n stroke-width: 3px;\n}\n\n.blocklyCommentDeleteIcon {\n cursor: pointer;\n fill: #000;\n display: none;\n}\n\n.blocklySelected > .blocklyCommentDeleteIcon {\n display: block;\n}\n\n.blocklyDeleteIconShape {\n fill: #000;\n stroke: #000;\n stroke-width: 1px;\n}\n\n.blocklyDeleteIconShape.blocklyDeleteIconHighlighted {\n stroke: #fc3;\n}\n");var module$exports$Blockly$Trashcan={Trashcan:function(a){module$exports$Blockly$DeleteArea.DeleteArea.call(this);this.workspace_=a;this.id="trashcan";this.contents_=[];this.flyout=null;0>=this.workspace_.options.maxTrashcanContents||(this.isLidOpen=!1,this.minOpenness_=0,this.svgLid_=this.svgGroup_=null,this.top_=this.left_=this.lidOpen_=this.lidTask_=0,this.initialized_=!1,a=new module$exports$Blockly$Options.Options({scrollbars:!0,parentWorkspace:this.workspace_,rtl:this.workspace_.RTL,oneBasedIndex:this.workspace_.options.oneBasedIndex, -renderer:this.workspace_.options.renderer,rendererOverrides:this.workspace_.options.rendererOverrides,move:{scrollbars:!0}}),this.workspace_.horizontalLayout?(a.toolboxPosition=this.workspace_.toolboxPosition===module$exports$Blockly$utils$toolbox.Position.TOP?module$exports$Blockly$utils$toolbox.Position.BOTTOM:module$exports$Blockly$utils$toolbox.Position.TOP,this.flyout=new ((0,module$exports$Blockly$registry.getClassFromOptions)(module$exports$Blockly$registry.Type.FLYOUTS_HORIZONTAL_TOOLBOX, -this.workspace_.options,!0))(a)):(a.toolboxPosition=this.workspace_.toolboxPosition===module$exports$Blockly$utils$toolbox.Position.RIGHT?module$exports$Blockly$utils$toolbox.Position.LEFT:module$exports$Blockly$utils$toolbox.Position.RIGHT,this.flyout=new ((0,module$exports$Blockly$registry.getClassFromOptions)(module$exports$Blockly$registry.Type.FLYOUTS_VERTICAL_TOOLBOX,this.workspace_.options,!0))(a)),this.workspace_.addChangeListener(this.onDelete_.bind(this)))}}; -$.$jscomp.inherits(module$exports$Blockly$Trashcan.Trashcan,module$exports$Blockly$DeleteArea.DeleteArea); -module$exports$Blockly$Trashcan.Trashcan.prototype.createDom=function(){this.svgGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{"class":"blocklyTrash"},null);var a=String(Math.random()).substring(2);var b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+a},this.svgGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT, -{width:module$contents$Blockly$Trashcan_WIDTH,height:module$contents$Blockly$Trashcan_BODY_HEIGHT,y:module$contents$Blockly$Trashcan_LID_HEIGHT},b);var c=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.IMAGE,{width:module$exports$Blockly$sprite.SPRITE.width,x:-module$contents$Blockly$Trashcan_SPRITE_LEFT,height:module$exports$Blockly$sprite.SPRITE.height,y:-module$contents$Blockly$Trashcan_SPRITE_TOP,"clip-path":"url(#blocklyTrashBodyClipPath"+a+")"},this.svgGroup_); -c.setAttributeNS(module$exports$Blockly$utils$dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+module$exports$Blockly$sprite.SPRITE.url);b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.CLIPPATH,{id:"blocklyTrashLidClipPath"+a},this.svgGroup_);(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{width:module$contents$Blockly$Trashcan_WIDTH,height:module$contents$Blockly$Trashcan_LID_HEIGHT},b);this.svgLid_= -(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.IMAGE,{width:module$exports$Blockly$sprite.SPRITE.width,x:-module$contents$Blockly$Trashcan_SPRITE_LEFT,height:module$exports$Blockly$sprite.SPRITE.height,y:-module$contents$Blockly$Trashcan_SPRITE_TOP,"clip-path":"url(#blocklyTrashLidClipPath"+a+")"},this.svgGroup_);this.svgLid_.setAttributeNS(module$exports$Blockly$utils$dom.XLINK_NS,"xlink:href",this.workspace_.options.pathToMedia+module$exports$Blockly$sprite.SPRITE.url); -(0,module$exports$Blockly$browserEvents.bind)(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);(0,module$exports$Blockly$browserEvents.bind)(this.svgGroup_,"mouseup",this,this.click);(0,module$exports$Blockly$browserEvents.bind)(c,"mouseover",this,this.mouseOver_);(0,module$exports$Blockly$browserEvents.bind)(c,"mouseout",this,this.mouseOut_);this.animateLid_();return this.svgGroup_}; -module$exports$Blockly$Trashcan.Trashcan.prototype.init=function(){0this.minOpenness_&&1>this.lidOpen_&&(this.lidTask_=setTimeout(this.animateLid_.bind(this),module$contents$Blockly$Trashcan_ANIMATION_LENGTH/a))}; -module$exports$Blockly$Trashcan.Trashcan.prototype.setLidAngle_=function(a){var b=this.workspace_.toolboxPosition===module$exports$Blockly$utils$toolbox.Position.RIGHT||this.workspace_.horizontalLayout&&this.workspace_.RTL;this.svgLid_.setAttribute("transform","rotate("+(b?-a:a)+","+(b?4:module$contents$Blockly$Trashcan_WIDTH-4)+","+(module$contents$Blockly$Trashcan_LID_HEIGHT-2)+")")}; -module$exports$Blockly$Trashcan.Trashcan.prototype.setMinOpenness_=function(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*module$contents$Blockly$Trashcan_MAX_LID_ANGLE)};module$exports$Blockly$Trashcan.Trashcan.prototype.closeLid=function(){this.setLidOpen(!1)};module$exports$Blockly$Trashcan.Trashcan.prototype.click=function(){this.hasContents_()&&this.openFlyout()}; -module$exports$Blockly$Trashcan.Trashcan.prototype.fireUiEvent_=function(a){a=new ((0,module$exports$Blockly$Events$utils.get)(module$exports$Blockly$Events$utils.TRASHCAN_OPEN))(a,this.workspace_.id);(0,module$exports$Blockly$Events$utils.fire)(a)};module$exports$Blockly$Trashcan.Trashcan.prototype.blockMouseDownWhenOpenable_=function(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()}; -module$exports$Blockly$Trashcan.Trashcan.prototype.mouseOver_=function(){this.hasContents_()&&this.setLidOpen(!0)};module$exports$Blockly$Trashcan.Trashcan.prototype.mouseOut_=function(){this.setLidOpen(!1)}; -module$exports$Blockly$Trashcan.Trashcan.prototype.onDelete_=function(a){if(!(0>=this.workspace_.options.maxTrashcanContents||a.type!==module$exports$Blockly$Events$utils.DELETE||a.type!==module$exports$Blockly$Events$utils.DELETE||a.wasShadow)&&(a=this.cleanBlockJson_(a.oldJson),-1===this.contents_.indexOf(a))){for(this.contents_.unshift(a);this.contents_.length>this.workspace_.options.maxTrashcanContents;)this.contents_.pop();this.setMinOpenness_(module$contents$Blockly$Trashcan_HAS_BLOCKS_LID_ANGLE)}}; -module$exports$Blockly$Trashcan.Trashcan.prototype.cleanBlockJson_=function(a){function b(c){if(c){delete c.id;delete c.x;delete c.y;delete c.enabled;if(c.icons&&c.icons.comment){var d=c.icons.comment;delete d.height;delete d.width;delete d.pinned}d=c.inputs;for(var e in d){var f=d[e];b(f.block);b(f.shadow)}c.next&&(c=c.next,b(c.block),b(c.shadow))}}a=JSON.parse(JSON.stringify(a));b(a);a.kind="BLOCK";return JSON.stringify(a)}; -var module$contents$Blockly$Trashcan_WIDTH=47,module$contents$Blockly$Trashcan_BODY_HEIGHT=44,module$contents$Blockly$Trashcan_LID_HEIGHT=16,module$contents$Blockly$Trashcan_MARGIN_VERTICAL=20,module$contents$Blockly$Trashcan_MARGIN_HORIZONTAL=20,module$contents$Blockly$Trashcan_MARGIN_HOTSPOT=10,module$contents$Blockly$Trashcan_SPRITE_LEFT=0,module$contents$Blockly$Trashcan_SPRITE_TOP=32,module$contents$Blockly$Trashcan_HAS_BLOCKS_LID_ANGLE=.1,module$contents$Blockly$Trashcan_ANIMATION_LENGTH=80, -module$contents$Blockly$Trashcan_ANIMATION_FRAMES=4,module$contents$Blockly$Trashcan_OPACITY_MIN=.4,module$contents$Blockly$Trashcan_OPACITY_MAX=.8,module$contents$Blockly$Trashcan_MAX_LID_ANGLE=45;var module$exports$Blockly$FlyoutButton={FlyoutButton:function(a,b,c,d){this.workspace_=a;this.targetWorkspace_=b;this.text_=c.text;this.position_=new module$exports$Blockly$utils$Coordinate.Coordinate(0,0);this.isLabel_=d;this.callbackKey_=c.callbackKey||c.callbackkey;this.cssClass_=c["web-class"]||null;this.onMouseUpWrapper_=null;this.info=c;this.height=this.width=0;this.svgText_=this.svgGroup_=null}}; -module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.createDom=function(){var a=this.isLabel_?"blocklyFlyoutLabel":"blocklyFlyoutButton";this.cssClass_&&(a+=" "+this.cssClass_);this.svgGroup_=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.G,{"class":a},this.workspace_.getCanvas());var b;this.isLabel_||(b=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":"blocklyFlyoutButtonShadow",rx:4,ry:4,x:1, -y:1},this.svgGroup_));a=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.RECT,{"class":this.isLabel_?"blocklyFlyoutLabelBackground":"blocklyFlyoutButtonBackground",rx:4,ry:4},this.svgGroup_);var c=(0,module$exports$Blockly$utils$dom.createSvgElement)(module$exports$Blockly$utils$Svg.Svg.TEXT,{"class":this.isLabel_?"blocklyFlyoutLabelText":"blocklyText",x:0,y:0,"text-anchor":"middle"},this.svgGroup_),d=(0,module$exports$Blockly$utils$parsing.replaceMessageReferences)(this.text_); -this.workspace_.RTL&&(d+="\u200f");c.textContent=d;this.isLabel_&&(this.svgText_=c,this.workspace_.getThemeManager().subscribe(this.svgText_,"flyoutForegroundColour","fill"));var e=(0,module$exports$Blockly$utils$style.getComputedStyle)(c,"fontSize"),f=(0,module$exports$Blockly$utils$style.getComputedStyle)(c,"fontWeight"),g=(0,module$exports$Blockly$utils$style.getComputedStyle)(c,"fontFamily");this.width=(0,module$exports$Blockly$utils$dom.getFastTextWidthWithSizeString)(c,e,f,g);d=(0,module$exports$Blockly$utils$dom.measureFontMetrics)(d, -e,f,g);this.height=d.height;this.isLabel_||(this.width+=2*module$exports$Blockly$FlyoutButton.FlyoutButton.TEXT_MARGIN_X,this.height+=2*module$exports$Blockly$FlyoutButton.FlyoutButton.TEXT_MARGIN_Y,b.setAttribute("width",this.width),b.setAttribute("height",this.height));a.setAttribute("width",this.width);a.setAttribute("height",this.height);c.setAttribute("x",this.width/2);c.setAttribute("y",this.height/2-d.height/2+d.baseline);this.updateTransform_();this.onMouseUpWrapper_=(0,module$exports$Blockly$browserEvents.conditionalBind)(this.svgGroup_, -"mouseup",this,this.onMouseUp_);return this.svgGroup_};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.show=function(){this.updateTransform_();this.svgGroup_.setAttribute("display","block")};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.updateTransform_=function(){this.svgGroup_.setAttribute("transform","translate("+this.position_.x+","+this.position_.y+")")}; -module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.moveTo=function(a,b){this.position_.x=a;this.position_.y=b;this.updateTransform_()};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.isLabel=function(){return this.isLabel_};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.getPosition=function(){return this.position_};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.getButtonText=function(){return this.text_}; -module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.getTargetWorkspace=function(){return this.targetWorkspace_};module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.dispose=function(){this.onMouseUpWrapper_&&(0,module$exports$Blockly$browserEvents.unbind)(this.onMouseUpWrapper_);this.svgGroup_&&(0,module$exports$Blockly$utils$dom.removeNode)(this.svgGroup_);this.svgText_&&this.workspace_.getThemeManager().unsubscribe(this.svgText_)}; -module$exports$Blockly$FlyoutButton.FlyoutButton.prototype.onMouseUp_=function(a){(a=this.targetWorkspace_.getGesture(a))&&a.cancel();this.isLabel_&&this.callbackKey_?console.warn("Labels should not have callbacks. Label text: "+this.text_):this.isLabel_||this.callbackKey_&&this.targetWorkspace_.getButtonCallback(this.callbackKey_)?this.isLabel_||this.targetWorkspace_.getButtonCallback(this.callbackKey_)(this):console.warn("Buttons should have callbacks. Button text: "+this.text_)}; -module$exports$Blockly$FlyoutButton.FlyoutButton.TEXT_MARGIN_X=5;module$exports$Blockly$FlyoutButton.FlyoutButton.TEXT_MARGIN_Y=2;(0,module$exports$Blockly$Css.register)("\n.blocklyFlyoutButton {\n fill: #888;\n cursor: default;\n}\n\n.blocklyFlyoutButtonShadow {\n fill: #666;\n}\n\n.blocklyFlyoutButton:hover {\n fill: #aaa;\n}\n\n.blocklyFlyoutLabel {\n cursor: default;\n}\n\n.blocklyFlyoutLabelBackground {\n opacity: 0;\n}\n");var module$exports$Blockly$BlocklyOptions={BlocklyOptions:function(){}};var module$exports$Blockly$VariablesDynamic={CATEGORY_NAME:"VARIABLE_DYNAMIC",onCreateVariableButtonClick_String:function(a){(0,$.module$exports$Blockly$Variables.createVariableButtonHandler)(a.getTargetWorkspace(),void 0,"String")},onCreateVariableButtonClick_Number:function(a){(0,$.module$exports$Blockly$Variables.createVariableButtonHandler)(a.getTargetWorkspace(),void 0,"Number")},onCreateVariableButtonClick_Colour:function(a){(0,$.module$exports$Blockly$Variables.createVariableButtonHandler)(a.getTargetWorkspace(), -void 0,"Colour")},flyoutCategory:function(a){var b=[],c=document.createElement("button");c.setAttribute("text",$.module$exports$Blockly$Msg.Msg.NEW_STRING_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_STRING");b.push(c);c=document.createElement("button");c.setAttribute("text",$.module$exports$Blockly$Msg.Msg.NEW_NUMBER_VARIABLE);c.setAttribute("callbackKey","CREATE_VARIABLE_NUMBER");b.push(c);c=document.createElement("button");c.setAttribute("text",$.module$exports$Blockly$Msg.Msg.NEW_COLOUR_VARIABLE); -c.setAttribute("callbackKey","CREATE_VARIABLE_COLOUR");b.push(c);a.registerButtonCallback("CREATE_VARIABLE_STRING",module$exports$Blockly$VariablesDynamic.onCreateVariableButtonClick_String);a.registerButtonCallback("CREATE_VARIABLE_NUMBER",module$exports$Blockly$VariablesDynamic.onCreateVariableButtonClick_Number);a.registerButtonCallback("CREATE_VARIABLE_COLOUR",module$exports$Blockly$VariablesDynamic.onCreateVariableButtonClick_Colour);a=(0,module$exports$Blockly$VariablesDynamic.flyoutCategoryBlocks)(a); -return b=b.concat(a)},flyoutCategoryBlocks:function(a){a=a.getAllVariables();var b=[];if(0=this.left&&a<=this.right&&b>=this.top&&b<=this.bottom}intersects(a){return!(this.left>a.right||this.righta.bottom||this.bottome.top?getPositionAboveMetrics$$module$build$src$core$dropdowndiv(c,d,e,f):b+f.heightdocument.documentElement.clientTop?getPositionAboveMetrics$$module$build$src$core$dropdowndiv(c,d,e,f):getPositionTopOfPageMetrics$$module$build$src$core$dropdowndiv(a,e,f)}},TEST_ONLY$$module$build$src$core$dropdowndiv=internal$$module$build$src$core$dropdowndiv,module$build$src$core$dropdowndiv={};module$build$src$core$dropdowndiv.ANIMATION_TIME=ANIMATION_TIME$$module$build$src$core$dropdowndiv; +module$build$src$core$dropdowndiv.ARROW_HORIZONTAL_PADDING=ARROW_HORIZONTAL_PADDING$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.ARROW_SIZE=ARROW_SIZE$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.BORDER_SIZE=BORDER_SIZE$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.PADDING_Y=PADDING_Y$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.TEST_ONLY=internal$$module$build$src$core$dropdowndiv; +module$build$src$core$dropdowndiv.clearContent=clearContent$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.createDom=createDom$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.getContentDiv=getContentDiv$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.getPositionX=getPositionX$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.hide=hide$$module$build$src$core$dropdowndiv; +module$build$src$core$dropdowndiv.hideIfOwner=hideIfOwner$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.hideWithoutAnimation=hideWithoutAnimation$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.isVisible=isVisible$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.repositionForWindowResize=repositionForWindowResize$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.setBoundsElement=setBoundsElement$$module$build$src$core$dropdowndiv; +module$build$src$core$dropdowndiv.setColour=setColour$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.show=show$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.showPositionedByBlock=showPositionedByBlock$$module$build$src$core$dropdowndiv;module$build$src$core$dropdowndiv.showPositionedByField=showPositionedByField$$module$build$src$core$dropdowndiv;var typeMap$$module$build$src$core$registry=Object.create(null),TEST_ONLY$$module$build$src$core$registry={typeMap:typeMap$$module$build$src$core$registry},nameMap$$module$build$src$core$registry=Object.create(null),DEFAULT$$module$build$src$core$registry="default",Type$$module$build$src$core$registry=class{constructor(a){this.name=a}toString(){return this.name}};Type$$module$build$src$core$registry.CONNECTION_CHECKER=new Type$$module$build$src$core$registry("connectionChecker"); +Type$$module$build$src$core$registry.CURSOR=new Type$$module$build$src$core$registry("cursor");Type$$module$build$src$core$registry.EVENT=new Type$$module$build$src$core$registry("event");Type$$module$build$src$core$registry.FIELD=new Type$$module$build$src$core$registry("field");Type$$module$build$src$core$registry.RENDERER=new Type$$module$build$src$core$registry("renderer");Type$$module$build$src$core$registry.TOOLBOX=new Type$$module$build$src$core$registry("toolbox"); +Type$$module$build$src$core$registry.THEME=new Type$$module$build$src$core$registry("theme");Type$$module$build$src$core$registry.TOOLBOX_ITEM=new Type$$module$build$src$core$registry("toolboxItem");Type$$module$build$src$core$registry.FLYOUTS_VERTICAL_TOOLBOX=new Type$$module$build$src$core$registry("flyoutsVerticalToolbox");Type$$module$build$src$core$registry.FLYOUTS_HORIZONTAL_TOOLBOX=new Type$$module$build$src$core$registry("flyoutsHorizontalToolbox"); +Type$$module$build$src$core$registry.METRICS_MANAGER=new Type$$module$build$src$core$registry("metricsManager");Type$$module$build$src$core$registry.BLOCK_DRAGGER=new Type$$module$build$src$core$registry("blockDragger");Type$$module$build$src$core$registry.SERIALIZER=new Type$$module$build$src$core$registry("serializer");var module$build$src$core$registry={};module$build$src$core$registry.DEFAULT=DEFAULT$$module$build$src$core$registry;module$build$src$core$registry.TEST_ONLY=TEST_ONLY$$module$build$src$core$registry; +module$build$src$core$registry.Type=Type$$module$build$src$core$registry;module$build$src$core$registry.getAllItems=getAllItems$$module$build$src$core$registry;module$build$src$core$registry.getClass=getClass$$module$build$src$core$registry;module$build$src$core$registry.getClassFromOptions=getClassFromOptions$$module$build$src$core$registry;module$build$src$core$registry.getObject=getObject$$module$build$src$core$registry;module$build$src$core$registry.hasItem=hasItem$$module$build$src$core$registry; +module$build$src$core$registry.register=register$$module$build$src$core$registry;module$build$src$core$registry.unregister=unregister$$module$build$src$core$registry;var soup$$module$build$src$core$utils$idgenerator="!#$%()*+,-./:;=?@[]^_`{|}~ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",internal$$module$build$src$core$utils$idgenerator={genUid:()=>{const a=soup$$module$build$src$core$utils$idgenerator.length,b=[];for(let c=0;20>c;c++)b[c]=soup$$module$build$src$core$utils$idgenerator.charAt(Math.random()*a);return b.join("")}},TEST_ONLY$$module$build$src$core$utils$idgenerator=internal$$module$build$src$core$utils$idgenerator,nextId$$module$build$src$core$utils$idgenerator= +0,module$build$src$core$utils$idgenerator={};module$build$src$core$utils$idgenerator.TEST_ONLY=internal$$module$build$src$core$utils$idgenerator;module$build$src$core$utils$idgenerator.genUid=genUid$$module$build$src$core$utils$idgenerator;module$build$src$core$utils$idgenerator.getNextUniqueId=getNextUniqueId$$module$build$src$core$utils$idgenerator;var group$$module$build$src$core$events$utils="",recordUndo$$module$build$src$core$events$utils=!0,disabled$$module$build$src$core$events$utils=0,CREATE$$module$build$src$core$events$utils="create",BLOCK_CREATE$$module$build$src$core$events$utils=CREATE$$module$build$src$core$events$utils,DELETE$$module$build$src$core$events$utils="delete",BLOCK_DELETE$$module$build$src$core$events$utils=DELETE$$module$build$src$core$events$utils,CHANGE$$module$build$src$core$events$utils="change",BLOCK_CHANGE$$module$build$src$core$events$utils= +CHANGE$$module$build$src$core$events$utils,MOVE$$module$build$src$core$events$utils="move",BLOCK_MOVE$$module$build$src$core$events$utils=MOVE$$module$build$src$core$events$utils,VAR_CREATE$$module$build$src$core$events$utils="var_create",VAR_DELETE$$module$build$src$core$events$utils="var_delete",VAR_RENAME$$module$build$src$core$events$utils="var_rename",UI$$module$build$src$core$events$utils="ui",BLOCK_DRAG$$module$build$src$core$events$utils="drag",SELECTED$$module$build$src$core$events$utils= +"selected",CLICK$$module$build$src$core$events$utils="click",MARKER_MOVE$$module$build$src$core$events$utils="marker_move",BUBBLE_OPEN$$module$build$src$core$events$utils="bubble_open",TRASHCAN_OPEN$$module$build$src$core$events$utils="trashcan_open",TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils="toolbox_item_select",THEME_CHANGE$$module$build$src$core$events$utils="theme_change",VIEWPORT_CHANGE$$module$build$src$core$events$utils="viewport_change",COMMENT_CREATE$$module$build$src$core$events$utils= +"comment_create",COMMENT_DELETE$$module$build$src$core$events$utils="comment_delete",COMMENT_CHANGE$$module$build$src$core$events$utils="comment_change",COMMENT_MOVE$$module$build$src$core$events$utils="comment_move",FINISHED_LOADING$$module$build$src$core$events$utils="finished_loading",BUMP_EVENTS$$module$build$src$core$events$utils=[CREATE$$module$build$src$core$events$utils,MOVE$$module$build$src$core$events$utils,COMMENT_CREATE$$module$build$src$core$events$utils,COMMENT_MOVE$$module$build$src$core$events$utils], +FIRE_QUEUE$$module$build$src$core$events$utils=[],TEST_ONLY$$module$build$src$core$events$utils={FIRE_QUEUE:FIRE_QUEUE$$module$build$src$core$events$utils,fireNow:fireNow$$module$build$src$core$events$utils,fireInternal:fireInternal$$module$build$src$core$events$utils,setGroupInternal:setGroupInternal$$module$build$src$core$events$utils},module$build$src$core$events$utils={};module$build$src$core$events$utils.BLOCK_CHANGE=CHANGE$$module$build$src$core$events$utils; +module$build$src$core$events$utils.BLOCK_CREATE=CREATE$$module$build$src$core$events$utils;module$build$src$core$events$utils.BLOCK_DELETE=DELETE$$module$build$src$core$events$utils;module$build$src$core$events$utils.BLOCK_DRAG=BLOCK_DRAG$$module$build$src$core$events$utils;module$build$src$core$events$utils.BLOCK_MOVE=MOVE$$module$build$src$core$events$utils;module$build$src$core$events$utils.BUBBLE_OPEN=BUBBLE_OPEN$$module$build$src$core$events$utils; +module$build$src$core$events$utils.BUMP_EVENTS=BUMP_EVENTS$$module$build$src$core$events$utils;module$build$src$core$events$utils.CHANGE=CHANGE$$module$build$src$core$events$utils;module$build$src$core$events$utils.CLICK=CLICK$$module$build$src$core$events$utils;module$build$src$core$events$utils.COMMENT_CHANGE=COMMENT_CHANGE$$module$build$src$core$events$utils;module$build$src$core$events$utils.COMMENT_CREATE=COMMENT_CREATE$$module$build$src$core$events$utils; +module$build$src$core$events$utils.COMMENT_DELETE=COMMENT_DELETE$$module$build$src$core$events$utils;module$build$src$core$events$utils.COMMENT_MOVE=COMMENT_MOVE$$module$build$src$core$events$utils;module$build$src$core$events$utils.CREATE=CREATE$$module$build$src$core$events$utils;module$build$src$core$events$utils.DELETE=DELETE$$module$build$src$core$events$utils;module$build$src$core$events$utils.FINISHED_LOADING=FINISHED_LOADING$$module$build$src$core$events$utils; +module$build$src$core$events$utils.MARKER_MOVE=MARKER_MOVE$$module$build$src$core$events$utils;module$build$src$core$events$utils.MOVE=MOVE$$module$build$src$core$events$utils;module$build$src$core$events$utils.SELECTED=SELECTED$$module$build$src$core$events$utils;module$build$src$core$events$utils.TEST_ONLY=TEST_ONLY$$module$build$src$core$events$utils;module$build$src$core$events$utils.THEME_CHANGE=THEME_CHANGE$$module$build$src$core$events$utils; +module$build$src$core$events$utils.TOOLBOX_ITEM_SELECT=TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils;module$build$src$core$events$utils.TRASHCAN_OPEN=TRASHCAN_OPEN$$module$build$src$core$events$utils;module$build$src$core$events$utils.UI=UI$$module$build$src$core$events$utils;module$build$src$core$events$utils.VAR_CREATE=VAR_CREATE$$module$build$src$core$events$utils;module$build$src$core$events$utils.VAR_DELETE=VAR_DELETE$$module$build$src$core$events$utils; +module$build$src$core$events$utils.VAR_RENAME=VAR_RENAME$$module$build$src$core$events$utils;module$build$src$core$events$utils.VIEWPORT_CHANGE=VIEWPORT_CHANGE$$module$build$src$core$events$utils;module$build$src$core$events$utils.clearPendingUndo=clearPendingUndo$$module$build$src$core$events$utils;module$build$src$core$events$utils.disable=disable$$module$build$src$core$events$utils;module$build$src$core$events$utils.disableOrphans=disableOrphans$$module$build$src$core$events$utils; +module$build$src$core$events$utils.enable=enable$$module$build$src$core$events$utils;module$build$src$core$events$utils.filter=filter$$module$build$src$core$events$utils;module$build$src$core$events$utils.fire=fire$$module$build$src$core$events$utils;module$build$src$core$events$utils.fromJson=fromJson$$module$build$src$core$events$utils;module$build$src$core$events$utils.get=get$$module$build$src$core$events$utils;module$build$src$core$events$utils.getDescendantIds=getDescendantIds$$module$build$src$core$events$utils; +module$build$src$core$events$utils.getGroup=getGroup$$module$build$src$core$events$utils;module$build$src$core$events$utils.getRecordUndo=getRecordUndo$$module$build$src$core$events$utils;module$build$src$core$events$utils.isEnabled=isEnabled$$module$build$src$core$events$utils;module$build$src$core$events$utils.setGroup=setGroup$$module$build$src$core$events$utils;module$build$src$core$events$utils.setRecordUndo=setRecordUndo$$module$build$src$core$events$utils;var inputTypes$$module$build$src$core$input_types;(function(a){a[a.VALUE=1]="VALUE";a[a.STATEMENT=3]="STATEMENT";a[a.DUMMY=5]="DUMMY"})(inputTypes$$module$build$src$core$input_types||(inputTypes$$module$build$src$core$input_types={}));$.module$build$src$core$input_types={};$.module$build$src$core$input_types.inputTypes=inputTypes$$module$build$src$core$input_types;var NAME_SPACE$$module$build$src$core$utils$xml,xmlDocument$$module$build$src$core$utils$xml;NAME_SPACE$$module$build$src$core$utils$xml="https://developers.google.com/blockly/xml";xmlDocument$$module$build$src$core$utils$xml=globalThis.document;$.module$build$src$core$utils$xml={};$.module$build$src$core$utils$xml.NAME_SPACE=NAME_SPACE$$module$build$src$core$utils$xml;$.module$build$src$core$utils$xml.createElement=createElement$$module$build$src$core$utils$xml; +$.module$build$src$core$utils$xml.createTextNode=createTextNode$$module$build$src$core$utils$xml;$.module$build$src$core$utils$xml.domToText=domToText$$module$build$src$core$utils$xml;$.module$build$src$core$utils$xml.getDocument=getDocument$$module$build$src$core$utils$xml;$.module$build$src$core$utils$xml.setDocument=setDocument$$module$build$src$core$utils$xml;$.module$build$src$core$utils$xml.textToDomDocument=textToDomDocument$$module$build$src$core$utils$xml;var alertImplementation$$module$build$src$core$dialog=function(a,b){window.alert(a);b&&b()},confirmImplementation$$module$build$src$core$dialog=function(a,b){b(window.confirm(a))},promptImplementation$$module$build$src$core$dialog=function(a,b,c){c(window.prompt(a,b))},TEST_ONLY$$module$build$src$core$dialog={confirmInternal:confirmInternal$$module$build$src$core$dialog},module$build$src$core$dialog={};module$build$src$core$dialog.TEST_ONLY=TEST_ONLY$$module$build$src$core$dialog; +module$build$src$core$dialog.alert=alert$$module$build$src$core$dialog;module$build$src$core$dialog.confirm=confirm$$module$build$src$core$dialog;module$build$src$core$dialog.prompt=prompt$$module$build$src$core$dialog;module$build$src$core$dialog.setAlert=setAlert$$module$build$src$core$dialog;module$build$src$core$dialog.setConfirm=setConfirm$$module$build$src$core$dialog;module$build$src$core$dialog.setPrompt=setPrompt$$module$build$src$core$dialog;var Msg$$module$build$src$core$msg,setLocale$$module$build$src$core$msg;Msg$$module$build$src$core$msg=Object.create(null);setLocale$$module$build$src$core$msg=function(a){Object.keys(a).forEach(function(b){Msg$$module$build$src$core$msg[b]=a[b]})};$.module$build$src$core$msg={};$.module$build$src$core$msg.Msg=Msg$$module$build$src$core$msg;$.module$build$src$core$msg.setLocale=setLocale$$module$build$src$core$msg;var Abstract$$module$build$src$core$events$events_abstract=class{constructor(){this.workspaceId=void 0;this.isUiEvent=!1;this.type="";this.group=getGroup$$module$build$src$core$events$utils();this.recordUndo=getRecordUndo$$module$build$src$core$events$utils()}toJson(){return{type:this.type,group:this.group}}fromJson(a){this.isBlank=!1;this.group=a.group||""}isNull(){return!1}run(a){}getEventWorkspace_(){let a;this.workspaceId&&(a=getWorkspaceById$$module$build$src$core$common(this.workspaceId));if(!a)throw Error("Workspace is null. Event must have been generated from real Blockly events."); +return a}},module$build$src$core$events$events_abstract={};module$build$src$core$events$events_abstract.Abstract=Abstract$$module$build$src$core$events$events_abstract;var VarBase$$module$build$src$core$events$events_var_base=class extends Abstract$$module$build$src$core$events$events_abstract{constructor(a){super();this.isBlank="undefined"===typeof a;a&&(this.varId=a.getId(),this.workspaceId=a.workspace.id)}toJson(){const a=super.toJson();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");a.varId=this.varId;return a}fromJson(a){super.fromJson(a);this.varId=a.varId}},module$build$src$core$events$events_var_base= +{};module$build$src$core$events$events_var_base.VarBase=VarBase$$module$build$src$core$events$events_var_base;var VarCreate$$module$build$src$core$events$events_var_create=class extends VarBase$$module$build$src$core$events$events_var_base{constructor(a){super(a);this.type=VAR_CREATE$$module$build$src$core$events$utils;a&&(this.varType=a.type,this.varName=a.name)}toJson(){const a=super.toJson();if(!this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson"); +a.varType=this.varType;a.varName=this.varName;return a}fromJson(a){super.fromJson(a);this.varType=a.varType;this.varName=a.varName}run(a){const b=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");a?b.createVariable(this.varName,this.varType,this.varId):b.deleteVariableById(this.varId)}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,VAR_CREATE$$module$build$src$core$events$utils,VarCreate$$module$build$src$core$events$events_var_create);var module$build$src$core$events$events_var_create={};module$build$src$core$events$events_var_create.VarCreate=VarCreate$$module$build$src$core$events$events_var_create;var VariableModel$$module$build$src$core$variable_model=class{constructor(a,b,c,d){this.workspace=a;this.name=b;this.type=c||"";this.id_=d||genUid$$module$build$src$core$utils$idgenerator();fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(VAR_CREATE$$module$build$src$core$events$utils))(this))}getId(){return this.id_}static compareByName(a,b){return a.name.localeCompare(b.name,void 0,{sensitivity:"base"})}},module$build$src$core$variable_model={}; +module$build$src$core$variable_model.VariableModel=VariableModel$$module$build$src$core$variable_model;var CATEGORY_NAME$$module$build$src$core$variables,VAR_LETTER_OPTIONS$$module$build$src$core$variables,TEST_ONLY$$module$build$src$core$variables;CATEGORY_NAME$$module$build$src$core$variables="VARIABLE";VAR_LETTER_OPTIONS$$module$build$src$core$variables="ijkmnopqrstuvwxyzabcdefgh";TEST_ONLY$$module$build$src$core$variables={generateUniqueNameInternal:generateUniqueNameInternal$$module$build$src$core$variables};$.module$build$src$core$variables={}; +$.module$build$src$core$variables.CATEGORY_NAME=CATEGORY_NAME$$module$build$src$core$variables;$.module$build$src$core$variables.TEST_ONLY=TEST_ONLY$$module$build$src$core$variables;$.module$build$src$core$variables.VAR_LETTER_OPTIONS=VAR_LETTER_OPTIONS$$module$build$src$core$variables;$.module$build$src$core$variables.allDeveloperVariables=allDeveloperVariables$$module$build$src$core$variables;$.module$build$src$core$variables.allUsedVarModels=allUsedVarModels$$module$build$src$core$variables; +$.module$build$src$core$variables.createVariableButtonHandler=createVariableButtonHandler$$module$build$src$core$variables;$.module$build$src$core$variables.flyoutCategory=flyoutCategory$$module$build$src$core$variables;$.module$build$src$core$variables.flyoutCategoryBlocks=flyoutCategoryBlocks$$module$build$src$core$variables;$.module$build$src$core$variables.generateUniqueName=generateUniqueName$$module$build$src$core$variables;$.module$build$src$core$variables.generateUniqueNameFromOptions=generateUniqueNameFromOptions$$module$build$src$core$variables; +$.module$build$src$core$variables.generateVariableFieldDom=generateVariableFieldDom$$module$build$src$core$variables;$.module$build$src$core$variables.getAddedVariables=getAddedVariables$$module$build$src$core$variables;$.module$build$src$core$variables.getOrCreateVariablePackage=getOrCreateVariablePackage$$module$build$src$core$variables;$.module$build$src$core$variables.getVariable=getVariable$$module$build$src$core$variables;$.module$build$src$core$variables.nameUsedWithAnyType=nameUsedWithAnyType$$module$build$src$core$variables; +$.module$build$src$core$variables.promptName=promptName$$module$build$src$core$variables;$.module$build$src$core$variables.renameVariable=renameVariable$$module$build$src$core$variables;var WorkspaceComment$$module$build$src$core$workspace_comment=class{constructor(a,b,c,d,e){this.workspace=a;this.editable_=this.movable_=this.deletable_=!0;this.disposed_=!1;this.isComment=!0;this.id=e&&!a.getCommentById(e)?e:genUid$$module$build$src$core$utils$idgenerator();a.addTopComment(this);this.xy_=new Coordinate$$module$build$src$core$utils$coordinate(0,0);this.height_=c;this.width_=d;this.RTL=a.RTL;this.content_=b;WorkspaceComment$$module$build$src$core$workspace_comment.fireCreateEvent(this)}dispose(){this.disposed_|| +(isEnabled$$module$build$src$core$events$utils()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(COMMENT_DELETE$$module$build$src$core$events$utils))(this)),this.workspace.removeTopComment(this),this.disposed_=!0)}getHeight(){return this.height_}setHeight(a){this.height_=a}getWidth(){return this.width_}setWidth(a){this.width_=a}getXY(){return new Coordinate$$module$build$src$core$utils$coordinate(this.xy_.x,this.xy_.y)}moveBy(a,b){const c=new (get$$module$build$src$core$events$utils(COMMENT_MOVE$$module$build$src$core$events$utils))(this); +this.xy_.translate(a,b);c.recordNew();fire$$module$build$src$core$events$utils(c)}isDeletable(){return this.deletable_&&!(this.workspace&&this.workspace.options.readOnly)}setDeletable(a){this.deletable_=a}isMovable(){return this.movable_&&!(this.workspace&&this.workspace.options.readOnly)}setMovable(a){this.movable_=a}isEditable(){return this.editable_&&!(this.workspace&&this.workspace.options.readOnly)}setEditable(a){this.editable_=a}getContent(){return this.content_}setContent(a){this.content_!== +a&&(fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(COMMENT_CHANGE$$module$build$src$core$events$utils))(this,this.content_,a)),this.content_=a)}toXmlWithXY(a){a=this.toXml(a);a.setAttribute("x",`${Math.round(this.xy_.x)}`);a.setAttribute("y",`${Math.round(this.xy_.y)}`);a.setAttribute("h",`${this.height_}`);a.setAttribute("w",`${this.width_}`);return a}toXml(a){const b=createElement$$module$build$src$core$utils$xml("comment");a||(b.id=this.id);b.textContent= +this.getContent();return b}static fireCreateEvent(a){if(isEnabled$$module$build$src$core$events$utils()){const b=getGroup$$module$build$src$core$events$utils();b||setGroup$$module$build$src$core$events$utils(!0);try{fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(COMMENT_CREATE$$module$build$src$core$events$utils))(a))}finally{b||setGroup$$module$build$src$core$events$utils(!1)}}}static fromXml(a,b){var c=WorkspaceComment$$module$build$src$core$workspace_comment.parseAttributes(a); +b=new WorkspaceComment$$module$build$src$core$workspace_comment(b,c.content,c.h,c.w,c.id);c=a.getAttribute("x");a=a.getAttribute("y");c=c?parseInt(c,10):NaN;a=a?parseInt(a,10):NaN;isNaN(c)||isNaN(a)||b.moveBy(c,a);WorkspaceComment$$module$build$src$core$workspace_comment.fireCreateEvent(b);return b}static parseAttributes(a){const b=a.getAttribute("h"),c=a.getAttribute("w"),d=a.getAttribute("x"),e=a.getAttribute("y"),f=a.getAttribute("id");if(!f)throw Error("No ID present in XML comment definition."); +let g;return{id:f,h:b?parseInt(b):100,w:c?parseInt(c):100,x:d?parseInt(d):NaN,y:e?parseInt(e):NaN,content:null!=(g=a.textContent)?g:""}}},module$build$src$core$workspace_comment={};module$build$src$core$workspace_comment.WorkspaceComment=WorkspaceComment$$module$build$src$core$workspace_comment;var UiBase$$module$build$src$core$events$events_ui_base=class extends Abstract$$module$build$src$core$events$events_abstract{constructor(a){super();this.isBlank=!0;this.recordUndo=!1;this.isUiEvent=!0;this.isBlank="undefined"===typeof a;this.workspaceId=a?a:""}},module$build$src$core$events$events_ui_base={};module$build$src$core$events$events_ui_base.UiBase=UiBase$$module$build$src$core$events$events_ui_base;var Selected$$module$build$src$core$events$events_selected=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b,c){super(c);this.type=SELECTED$$module$build$src$core$events$utils;this.oldElementId=null!=a?a:void 0;this.newElementId=null!=b?b:void 0}toJson(){const a=super.toJson();a.oldElementId=this.oldElementId;a.newElementId=this.newElementId;return a}fromJson(a){super.fromJson(a);this.oldElementId=a.oldElementId;this.newElementId=a.newElementId}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,SELECTED$$module$build$src$core$events$utils,Selected$$module$build$src$core$events$events_selected);var module$build$src$core$events$events_selected={};module$build$src$core$events$events_selected.Selected=Selected$$module$build$src$core$events$events_selected;var injected$$module$build$src$core$css=!1,content$$module$build$src$core$css='\n.blocklySvg {\n background-color: #fff;\n outline: none;\n overflow: hidden; /* IE overflows by default. */\n position: absolute;\n display: block;\n}\n\n.blocklyWidgetDiv {\n display: none;\n position: absolute;\n z-index: 99999; /* big value for bootstrap3 compatibility */\n}\n\n.injectionDiv {\n height: 100%;\n position: relative;\n overflow: hidden; /* So blocks in drag surface disappear at edges */\n touch-action: none;\n}\n\n.blocklyNonSelectable {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n\n.blocklyWsDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n/* Added as a separate rule with multiple classes to make it more specific\n than a bootstrap rule that selects svg:root. See issue #1275 for context.\n*/\n.blocklyWsDragSurface.blocklyOverflowVisible {\n overflow: visible;\n}\n\n.blocklyBlockDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: visible !important;\n z-index: 50; /* Display below toolbox, but above everything else. */\n}\n\n.blocklyBlockCanvas.blocklyCanvasTransitioning,\n.blocklyBubbleCanvas.blocklyCanvasTransitioning {\n transition: transform .5s;\n}\n\n.blocklyTooltipDiv {\n background-color: #ffffc7;\n border: 1px solid #ddc;\n box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);\n color: #000;\n display: none;\n font: 9pt sans-serif;\n opacity: .9;\n padding: 2px;\n position: absolute;\n z-index: 100000; /* big value for bootstrap3 compatibility */\n}\n\n.blocklyDropDownDiv {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1000;\n display: none;\n border: 1px solid;\n border-color: #dadce0;\n background-color: #fff;\n border-radius: 2px;\n padding: 4px;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownContent {\n max-height: 300px; // @todo: spec for maximum height.\n overflow: auto;\n overflow-x: hidden;\n position: relative;\n}\n\n.blocklyDropDownArrow {\n position: absolute;\n left: 0;\n top: 0;\n width: 16px;\n height: 16px;\n z-index: -1;\n background-color: inherit;\n border-color: inherit;\n}\n\n.blocklyDropDownButton {\n display: inline-block;\n float: left;\n padding: 0;\n margin: 4px;\n border-radius: 4px;\n outline: none;\n border: 1px solid;\n transition: box-shadow .1s;\n cursor: pointer;\n}\n\n.blocklyArrowTop {\n border-top: 1px solid;\n border-left: 1px solid;\n border-top-left-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyArrowBottom {\n border-bottom: 1px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyResizeSE {\n cursor: se-resize;\n fill: #aaa;\n}\n\n.blocklyResizeSW {\n cursor: sw-resize;\n fill: #aaa;\n}\n\n.blocklyResizeLine {\n stroke: #515A5A;\n stroke-width: 1;\n}\n\n.blocklyHighlightedConnectionPath {\n fill: none;\n stroke: #fc3;\n stroke-width: 4px;\n}\n\n.blocklyPathLight {\n fill: none;\n stroke-linecap: round;\n stroke-width: 1;\n}\n\n.blocklySelected>.blocklyPathLight {\n display: none;\n}\n\n.blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don\'t support grab */\n cursor: url("<<>>/handopen.cur"), auto;\n cursor: grab;\n cursor: -webkit-grab;\n}\n\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n.blocklyDragging {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n /* Changes cursor on mouse down. Not effective in Firefox because of\n https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */\n.blocklyDraggable:active {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Change the cursor on the whole drag surface in case the mouse gets\n ahead of block during a drag. This way the cursor is still a closed hand.\n */\n.blocklyBlockDragSurface .blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don\'t support grabbing */\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n.blocklyDragging.blocklyDraggingDelete {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyDragging>.blocklyPath,\n.blocklyDragging>.blocklyPathLight {\n fill-opacity: .8;\n stroke-opacity: .8;\n}\n\n.blocklyDragging>.blocklyPathDark {\n display: none;\n}\n\n.blocklyDisabled>.blocklyPath {\n fill-opacity: .5;\n stroke-opacity: .5;\n}\n\n.blocklyDisabled>.blocklyPathLight,\n.blocklyDisabled>.blocklyPathDark {\n display: none;\n}\n\n.blocklyInsertionMarker>.blocklyPath,\n.blocklyInsertionMarker>.blocklyPathLight,\n.blocklyInsertionMarker>.blocklyPathDark {\n fill-opacity: .2;\n stroke: none;\n}\n\n.blocklyMultilineText {\n font-family: monospace;\n}\n\n.blocklyNonEditableText>text {\n pointer-events: none;\n}\n\n.blocklyFlyout {\n position: absolute;\n z-index: 20;\n}\n\n.blocklyText text {\n cursor: default;\n}\n\n/*\n Don\'t allow users to select text. It gets annoying when trying to\n drag a block and selected text moves instead.\n*/\n.blocklySvg text,\n.blocklyBlockDragSurface text {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n cursor: inherit;\n}\n\n.blocklyHidden {\n display: none;\n}\n\n.blocklyFieldDropdown:not(.blocklyHidden) {\n display: block;\n}\n\n.blocklyIconGroup {\n cursor: default;\n}\n\n.blocklyIconGroup:not(:hover),\n.blocklyIconGroupReadonly {\n opacity: .6;\n}\n\n.blocklyIconShape {\n fill: #00f;\n stroke: #fff;\n stroke-width: 1px;\n}\n\n.blocklyIconSymbol {\n fill: #fff;\n}\n\n.blocklyMinimalBody {\n margin: 0;\n padding: 0;\n}\n\n.blocklyHtmlInput {\n border: none;\n border-radius: 4px;\n height: 100%;\n margin: 0;\n outline: none;\n padding: 0;\n width: 100%;\n text-align: center;\n display: block;\n box-sizing: border-box;\n}\n\n/* Edge and IE introduce a close icon when the input value is longer than a\n certain length. This affects our sizing calculations of the text input.\n Hiding the close icon to avoid that. */\n.blocklyHtmlInput::-ms-clear {\n display: none;\n}\n\n.blocklyMainBackground {\n stroke-width: 1;\n stroke: #c6c6c6; /* Equates to #ddd due to border being off-pixel. */\n}\n\n.blocklyMutatorBackground {\n fill: #fff;\n stroke: #ddd;\n stroke-width: 1;\n}\n\n.blocklyFlyoutBackground {\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyMainWorkspaceScrollbar {\n z-index: 20;\n}\n\n.blocklyFlyoutScrollbar {\n z-index: 30;\n}\n\n.blocklyScrollbarHorizontal,\n.blocklyScrollbarVertical {\n position: absolute;\n outline: none;\n}\n\n.blocklyScrollbarBackground {\n opacity: 0;\n}\n\n.blocklyScrollbarHandle {\n fill: #ccc;\n}\n\n.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyScrollbarHandle:hover {\n fill: #bbb;\n}\n\n/* Darken flyout scrollbars due to being on a grey background. */\n/* By contrast, workspace scrollbars are on a white background. */\n.blocklyFlyout .blocklyScrollbarHandle {\n fill: #bbb;\n}\n\n.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyFlyout .blocklyScrollbarHandle:hover {\n fill: #aaa;\n}\n\n.blocklyInvalidInput {\n background: #faa;\n}\n\n.blocklyVerticalMarker {\n stroke-width: 3px;\n fill: rgba(255,255,255,.5);\n pointer-events: none;\n}\n\n.blocklyComputeCanvas {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.blocklyNoPointerEvents {\n pointer-events: none;\n}\n\n.blocklyContextMenu {\n border-radius: 4px;\n max-height: 100%;\n}\n\n.blocklyDropdownMenu {\n border-radius: 2px;\n padding: 0 !important;\n}\n\n.blocklyDropdownMenu .blocklyMenuItem {\n /* 28px on the left for icon or checkbox. */\n padding-left: 28px;\n}\n\n/* BiDi override for the resting state. */\n.blocklyDropdownMenu .blocklyMenuItemRtl {\n /* Flip left/right padding for BiDi. */\n padding-left: 5px;\n padding-right: 28px;\n}\n\n.blocklyWidgetDiv .blocklyMenu {\n background: #fff;\n border: 1px solid transparent;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n font: normal 13px Arial, sans-serif;\n margin: 0;\n outline: none;\n padding: 4px 0;\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n.blocklyWidgetDiv .blocklyMenu.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv .blocklyMenu {\n background: inherit; /* Compatibility with gapi, reset from goog-menu */\n border: inherit; /* Compatibility with gapi, reset from goog-menu */\n font: normal 13px "Helvetica Neue", Helvetica, sans-serif;\n outline: none;\n position: relative; /* Compatibility with gapi, reset from goog-menu */\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n/* State: resting. */\n.blocklyMenuItem {\n border: none;\n color: #000;\n cursor: pointer;\n list-style: none;\n margin: 0;\n /* 7em on the right for shortcut. */\n min-width: 7em;\n padding: 6px 15px;\n white-space: nowrap;\n}\n\n/* State: disabled. */\n.blocklyMenuItemDisabled {\n color: #ccc;\n cursor: inherit;\n}\n\n/* State: hover. */\n.blocklyMenuItemHighlight {\n background-color: rgba(0,0,0,.1);\n}\n\n/* State: selected/checked. */\n.blocklyMenuItemCheckbox {\n height: 16px;\n position: absolute;\n width: 16px;\n}\n\n.blocklyMenuItemSelected .blocklyMenuItemCheckbox {\n background: url(<<>>/sprites.png) no-repeat -48px -16px;\n float: left;\n margin-left: -24px;\n position: static; /* Scroll with the menu. */\n}\n\n.blocklyMenuItemRtl .blocklyMenuItemCheckbox {\n float: right;\n margin-right: -24px;\n}\n', +module$build$src$core$css={};module$build$src$core$css.inject=inject$$module$build$src$core$css;module$build$src$core$css.register=register$$module$build$src$core$css;var Svg$$module$build$src$core$utils$svg=class{constructor(a){this.tagName=a}toString(){return this.tagName}};Svg$$module$build$src$core$utils$svg.ANIMATE=new Svg$$module$build$src$core$utils$svg("animate");Svg$$module$build$src$core$utils$svg.CIRCLE=new Svg$$module$build$src$core$utils$svg("circle");Svg$$module$build$src$core$utils$svg.CLIPPATH=new Svg$$module$build$src$core$utils$svg("clipPath");Svg$$module$build$src$core$utils$svg.DEFS=new Svg$$module$build$src$core$utils$svg("defs"); +Svg$$module$build$src$core$utils$svg.FECOMPOSITE=new Svg$$module$build$src$core$utils$svg("feComposite");Svg$$module$build$src$core$utils$svg.FECOMPONENTTRANSFER=new Svg$$module$build$src$core$utils$svg("feComponentTransfer");Svg$$module$build$src$core$utils$svg.FEFLOOD=new Svg$$module$build$src$core$utils$svg("feFlood");Svg$$module$build$src$core$utils$svg.FEFUNCA=new Svg$$module$build$src$core$utils$svg("feFuncA");Svg$$module$build$src$core$utils$svg.FEGAUSSIANBLUR=new Svg$$module$build$src$core$utils$svg("feGaussianBlur"); +Svg$$module$build$src$core$utils$svg.FEPOINTLIGHT=new Svg$$module$build$src$core$utils$svg("fePointLight");Svg$$module$build$src$core$utils$svg.FESPECULARLIGHTING=new Svg$$module$build$src$core$utils$svg("feSpecularLighting");Svg$$module$build$src$core$utils$svg.FILTER=new Svg$$module$build$src$core$utils$svg("filter");Svg$$module$build$src$core$utils$svg.FOREIGNOBJECT=new Svg$$module$build$src$core$utils$svg("foreignObject");Svg$$module$build$src$core$utils$svg.G=new Svg$$module$build$src$core$utils$svg("g"); +Svg$$module$build$src$core$utils$svg.IMAGE=new Svg$$module$build$src$core$utils$svg("image");Svg$$module$build$src$core$utils$svg.LINE=new Svg$$module$build$src$core$utils$svg("line");Svg$$module$build$src$core$utils$svg.PATH=new Svg$$module$build$src$core$utils$svg("path");Svg$$module$build$src$core$utils$svg.PATTERN=new Svg$$module$build$src$core$utils$svg("pattern");Svg$$module$build$src$core$utils$svg.POLYGON=new Svg$$module$build$src$core$utils$svg("polygon"); +Svg$$module$build$src$core$utils$svg.RECT=new Svg$$module$build$src$core$utils$svg("rect");Svg$$module$build$src$core$utils$svg.SVG=new Svg$$module$build$src$core$utils$svg("svg");Svg$$module$build$src$core$utils$svg.TEXT=new Svg$$module$build$src$core$utils$svg("text");Svg$$module$build$src$core$utils$svg.TSPAN=new Svg$$module$build$src$core$utils$svg("tspan");var module$build$src$core$utils$svg={};module$build$src$core$utils$svg.Svg=Svg$$module$build$src$core$utils$svg;var XY_REGEX$$module$build$src$core$utils$svg_math=/translate\(\s*([-+\d.e]+)([ ,]\s*([-+\d.e]+)\s*)?/,XY_STYLE_REGEX$$module$build$src$core$utils$svg_math=/transform:\s*translate(?:3d)?\(\s*([-+\d.e]+)\s*px([ ,]\s*([-+\d.e]+)\s*px)?/,TEST_ONLY$$module$build$src$core$utils$svg_math={XY_REGEX:XY_REGEX$$module$build$src$core$utils$svg_math,XY_STYLE_REGEX:XY_STYLE_REGEX$$module$build$src$core$utils$svg_math},module$build$src$core$utils$svg_math={};module$build$src$core$utils$svg_math.TEST_ONLY=TEST_ONLY$$module$build$src$core$utils$svg_math; +module$build$src$core$utils$svg_math.getDocumentScroll=getDocumentScroll$$module$build$src$core$utils$svg_math;module$build$src$core$utils$svg_math.getInjectionDivXY=getInjectionDivXY$$module$build$src$core$utils$svg_math;module$build$src$core$utils$svg_math.getRelativeXY=getRelativeXY$$module$build$src$core$utils$svg_math;module$build$src$core$utils$svg_math.getViewportBBox=getViewportBBox$$module$build$src$core$utils$svg_math;module$build$src$core$utils$svg_math.is3dSupported=is3dSupported$$module$build$src$core$utils$svg_math; +module$build$src$core$utils$svg_math.screenToWsCoordinates=screenToWsCoordinates$$module$build$src$core$utils$svg_math;var RESIZE_SIZE$$module$build$src$core$workspace_comment_svg=8,BORDER_RADIUS$$module$build$src$core$workspace_comment_svg=3,TEXTAREA_OFFSET$$module$build$src$core$workspace_comment_svg=2,WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg=class extends WorkspaceComment$$module$build$src$core$workspace_comment{constructor(a,b,c,d,e){super(a,b,c,d,e);this.onMouseMoveWrapper_=this.onMouseUpWrapper_=null;this.eventsInit_=!1;this.deleteIconBorder_=this.deleteGroup_=this.resizeGroup_=this.foreignObject_= +this.svgHandleTarget_=this.svgRectTarget_=this.textarea_=null;this.rendered_=this.autoLayout_=this.focused_=!1;this.svgGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyComment"});this.svgGroup_.translate_="";this.workspace=a;this.svgRect_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyCommentRect",x:0,y:0,rx:BORDER_RADIUS$$module$build$src$core$workspace_comment_svg,ry:BORDER_RADIUS$$module$build$src$core$workspace_comment_svg}); +this.svgGroup_.appendChild(this.svgRect_);this.useDragSurface_=!!a.getBlockDragSurface();this.render()}dispose(){this.disposed_||(getSelected$$module$build$src$core$common()===this&&(this.unselect(),this.workspace.cancelCurrentGesture()),isEnabled$$module$build$src$core$events$utils()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(COMMENT_DELETE$$module$build$src$core$events$utils))(this)),removeNode$$module$build$src$core$utils$dom(this.svgGroup_),this.disposeInternal_(), +disable$$module$build$src$core$events$utils(),super.dispose(),enable$$module$build$src$core$events$utils())}initSvg(a){if(!this.workspace.rendered)throw TypeError("Workspace is headless.");this.workspace.options.readOnly||this.eventsInit_||(conditionalBind$$module$build$src$core$browser_events(this.svgRectTarget_,"mousedown",this,this.pathMouseDown_),conditionalBind$$module$build$src$core$browser_events(this.svgHandleTarget_,"mousedown",this,this.pathMouseDown_));this.eventsInit_=!0;this.updateMovable(); +this.getSvgRoot().parentNode||this.workspace.getBubbleCanvas().appendChild(this.getSvgRoot());!a&&this.textarea_&&this.textarea_.select()}pathMouseDown_(a){const b=this.workspace.getGesture(a);b&&b.handleBubbleStart(a,this)}showContextMenu(a){throw Error("The implementation of showContextMenu should be monkey-patched in by blockly.ts");}select(){if(getSelected$$module$build$src$core$common()!==this){var a=null;if(getSelected$$module$build$src$core$common()){a=getSelected$$module$build$src$core$common().id; +disable$$module$build$src$core$events$utils();try{getSelected$$module$build$src$core$common().unselect()}finally{enable$$module$build$src$core$events$utils()}}a=new (get$$module$build$src$core$events$utils(SELECTED$$module$build$src$core$events$utils))(a,this.id,this.workspace.id);fire$$module$build$src$core$events$utils(a);setSelected$$module$build$src$core$common(this);this.addSelect()}}unselect(){if(getSelected$$module$build$src$core$common()===this){var a=new (get$$module$build$src$core$events$utils(SELECTED$$module$build$src$core$events$utils))(this.id, +null,this.workspace.id);fire$$module$build$src$core$events$utils(a);setSelected$$module$build$src$core$common(null);this.removeSelect();this.blurFocus()}}addSelect(){addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklySelected");this.setFocus()}removeSelect(){addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklySelected");this.blurFocus()}addFocus(){addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyFocused")}removeFocus(){removeClass$$module$build$src$core$utils$dom(this.svgGroup_, +"blocklyFocused")}getRelativeToSurfaceXY(){let a=0,b=0;const c=this.useDragSurface_?this.workspace.getBlockDragSurface().getGroup():null;let d=this.getSvgRoot();if(d){do{var e=getRelativeXY$$module$build$src$core$utils$svg_math(d);a+=e.x;b+=e.y;this.useDragSurface_&&this.workspace.getBlockDragSurface().getCurrentBlock()===d&&(e=this.workspace.getBlockDragSurface().getSurfaceTranslation(),a+=e.x,b+=e.y);d=d.parentNode}while(d&&d!==this.workspace.getBubbleCanvas()&&d!==c)}return this.xy_=new Coordinate$$module$build$src$core$utils$coordinate(a, +b)}moveBy(a,b){const c=new (get$$module$build$src$core$events$utils(COMMENT_MOVE$$module$build$src$core$events$utils))(this),d=this.getRelativeToSurfaceXY();this.translate(d.x+a,d.y+b);this.xy_=new Coordinate$$module$build$src$core$utils$coordinate(d.x+a,d.y+b);c.recordNew();fire$$module$build$src$core$events$utils(c);this.workspace.resizeContents()}translate(a,b){this.xy_=new Coordinate$$module$build$src$core$utils$coordinate(a,b);this.getSvgRoot().setAttribute("transform","translate("+a+","+b+")")}moveToDragSurface(){if(this.useDragSurface_){var a= +this.getRelativeToSurfaceXY();this.clearTransformAttributes_();this.workspace.getBlockDragSurface().translateSurface(a.x,a.y);this.workspace.getBlockDragSurface().setBlocksAndShow(this.getSvgRoot())}}moveDuringDrag(a,b){a?a.translateSurface(b.x,b.y):(this.svgGroup_.translate_="translate("+b.x+","+b.y+")",this.svgGroup_.setAttribute("transform",this.svgGroup_.translate_+this.svgGroup_.skew_))}moveTo(a,b){this.translate(a,b)}clearTransformAttributes_(){this.getSvgRoot().removeAttribute("transform")}getBoundingRectangle(){var a= +this.getRelativeToSurfaceXY();const b=this.getHeightWidth(),c=a.y,d=a.y+b.height;let e;this.RTL?(e=a.x-b.width,a=a.x):(e=a.x,a=a.x+b.width);return new Rect$$module$build$src$core$utils$rect(c,d,e,a)}updateMovable(){this.isMovable()?addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDraggable"):removeClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDraggable")}setMovable(a){super.setMovable(a);this.updateMovable()}setEditable(a){super.setEditable(a);this.textarea_&&(this.textarea_.readOnly= +!a)}setDragging(a){a?(a=this.getSvgRoot(),a.translate_="",a.skew_="",addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDragging")):removeClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDragging")}getSvgRoot(){return this.svgGroup_}getContent(){return this.textarea_?this.textarea_.value:this.content_}setContent(a){super.setContent(a);this.textarea_&&(this.textarea_.value=a)}setDeleteStyle(a){a?addClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDraggingDelete"): +removeClass$$module$build$src$core$utils$dom(this.svgGroup_,"blocklyDraggingDelete")}setAutoLayout(a){}toXmlWithXY(a){let b=0;this.workspace.RTL&&(b=this.workspace.getWidth());a=this.toXml(a);const c=this.getRelativeToSurfaceXY();a.setAttribute("x",Math.round(this.workspace.RTL?b-c.x:c.x));a.setAttribute("y",Math.round(c.y));a.setAttribute("h",this.getHeight());a.setAttribute("w",this.getWidth());return a}toCopyData(){return{saveInfo:this.toXmlWithXY(),source:this.workspace,typeCounts:null}}getHeightWidth(){return{width:this.getWidth(), +height:this.getHeight()}}render(){if(!this.rendered_){var a=this.getHeightWidth();this.createEditor_();this.svgGroup_.appendChild(this.foreignObject_);this.svgHandleTarget_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyCommentHandleTarget",x:0,y:0});this.svgGroup_.appendChild(this.svgHandleTarget_);this.svgRectTarget_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyCommentTarget", +x:0,y:0,rx:BORDER_RADIUS$$module$build$src$core$workspace_comment_svg,ry:BORDER_RADIUS$$module$build$src$core$workspace_comment_svg});this.svgGroup_.appendChild(this.svgRectTarget_);this.addResizeDom_();this.isDeletable()&&this.addDeleteDom_();this.setSize_(a.width,a.height);this.textarea_.value=this.content_;this.rendered_=!0;this.resizeGroup_&&conditionalBind$$module$build$src$core$browser_events(this.resizeGroup_,"mousedown",this,this.resizeMouseDown_);this.isDeletable()&&(conditionalBind$$module$build$src$core$browser_events(this.deleteGroup_, +"mousedown",this,this.deleteMouseDown_),conditionalBind$$module$build$src$core$browser_events(this.deleteGroup_,"mouseout",this,this.deleteMouseOut_),conditionalBind$$module$build$src$core$browser_events(this.deleteGroup_,"mouseup",this,this.deleteMouseUp_))}}createEditor_(){this.foreignObject_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FOREIGNOBJECT,{x:0,y:WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.TOP_OFFSET,"class":"blocklyCommentForeignObject"}); +const a=document.createElementNS(HTML_NS$$module$build$src$core$utils$dom,"body");a.setAttribute("xmlns",HTML_NS$$module$build$src$core$utils$dom);a.className="blocklyMinimalBody";const b=document.createElementNS(HTML_NS$$module$build$src$core$utils$dom,"textarea");b.className="blocklyCommentTextarea";b.setAttribute("dir",this.RTL?"RTL":"LTR");b.readOnly=!this.isEditable();a.appendChild(b);this.textarea_=b;this.foreignObject_.appendChild(a);conditionalBind$$module$build$src$core$browser_events(b, +"wheel",this,function(c){c.stopPropagation()});conditionalBind$$module$build$src$core$browser_events(b,"change",this,function(c){this.setContent(b.value)});return this.foreignObject_}addResizeDom_(){this.resizeGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":this.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.svgGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g, +RESIZE_SIZE$$module$build$src$core$workspace_comment_svg.toString())},this.resizeGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{"class":"blocklyResizeLine",x1:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg/3,y1:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg-1,x2:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg-1,y2:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg/3},this.resizeGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE, +{"class":"blocklyResizeLine",x1:2*RESIZE_SIZE$$module$build$src$core$workspace_comment_svg/3,y1:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg-1,x2:RESIZE_SIZE$$module$build$src$core$workspace_comment_svg-1,y2:2*RESIZE_SIZE$$module$build$src$core$workspace_comment_svg/3},this.resizeGroup_)}addDeleteDom_(){this.deleteGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyCommentDeleteIcon"},this.svgGroup_);this.deleteIconBorder_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CIRCLE, +{"class":"blocklyDeleteIconShape",r:"7",cx:"7.5",cy:"7.5"},this.deleteGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{x1:"5",y1:"10",x2:"10",y2:"5",stroke:"#fff","stroke-width":"2"},this.deleteGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{x1:"5",y1:"5",x2:"10",y2:"10",stroke:"#fff","stroke-width":"2"},this.deleteGroup_)}resizeMouseDown_(a){this.unbindDragEvents_();isRightButton$$module$build$src$core$browser_events(a)|| +(this.workspace.startDrag(a,new Coordinate$$module$build$src$core$utils$coordinate(this.workspace.RTL?-this.width_:this.width_,this.height_)),this.onMouseUpWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mouseup",this,this.resizeMouseUp_),this.onMouseMoveWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mousemove",this,this.resizeMouseMove_),this.workspace.hideChaff());a.stopPropagation()}deleteMouseDown_(a){this.deleteIconBorder_&&addClass$$module$build$src$core$utils$dom(this.deleteIconBorder_, +"blocklyDeleteIconHighlighted");a.stopPropagation()}deleteMouseOut_(a){this.deleteIconBorder_&&removeClass$$module$build$src$core$utils$dom(this.deleteIconBorder_,"blocklyDeleteIconHighlighted")}deleteMouseUp_(a){this.dispose();a.stopPropagation()}unbindDragEvents_(){this.onMouseUpWrapper_&&(unbind$$module$build$src$core$browser_events(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null);this.onMouseMoveWrapper_&&(unbind$$module$build$src$core$browser_events(this.onMouseMoveWrapper_),this.onMouseMoveWrapper_= +null)}resizeMouseUp_(a){clearTouchIdentifier$$module$build$src$core$touch();this.unbindDragEvents_()}resizeMouseMove_(a){this.autoLayout_=!1;a=this.workspace.moveDrag(a);this.setSize_(this.RTL?-a.x:a.x,a.y)}resizeComment_(){const a=this.getHeightWidth(),b=WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.TOP_OFFSET,c=2*TEXTAREA_OFFSET$$module$build$src$core$workspace_comment_svg;this.foreignObject_.setAttribute("width",a.width);this.foreignObject_.setAttribute("height",(a.height-b).toString()); +this.RTL&&this.foreignObject_.setAttribute("x",(-a.width).toString());this.textarea_.style.width=a.width-c+"px";this.textarea_.style.height=a.height-c-b+"px"}setSize_(a,b){a=Math.max(a,45);b=Math.max(b,20+WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.TOP_OFFSET);this.width_=a;this.height_=b;this.svgRect_.setAttribute("width",a);this.svgRect_.setAttribute("height",b);this.svgRectTarget_.setAttribute("width",a);this.svgRectTarget_.setAttribute("height",b);this.svgHandleTarget_.setAttribute("width", +a);this.svgHandleTarget_.setAttribute("height",WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.TOP_OFFSET);this.RTL&&(this.svgRect_.setAttribute("transform","scale(-1 1)"),this.svgRectTarget_.setAttribute("transform","scale(-1 1)"));this.resizeGroup_&&(this.RTL?(this.resizeGroup_.setAttribute("transform","translate("+(-a+RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+","+(b-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+") scale(-1 1)"),this.deleteGroup_.setAttribute("transform", +"translate("+(-a+RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+","+-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg+") scale(-1 1)")):(this.resizeGroup_.setAttribute("transform","translate("+(a-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+","+(b-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+")"),this.deleteGroup_.setAttribute("transform","translate("+(a-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg)+","+-RESIZE_SIZE$$module$build$src$core$workspace_comment_svg+ +")")));this.resizeComment_()}disposeInternal_(){this.svgHandleTarget_=this.svgRectTarget_=this.foreignObject_=this.textarea_=null;this.disposed_=!0}setFocus(){this.focused_=!0;setTimeout(()=>{this.disposed_||(this.textarea_.focus(),this.addFocus(),this.svgRectTarget_&&addClass$$module$build$src$core$utils$dom(this.svgRectTarget_,"blocklyCommentTargetFocused"),this.svgHandleTarget_&&addClass$$module$build$src$core$utils$dom(this.svgHandleTarget_,"blocklyCommentHandleTargetFocused"))},0)}blurFocus(){this.focused_= +!1;setTimeout(()=>{this.disposed_||(this.textarea_.blur(),this.removeFocus(),this.svgRectTarget_&&removeClass$$module$build$src$core$utils$dom(this.svgRectTarget_,"blocklyCommentTargetFocused"),this.svgHandleTarget_&&removeClass$$module$build$src$core$utils$dom(this.svgHandleTarget_,"blocklyCommentHandleTargetFocused"))},0)}static fromXmlRendered(a,b,c){disable$$module$build$src$core$events$utils();let d;try{const e=WorkspaceComment$$module$build$src$core$workspace_comment.parseAttributes(a);d=new WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg(b, +e.content,e.h,e.w,e.id);b.rendered&&(d.initSvg(!0),d.render());if(!isNaN(e.x)&&!isNaN(e.y))if(b.RTL){const f=c||b.getWidth();d.moveBy(f-e.x,e.y)}else d.moveBy(e.x,e.y)}finally{enable$$module$build$src$core$events$utils()}WorkspaceComment$$module$build$src$core$workspace_comment.fireCreateEvent(d);return d}};WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.DEFAULT_SIZE=100;WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.TOP_OFFSET=10;register$$module$build$src$core$css("\n.blocklyCommentForeignObject {\n position: relative;\n z-index: 0;\n}\n\n.blocklyCommentRect {\n fill: #E7DE8E;\n stroke: #bcA903;\n stroke-width: 1px;\n}\n\n.blocklyCommentTarget {\n fill: transparent;\n stroke: #bcA903;\n}\n\n.blocklyCommentTargetFocused {\n fill: none;\n}\n\n.blocklyCommentHandleTarget {\n fill: none;\n}\n\n.blocklyCommentHandleTargetFocused {\n fill: transparent;\n}\n\n.blocklyFocused>.blocklyCommentRect {\n fill: #B9B272;\n stroke: #B9B272;\n}\n\n.blocklySelected>.blocklyCommentTarget {\n stroke: #fc3;\n stroke-width: 3px;\n}\n\n.blocklyCommentDeleteIcon {\n cursor: pointer;\n fill: #000;\n display: none;\n}\n\n.blocklySelected > .blocklyCommentDeleteIcon {\n display: block;\n}\n\n.blocklyDeleteIconShape {\n fill: #000;\n stroke: #000;\n stroke-width: 1px;\n}\n\n.blocklyDeleteIconShape.blocklyDeleteIconHighlighted {\n stroke: #fc3;\n}\n"); +var module$build$src$core$workspace_comment_svg={};module$build$src$core$workspace_comment_svg.WorkspaceCommentSvg=WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg;$.module$build$src$core$xml={};$.module$build$src$core$xml.appendDomToWorkspace=appendDomToWorkspace$$module$build$src$core$xml;$.module$build$src$core$xml.blockToDom=blockToDom$$module$build$src$core$xml;$.module$build$src$core$xml.blockToDomWithXY=blockToDomWithXY$$module$build$src$core$xml;$.module$build$src$core$xml.clearWorkspaceAndLoadFromXml=clearWorkspaceAndLoadFromXml$$module$build$src$core$xml;$.module$build$src$core$xml.deleteNext=deleteNext$$module$build$src$core$xml; +$.module$build$src$core$xml.domToBlock=domToBlock$$module$build$src$core$xml;$.module$build$src$core$xml.domToPrettyText=domToPrettyText$$module$build$src$core$xml;$.module$build$src$core$xml.domToText=domToText$$module$build$src$core$xml;$.module$build$src$core$xml.domToVariables=domToVariables$$module$build$src$core$xml;$.module$build$src$core$xml.domToWorkspace=domToWorkspace$$module$build$src$core$xml;$.module$build$src$core$xml.textToDom=textToDom$$module$build$src$core$xml; +$.module$build$src$core$xml.variablesToDom=variablesToDom$$module$build$src$core$xml;$.module$build$src$core$xml.workspaceToDom=workspaceToDom$$module$build$src$core$xml;var BlockBase$$module$build$src$core$events$events_block_base=class extends Abstract$$module$build$src$core$events$events_abstract{constructor(a){super();this.isBlank=!!a;a&&(this.blockId=a.id,this.workspaceId=a.workspace.id)}toJson(){const a=super.toJson();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");a.blockId=this.blockId;return a}fromJson(a){super.fromJson(a);this.blockId=a.blockId}},module$build$src$core$events$events_block_base= +{};module$build$src$core$events$events_block_base.BlockBase=BlockBase$$module$build$src$core$events$events_block_base;var BlockChange$$module$build$src$core$events$events_block_change=class extends BlockBase$$module$build$src$core$events$events_block_base{constructor(a,b,c,d,e){super(a);this.type=CHANGE$$module$build$src$core$events$utils;a&&(this.element=b,this.name=c||void 0,this.oldValue=d,this.newValue=e)}toJson(){const a=super.toJson();if(!this.element)throw Error("The changed element is undefined. Either pass an element to the constructor, or call fromJson");a.element=this.element;a.name=this.name;a.oldValue= +this.oldValue;a.newValue=this.newValue;return a}fromJson(a){super.fromJson(a);this.element=a.element;this.name=a.name;this.oldValue=a.oldValue;this.newValue=a.newValue}isNull(){return this.oldValue===this.newValue}run(a){var b=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");b=b.getBlockById(this.blockId);if(!b)throw Error("The associated block is undefined. Either pass a block to the constructor, or call fromJson"); +b.mutator&&b.mutator.setVisible(!1);a=a?this.newValue:this.oldValue;switch(this.element){case "field":(b=b.getField(this.name))?b.setValue(a):console.warn("Can't set non-existent field: "+this.name);break;case "comment":b.setCommentText(a||null);break;case "collapsed":b.setCollapsed(!!a);break;case "disabled":b.setEnabled(!a);break;case "inline":b.setInputsInline(!!a);break;case "mutation":const c=BlockChange$$module$build$src$core$events$events_block_change.getExtraBlockState_(b);b.loadExtraState? +b.loadExtraState(JSON.parse(a||"{}")):b.domToMutation&&b.domToMutation(textToDom$$module$build$src$core$xml(a||""));fire$$module$build$src$core$events$utils(new BlockChange$$module$build$src$core$events$events_block_change(b,"mutation",null,c,a));break;default:console.warn("Unknown change type: "+this.element)}}static getExtraBlockState_(a){return a.saveExtraState?(a=a.saveExtraState())?JSON.stringify(a):"":a.mutationToDom?(a=a.mutationToDom())?domToText$$module$build$src$core$xml(a):"": +""}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,CHANGE$$module$build$src$core$events$utils,BlockChange$$module$build$src$core$events$events_block_change);var module$build$src$core$events$events_block_change={};module$build$src$core$events$events_block_change.BlockChange=BlockChange$$module$build$src$core$events$events_block_change;var MarkerManager$$module$build$src$core$marker_manager=class{constructor(a){this.workspace=a;this.cursorSvg_=this.cursor_=null;this.markers=new Map;this.markerSvg_=null}registerMarker(a,b){this.markers.has(a)&&this.unregisterMarker(a);b.setDrawer(this.workspace.getRenderer().makeMarkerDrawer(this.workspace,b));this.setMarkerSvg(b.getDrawer().createDom());this.markers.set(a,b)}unregisterMarker(a){const b=this.markers.get(a);if(b)b.dispose(),this.markers.delete(a);else throw Error("Marker with ID "+ +a+" does not exist. Can only unregister markers that exist.");}getCursor(){return this.cursor_}getMarker(a){return this.markers.get(a)||null}setCursor(a){this.cursor_&&this.cursor_.getDrawer()&&this.cursor_.getDrawer().dispose();if(this.cursor_=a)a=this.workspace.getRenderer().makeMarkerDrawer(this.workspace,this.cursor_),this.cursor_.setDrawer(a),this.setCursorSvg(this.cursor_.getDrawer().createDom())}setCursorSvg(a){a?(this.workspace.getBlockCanvas().appendChild(a),this.cursorSvg_=a):this.cursorSvg_= +null}setMarkerSvg(a){a?this.workspace.getBlockCanvas()&&(this.cursorSvg_?this.workspace.getBlockCanvas().insertBefore(a,this.cursorSvg_):this.workspace.getBlockCanvas().appendChild(a)):this.markerSvg_=null}updateMarkers(){this.workspace.keyboardAccessibilityMode&&this.cursorSvg_&&this.workspace.getCursor().draw()}dispose(){const a=Object.keys(this.markers);for(let b=0,c;c=a[b];b++)this.unregisterMarker(c);this.markers.clear();this.cursor_&&(this.cursor_.dispose(),this.cursor_=null)}}; +MarkerManager$$module$build$src$core$marker_manager.LOCAL_MARKER="local_marker_1";var module$build$src$core$marker_manager={};module$build$src$core$marker_manager.MarkerManager=MarkerManager$$module$build$src$core$marker_manager;$.module$build$src$core$utils$string={};$.module$build$src$core$utils$string.commonWordPrefix=commonWordPrefix$$module$build$src$core$utils$string;$.module$build$src$core$utils$string.commonWordSuffix=commonWordSuffix$$module$build$src$core$utils$string;$.module$build$src$core$utils$string.isNumber=isNumber$$module$build$src$core$utils$string;$.module$build$src$core$utils$string.shortestStringLength=shortestStringLength$$module$build$src$core$utils$string; +$.module$build$src$core$utils$string.startsWith=startsWith$$module$build$src$core$utils$string;$.module$build$src$core$utils$string.wrap=wrap$$module$build$src$core$utils$string;var customTooltip$$module$build$src$core$tooltip=void 0,visible$$module$build$src$core$tooltip=!1,blocked$$module$build$src$core$tooltip=!1,LIMIT$$module$build$src$core$tooltip=50,mouseOutPid$$module$build$src$core$tooltip=0,showPid$$module$build$src$core$tooltip=0,lastX$$module$build$src$core$tooltip=0,lastY$$module$build$src$core$tooltip=0,element$$module$build$src$core$tooltip=null,poisonedElement$$module$build$src$core$tooltip=null,OFFSET_X$$module$build$src$core$tooltip=0,OFFSET_Y$$module$build$src$core$tooltip= +10,RADIUS_OK$$module$build$src$core$tooltip=10,HOVER_MS$$module$build$src$core$tooltip=750,MARGINS$$module$build$src$core$tooltip=5,containerDiv$$module$build$src$core$tooltip=null,module$build$src$core$tooltip={};module$build$src$core$tooltip.HOVER_MS=HOVER_MS$$module$build$src$core$tooltip;module$build$src$core$tooltip.LIMIT=LIMIT$$module$build$src$core$tooltip;module$build$src$core$tooltip.MARGINS=MARGINS$$module$build$src$core$tooltip;module$build$src$core$tooltip.OFFSET_X=OFFSET_X$$module$build$src$core$tooltip; +module$build$src$core$tooltip.OFFSET_Y=OFFSET_Y$$module$build$src$core$tooltip;module$build$src$core$tooltip.RADIUS_OK=RADIUS_OK$$module$build$src$core$tooltip;module$build$src$core$tooltip.bindMouseEvents=bindMouseEvents$$module$build$src$core$tooltip;module$build$src$core$tooltip.block=block$$module$build$src$core$tooltip;module$build$src$core$tooltip.createDom=createDom$$module$build$src$core$tooltip;module$build$src$core$tooltip.dispose=dispose$$module$build$src$core$tooltip; +module$build$src$core$tooltip.getCustomTooltip=getCustomTooltip$$module$build$src$core$tooltip;module$build$src$core$tooltip.getDiv=getDiv$$module$build$src$core$tooltip;module$build$src$core$tooltip.getTooltipOfObject=getTooltipOfObject$$module$build$src$core$tooltip;module$build$src$core$tooltip.hide=hide$$module$build$src$core$tooltip;module$build$src$core$tooltip.isVisible=isVisible$$module$build$src$core$tooltip;module$build$src$core$tooltip.setCustomTooltip=setCustomTooltip$$module$build$src$core$tooltip; +module$build$src$core$tooltip.unbindMouseEvents=unbindMouseEvents$$module$build$src$core$tooltip;module$build$src$core$tooltip.unblock=unblock$$module$build$src$core$tooltip;var hsvSaturation$$module$build$src$core$utils$colour=.45,hsvValue$$module$build$src$core$utils$colour=.65,names$$module$build$src$core$utils$colour={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},module$build$src$core$utils$colour={};module$build$src$core$utils$colour.blend=blend$$module$build$src$core$utils$colour; +module$build$src$core$utils$colour.getHsvSaturation=getHsvSaturation$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.getHsvValue=getHsvValue$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.hexToRgb=hexToRgb$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.hsvToHex=hsvToHex$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.hueToHex=hueToHex$$module$build$src$core$utils$colour; +module$build$src$core$utils$colour.names=names$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.parse=parse$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.rgbToHex=rgbToHex$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.setHsvSaturation=setHsvSaturation$$module$build$src$core$utils$colour;module$build$src$core$utils$colour.setHsvValue=setHsvValue$$module$build$src$core$utils$colour;var module$build$src$core$utils$parsing={};module$build$src$core$utils$parsing.checkMessageReferences=checkMessageReferences$$module$build$src$core$utils$parsing;module$build$src$core$utils$parsing.parseBlockColour=parseBlockColour$$module$build$src$core$utils$parsing;module$build$src$core$utils$parsing.replaceMessageReferences=replaceMessageReferences$$module$build$src$core$utils$parsing;module$build$src$core$utils$parsing.tokenizeInterpolation=tokenizeInterpolation$$module$build$src$core$utils$parsing;var Sentinel$$module$build$src$core$utils$sentinel=class{},module$build$src$core$utils$sentinel={};module$build$src$core$utils$sentinel.Sentinel=Sentinel$$module$build$src$core$utils$sentinel;var owner$$module$build$src$core$widgetdiv=null,dispose$$module$build$src$core$widgetdiv=null,rendererClassName$$module$build$src$core$widgetdiv="",themeClassName$$module$build$src$core$widgetdiv="",containerDiv$$module$build$src$core$widgetdiv,module$build$src$core$widgetdiv={};module$build$src$core$widgetdiv.createDom=createDom$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.getDiv=getDiv$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.hide=hide$$module$build$src$core$widgetdiv; +module$build$src$core$widgetdiv.hideIfOwner=hideIfOwner$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.isVisible=isVisible$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.positionWithAnchor=positionWithAnchor$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.show=show$$module$build$src$core$widgetdiv;module$build$src$core$widgetdiv.testOnly_setDiv=testOnly_setDiv$$module$build$src$core$widgetdiv;var Field$$module$build$src$core$field=class{constructor(a,b,c){this.name=void 0;this.constants_=this.mouseDownWrapper_=this.textContent_=this.textElement_=this.borderRect_=this.fieldGroup_=this.markerSvg_=this.cursorSvg_=this.tooltip_=this.validator_=null;this.disposed=!1;this.maxDisplayLength=50;this.sourceBlock_=null;this.enabled_=this.visible_=this.isDirty_=!0;this.suffixField=this.prefixField=this.clickTarget_=null;this.EDITABLE=!0;this.SERIALIZABLE=!1;this.CURSOR="";this.value_="DEFAULT_VALUE"in +new.target.prototype?new.target.prototype.DEFAULT_VALUE:null;this.size_=new Size$$module$build$src$core$utils$size(0,0);a!==Field$$module$build$src$core$field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}configure_(a){a.tooltip&&this.setTooltip(replaceMessageReferences$$module$build$src$core$utils$parsing(a.tooltip))}setSourceBlock(a){if(this.sourceBlock_)throw Error("Field already bound to a block");this.sourceBlock_=a}getConstants(){!this.constants_&&this.sourceBlock_&& +!this.sourceBlock_.isDeadOrDying()&&this.sourceBlock_.workspace.rendered&&(this.constants_=this.sourceBlock_.workspace.getRenderer().getConstants());return this.constants_}getSourceBlock(){if(!this.sourceBlock_)throw Error(`The source block is ${this.sourceBlock_}.`);return this.sourceBlock_}init(){this.fieldGroup_||(this.fieldGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{}),this.isVisible()||(this.fieldGroup_.style.display="none"),this.sourceBlock_.getSvgRoot().appendChild(this.fieldGroup_), +this.initView(),this.updateEditable(),this.setTooltip(this.tooltip_),this.bindEvents_(),this.initModel())}initView(){this.createBorderRect_();this.createTextElement_()}initModel(){}createBorderRect_(){this.borderRect_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{rx:this.getConstants().FIELD_BORDER_RECT_RADIUS,ry:this.getConstants().FIELD_BORDER_RECT_RADIUS,x:0,y:0,height:this.size_.height,width:this.size_.width,"class":"blocklyFieldRect"},this.fieldGroup_)}createTextElement_(){this.textElement_= +createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.TEXT,{"class":"blocklyText"},this.fieldGroup_);this.getConstants().FIELD_TEXT_BASELINE_CENTER&&this.textElement_.setAttribute("dominant-baseline","central");this.textContent_=document.createTextNode("");this.textElement_.appendChild(this.textContent_)}bindEvents_(){const a=this.getClickTarget_();if(!a)throw Error("A click target has not been set.");bindMouseEvents$$module$build$src$core$tooltip(a);this.mouseDownWrapper_= +conditionalBind$$module$build$src$core$browser_events(a,"mousedown",this,this.onMouseDown_)}fromXml(a){this.setValue(a.textContent)}toXml(a){a.textContent=this.getValue();return a}saveState(a){a=this.saveLegacyState(Field$$module$build$src$core$field);return null!==a?a:this.getValue()}loadState(a){this.loadLegacyState(Field$$module$build$src$core$field,a)||this.setValue(a)}saveLegacyState(a){return a.prototype.saveState===this.saveState&&a.prototype.toXml!==this.toXml?(a=createElement$$module$build$src$core$utils$xml("field"), +a.setAttribute("name",this.name||""),domToText$$module$build$src$core$xml(this.toXml(a)).replace(' xmlns="https://developers.google.com/blockly/xml"',"")):null}loadLegacyState(a,b){return a.prototype.loadState===this.loadState&&a.prototype.fromXml!==this.fromXml?(this.fromXml(textToDom$$module$build$src$core$xml(b)),!0):!1}dispose(){hideIfOwner$$module$build$src$core$dropdowndiv(this);hideIfOwner$$module$build$src$core$widgetdiv(this);unbindMouseEvents$$module$build$src$core$tooltip(this.getClickTarget_()); +this.mouseDownWrapper_&&unbind$$module$build$src$core$browser_events(this.mouseDownWrapper_);removeNode$$module$build$src$core$utils$dom(this.fieldGroup_);this.disposed=!0}updateEditable(){const a=this.fieldGroup_;this.EDITABLE&&a&&(this.enabled_&&this.getSourceBlock().isEditable()?(addClass$$module$build$src$core$utils$dom(a,"blocklyEditableText"),removeClass$$module$build$src$core$utils$dom(a,"blocklyNonEditableText"),a.style.cursor=this.CURSOR):(addClass$$module$build$src$core$utils$dom(a,"blocklyNonEditableText"), +removeClass$$module$build$src$core$utils$dom(a,"blocklyEditableText"),a.style.cursor=""))}setEnabled(a){this.enabled_=a;this.updateEditable()}isEnabled(){return this.enabled_}isClickable(){return this.enabled_&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()&&this.showEditor_!==Field$$module$build$src$core$field.prototype.showEditor_}isCurrentlyEditable(){return this.enabled_&&this.EDITABLE&&!!this.sourceBlock_&&this.sourceBlock_.isEditable()}isSerializable(){let a=!1;this.name&&(this.SERIALIZABLE? +a=!0:this.EDITABLE&&(console.warn("Detected an editable field that was not serializable. Please define SERIALIZABLE property as true on all editable custom fields. Proceeding with serialization."),a=!0));return a}isVisible(){return this.visible_}setVisible(a){if(this.visible_!==a){this.visible_=a;var b=this.fieldGroup_;b&&(b.style.display=a?"block":"none")}}setValidator(a){this.validator_=a}getValidator(){return this.validator_}getSvgRoot(){return this.fieldGroup_}getBorderRect(){if(!this.borderRect_)throw Error(`The border rectangle is ${this.borderRect_}.`); +return this.borderRect_}getTextElement(){if(!this.textElement_)throw Error(`The text element is ${this.textElement_}.`);return this.textElement_}getTextContent(){if(!this.textContent_)throw Error(`The text content is ${this.textContent_}.`);return this.textContent_}applyColour(){}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_()}showEditor(a){this.isClickable()&&this.showEditor_(a)}showEditor_(a){}updateSize_(a){const b=this.getConstants();a=void 0!== +a?a:this.borderRect_?this.getConstants().FIELD_BORDER_RECT_X_PADDING:0;let c=2*a,d=b.FIELD_TEXT_HEIGHT,e=0;this.textElement_&&(e=getFastTextWidth$$module$build$src$core$utils$dom(this.textElement_,b.FIELD_TEXT_FONTSIZE,b.FIELD_TEXT_FONTWEIGHT,b.FIELD_TEXT_FONTFAMILY),c+=e);this.borderRect_&&(d=Math.max(d,b.FIELD_BORDER_RECT_HEIGHT));this.size_.height=d;this.size_.width=c;this.positionTextElement_(a,e);this.positionBorderRect_()}positionTextElement_(a,b){if(this.textElement_){var c=this.getConstants(), +d=this.size_.height/2;this.textElement_.setAttribute("x",`${this.getSourceBlock().RTL?this.size_.width-b-a:a}`);this.textElement_.setAttribute("y",`${c.FIELD_TEXT_BASELINE_CENTER?d:d-c.FIELD_TEXT_HEIGHT/2+c.FIELD_TEXT_BASELINE}`)}}positionBorderRect_(){this.borderRect_&&(this.borderRect_.setAttribute("width",`${this.size_.width}`),this.borderRect_.setAttribute("height",`${this.size_.height}`),this.borderRect_.setAttribute("rx",`${this.getConstants().FIELD_BORDER_RECT_RADIUS}`),this.borderRect_.setAttribute("ry", +`${this.getConstants().FIELD_BORDER_RECT_RADIUS}`))}getSize(){if(!this.isVisible())return new Size$$module$build$src$core$utils$size(0,0);this.isDirty_?(this.render_(),this.isDirty_=!1):this.visible_&&0===this.size_.width&&(console.warn("Deprecated use of setting size_.width to 0 to rerender a field. Set field.isDirty_ to true instead."),this.render_());return this.size_}getScaledBBox(){let a;let b;if(this.borderRect_){var c=this.borderRect_.getBoundingClientRect();b=getPageOffset$$module$build$src$core$utils$style(this.borderRect_); +a=c.width;var d=c.height}else d=this.sourceBlock_.getHeightWidth(),c=this.getSourceBlock().workspace.scale,b=this.getAbsoluteXY_(),a=(d.width+1)*c,d=(d.height+1)*c,GECKO$$module$build$src$core$utils$useragent?(b.x+=1.5*c,b.y+=1.5*c):(b.x-=.5*c,b.y-=.5*c);return new Rect$$module$build$src$core$utils$rect(b.y,b.y+d,b.x,b.x+a)}getDisplayText_(){let a=this.getText();if(!a)return Field$$module$build$src$core$field.NBSP;a.length>this.maxDisplayLength&&(a=a.substring(0,this.maxDisplayLength-2)+"\u2026"); +a=a.replace(/\s/g,Field$$module$build$src$core$field.NBSP);this.sourceBlock_&&this.sourceBlock_.RTL&&(a+="\u200f");return a}getText(){const a=this.getText_();return null!==a?String(a):String(this.getValue())}getText_(){return null}markDirty(){this.isDirty_=!0;this.constants_=null}forceRerender(){this.isDirty_=!0;this.sourceBlock_&&this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours(),this.updateMarkers_())}setValue(a){if(null!==a){var b=this.doClassValidation_(a); +a=this.processValidation_(a,b);if(!(a instanceof Error)){if(b=this.getValidator())if(b=b.call(this,a),a=this.processValidation_(a,b),a instanceof Error)return;b=this.sourceBlock_;if(!b||!b.disposed){var c=this.getValue();c===a?this.doValueUpdate_(a):(this.doValueUpdate_(a),b&&isEnabled$$module$build$src$core$events$utils()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CHANGE$$module$build$src$core$events$utils))(b,"field",this.name||null,c,a)),this.isDirty_&& +this.forceRerender())}}}}processValidation_(a,b){if(null===b)return this.doValueInvalid_(a),this.isDirty_&&this.forceRerender(),Error();void 0!==b&&(a=b);return a}getValue(){return this.value_}doClassValidation_(a){return null===a||void 0===a?null:a}doValueUpdate_(a){this.value_=a;this.isDirty_=!0}doValueInvalid_(a){}onMouseDown_(a){this.sourceBlock_&&!this.sourceBlock_.isDeadOrDying()&&(a=this.sourceBlock_.workspace.getGesture(a))&&a.setStartField(this)}setTooltip(a){a||""===a||(a=this.sourceBlock_); +const b=this.getClickTarget_();b?b.tooltip=a:this.tooltip_=a}getTooltip(){const a=this.getClickTarget_();return a?getTooltipOfObject$$module$build$src$core$tooltip(a):getTooltipOfObject$$module$build$src$core$tooltip({tooltip:this.tooltip_})}getClickTarget_(){return this.clickTarget_||this.getSvgRoot()}getAbsoluteXY_(){return getPageOffset$$module$build$src$core$utils$style(this.getClickTarget_())}referencesVariables(){return!1}refreshVariableName(){}getParentInput(){let a=null;const b=this.getSourceBlock(), +c=b.inputList;for(let d=0;da?this.menuItems_.length:a,-1)}highlightFirst_(){this.highlightHelper_(-1,1)}highlightLast_(){this.highlightHelper_(this.menuItems_.length, +-1)}highlightHelper_(a,b){a+=b;let c;for(;c=this.menuItems_[a];){if(c.isEnabled()){this.setHighlighted(c);break}a+=b}}handleMouseOver_(a){(a=this.getMenuItem_(a.target))&&(a.isEnabled()?this.highlightedItem_!==a&&this.setHighlighted(a):this.setHighlighted(null))}handleClick_(a){const b=this.openingCoords;this.openingCoords=null;if(b&&"number"===typeof a.clientX){const c=new Coordinate$$module$build$src$core$utils$coordinate(a.clientX,a.clientY);if(1>Coordinate$$module$build$src$core$utils$coordinate.distance(b, +c))return}(a=this.getMenuItem_(a.target))&&a.performAction()}handleMouseEnter_(a){this.focus()}handleMouseLeave_(a){this.getElement()&&(this.blur_(),this.setHighlighted(null))}handleKeyEvent_(a){if(this.menuItems_.length&&!(a.shiftKey||a.ctrlKey||a.metaKey||a.altKey)){var b=this.highlightedItem_;switch(a.keyCode){case KeyCodes$$module$build$src$core$utils$keycodes.ENTER:case KeyCodes$$module$build$src$core$utils$keycodes.SPACE:b&&b.performAction();break;case KeyCodes$$module$build$src$core$utils$keycodes.UP:this.highlightPrevious(); +break;case KeyCodes$$module$build$src$core$utils$keycodes.DOWN:this.highlightNext();break;case KeyCodes$$module$build$src$core$utils$keycodes.PAGE_UP:case KeyCodes$$module$build$src$core$utils$keycodes.HOME:this.highlightFirst_();break;case KeyCodes$$module$build$src$core$utils$keycodes.PAGE_DOWN:case KeyCodes$$module$build$src$core$utils$keycodes.END:this.highlightLast_();break;default:return}a.preventDefault();a.stopPropagation()}}getSize(){const a=this.getElement(),b=getSize$$module$build$src$core$utils$style(a); +b.height=a.scrollHeight;return b}},module$build$src$core$menu={};module$build$src$core$menu.Menu=Menu$$module$build$src$core$menu;var MenuItem$$module$build$src$core$menuitem=class{constructor(a,b){this.content=a;this.opt_value=b;this.enabled_=!0;this.element_=null;this.rightToLeft_=!1;this.roleName_=null;this.highlight_=this.checked_=this.checkable_=!1;this.actionHandler_=null}createDom(){const a=document.createElement("div");a.id=getNextUniqueId$$module$build$src$core$utils$idgenerator();this.element_=a;a.className="blocklyMenuItem goog-menuitem "+(this.enabled_?"":"blocklyMenuItemDisabled goog-menuitem-disabled ")+(this.checked_? +"blocklyMenuItemSelected goog-option-selected ":"")+(this.highlight_?"blocklyMenuItemHighlight goog-menuitem-highlight ":"")+(this.rightToLeft_?"blocklyMenuItemRtl goog-menuitem-rtl ":"");const b=document.createElement("div");b.className="blocklyMenuItemContent goog-menuitem-content";if(this.checkable_){var c=document.createElement("div");c.className="blocklyMenuItemCheckbox goog-menuitem-checkbox";b.appendChild(c)}c=this.content;"string"===typeof this.content&&(c=document.createTextNode(this.content)); +b.appendChild(c);a.appendChild(b);this.roleName_&&setRole$$module$build$src$core$utils$aria(a,this.roleName_);setState$$module$build$src$core$utils$aria(a,State$$module$build$src$core$utils$aria.SELECTED,this.checkable_&&this.checked_||!1);setState$$module$build$src$core$utils$aria(a,State$$module$build$src$core$utils$aria.DISABLED,!this.enabled_);return a}dispose(){this.element_=null}getElement(){return this.element_}getId(){return this.element_.id}getValue(){let a;return null!=(a=this.opt_value)? +a:null}setRightToLeft(a){this.rightToLeft_=a}setRole(a){this.roleName_=a}setCheckable(a){this.checkable_=a}setChecked(a){this.checked_=a}setHighlighted(a){this.highlight_=a;const b=this.getElement();b&&this.isEnabled()&&(a?(addClass$$module$build$src$core$utils$dom(b,"blocklyMenuItemHighlight"),addClass$$module$build$src$core$utils$dom(b,"goog-menuitem-highlight")):(removeClass$$module$build$src$core$utils$dom(b,"blocklyMenuItemHighlight"),removeClass$$module$build$src$core$utils$dom(b,"goog-menuitem-highlight")))}isEnabled(){return this.enabled_}setEnabled(a){this.enabled_= +a}performAction(){this.isEnabled()&&this.actionHandler_&&this.actionHandler_(this)}onAction(a,b){this.actionHandler_=a.bind(b)}},module$build$src$core$menuitem={};module$build$src$core$menuitem.MenuItem=MenuItem$$module$build$src$core$menuitem;var FieldDropdown$$module$build$src$core$field_dropdown=class extends Field$$module$build$src$core$field{constructor(a,b,c){super(Field$$module$build$src$core$field.SKIP_SETUP);this.svgArrow_=this.arrow_=this.imageElement_=this.menu_=this.selectedMenuItem_=null;this.SERIALIZABLE=!0;this.CURSOR="default";this.suffixField=this.prefixField=this.generatedOptions_=null;a!==Field$$module$build$src$core$field.SKIP_SETUP&&(Array.isArray(a)&&(validateOptions$$module$build$src$core$field_dropdown(a),a=JSON.parse(JSON.stringify(a))), +this.menuGenerator_=a,this.trimOptions_(),this.selectedOption_=this.getOptions(!1)[0],c&&this.configure_(c),this.setValue(this.selectedOption_[1]),b&&this.setValidator(b))}fromXml(a){this.isOptionListDynamic()&&this.getOptions(!1);this.setValue(a.textContent)}loadState(a){this.loadLegacyState(FieldDropdown$$module$build$src$core$field_dropdown,a)||(this.isOptionListDynamic()&&this.getOptions(!1),this.setValue(a))}initView(){this.shouldAddBorderRect_()?this.createBorderRect_():this.clickTarget_=this.sourceBlock_.getSvgRoot(); +this.createTextElement_();this.imageElement_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.IMAGE,{},this.fieldGroup_);this.getConstants().FIELD_DROPDOWN_SVG_ARROW?this.createSVGArrow_():this.createTextArrow_();this.borderRect_&&addClass$$module$build$src$core$utils$dom(this.borderRect_,"blocklyDropdownRect")}shouldAddBorderRect_(){return!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW&&!this.getSourceBlock().isShadow()}createTextArrow_(){this.arrow_= +createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.TSPAN,{},this.textElement_);this.arrow_.appendChild(document.createTextNode(this.getSourceBlock().RTL?FieldDropdown$$module$build$src$core$field_dropdown.ARROW_CHAR+" ":" "+FieldDropdown$$module$build$src$core$field_dropdown.ARROW_CHAR));this.getSourceBlock().RTL?this.getTextElement().insertBefore(this.arrow_,this.textContent_):this.getTextElement().appendChild(this.arrow_)}createSVGArrow_(){this.svgArrow_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.IMAGE, +{height:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px",width:this.getConstants().FIELD_DROPDOWN_SVG_ARROW_SIZE+"px"},this.fieldGroup_);this.svgArrow_.setAttributeNS(XLINK_NS$$module$build$src$core$utils$dom,"xlink:href",this.getConstants().FIELD_DROPDOWN_SVG_ARROW_DATAURI)}showEditor_(a){this.dropdownCreate_();this.menu_.openingCoords=a&&"number"===typeof a.clientX?new Coordinate$$module$build$src$core$utils$coordinate(a.clientX,a.clientY):null;clearContent$$module$build$src$core$dropdowndiv(); +a=this.menu_.render(getContentDiv$$module$build$src$core$dropdowndiv());addClass$$module$build$src$core$utils$dom(a,"blocklyDropdownMenu");if(this.getConstants().FIELD_DROPDOWN_COLOURED_DIV){a=this.getSourceBlock().isShadow()?this.getSourceBlock().getParent().getColour():this.getSourceBlock().getColour();const b=this.getSourceBlock().isShadow()?this.getSourceBlock().getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;if(!b)throw Error("The renderer did not properly initialize the block style"); +setColour$$module$build$src$core$dropdowndiv(a,b)}showPositionedByField$$module$build$src$core$dropdowndiv(this,this.dropdownDispose_.bind(this));this.menu_.focus();this.selectedMenuItem_&&this.menu_.setHighlighted(this.selectedMenuItem_);this.applyColour()}dropdownCreate_(){const a=new Menu$$module$build$src$core$menu;a.setRole(Role$$module$build$src$core$utils$aria.LISTBOX);this.menu_=a;const b=this.getOptions(!1);this.selectedMenuItem_=null;for(let d=0;da.length)){b=[];for(c=0;c=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_)}setHandleLength_(a){this.handleLength_=a;this.svgHandle_.setAttribute(this.lengthAttribute_,String(this.handleLength_))}constrainHandlePosition_(a){return a=0>=a||isNaN(a)?0:Math.min(a,this.scrollbarLength_-this.handleLength_)}setHandlePosition(a){this.handlePosition_=a;this.svgHandle_.setAttribute(this.positionAttribute_,String(this.handlePosition_))}setScrollbarLength_(a){this.scrollbarLength_= +a;this.outerSvg_.setAttribute(this.lengthAttribute_,String(this.scrollbarLength_));this.svgBackground_.setAttribute(this.lengthAttribute_,String(this.scrollbarLength_))}setPosition(a,b){this.position.x=a;this.position.y=b;a=this.position.x+this.origin_.x;b=this.position.y+this.origin_.y;this.outerSvg_&&setCssTransform$$module$build$src$core$utils$dom(this.outerSvg_,"translate("+a+"px,"+b+"px)")}resize(a){if(!a&&(a=this.workspace.getMetrics(),!a))return;this.oldHostMetrics_&&Scrollbar$$module$build$src$core$scrollbar.metricsAreEquivalent_(a, +this.oldHostMetrics_)||(this.horizontal?this.resizeHorizontal_(a):this.resizeVertical_(a),this.oldHostMetrics_=a,this.updateMetrics_())}requiresViewResize_(a){return this.oldHostMetrics_?this.oldHostMetrics_.viewWidth!==a.viewWidth||this.oldHostMetrics_.viewHeight!==a.viewHeight||this.oldHostMetrics_.absoluteLeft!==a.absoluteLeft||this.oldHostMetrics_.absoluteTop!==a.absoluteTop:!0}resizeHorizontal_(a){this.requiresViewResize_(a)?this.resizeViewHorizontal(a):this.resizeContentHorizontal(a)}resizeViewHorizontal(a){var b= +a.viewWidth-2*this.margin_;this.pair_&&(b-=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));b=a.absoluteLeft+this.margin_;this.pair_&&this.workspace.RTL&&(b+=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness);this.setPosition(b,a.absoluteTop+a.viewHeight-Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness-this.margin_);this.resizeContentHorizontal(a)}resizeContentHorizontal(a){if(a.viewWidth>=a.scrollWidth)this.setHandleLength_(this.scrollbarLength_), +this.setHandlePosition(0),this.pair_||this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewWidth/a.scrollWidth;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollWidth-a.viewWidth;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewLeft-a.scrollLeft)/b*c;a=this.constrainHandlePosition_(a);this.setHandlePosition(a);this.ratio=c/b}}resizeVertical_(a){this.requiresViewResize_(a)?this.resizeViewVertical(a):this.resizeContentVertical(a)}resizeViewVertical(a){let b= +a.viewHeight-2*this.margin_;this.pair_&&(b-=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness);this.setScrollbarLength_(Math.max(0,b));this.setPosition(this.workspace.RTL?a.absoluteLeft+this.margin_:a.absoluteLeft+a.viewWidth-Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness-this.margin_,a.absoluteTop+this.margin_);this.resizeContentVertical(a)}resizeContentVertical(a){if(a.viewHeight>=a.scrollHeight)this.setHandleLength_(this.scrollbarLength_),this.setHandlePosition(0),this.pair_|| +this.setVisible(!1);else{this.pair_||this.setVisible(!0);var b=this.scrollbarLength_*a.viewHeight/a.scrollHeight;b=this.constrainHandleLength_(b);this.setHandleLength_(b);b=a.scrollHeight-a.viewHeight;var c=this.scrollbarLength_-this.handleLength_;a=(a.viewTop-a.scrollTop)/b*c;a=this.constrainHandlePosition_(a);this.setHandlePosition(a);this.ratio=c/b}}createDom_(a){let b="blocklyScrollbar"+(this.horizontal?"Horizontal":"Vertical");a&&(b+=" "+a);this.outerSvg_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.SVG, +{"class":b});this.svgGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{},this.outerSvg_);this.svgBackground_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyScrollbarBackground"},this.svgGroup_);a=Math.floor((Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness-5)/2);this.svgHandle_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyScrollbarHandle", +rx:a,ry:a},this.svgGroup_);this.workspace.getThemeManager().subscribe(this.svgHandle_,"scrollbarColour","fill");this.workspace.getThemeManager().subscribe(this.svgHandle_,"scrollbarOpacity","fill-opacity");insertAfter$$module$build$src$core$utils$dom(this.outerSvg_,this.workspace.getParentSvg())}isVisible(){return this.isVisible_}setContainerVisible(a){const b=a!==this.containerVisible_;this.containerVisible_=a;b&&this.updateDisplay_()}setVisible(a){const b=a!==this.isVisible();if(this.pair_)throw Error("Unable to toggle visibility of paired scrollbars."); +this.isVisible_=a;b&&this.updateDisplay_()}updateDisplay_(){this.containerVisible_&&this.isVisible()?this.outerSvg_.setAttribute("display","block"):this.outerSvg_.setAttribute("display","none")}onMouseDownBar_(a){this.workspace.markFocused();clearTouchIdentifier$$module$build$src$core$touch();this.cleanUp_();if(isRightButton$$module$build$src$core$browser_events(a))a.stopPropagation();else{var b=mouseToSvg$$module$build$src$core$browser_events(a,this.workspace.getParentSvg(),this.workspace.getInverseScreenCTM()); +b=this.horizontal?b.x:b.y;var c=getInjectionDivXY$$module$build$src$core$utils$svg_math(this.svgHandle_);c=this.horizontal?c.x:c.y;var d=this.handlePosition_,e=.95*this.handleLength_;b<=c?d-=e:b>=c+this.handleLength_&&(d+=e);this.setHandlePosition(this.constrainHandlePosition_(d));this.updateMetrics_();a.stopPropagation();a.preventDefault()}}onMouseDownHandle_(a){this.workspace.markFocused();this.cleanUp_();isRightButton$$module$build$src$core$browser_events(a)?a.stopPropagation():(this.startDragHandle= +this.handlePosition_,this.workspace.setupDragSurface(),this.startDragMouse_=this.horizontal?a.clientX:a.clientY,this.onMouseUpWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mouseup",this,this.onMouseUpHandle_),this.onMouseMoveWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mousemove",this,this.onMouseMoveHandle_),a.stopPropagation(),a.preventDefault())}onMouseMoveHandle_(a){this.setHandlePosition(this.constrainHandlePosition_(this.startDragHandle+ +((this.horizontal?a.clientX:a.clientY)-this.startDragMouse_)));this.updateMetrics_()}onMouseUpHandle_(){this.workspace.resetDragSurface();clearTouchIdentifier$$module$build$src$core$touch();this.cleanUp_()}cleanUp_(){this.workspace.hideChaff(!0);this.onMouseUpWrapper_&&(unbind$$module$build$src$core$browser_events(this.onMouseUpWrapper_),this.onMouseUpWrapper_=null);this.onMouseMoveWrapper_&&(unbind$$module$build$src$core$browser_events(this.onMouseMoveWrapper_),this.onMouseMoveWrapper_=null)}getRatio_(){let a= +this.handlePosition_/(this.scrollbarLength_-this.handleLength_);isNaN(a)&&(a=0);return a}updateMetrics_(){const a=this.getRatio_();this.horizontal?this.workspace.setMetrics({x:a}):this.workspace.setMetrics({y:a})}set(a,b){this.setHandlePosition(this.constrainHandlePosition_(a*this.ratio));(b||void 0===b)&&this.updateMetrics_()}setOrigin(a,b){this.origin_=new Coordinate$$module$build$src$core$utils$coordinate(a,b)}static metricsAreEquivalent_(a,b){return a.viewWidth===b.viewWidth&&a.viewHeight===b.viewHeight&& +a.viewLeft===b.viewLeft&&a.viewTop===b.viewTop&&a.absoluteTop===b.absoluteTop&&a.absoluteLeft===b.absoluteLeft&&a.scrollWidth===b.scrollWidth&&a.scrollHeight===b.scrollHeight&&a.scrollLeft===b.scrollLeft&&a.scrollTop===b.scrollTop}};Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness=TOUCH_ENABLED$$module$build$src$core$touch?25:15;Scrollbar$$module$build$src$core$scrollbar.DEFAULT_SCROLLBAR_MARGIN=.5;var module$build$src$core$scrollbar={};module$build$src$core$scrollbar.Scrollbar=Scrollbar$$module$build$src$core$scrollbar;var Bubble$$module$build$src$core$bubble=class{constructor(a,b,c,d,e,f){this.resizeGroup_=this.bubbleBack_=this.bubbleArrow_=this.bubbleGroup_=null;this.height_=this.width_=this.relativeTop_=this.relativeLeft_=0;this.autoLayout_=!0;this.onMouseDownResizeWrapper_=this.onMouseDownBubbleWrapper_=this.moveCallback_=this.resizeCallback_=null;this.rendered_=this.disposed=!1;this.workspace_=a;this.content_=b;this.shape_=c;c=Bubble$$module$build$src$core$bubble.ARROW_ANGLE;this.workspace_.RTL&&(c=-c);this.arrow_radians_= +toRadians$$module$build$src$core$utils$math(c);a.getBubbleCanvas().appendChild(this.createDom_(b,!(!e||!f)));this.setAnchorLocation(d);e&&f||(a=this.content_.getBBox(),e=a.width+2*Bubble$$module$build$src$core$bubble.BORDER_WIDTH,f=a.height+2*Bubble$$module$build$src$core$bubble.BORDER_WIDTH);this.setBubbleSize(e,f);this.positionBubble_();this.renderArrow_();this.rendered_=!0}createDom_(a,b){this.bubbleGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G, +{});var c={filter:"url(#"+this.workspace_.getRenderer().getConstants().embossFilterId+")"};JavaFx$$module$build$src$core$utils$useragent&&(c={});c=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,c,this.bubbleGroup_);this.bubbleArrow_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.PATH,{},c);this.bubbleBack_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"blocklyDraggable", +x:0,y:0,rx:Bubble$$module$build$src$core$bubble.BORDER_WIDTH,ry:Bubble$$module$build$src$core$bubble.BORDER_WIDTH},c);b?(this.resizeGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":this.workspace_.RTL?"blocklyResizeSW":"blocklyResizeSE"},this.bubbleGroup_),b=2*Bubble$$module$build$src$core$bubble.BORDER_WIDTH,createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.POLYGON,{points:"0,x x,x x,0".replace(/x/g,b.toString())}, +this.resizeGroup_),createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{"class":"blocklyResizeLine",x1:b/3,y1:b-1,x2:b-1,y2:b/3},this.resizeGroup_),createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{"class":"blocklyResizeLine",x1:2*b/3,y1:b-1,x2:b-1,y2:2*b/3},this.resizeGroup_)):this.resizeGroup_=null;this.workspace_.options.readOnly||(this.onMouseDownBubbleWrapper_=conditionalBind$$module$build$src$core$browser_events(this.bubbleBack_, +"mousedown",this,this.bubbleMouseDown_),this.resizeGroup_&&(this.onMouseDownResizeWrapper_=conditionalBind$$module$build$src$core$browser_events(this.resizeGroup_,"mousedown",this,this.resizeMouseDown_)));this.bubbleGroup_.appendChild(a);return this.bubbleGroup_}getSvgRoot(){return this.bubbleGroup_}setSvgId(a){let b;null==(b=this.bubbleGroup_)||b.setAttribute("data-block-id",a)}bubbleMouseDown_(a){const b=this.workspace_.getGesture(a);b&&b.handleBubbleStart(a,this)}showContextMenu(a){}isDeletable(){return!1}setDeleteStyle(a){}resizeMouseDown_(a){this.promote(); +Bubble$$module$build$src$core$bubble.unbindDragEvents_();isRightButton$$module$build$src$core$browser_events(a)||(this.workspace_.startDrag(a,new Coordinate$$module$build$src$core$utils$coordinate(this.workspace_.RTL?-this.width_:this.width_,this.height_)),Bubble$$module$build$src$core$bubble.onMouseUpWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mouseup",this,Bubble$$module$build$src$core$bubble.bubbleMouseUp_),Bubble$$module$build$src$core$bubble.onMouseMoveWrapper_=conditionalBind$$module$build$src$core$browser_events(document, +"mousemove",this,this.resizeMouseMove_),this.workspace_.hideChaff());a.stopPropagation()}resizeMouseMove_(a){this.autoLayout_=!1;a=this.workspace_.moveDrag(a);this.setBubbleSize(this.workspace_.RTL?-a.x:a.x,a.y);this.workspace_.RTL&&this.positionBubble_()}registerResizeEvent(a){this.resizeCallback_=a}registerMoveEvent(a){this.moveCallback_=a}promote(){let a;const b=null==(a=this.bubbleGroup_)?void 0:a.parentNode;return(null==b?void 0:b.lastChild)!==this.bubbleGroup_&&this.bubbleGroup_?(null==b||b.appendChild(this.bubbleGroup_), +!0):!1}setAnchorLocation(a){this.anchorXY_=a;this.rendered_&&this.positionBubble_()}layoutBubble_(){var a=this.workspace_.getMetricsManager().getViewMetrics(!0),b=this.getOptimalRelativeLeft_(a),c=this.getOptimalRelativeTop_(a),d=this.shape_.getBBox();const e={x:b,y:-this.height_-this.workspace_.getRenderer().getConstants().MIN_BLOCK_HEIGHT},f={x:-this.width_-30,y:c};c={x:d.width,y:c};var g={x:b,y:d.height};b=d.widtha.width)return b;if(this.workspace_.RTL){var c=this.anchorXY_.x-b,d=a.left+a.width;a=a.left+Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness/this.workspace_.scale;c-this.width_d&&(b=-(d-this.anchorXY_.x))}else{c=b+this.anchorXY_.x;d=c+this.width_;const e=a.left;a=a.left+a.width-Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness/ +this.workspace_.scale;ca&&(b=a-this.anchorXY_.x-this.width_)}return b}getOptimalRelativeTop_(a){let b=-this.height_/4;if(this.height_>a.height)return b;const c=this.anchorXY_.y+b,d=c+this.height_,e=a.top;a=a.top+a.height-Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness/this.workspace_.scale;const f=this.anchorXY_.y;ca&&(b=a-f-this.height_);return b}positionBubble_(){let a=this.anchorXY_.x;a=this.workspace_.RTL?a-(this.relativeLeft_+this.width_):a+ +this.relativeLeft_;this.moveTo(a,this.relativeTop_+this.anchorXY_.y)}moveTo(a,b){let c;null==(c=this.bubbleGroup_)||c.setAttribute("transform","translate("+a+","+b+")")}setDragging(a){!a&&this.moveCallback_&&this.moveCallback_()}getBubbleSize(){return new Size$$module$build$src$core$utils$size(this.width_,this.height_)}setBubbleSize(a,b){const c=2*Bubble$$module$build$src$core$bubble.BORDER_WIDTH;a=Math.max(a,c+45);b=Math.max(b,c+20);this.width_=a;this.height_=b;let d;null==(d=this.bubbleBack_)|| +d.setAttribute("width",a.toString());let e;null==(e=this.bubbleBack_)||e.setAttribute("height",b.toString());this.resizeGroup_&&(this.workspace_.RTL?this.resizeGroup_.setAttribute("transform","translate("+2*Bubble$$module$build$src$core$bubble.BORDER_WIDTH+","+(b-c)+") scale(-1 1)"):this.resizeGroup_.setAttribute("transform","translate("+(a-c)+","+(b-c)+")"));this.autoLayout_&&this.layoutBubble_();this.positionBubble_();this.renderArrow_();this.resizeCallback_&&this.resizeCallback_()}renderArrow_(){const a= +[];var b=this.width_/2,c=this.height_/2,d=-this.relativeLeft_,e=-this.relativeTop_;if(b===d&&c===e)a.push("M "+b+","+c);else{e-=c;d-=b;this.workspace_.RTL&&(d*=-1);var f=Math.sqrt(e*e+d*d),g=Math.acos(d/f);0>e&&(g=2*Math.PI-g);var h=g+Math.PI/2;h>2*Math.PI&&(h-=2*Math.PI);var k=Math.sin(h);const n=Math.cos(h);var l=this.getBubbleSize();h=(l.width+l.height)/Bubble$$module$build$src$core$bubble.ARROW_THICKNESS;h=Math.min(h,l.width,l.height)/4;l=1-Bubble$$module$build$src$core$bubble.ANCHOR_RADIUS/f; +d=b+l*d;e=c+l*e;l=b+h*n;const p=c+h*k;b-=h*n;c-=h*k;k=g+this.arrow_radians_;k>2*Math.PI&&(k-=2*Math.PI);g=Math.sin(k)*f/Bubble$$module$build$src$core$bubble.ARROW_BEND;f=Math.cos(k)*f/Bubble$$module$build$src$core$bubble.ARROW_BEND;a.push("M"+l+","+p);a.push("C"+(l+f)+","+(p+g)+" "+d+","+e+" "+d+","+e);a.push("C"+d+","+e+" "+(b+f)+","+(c+g)+" "+b+","+c)}a.push("z");let m;null==(m=this.bubbleArrow_)||m.setAttribute("d",a.join(" "))}setColour(a){let b;null==(b=this.bubbleBack_)||b.setAttribute("fill", +a);let c;null==(c=this.bubbleArrow_)||c.setAttribute("fill",a)}dispose(){this.onMouseDownBubbleWrapper_&&unbind$$module$build$src$core$browser_events(this.onMouseDownBubbleWrapper_);this.onMouseDownResizeWrapper_&&unbind$$module$build$src$core$browser_events(this.onMouseDownResizeWrapper_);Bubble$$module$build$src$core$bubble.unbindDragEvents_();removeNode$$module$build$src$core$utils$dom(this.bubbleGroup_);this.disposed=!0}moveDuringDrag(a,b){a?a.translateSurface(b.x,b.y):this.moveTo(b.x,b.y);this.relativeLeft_= +this.workspace_.RTL?this.anchorXY_.x-b.x-this.width_:b.x-this.anchorXY_.x;this.relativeTop_=b.y-this.anchorXY_.y;this.renderArrow_()}getRelativeToSurfaceXY(){return new Coordinate$$module$build$src$core$utils$coordinate(this.workspace_.RTL?-this.relativeLeft_+this.anchorXY_.x-this.width_:this.anchorXY_.x+this.relativeLeft_,this.anchorXY_.y+this.relativeTop_)}setAutoLayout(a){this.autoLayout_=a}static unbindDragEvents_(){Bubble$$module$build$src$core$bubble.onMouseUpWrapper_&&(unbind$$module$build$src$core$browser_events(Bubble$$module$build$src$core$bubble.onMouseUpWrapper_), +Bubble$$module$build$src$core$bubble.onMouseUpWrapper_=null);Bubble$$module$build$src$core$bubble.onMouseMoveWrapper_&&(unbind$$module$build$src$core$browser_events(Bubble$$module$build$src$core$bubble.onMouseMoveWrapper_),Bubble$$module$build$src$core$bubble.onMouseMoveWrapper_=null)}static bubbleMouseUp_(a){clearTouchIdentifier$$module$build$src$core$touch();Bubble$$module$build$src$core$bubble.unbindDragEvents_()}static textToDom(a){const b=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.TEXT, +{"class":"blocklyText blocklyBubbleText blocklyNoPointerEvents",y:Bubble$$module$build$src$core$bubble.BORDER_WIDTH});a=a.split("\n");for(let c=0;ca||Math.abs(this.workspaceHeight_-d)>a)this.workspaceWidth_=c,this.workspaceHeight_=d,this.bubble_.setBubbleSize(c+a,d+a),this.svgDialog_.setAttribute("width",`${this.workspaceWidth_}`),this.svgDialog_.setAttribute("height", +`${this.workspaceHeight_}`),this.workspace_.setCachedParentSvgSize(this.workspaceWidth_,this.workspaceHeight_);this.getBlock().RTL&&(a="translate("+this.workspaceWidth_+",0)",this.workspace_.getCanvas().setAttribute("transform",a));this.workspace_.resize()}onBubbleMove_(){this.workspace_&&this.workspace_.recordDragTargets()}setVisible(a){if(a!==this.isVisible()){var b=this.getBlock();fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(BUBBLE_OPEN$$module$build$src$core$events$utils))(b, +a,"mutator"));if(a){this.bubble_=new Bubble$$module$build$src$core$bubble(b.workspace,this.createEditor_(),b.pathObject.svgPath,this.iconXY_,null,null);this.bubble_.setSvgId(b.id);this.bubble_.registerMoveEvent(this.onBubbleMove_.bind(this));var c=this.workspace_.options.languageTree;a=this.workspace_.getFlyout();c&&(a.init(this.workspace_),a.show(c));this.rootBlock_=b.decompose(this.workspace_);c=this.rootBlock_.getDescendants(!1);for(let d=0,e;e=c[d];d++)e.render();this.rootBlock_.setMovable(!1); +this.rootBlock_.setDeletable(!1);a?(c=2*a.CORNER_RADIUS,a=this.rootBlock_.RTL?a.getWidth()+c:c):a=c=16;b.RTL&&(a=-a);this.rootBlock_.moveBy(a,c);if(b.saveConnections){const d=this.rootBlock_;b.saveConnections(d);this.sourceListener_=()=>{const e=this.getBlock();e.saveConnections&&e.saveConnections(d)};b.workspace.addChangeListener(this.sourceListener_)}this.resizeBubble_();this.workspace_.addChangeListener(this.workspaceChanged_.bind(this));this.updateWorkspace_();this.applyColour()}else this.svgDialog_= +null,this.workspace_.dispose(),this.rootBlock_=this.workspace_=null,null==(c=this.bubble_)||c.dispose(),this.bubble_=null,this.workspaceHeight_=this.workspaceWidth_=0,this.sourceListener_&&(b.workspace.removeChangeListener(this.sourceListener_),this.sourceListener_=null)}}workspaceChanged_(a){this.shouldIgnoreMutatorEvent_(a)||this.updateWorkspacePid_||(this.updateWorkspacePid_=setTimeout(()=>{this.updateWorkspacePid_=null;this.updateWorkspace_()},0))}shouldIgnoreMutatorEvent_(a){return a.isUiEvent|| +a.type===CREATE$$module$build$src$core$events$utils||a.type===CHANGE$$module$build$src$core$events$utils&&"disabled"===a.element}updateWorkspace_(){if(!this.workspace_.isDragging()){var a=this.workspace_.getTopBlocks(!1);for(let d=0,e;e=a[d];d++){var b=e.getRelativeToSurfaceXY();20>b.y&&e.moveBy(0,20-b.y);if(e.RTL){var c=-20;const f=this.workspace_.getFlyout();f&&(c-=f.getWidth());b.x>c&&e.moveBy(c-b.x,0)}else 20>b.x&&e.moveBy(20-b.x,0)}}if(this.rootBlock_&&this.rootBlock_.workspace===this.workspace_){(a= +getGroup$$module$build$src$core$events$utils())||setGroup$$module$build$src$core$events$utils(!0);const d=this.getBlock();b=BlockChange$$module$build$src$core$events$events_block_change.getExtraBlockState_(d);c=d.rendered;d.rendered=!1;d.compose(this.rootBlock_);d.rendered=c;d.initSvg();d.rendered&&d.render();c=BlockChange$$module$build$src$core$events$events_block_change.getExtraBlockState_(d);if(b!==c){fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CHANGE$$module$build$src$core$events$utils))(d, +"mutation",null,b,c));const e=getGroup$$module$build$src$core$events$utils();setTimeout(function(){const f=getGroup$$module$build$src$core$events$utils();setGroup$$module$build$src$core$events$utils(e);d.bumpNeighbours();setGroup$$module$build$src$core$events$utils(f)},$.config$$module$build$src$core$config.bumpDelay)}this.workspace_.isDragging()||setTimeout(()=>this.resizeBubble_(),0);setGroup$$module$build$src$core$events$utils(a)}}dispose(){this.getBlock().mutator=null;super.dispose()}updateBlockStyle(){var a= +this.workspace_;if(a&&a.getAllBlocks(!1)){const b=a.getAllBlocks(!1);for(let c=0,d;d=b[c];c++)d.setStyle(d.getStyleName());if(a=a.getFlyout()){a=a.getWorkspace().getAllBlocks(!1);for(let c=0,d;d=a[c];c++)d.setStyle(d.getStyleName())}}}static reconnect(a,b,c){if(!a||!a.getSourceBlock().workspace)return!1;c=b.getInput(c).connection;const d=a.targetBlock();return d&&d!==b||!c||c.targetConnection===a?!1:(c.isConnected()&&c.disconnect(),c.connect(a),!0)}static findParentWs(a){let b=null;if(a&&a.options){const c= +a.options.parentWorkspace;a.isFlyout?c&&c.options&&(b=c.options.parentWorkspace):c&&(b=c)}return b}};module$build$src$core$mutator={};module$build$src$core$mutator.Mutator=$.Mutator$$module$build$src$core$mutator;var allExtensions$$module$build$src$core$extensions=Object.create(null),TEST_ONLY$$module$build$src$core$extensions={allExtensions:allExtensions$$module$build$src$core$extensions};register$$module$build$src$core$extensions("parent_tooltip_when_inline",extensionParentTooltip$$module$build$src$core$extensions);$.module$build$src$core$extensions={};$.module$build$src$core$extensions.TEST_ONLY=TEST_ONLY$$module$build$src$core$extensions;$.module$build$src$core$extensions.apply=apply$$module$build$src$core$extensions; +$.module$build$src$core$extensions.buildTooltipForDropdown=buildTooltipForDropdown$$module$build$src$core$extensions;$.module$build$src$core$extensions.buildTooltipWithFieldText=buildTooltipWithFieldText$$module$build$src$core$extensions;$.module$build$src$core$extensions.isRegistered=isRegistered$$module$build$src$core$extensions;$.module$build$src$core$extensions.register=register$$module$build$src$core$extensions;$.module$build$src$core$extensions.registerMixin=registerMixin$$module$build$src$core$extensions; +$.module$build$src$core$extensions.registerMutator=registerMutator$$module$build$src$core$extensions;$.module$build$src$core$extensions.runAfterPageLoad=runAfterPageLoad$$module$build$src$core$extensions;$.module$build$src$core$extensions.unregister=unregister$$module$build$src$core$extensions;var module$build$src$core$utils$array={};module$build$src$core$utils$array.removeElem=removeElem$$module$build$src$core$utils$array;var module$build$src$core$utils$svg_paths={};module$build$src$core$utils$svg_paths.arc=arc$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.curve=curve$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.line=line$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.lineOnAxis=lineOnAxis$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.lineTo=lineTo$$module$build$src$core$utils$svg_paths; +module$build$src$core$utils$svg_paths.moveBy=moveBy$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.moveTo=moveTo$$module$build$src$core$utils$svg_paths;module$build$src$core$utils$svg_paths.point=point$$module$build$src$core$utils$svg_paths;var getInjectionDivXY_$$module$build$src$core$utils=getInjectionDivXY$$module$build$src$core$utils,module$build$src$core$utils={};module$build$src$core$utils.Coordinate=Coordinate$$module$build$src$core$utils$coordinate;module$build$src$core$utils.KeyCodes=KeyCodes$$module$build$src$core$utils$keycodes;module$build$src$core$utils.Rect=Rect$$module$build$src$core$utils$rect;module$build$src$core$utils.Size=Size$$module$build$src$core$utils$size;module$build$src$core$utils.Svg=Svg$$module$build$src$core$utils$svg; +module$build$src$core$utils.aria=module$build$src$core$utils$aria;module$build$src$core$utils.array=module$build$src$core$utils$array;module$build$src$core$utils.arrayRemove=arrayRemove$$module$build$src$core$utils;module$build$src$core$utils.browserEvents=module$build$src$core$browser_events;module$build$src$core$utils.checkMessageReferences=checkMessageReferences$$module$build$src$core$utils;module$build$src$core$utils.colour=module$build$src$core$utils$colour; +module$build$src$core$utils.deprecation=module$build$src$core$utils$deprecation;module$build$src$core$utils.dom=module$build$src$core$utils$dom;module$build$src$core$utils.extensions=$.module$build$src$core$extensions;module$build$src$core$utils.getBlockTypeCounts=getBlockTypeCounts$$module$build$src$core$utils;module$build$src$core$utils.getDocumentScroll=getDocumentScroll$$module$build$src$core$utils;module$build$src$core$utils.getInjectionDivXY_=getInjectionDivXY$$module$build$src$core$utils; +module$build$src$core$utils.getRelativeXY=getRelativeXY$$module$build$src$core$utils;module$build$src$core$utils.getViewportBBox=getViewportBBox$$module$build$src$core$utils;module$build$src$core$utils.idGenerator=module$build$src$core$utils$idgenerator;module$build$src$core$utils.is3dSupported=is3dSupported$$module$build$src$core$utils;module$build$src$core$utils.math=module$build$src$core$utils$math;module$build$src$core$utils.object=$.module$build$src$core$utils$object; +module$build$src$core$utils.parseBlockColour=parseBlockColour$$module$build$src$core$utils;module$build$src$core$utils.parsing=module$build$src$core$utils$parsing;module$build$src$core$utils.replaceMessageReferences=replaceMessageReferences$$module$build$src$core$utils;module$build$src$core$utils.runAfterPageLoad=runAfterPageLoad$$module$build$src$core$utils;module$build$src$core$utils.screenToWsCoordinates=screenToWsCoordinates$$module$build$src$core$utils;module$build$src$core$utils.string=$.module$build$src$core$utils$string; +module$build$src$core$utils.style=module$build$src$core$utils$style;module$build$src$core$utils.svgMath=module$build$src$core$utils$svg_math;module$build$src$core$utils.svgPaths=module$build$src$core$utils$svg_paths;module$build$src$core$utils.tokenizeInterpolation=tokenizeInterpolation$$module$build$src$core$utils;module$build$src$core$utils.toolbox=module$build$src$core$utils$toolbox;module$build$src$core$utils.userAgent=module$build$src$core$utils$useragent;module$build$src$core$utils.xml=$.module$build$src$core$utils$xml;var TrashcanOpen$$module$build$src$core$events$events_trashcan_open=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b){super(b);this.type=TRASHCAN_OPEN$$module$build$src$core$events$utils;this.isOpen=a}toJson(){const a=super.toJson();if(void 0===this.isOpen)throw Error("Whether this is already open or not is undefined. Either pass a value to the constructor, or call fromJson");a.isOpen=this.isOpen;return a}fromJson(a){super.fromJson(a);this.isOpen=a.isOpen}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,TRASHCAN_OPEN$$module$build$src$core$events$utils,TrashcanOpen$$module$build$src$core$events$events_trashcan_open);var module$build$src$core$events$events_trashcan_open={};module$build$src$core$events$events_trashcan_open.TrashcanOpen=TrashcanOpen$$module$build$src$core$events$events_trashcan_open;var Capability$$module$build$src$core$component_manager=class{constructor(a){this.name_=a}toString(){return this.name_}};Capability$$module$build$src$core$component_manager.POSITIONABLE=new Capability$$module$build$src$core$component_manager("positionable");Capability$$module$build$src$core$component_manager.DRAG_TARGET=new Capability$$module$build$src$core$component_manager("drag_target");Capability$$module$build$src$core$component_manager.DELETE_AREA=new Capability$$module$build$src$core$component_manager("delete_area"); +Capability$$module$build$src$core$component_manager.AUTOHIDEABLE=new Capability$$module$build$src$core$component_manager("autohideable"); +var ComponentManager$$module$build$src$core$component_manager=class{constructor(){this.componentData=new Map;this.capabilityToComponentIds=new Map}addComponent(a,b){const c=a.component.id;if(!b&&this.componentData.has(c)){var d;throw Error('Plugin "'+c+'" with capabilities "'+(null==(d=this.componentData.get(c))?void 0:d.capabilities)+'" already added.');}this.componentData.set(c,a);b=[];for(d=0;d{d.push(this.componentData.get(e))});d.sort(function(e,f){return e.weight-f.weight});d.forEach(function(e){c.push(e.component)})}else a.forEach(d=>{c.push(this.componentData.get(d).component)});return c}};ComponentManager$$module$build$src$core$component_manager.Capability=Capability$$module$build$src$core$component_manager;var module$build$src$core$component_manager={}; +module$build$src$core$component_manager.ComponentManager=ComponentManager$$module$build$src$core$component_manager;var DeserializationError$$module$build$src$core$serialization$exceptions=class extends Error{},MissingBlockType$$module$build$src$core$serialization$exceptions=class extends DeserializationError$$module$build$src$core$serialization$exceptions{constructor(a){super("Expected to find a 'type' property, defining the block type");this.state=a}},MissingConnection$$module$build$src$core$serialization$exceptions=class extends DeserializationError$$module$build$src$core$serialization$exceptions{constructor(a, +b,c){super(`The block ${b.toDevString()} is missing a(n) ${a} +connection`);this.block=b;this.state=c}},BadConnectionCheck$$module$build$src$core$serialization$exceptions=class extends DeserializationError$$module$build$src$core$serialization$exceptions{constructor(a,b,c,d){super(`The block ${c.toDevString()} could not connect its +${b} to its parent, because: ${a}`);this.childBlock=c;this.childState=d}},RealChildOfShadow$$module$build$src$core$serialization$exceptions=class extends DeserializationError$$module$build$src$core$serialization$exceptions{constructor(a){super("Encountered a real block which is defined as a child of a shadow\nblock. It is an invariant of Blockly that shadow blocks only have shadow\nchildren");this.state=a}},module$build$src$core$serialization$exceptions={}; +module$build$src$core$serialization$exceptions.BadConnectionCheck=BadConnectionCheck$$module$build$src$core$serialization$exceptions;module$build$src$core$serialization$exceptions.DeserializationError=DeserializationError$$module$build$src$core$serialization$exceptions;module$build$src$core$serialization$exceptions.MissingBlockType=MissingBlockType$$module$build$src$core$serialization$exceptions;module$build$src$core$serialization$exceptions.MissingConnection=MissingConnection$$module$build$src$core$serialization$exceptions; +module$build$src$core$serialization$exceptions.RealChildOfShadow=RealChildOfShadow$$module$build$src$core$serialization$exceptions;var VARIABLES$$module$build$src$core$serialization$priorities=100,BLOCKS$$module$build$src$core$serialization$priorities=50,module$build$src$core$serialization$priorities={};module$build$src$core$serialization$priorities.BLOCKS=BLOCKS$$module$build$src$core$serialization$priorities;module$build$src$core$serialization$priorities.VARIABLES=VARIABLES$$module$build$src$core$serialization$priorities;var module$build$src$core$serialization$registry={};module$build$src$core$serialization$registry.register=register$$module$build$src$core$serialization$registry;module$build$src$core$serialization$registry.unregister=unregister$$module$build$src$core$serialization$registry;var saveBlock$$module$build$src$core$serialization$blocks=save$$module$build$src$core$serialization$blocks,BlockSerializer$$module$build$src$core$serialization$blocks=class{constructor(){this.priority=BLOCKS$$module$build$src$core$serialization$priorities}save(a){const b=[];for(const c of a.getTopBlocks(!1))(a=save$$module$build$src$core$serialization$blocks(c,{addCoordinates:!0,doFullSerialization:!1}))&&b.push(a);return b.length?{languageVersion:0,blocks:b}:null}load(a,b){a=a.blocks;for(const c of a)append$$module$build$src$core$serialization$blocks(c, +b,{recordUndo:getRecordUndo$$module$build$src$core$events$utils()})}clear(a){for(const b of a.getTopBlocks(!1))b.dispose(!1)}};register$$module$build$src$core$serialization$registry("blocks",new BlockSerializer$$module$build$src$core$serialization$blocks);var module$build$src$core$serialization$blocks={};module$build$src$core$serialization$blocks.append=append$$module$build$src$core$serialization$blocks;module$build$src$core$serialization$blocks.appendInternal=appendInternal$$module$build$src$core$serialization$blocks; +module$build$src$core$serialization$blocks.save=save$$module$build$src$core$serialization$blocks;var BlockCreate$$module$build$src$core$events$events_block_create=class extends BlockBase$$module$build$src$core$events$events_block_base{constructor(a){super(a);this.type=CREATE$$module$build$src$core$events$utils;a&&(a.isShadow()&&(this.recordUndo=!1),this.xml=blockToDomWithXY$$module$build$src$core$xml(a),this.ids=getDescendantIds$$module$build$src$core$events$utils(a),this.json=save$$module$build$src$core$serialization$blocks(a,{addCoordinates:!0}))}toJson(){const a=super.toJson();if(!this.xml)throw Error("The block XML is undefined. Either pass a block to the constructor, or call fromJson"); +if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");a.xml=domToText$$module$build$src$core$xml(this.xml);a.ids=this.ids;a.json=this.json;this.recordUndo||(a.recordUndo=this.recordUndo);return a}fromJson(a){super.fromJson(a);this.xml=textToDom$$module$build$src$core$xml(a.xml);this.ids=a.ids;this.json=a.json;void 0!==a.recordUndo&& +(this.recordUndo=a.recordUndo)}run(a){const b=this.getEventWorkspace_();if(!this.json)throw Error("The block JSON is undefined. Either pass a block to the constructor, or call fromJson");if(!this.ids)throw Error("The block IDs are undefined. Either pass a block to the constructor, or call fromJson");if(a)append$$module$build$src$core$serialization$blocks(this.json,b);else for(a=0;aa||a>this.fieldRow.length)throw Error("index "+ +a+" out of bounds.");if(!(b||""===b&&c))return a;"string"===typeof b&&(b=fromJson$$module$build$src$core$field_registry({type:"field_label",text:b}));b.setSourceBlock(this.sourceBlock_);this.sourceBlock_.rendered&&(b.init(),b.applyColour());b.name=c;b.setVisible(this.isVisible());b.prefixField&&(a=this.insertFieldAt(a,b.prefixField));this.fieldRow.splice(a,0,b);a++;b.suffixField&&(a=this.insertFieldAt(a,b.suffixField));this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()); +return a}removeField(a,b){for(let c=0,d;d=this.fieldRow[c];c++)if(d.name===a)return d.dispose(),this.fieldRow.splice(c,1),this.sourceBlock_.rendered&&(this.sourceBlock_.render(),this.sourceBlock_.bumpNeighbours()),!0;if(b)return!1;throw Error('Field "'+a+'" not found.');}isVisible(){return this.visible_}setVisible(a){let b=[];if(this.visible_===a)return b;this.visible_=a;for(let d=0,e;e=this.fieldRow[d];d++)e.setVisible(a);if(this.connection){var c=this.connection;a?b=c.startTrackingAll():c.stopTrackingAll(); +if(c=c.targetBlock())c.getSvgRoot().style.display=a?"block":"none"}return b}markDirty(){for(let a=0,b;b=this.fieldRow[a];a++)b.markDirty()}setCheck(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setCheck(a);return this}setAlign(a){this.align=a;this.sourceBlock_.rendered&&this.sourceBlock_.render();return this}setShadowDom(a){if(!this.connection)throw Error("This input does not have a connection.");this.connection.setShadowDom(a);return this}getShadowDom(){if(!this.connection)throw Error("This input does not have a connection."); +return this.connection.getShadowDom()}init(){if(this.sourceBlock_.workspace.rendered)for(let a=0;aa&&(e=e.substring(0,a-3)+"...");return e}appendValueInput(a){return this.appendInput_(inputTypes$$module$build$src$core$input_types.VALUE,a)}appendStatementInput(a){return this.appendInput_(inputTypes$$module$build$src$core$input_types.STATEMENT,a)}appendDummyInput(a){return this.appendInput_(inputTypes$$module$build$src$core$input_types.DUMMY, +a||"")}jsonInit(a){var b=a.type?'Block "'+a.type+'": ':"";if(a.output&&a.previousStatement)throw Error(b+"Must not have both an output and a previousStatement.");a.style&&a.style.hat&&(this.hat=a.style.hat,a.style=null);if(a.style&&a.colour)throw Error(b+"Must not have both a colour and a style.");a.style?this.jsonInitStyle_(a,b):this.jsonInitColour_(a,b);for(var c=0;void 0!==a["message"+c];)this.interpolate_(a["message"+c],a["args"+c]||[],a["lastDummyAlign"+c],b),c++;void 0!==a.inputsInline&&this.setInputsInline(a.inputsInline); +void 0!==a.output&&this.setOutput(!0,a.output);void 0!==a.outputShape&&this.setOutputShape(a.outputShape);void 0!==a.previousStatement&&this.setPreviousStatement(!0,a.previousStatement);void 0!==a.nextStatement&&this.setNextStatement(!0,a.nextStatement);void 0!==a.tooltip&&(c=replaceMessageReferences$$module$build$src$core$utils$parsing(a.tooltip),this.setTooltip(c));void 0!==a.enableContextMenu&&(this.contextMenu=!!a.enableContextMenu);void 0!==a.suppressPrefixSuffix&&(this.suppressPrefixSuffix= +!!a.suppressPrefixSuffix);void 0!==a.helpUrl&&(c=replaceMessageReferences$$module$build$src$core$utils$parsing(a.helpUrl),this.setHelpUrl(c));"string"===typeof a.extensions&&(console.warn(b+"JSON attribute 'extensions' should be an array of strings. Found raw string in JSON for '"+a.type+"' block."),a.extensions=[a.extensions]);void 0!==a.mutator&&apply$$module$build$src$core$extensions(a.mutator,this,!0);a=a.extensions;if(Array.isArray(a))for(b=0;b +f||f>b)throw Error('Block "'+this.type+'": Message index %'+f+" out of range.");if(c[f])throw Error('Block "'+this.type+'": Message index %'+f+" duplicated.");c[f]=!0;d++}}if(d!==b)throw Error('Block "'+this.type+'": Message does not reference all '+b+" arg(s).");}interpolateArguments_(a,b,c){const d=[];for(let e=0;e=this.inputList.length)throw RangeError("Input index "+a+" out of bounds.");if(b>this.inputList.length)throw RangeError("Reference input "+b+" out of bounds.");const c=this.inputList[a];this.inputList.splice(a,1);a{this.isDeadOrDying()||(this.warningTextDb.delete(c),this.setWarningText(a,c))},100));else{this.isInFlyout&&(a=null);b=!1;if("string"===typeof a){d=this.getSurroundParent();let e=null;for(;d;)d.isCollapsed()&&(e=d),d=d.getSurroundParent();e&&e.setWarningText(Msg$$module$build$src$core$msg.COLLAPSED_WARNINGS_WARNING,BlockSvg$$module$build$src$core$block_svg.COLLAPSED_WARNING_ID);this.warning||(this.warning=new Warning$$module$build$src$core$warning(this),b=!0);this.warning.setText(a, +c)}else this.warning&&!c?(this.warning.dispose(),b=!0):this.warning&&(b=this.warning.getText(),this.warning.setText("",c),(d=this.warning.getText())||this.warning.dispose(),b=b!==d);b&&this.rendered&&(this.render(),this.bumpNeighbours())}}setMutator(a){this.mutator&&this.mutator!==a&&this.mutator.dispose();a&&(a.setBlock(this),this.mutator=a,a.createIcon());this.rendered&&(this.render(),this.bumpNeighbours())}setEnabled(a){this.isEnabled()!==a&&(super.setEnabled(a),this.rendered&&!this.getInheritedDisabled()&& +this.updateDisabled())}setHighlighted(a){this.rendered&&this.pathObject.updateHighlighted(a)}addSelect(){this.pathObject.updateSelected(!0)}removeSelect(){this.pathObject.updateSelected(!1)}setDeleteStyle(a){this.pathObject.updateDraggingDelete(a)}getColour(){return this.style.colourPrimary}setColour(a){super.setColour(a);a=this.workspace.getRenderer().getConstants().getBlockStyleForColour(this.colour_);this.pathObject.setStyle(a.style);this.style=a.style;this.styleName_=a.name;this.applyColour()}setStyle(a){const b= +this.workspace.getRenderer().getConstants().getBlockStyle(a);this.styleName_=a;if(b)this.hat=b.hat,this.pathObject.setStyle(b),this.colour_=b.colourPrimary,this.style=b,this.applyColour();else throw Error("Invalid style name: "+a);}bringToFront(){let a=this;do{const b=a.getSvgRoot(),c=b.parentNode,d=c.childNodes;d[d.length-1]!==b&&c.appendChild(b);a=a.getParent()}while(a)}setPreviousStatement(a,b){super.setPreviousStatement(a,b);this.rendered&&(this.render(),this.bumpNeighbours())}setNextStatement(a, +b){super.setNextStatement(a,b);this.rendered&&(this.render(),this.bumpNeighbours())}setOutput(a,b){super.setOutput(a,b);this.rendered&&(this.render(),this.bumpNeighbours())}setInputsInline(a){super.setInputsInline(a);this.rendered&&(this.render(),this.bumpNeighbours())}removeInput(a,b){a=super.removeInput(a,b);this.rendered&&(this.render(),this.bumpNeighbours());return a}moveNumberedInputBefore(a,b){super.moveNumberedInputBefore(a,b);this.rendered&&(this.render(),this.bumpNeighbours())}appendInput_(a, +b){a=super.appendInput_(a,b);this.rendered&&(this.render(),this.bumpNeighbours());return a}setConnectionTracking(a){this.previousConnection&&this.previousConnection.setTracking(a);this.outputConnection&&this.outputConnection.setTracking(a);if(this.nextConnection){this.nextConnection.setTracking(a);var b=this.nextConnection.targetBlock();b&&b.setConnectionTracking(a)}if(!this.collapsed_)for(b=0;b{setGroup$$module$build$src$core$events$utils(a);this.snapToGrid();setGroup$$module$build$src$core$events$utils(!1)},$.config$$module$build$src$core$config.bumpDelay/2);setTimeout(()=>{setGroup$$module$build$src$core$events$utils(a);this.bumpNeighbours();setGroup$$module$build$src$core$events$utils(!1)},$.config$$module$build$src$core$config.bumpDelay)}positionNearConnection(a, +b){a.type!==ConnectionType$$module$build$src$core$connection_type.NEXT_STATEMENT&&a.type!==ConnectionType$$module$build$src$core$connection_type.INPUT_VALUE||this.moveBy(b.x-a.x,b.y-a.y)}getFirstStatementConnection(){return super.getFirstStatementConnection()}getChildren(a){return super.getChildren(a)}render(a){if(!this.renderIsInProgress_){this.renderIsInProgress_=!0;try{this.rendered=!0;startTextWidthCache$$module$build$src$core$utils$dom();this.isCollapsed()&&this.updateCollapsed_();this.workspace.getRenderer().render(this); +this.updateConnectionLocations_();if(!1!==a){const b=this.getParent();b?b.render(!0):this.workspace.resizeContents()}stopTextWidthCache$$module$build$src$core$utils$dom();this.updateMarkers_()}finally{this.renderIsInProgress_=!1}}}updateMarkers_(){this.workspace.keyboardAccessibilityMode&&this.pathObject.cursorSvg&&this.workspace.getCursor().draw();this.workspace.keyboardAccessibilityMode&&this.pathObject.markerSvg&&this.workspace.getMarker(MarkerManager$$module$build$src$core$marker_manager.LOCAL_MARKER).draw()}updateConnectionLocations_(){const a= +this.getRelativeToSurfaceXY();this.previousConnection&&this.previousConnection.moveToOffset(a);this.outputConnection&&this.outputConnection.moveToOffset(a);for(let b=0;b=this.workspace.options.maxTrashcanContents||(a=new Options$$module$build$src$core$options({scrollbars:!0,parentWorkspace:this.workspace,rtl:this.workspace.RTL, +oneBasedIndex:this.workspace.options.oneBasedIndex,renderer:this.workspace.options.renderer,rendererOverrides:this.workspace.options.rendererOverrides,move:{scrollbars:!0}}),this.workspace.horizontalLayout?(a.toolboxPosition=this.workspace.toolboxPosition===Position$$module$build$src$core$utils$toolbox.TOP?Position$$module$build$src$core$utils$toolbox.BOTTOM:Position$$module$build$src$core$utils$toolbox.TOP,this.flyout=new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_HORIZONTAL_TOOLBOX, +this.workspace.options,!0))(a)):(a.toolboxPosition=this.workspace.toolboxPosition===Position$$module$build$src$core$utils$toolbox.RIGHT?Position$$module$build$src$core$utils$toolbox.LEFT:Position$$module$build$src$core$utils$toolbox.RIGHT,this.flyout=new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_VERTICAL_TOOLBOX,this.workspace.options,!0))(a)),this.workspace.addChangeListener(this.onDelete_.bind(this)))}createDom(){this.svgGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G, +{"class":"blocklyTrash"});let a;const b=String(Math.random()).substring(2);a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CLIPPATH,{id:"blocklyTrashBodyClipPath"+b},this.svgGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{width:WIDTH$$module$build$src$core$trashcan,height:BODY_HEIGHT$$module$build$src$core$trashcan,y:LID_HEIGHT$$module$build$src$core$trashcan},a);const c=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.IMAGE, +{width:SPRITE$$module$build$src$core$sprites.width,x:-SPRITE_LEFT$$module$build$src$core$trashcan,height:SPRITE$$module$build$src$core$sprites.height,y:-SPRITE_TOP$$module$build$src$core$trashcan,"clip-path":"url(#blocklyTrashBodyClipPath"+b+")"},this.svgGroup_);c.setAttributeNS(XLINK_NS$$module$build$src$core$utils$dom,"xlink:href",this.workspace.options.pathToMedia+SPRITE$$module$build$src$core$sprites.url);a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CLIPPATH, +{id:"blocklyTrashLidClipPath"+b},this.svgGroup_);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{width:WIDTH$$module$build$src$core$trashcan,height:LID_HEIGHT$$module$build$src$core$trashcan},a);this.svgLid_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.IMAGE,{width:SPRITE$$module$build$src$core$sprites.width,x:-SPRITE_LEFT$$module$build$src$core$trashcan,height:SPRITE$$module$build$src$core$sprites.height,y:-SPRITE_TOP$$module$build$src$core$trashcan, +"clip-path":"url(#blocklyTrashLidClipPath"+b+")"},this.svgGroup_);this.svgLid_.setAttributeNS(XLINK_NS$$module$build$src$core$utils$dom,"xlink:href",this.workspace.options.pathToMedia+SPRITE$$module$build$src$core$sprites.url);bind$$module$build$src$core$browser_events(this.svgGroup_,"mousedown",this,this.blockMouseDownWhenOpenable_);bind$$module$build$src$core$browser_events(this.svgGroup_,"mouseup",this,this.click);bind$$module$build$src$core$browser_events(c,"mouseover",this,this.mouseOver_);bind$$module$build$src$core$browser_events(c, +"mouseout",this,this.mouseOut_);this.animateLid_();return this.svgGroup_}init(){0this.minOpenness_&&1>this.lidOpen_&&(this.lidTask_=setTimeout(this.animateLid_.bind(this),ANIMATION_LENGTH$$module$build$src$core$trashcan/ +a))}setLidAngle_(a){const b=this.workspace.toolboxPosition===Position$$module$build$src$core$utils$toolbox.RIGHT||this.workspace.horizontalLayout&&this.workspace.RTL;let c;null==(c=this.svgLid_)||c.setAttribute("transform","rotate("+(b?-a:a)+","+(b?4:WIDTH$$module$build$src$core$trashcan-4)+","+(LID_HEIGHT$$module$build$src$core$trashcan-2)+")")}setMinOpenness_(a){this.minOpenness_=a;this.isLidOpen||this.setLidAngle_(a*MAX_LID_ANGLE$$module$build$src$core$trashcan)}closeLid(){this.setLidOpen(!1)}click(){this.hasContents_()&& +this.openFlyout()}fireUiEvent_(a){a=new (get$$module$build$src$core$events$utils(TRASHCAN_OPEN$$module$build$src$core$events$utils))(a,this.workspace.id);fire$$module$build$src$core$events$utils(a)}blockMouseDownWhenOpenable_(a){!this.contentsIsOpen()&&this.hasContents_()&&a.stopPropagation()}mouseOver_(){this.hasContents_()&&this.setLidOpen(!0)}mouseOut_(){this.setLidOpen(!1)}onDelete_(a){if(!(0>=this.workspace.options.maxTrashcanContents||a.type!==DELETE$$module$build$src$core$events$utils||a.type!== +DELETE$$module$build$src$core$events$utils||a.wasShadow)){if(!a.oldJson)throw Error("Encountered a delete event without proper oldJson");a=JSON.stringify(this.cleanBlockJson_(a.oldJson));if(-1===this.contents_.indexOf(a)){for(this.contents_.unshift(a);this.contents_.length>this.workspace.options.maxTrashcanContents;)this.contents_.pop();this.setMinOpenness_(HAS_BLOCKS_LID_ANGLE$$module$build$src$core$trashcan)}}}cleanBlockJson_(a){function b(c){if(c){delete c.id;delete c.x;delete c.y;delete c.enabled; +if(c.icons&&c.icons.comment){var d=c.icons.comment;delete d.height;delete d.width;delete d.pinned}d=c.inputs;for(var e in d){var f=d[e];const g=f.block;f=f.shadow;g&&b(g);f&&b(f)}c.next&&(e=c.next,c=e.block,e=e.shadow,c&&b(c),e&&b(e))}}a=JSON.parse(JSON.stringify(a));b(a);return Object.assign({},{kind:"BLOCK"},a)}},WIDTH$$module$build$src$core$trashcan=47,BODY_HEIGHT$$module$build$src$core$trashcan=44,LID_HEIGHT$$module$build$src$core$trashcan=16,MARGIN_VERTICAL$$module$build$src$core$trashcan=20, +MARGIN_HORIZONTAL$$module$build$src$core$trashcan=20,MARGIN_HOTSPOT$$module$build$src$core$trashcan=10,SPRITE_LEFT$$module$build$src$core$trashcan=0,SPRITE_TOP$$module$build$src$core$trashcan=32,HAS_BLOCKS_LID_ANGLE$$module$build$src$core$trashcan=.1,ANIMATION_LENGTH$$module$build$src$core$trashcan=80,ANIMATION_FRAMES$$module$build$src$core$trashcan=4,OPACITY_MIN$$module$build$src$core$trashcan=.4,OPACITY_MAX$$module$build$src$core$trashcan=.8,MAX_LID_ANGLE$$module$build$src$core$trashcan=45,module$build$src$core$trashcan= +{};module$build$src$core$trashcan.Trashcan=Trashcan$$module$build$src$core$trashcan;var ToolboxItemSelect$$module$build$src$core$events$events_toolbox_item_select=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b,c){super(c);this.type=TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils;this.oldItem=null!=a?a:void 0;this.newItem=null!=b?b:void 0}toJson(){const a=super.toJson();a.oldItem=this.oldItem;a.newItem=this.newItem;return a}fromJson(a){super.fromJson(a);this.oldItem=a.oldItem;this.newItem=a.newItem}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils,ToolboxItemSelect$$module$build$src$core$events$events_toolbox_item_select);var module$build$src$core$events$events_toolbox_item_select={};module$build$src$core$events$events_toolbox_item_select.ToolboxItemSelect=ToolboxItemSelect$$module$build$src$core$events$events_toolbox_item_select;var ToolboxItem$$module$build$src$core$toolbox$toolbox_item=class{constructor(a,b,c){this.id_=a.toolboxitemid||getNextUniqueId$$module$build$src$core$utils$idgenerator();this.level_=(this.parent_=c||null)?this.parent_.getLevel()+1:0;this.toolboxItemDef_=a;this.parentToolbox_=b;this.workspace_=this.parentToolbox_.getWorkspace()}init(){}getDiv(){return null}getClickTarget(){return null}getId(){return this.id_}getParent(){return null}getLevel(){return this.level_}isSelectable(){return!1}isCollapsible(){return!1}dispose(){}setVisible_(a){}}, +module$build$src$core$toolbox$toolbox_item={};module$build$src$core$toolbox$toolbox_item.ToolboxItem=ToolboxItem$$module$build$src$core$toolbox$toolbox_item;var ToolboxCategory$$module$build$src$core$toolbox$category=class extends ToolboxItem$$module$build$src$core$toolbox$toolbox_item{constructor(a,b,c){super(a,b,c);this.colour_=this.name_="";this.labelDom_=this.iconDom_=this.rowContents_=this.rowDiv_=this.htmlDiv_=null;this.isDisabled_=this.isHidden_=!1;this.flyoutItems_=[];this.cssConfig_=this.makeDefaultCssConfig_()}init(){this.parseCategoryDef_(this.toolboxItemDef_);this.parseContents_(this.toolboxItemDef_);this.createDom_();"true"===this.toolboxItemDef_.hidden&& +this.hide()}makeDefaultCssConfig_(){return{container:"blocklyToolboxCategory",row:"blocklyTreeRow",rowcontentcontainer:"blocklyTreeRowContentContainer",icon:"blocklyTreeIcon",label:"blocklyTreeLabel",contents:"blocklyToolboxContents",selected:"blocklyTreeSelected",openicon:"blocklyTreeIconOpen",closedicon:"blocklyTreeIconClosed"}}parseContents_(a){if("custom"in a)this.flyoutItems_=a.custom;else if(a=a.contents)for(let b=0;b>>/sprites.png);\n height: 16px;\n vertical-align: middle;\n visibility: hidden;\n width: 16px;\n}\n\n.blocklyTreeIconClosed {\n background-position: -32px -1px;\n}\n\n.blocklyToolboxDiv[dir="RTL"] .blocklyTreeIconClosed {\n background-position: 0 -1px;\n}\n\n.blocklyTreeSelected>.blocklyTreeIconClosed {\n background-position: -32px -17px;\n}\n\n.blocklyToolboxDiv[dir="RTL"] .blocklyTreeSelected>.blocklyTreeIconClosed {\n background-position: 0 -17px;\n}\n\n.blocklyTreeIconOpen {\n background-position: -16px -1px;\n}\n\n.blocklyTreeSelected>.blocklyTreeIconOpen {\n background-position: -16px -17px;\n}\n\n.blocklyTreeLabel {\n cursor: default;\n font: 16px sans-serif;\n padding: 0 3px;\n vertical-align: middle;\n}\n\n.blocklyToolboxDelete .blocklyTreeLabel {\n cursor: url("<<>>/handdelete.cur"), auto;\n}\n\n.blocklyTreeSelected .blocklyTreeLabel {\n color: #fff;\n}\n'); +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.TOOLBOX_ITEM,ToolboxCategory$$module$build$src$core$toolbox$category.registrationName,ToolboxCategory$$module$build$src$core$toolbox$category);var module$build$src$core$toolbox$category={};module$build$src$core$toolbox$category.ToolboxCategory=ToolboxCategory$$module$build$src$core$toolbox$category;var ToolboxSeparator$$module$build$src$core$toolbox$separator=class extends ToolboxItem$$module$build$src$core$toolbox$toolbox_item{constructor(a,b){super(a,b);this.cssConfig_={container:"blocklyTreeSeparator"};this.htmlDiv_=null;Object.assign(this.cssConfig_,a.cssconfig||a.cssConfig)}init(){this.createDom_()}createDom_(){const a=document.createElement("div"),b=this.cssConfig_.container;b&&addClass$$module$build$src$core$utils$dom(a,b);return this.htmlDiv_=a}getDiv(){return this.htmlDiv_}dispose(){removeNode$$module$build$src$core$utils$dom(this.htmlDiv_)}}; +ToolboxSeparator$$module$build$src$core$toolbox$separator.registrationName="sep";register$$module$build$src$core$css('\n.blocklyTreeSeparator {\n border-bottom: solid #e5e5e5 1px;\n height: 0;\n margin: 5px 0;\n}\n\n.blocklyToolboxDiv[layout="h"] .blocklyTreeSeparator {\n border-right: solid #e5e5e5 1px;\n border-bottom: none;\n height: auto;\n margin: 0 5px 0 5px;\n padding: 5px 0;\n width: 0;\n}\n'); +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.TOOLBOX_ITEM,ToolboxSeparator$$module$build$src$core$toolbox$separator.registrationName,ToolboxSeparator$$module$build$src$core$toolbox$separator);var module$build$src$core$toolbox$separator={};module$build$src$core$toolbox$separator.ToolboxSeparator=ToolboxSeparator$$module$build$src$core$toolbox$separator;var CollapsibleToolboxCategory$$module$build$src$core$toolbox$collapsible_category=class extends ToolboxCategory$$module$build$src$core$toolbox$category{constructor(a,b,c){super(a,b,c);this.subcategoriesDiv_=null;this.expanded_=!1;this.toolboxItems_=[]}makeDefaultCssConfig_(){const a=super.makeDefaultCssConfig_();a.contents="blocklyToolboxContents";return a}parseContents_(a){const b=a.contents;let c=!0;if(a.custom)this.flyoutItems_=a.custom;else if(b)for(a=0;a>>/handdelete.cur"), auto;\n}\n\n.blocklyToolboxGrab {\n cursor: url("<<>>/handclosed.cur"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Category tree in Toolbox. */\n.blocklyToolboxDiv {\n background-color: #ddd;\n overflow-x: visible;\n overflow-y: auto;\n padding: 4px 0 4px 0;\n position: absolute;\n z-index: 70; /* so blocks go under toolbox when dragging */\n -webkit-tap-highlight-color: transparent; /* issue #1345 */\n}\n\n.blocklyToolboxContents {\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n}\n\n.blocklyToolboxContents:focus {\n outline: none;\n}\n'); +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.TOOLBOX,DEFAULT$$module$build$src$core$registry,Toolbox$$module$build$src$core$toolbox$toolbox);var module$build$src$core$toolbox$toolbox={};module$build$src$core$toolbox$toolbox.Toolbox=Toolbox$$module$build$src$core$toolbox$toolbox;var defaultBlockStyles$$module$build$src$core$theme$zelos={colour_blocks:{colourPrimary:"#CF63CF",colourSecondary:"#C94FC9",colourTertiary:"#BD42BD"},list_blocks:{colourPrimary:"#9966FF",colourSecondary:"#855CD6",colourTertiary:"#774DCB"},logic_blocks:{colourPrimary:"#4C97FF",colourSecondary:"#4280D7",colourTertiary:"#3373CC"},loop_blocks:{colourPrimary:"#0fBD8C",colourSecondary:"#0DA57A",colourTertiary:"#0B8E69"},math_blocks:{colourPrimary:"#59C059",colourSecondary:"#46B946",colourTertiary:"#389438"}, +procedure_blocks:{colourPrimary:"#FF6680",colourSecondary:"#FF4D6A",colourTertiary:"#FF3355"},text_blocks:{colourPrimary:"#FFBF00",colourSecondary:"#E6AC00",colourTertiary:"#CC9900"},variable_blocks:{colourPrimary:"#FF8C1A",colourSecondary:"#FF8000",colourTertiary:"#DB6E00"},variable_dynamic_blocks:{colourPrimary:"#FF8C1A",colourSecondary:"#FF8000",colourTertiary:"#DB6E00"},hat_blocks:{colourPrimary:"#4C97FF",colourSecondary:"#4280D7",colourTertiary:"#3373CC",hat:"cap"}},categoryStyles$$module$build$src$core$theme$zelos= +{colour_category:{colour:"#CF63CF"},list_category:{colour:"#9966FF"},logic_category:{colour:"#4C97FF"},loop_category:{colour:"#0fBD8C"},math_category:{colour:"#59C059"},procedure_category:{colour:"#FF6680"},text_category:{colour:"#FFBF00"},variable_category:{colour:"#FF8C1A"},variable_dynamic_category:{colour:"#FF8C1A"}},Zelos$$module$build$src$core$theme$zelos=new Theme$$module$build$src$core$theme("zelos",defaultBlockStyles$$module$build$src$core$theme$zelos,categoryStyles$$module$build$src$core$theme$zelos), +module$build$src$core$theme$zelos={};module$build$src$core$theme$zelos.Zelos=Zelos$$module$build$src$core$theme$zelos;var module$build$src$core$theme$themes={};module$build$src$core$theme$themes.Classic=Classic$$module$build$src$core$theme$classic;module$build$src$core$theme$themes.Zelos=Zelos$$module$build$src$core$theme$zelos;var Click$$module$build$src$core$events$events_click=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b,c){b=a?a.workspace.id:b;null===b&&(b=void 0);super(b);this.type=CLICK$$module$build$src$core$events$utils;this.blockId=a?a.id:void 0;this.targetType=c}toJson(){const a=super.toJson();if(!this.targetType)throw Error("The click target type is undefined. Either pass a block to the constructor, or call fromJson");a.targetType=this.targetType;a.blockId=this.blockId;return a}fromJson(a){super.fromJson(a); +this.targetType=a.targetType;this.blockId=a.blockId}},ClickTarget$$module$build$src$core$events$events_click;(function(a){a.BLOCK="block";a.WORKSPACE="workspace";a.ZOOM_CONTROLS="zoom_controls"})(ClickTarget$$module$build$src$core$events$events_click||(ClickTarget$$module$build$src$core$events$events_click={}));register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,CLICK$$module$build$src$core$events$utils,Click$$module$build$src$core$events$events_click); +var module$build$src$core$events$events_click={};module$build$src$core$events$events_click.Click=Click$$module$build$src$core$events$events_click;module$build$src$core$events$events_click.ClickTarget=ClickTarget$$module$build$src$core$events$events_click;var BubbleDragger$$module$build$src$core$bubble_dragger=class{constructor(a,b){this.bubble=a;this.workspace=b;this.dragTarget_=null;this.wouldDeleteBubble_=!1;this.startXY_=this.bubble.getRelativeToSurfaceXY();this.dragSurface_=b.getBlockDragSurface()}startBubbleDrag(){getGroup$$module$build$src$core$events$utils()||setGroup$$module$build$src$core$events$utils(!0);this.workspace.setResizesEnabled(!1);this.bubble.setAutoLayout(!1);this.dragSurface_&&(this.bubble.moveTo(0,0),this.dragSurface_.translateSurface(this.startXY_.x, +this.startXY_.y),this.dragSurface_.setBlocksAndShow(this.bubble.getSvgRoot()));this.bubble.setDragging&&this.bubble.setDragging(!0)}dragBubble(a,b){b=this.pixelsToWorkspaceUnits_(b);b=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startXY_,b);this.bubble.moveDuringDrag(this.dragSurface_,b);b=this.dragTarget_;this.dragTarget_=this.workspace.getDragTarget(a);a=this.wouldDeleteBubble_;this.wouldDeleteBubble_=this.shouldDelete_(this.dragTarget_);a!==this.wouldDeleteBubble_&&this.updateCursorDuringBubbleDrag_(); +this.dragTarget_!==b&&(b&&b.onDragExit(this.bubble),this.dragTarget_&&this.dragTarget_.onDragEnter(this.bubble));this.dragTarget_&&this.dragTarget_.onDragOver(this.bubble)}shouldDelete_(a){return a&&this.workspace.getComponentManager().hasCapability(a.id,ComponentManager$$module$build$src$core$component_manager.Capability.DELETE_AREA)?a.wouldDelete(this.bubble,!1):!1}updateCursorDuringBubbleDrag_(){this.bubble.setDeleteStyle(this.wouldDeleteBubble_)}endBubbleDrag(a,b){this.dragBubble(a,b);this.dragTarget_&& +this.dragTarget_.shouldPreventMove(this.bubble)?a=this.startXY_:(a=this.pixelsToWorkspaceUnits_(b),a=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startXY_,a));this.bubble.moveTo(a.x,a.y);if(this.dragTarget_)this.dragTarget_.onDrop(this.bubble);this.wouldDeleteBubble_?(this.fireMoveEvent_(),this.bubble.dispose()):(this.dragSurface_&&this.dragSurface_.clearAndHide(this.workspace.getBubbleCanvas()),this.bubble.setDragging&&this.bubble.setDragging(!1),this.fireMoveEvent_());this.workspace.setResizesEnabled(!0); +setGroup$$module$build$src$core$events$utils(!1)}fireMoveEvent_(){if(this.bubble instanceof WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg){const a=new (get$$module$build$src$core$events$utils(COMMENT_MOVE$$module$build$src$core$events$utils))(this.bubble);a.setOldCoordinate(this.startXY_);a.recordNew();fire$$module$build$src$core$events$utils(a)}}pixelsToWorkspaceUnits_(a){a=new Coordinate$$module$build$src$core$utils$coordinate(a.x/this.workspace.scale,a.y/this.workspace.scale); +this.workspace.isMutator&&a.scale(1/this.workspace.options.parentWorkspace.scale);return a}},module$build$src$core$bubble_dragger={};module$build$src$core$bubble_dragger.BubbleDragger=BubbleDragger$$module$build$src$core$bubble_dragger;var WorkspaceDragger$$module$build$src$core$workspace_dragger=class{constructor(a){this.workspace=a;this.horizontalScrollEnabled_=this.workspace.isMovableHorizontally();this.verticalScrollEnabled_=this.workspace.isMovableVertically();this.startScrollXY_=new Coordinate$$module$build$src$core$utils$coordinate(a.scrollX,a.scrollY)}dispose(){this.workspace=null}startDrag(){getSelected$$module$build$src$core$common()&&getSelected$$module$build$src$core$common().unselect();this.workspace.setupDragSurface()}endDrag(a){this.drag(a); +this.workspace.resetDragSurface()}drag(a){a=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startScrollXY_,a);if(this.horizontalScrollEnabled_&&this.verticalScrollEnabled_)this.workspace.scroll(a.x,a.y);else if(this.horizontalScrollEnabled_)this.workspace.scroll(a.x,this.workspace.scrollY);else if(this.verticalScrollEnabled_)this.workspace.scroll(this.workspace.scrollX,a.y);else throw new TypeError("Invalid state.");}},module$build$src$core$workspace_dragger={}; +module$build$src$core$workspace_dragger.WorkspaceDragger=WorkspaceDragger$$module$build$src$core$workspace_dragger;var Gesture$$module$build$src$core$gesture=class{constructor(a,b){this.creatorWorkspace=b;this.mouseDownXY_=new Coordinate$$module$build$src$core$utils$coordinate(0,0);this.startWorkspace_=this.targetBlock_=this.startBlock_=this.startField_=this.startBubble_=null;this.hasExceededDragRadius_=!1;this.flyout_=this.workspaceDragger_=this.blockDragger_=this.bubbleDragger_=this.onUpWrapper_=this.onMoveWrapper_=null;this.isEnding_=this.hasStarted_=this.calledUpdateIsDragging_=!1;this.mostRecentEvent_=a; +this.currentDragDeltaXY_=new Coordinate$$module$build$src$core$utils$coordinate(0,0);this.healStack_=!DRAG_STACK$$module$build$src$core$internal_constants}dispose(){clearTouchIdentifier$$module$build$src$core$touch();unblock$$module$build$src$core$tooltip();this.creatorWorkspace.clearGesture();this.onMoveWrapper_&&unbind$$module$build$src$core$browser_events(this.onMoveWrapper_);this.onUpWrapper_&&unbind$$module$build$src$core$browser_events(this.onUpWrapper_);this.blockDragger_&&this.blockDragger_.dispose(); +this.workspaceDragger_&&this.workspaceDragger_.dispose()}updateFromEvent_(a){const b=new Coordinate$$module$build$src$core$utils$coordinate(a.clientX,a.clientY);this.updateDragDelta_(b)&&(this.updateIsDragging_(),longStop$$module$build$src$core$touch());this.mostRecentEvent_=a}updateDragDelta_(a){this.currentDragDeltaXY_=Coordinate$$module$build$src$core$utils$coordinate.difference(a,this.mouseDownXY_);return this.hasExceededDragRadius_?!1:this.hasExceededDragRadius_=Coordinate$$module$build$src$core$utils$coordinate.magnitude(this.currentDragDeltaXY_)> +(this.flyout_?$.config$$module$build$src$core$config.flyoutDragRadius:$.config$$module$build$src$core$config.dragRadius)}updateIsDraggingFromFlyout_(){let a;if(!this.targetBlock_||null==(a=this.flyout_)||!a.isBlockCreatable(this.targetBlock_))return!1;if(!this.flyout_.targetWorkspace)throw Error("Cannot update dragging from the flyout because the ' +\n 'flyout's target workspace is undefined");return!this.flyout_.isScrollable()||this.flyout_.isDragTowardWorkspace(this.currentDragDeltaXY_)? +(this.startWorkspace_=this.flyout_.targetWorkspace,this.startWorkspace_.updateScreenCalculationsIfScrolled(),getGroup$$module$build$src$core$events$utils()||setGroup$$module$build$src$core$events$utils(!0),this.startBlock_=null,this.targetBlock_=this.flyout_.createBlock(this.targetBlock_),this.targetBlock_.select(),!0):!1}updateIsDraggingBubble_(){if(!this.startBubble_)return!1;this.startDraggingBubble_();return!0}updateIsDraggingBlock_(){if(!this.targetBlock_)return!1;if(this.flyout_){if(this.updateIsDraggingFromFlyout_())return this.startDraggingBlock_(), +!0}else if(this.targetBlock_.isMovable())return this.startDraggingBlock_(),!0;return!1}updateIsDraggingWorkspace_(){if(!this.startWorkspace_)throw Error("Cannot update dragging the workspace because the start workspace is undefined");if(this.flyout_?this.flyout_.isScrollable():this.startWorkspace_&&this.startWorkspace_.isDraggable())this.workspaceDragger_=new WorkspaceDragger$$module$build$src$core$workspace_dragger(this.startWorkspace_),this.workspaceDragger_.startDrag()}updateIsDragging_(){if(this.calledUpdateIsDragging_)throw Error("updateIsDragging_ should only be called once per gesture."); +this.calledUpdateIsDragging_=!0;this.updateIsDraggingBubble_()||this.updateIsDraggingBlock_()||this.updateIsDraggingWorkspace_()}startDraggingBlock_(){this.blockDragger_=new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.BLOCK_DRAGGER,this.creatorWorkspace.options,!0))(this.targetBlock_,this.startWorkspace_);this.blockDragger_.startDrag(this.currentDragDeltaXY_,this.healStack_);this.blockDragger_.drag(this.mostRecentEvent_,this.currentDragDeltaXY_)}startDraggingBubble_(){if(!this.startBubble_)throw Error("Cannot update dragging the bubble because the start bubble is undefined"); +if(!this.startWorkspace_)throw Error("Cannot update dragging the bubble because the start workspace is undefined");this.bubbleDragger_=new BubbleDragger$$module$build$src$core$bubble_dragger(this.startBubble_,this.startWorkspace_);this.bubbleDragger_.startBubbleDrag();this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_)}doStart(a){if(isTargetInput$$module$build$src$core$browser_events(a))this.cancel();else{if(!this.startWorkspace_)throw Error("Cannot start the gesture because the start workspace is undefined"); +this.hasStarted_=!0;disconnectUiStop$$module$build$src$core$block_animations();this.startWorkspace_.updateScreenCalculationsIfScrolled();this.startWorkspace_.isMutator&&this.startWorkspace_.resize();this.startWorkspace_.hideChaff(!!this.flyout_);this.startWorkspace_.markFocused();this.mostRecentEvent_=a;block$$module$build$src$core$tooltip();this.targetBlock_&&this.targetBlock_.select();isRightButton$$module$build$src$core$browser_events(a)?this.handleRightClick(a):("touchstart"!==a.type.toLowerCase()&& +"pointerdown"!==a.type.toLowerCase()||"mouse"===a.pointerType||longStart$$module$build$src$core$touch(a,this),this.mouseDownXY_=new Coordinate$$module$build$src$core$utils$coordinate(a.clientX,a.clientY),this.healStack_=a.altKey||a.ctrlKey||a.metaKey,this.bindMouseEvents(a))}}bindMouseEvents(a){this.onMoveWrapper_=conditionalBind$$module$build$src$core$browser_events(document,"mousemove",null,this.handleMove.bind(this));this.onUpWrapper_=conditionalBind$$module$build$src$core$browser_events(document, +"mouseup",null,this.handleUp.bind(this));a.preventDefault();a.stopPropagation()}handleMove(a){this.updateFromEvent_(a);this.workspaceDragger_?this.workspaceDragger_.drag(this.currentDragDeltaXY_):this.blockDragger_?this.blockDragger_.drag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.bubbleDragger_&&this.bubbleDragger_.dragBubble(this.mostRecentEvent_,this.currentDragDeltaXY_);a.preventDefault();a.stopPropagation()}handleUp(a){this.updateFromEvent_(a);longStop$$module$build$src$core$touch(); +this.isEnding_?console.log("Trying to end a gesture recursively."):(this.isEnding_=!0,this.bubbleDragger_?this.bubbleDragger_.endBubbleDrag(a,this.currentDragDeltaXY_):this.blockDragger_?this.blockDragger_.endDrag(a,this.currentDragDeltaXY_):this.workspaceDragger_?this.workspaceDragger_.endDrag(this.currentDragDeltaXY_):this.isBubbleClick_()?this.doBubbleClick_():this.isFieldClick_()?this.doFieldClick_():this.isBlockClick_()?this.doBlockClick_():this.isWorkspaceClick_()&&this.doWorkspaceClick_(a), +a.preventDefault(),a.stopPropagation(),this.dispose())}cancel(){this.isEnding_||(longStop$$module$build$src$core$touch(),this.bubbleDragger_?this.bubbleDragger_.endBubbleDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.blockDragger_?this.blockDragger_.endDrag(this.mostRecentEvent_,this.currentDragDeltaXY_):this.workspaceDragger_&&this.workspaceDragger_.endDrag(this.currentDragDeltaXY_),this.dispose())}handleRightClick(a){this.targetBlock_?(this.bringBlockToFront_(),this.targetBlock_.workspace.hideChaff(!!this.flyout_), +this.targetBlock_.showContextMenu(a)):this.startBubble_?this.startBubble_.showContextMenu(a):this.startWorkspace_&&!this.flyout_&&(this.startWorkspace_.hideChaff(),this.startWorkspace_.showContextMenu(a));a.preventDefault();a.stopPropagation();this.dispose()}handleWsStart(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleWsStart, but the gesture had already been started.");this.setStartWorkspace_(b);this.mostRecentEvent_=a;this.doStart(a)}fireWorkspaceClick_(a){fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CLICK$$module$build$src$core$events$utils))(null, +a.id,"workspace"))}handleFlyoutStart(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleFlyoutStart, but the gesture had already been started.");this.setStartFlyout_(b);this.handleWsStart(a,b.getWorkspace())}handleBlockStart(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBlockStart, but the gesture had already been started.");this.setStartBlock(b);this.mostRecentEvent_=a}handleBubbleStart(a,b){if(this.hasStarted_)throw Error("Tried to call gesture.handleBubbleStart, but the gesture had already been started."); +this.setStartBubble(b);this.mostRecentEvent_=a}doBubbleClick_(){this.startBubble_ instanceof WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg&&(this.startBubble_.setFocus(),this.startBubble_.select())}doFieldClick_(){if(!this.startField_)throw Error("Cannot do a field click because the start field is undefined");this.startField_.showEditor(this.mostRecentEvent_);this.bringBlockToFront_()}doBlockClick_(){if(this.flyout_&&this.flyout_.autoClose){if(!this.targetBlock_)throw Error("Cannot do a block click because the target block is undefined"); +this.targetBlock_.isEnabled()&&(getGroup$$module$build$src$core$events$utils()||setGroup$$module$build$src$core$events$utils(!0),this.flyout_.createBlock(this.targetBlock_).scheduleSnapAndBump())}else{if(!this.startWorkspace_)throw Error("Cannot do a block click because the start workspace is undefined");const a=new (get$$module$build$src$core$events$utils(CLICK$$module$build$src$core$events$utils))(this.startBlock_,this.startWorkspace_.id,"block");fire$$module$build$src$core$events$utils(a)}this.bringBlockToFront_(); +setGroup$$module$build$src$core$events$utils(!1)}doWorkspaceClick_(a){a=this.creatorWorkspace;getSelected$$module$build$src$core$common()&&getSelected$$module$build$src$core$common().unselect();this.fireWorkspaceClick_(this.startWorkspace_||a)}bringBlockToFront_(){this.targetBlock_&&!this.flyout_&&this.targetBlock_.bringToFront()}setStartField(a){if(this.hasStarted_)throw Error("Tried to call gesture.setStartField, but the gesture had already been started.");this.startField_||(this.startField_=a)}setStartBubble(a){this.startBubble_|| +(this.startBubble_=a)}setStartBlock(a){this.startBlock_||this.startBubble_||(this.startBlock_=a,a.isInFlyout&&a!==a.getRootBlock()?this.setTargetBlock_(a.getRootBlock()):this.setTargetBlock_(a))}setTargetBlock_(a){a.isShadow()?this.setTargetBlock_(a.getParent()):this.targetBlock_=a}setStartWorkspace_(a){this.startWorkspace_||(this.startWorkspace_=a)}setStartFlyout_(a){this.flyout_||(this.flyout_=a)}isBubbleClick_(){return!!this.startBubble_&&!this.hasExceededDragRadius_}isBlockClick_(){return!!this.startBlock_&& +!this.hasExceededDragRadius_&&!this.isFieldClick_()}isFieldClick_(){return(this.startField_?this.startField_.isClickable():!1)&&!this.hasExceededDragRadius_&&(!this.flyout_||!this.flyout_.autoClose)}isWorkspaceClick_(){return!this.startBlock_&&!this.startBubble_&&!this.startField_&&!this.hasExceededDragRadius_}isDragging(){return!!this.workspaceDragger_||!!this.blockDragger_||!!this.bubbleDragger_}hasStarted(){return this.hasStarted_}getInsertionMarkers(){return this.blockDragger_?this.blockDragger_.getInsertionMarkers(): +[]}getCurrentDragger(){let a,b;return null!=(b=null!=(a=this.blockDragger_)?a:this.workspaceDragger_)?b:this.bubbleDragger_}static inProgress(){const a=getAllWorkspaces$$module$build$src$core$common();for(let b=0,c;c=a[b];b++)if(c.currentGesture_)return!0;return!1}},module$build$src$core$gesture={};module$build$src$core$gesture.Gesture=Gesture$$module$build$src$core$gesture;var ShortcutRegistry$$module$build$src$core$shortcut_registry=class{constructor(){this.shortcuts=new Map;this.keyMap=new Map;this.reset()}reset(){this.shortcuts.clear();this.keyMap.clear()}register(a,b){if(this.shortcuts.get(a.name)&&!b)throw Error('Shortcut with name "'+a.name+'" already exists.');this.shortcuts.set(a.name,a);if((b=a.keyCodes)&&0=this.connections_.length)return-1;b=a.y;let d=c;for(;0<=d&&this.connections_[d].y===b;){if(this.connections_[d]===a)return d;d--}for(d=c;da)c=d;else{b=d;break}}return b}removeConnection(a,b){a=this.findIndexOfConnection_(a,b);if(-1===a)throw Error("Unable to find connection in connectionDB.");this.connections_.splice(a,1)}getNeighbours(a,b){function c(l){const m=e-d[l].x,n=f-d[l].y; +Math.sqrt(m*m+n*n)<=b&&k.push(d[l]);return nrect,`,`${a} .blocklyEditableText>rect {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"fill-opacity: .6;","stroke: none;","}",`${a} .blocklyNonEditableText>text,`,`${a} .blocklyEditableText>text {`,"fill: #000;","}",`${a} .blocklyFlyoutLabelText {`,"fill: #000;","}",`${a} .blocklyText.blocklyBubbleText {`,"fill: #000;","}",`${a} .blocklyEditableText:not(.editing):hover>rect {`,"stroke: #fff;","stroke-width: 2;","}",`${a} .blocklyHtmlInput {`, +`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"}",`${a} .blocklySelected>.blocklyPath {`,"stroke: #fc3;","stroke-width: 3px;","}",`${a} .blocklyHighlightedConnectionPath {`,"stroke: #fc3;","}",`${a} .blocklyReplaceable .blocklyPath {`,"fill-opacity: .5;","}",`${a} .blocklyReplaceable .blocklyPathLight,`,`${a} .blocklyReplaceable .blocklyPathDark {`,"display: none;","}",`${a} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`, +"stroke: none;","}"]}},module$build$src$core$renderers$common$constants={};module$build$src$core$renderers$common$constants.ConstantProvider=ConstantProvider$$module$build$src$core$renderers$common$constants;module$build$src$core$renderers$common$constants.isDynamicShape=isDynamicShape$$module$build$src$core$renderers$common$constants;var useDebugger$$module$build$src$core$renderers$common$debug=!1,module$build$src$core$renderers$common$debug={};module$build$src$core$renderers$common$debug.isDebuggerEnabled=isDebuggerEnabled$$module$build$src$core$renderers$common$debug;module$build$src$core$renderers$common$debug.startDebugger=startDebugger$$module$build$src$core$renderers$common$debug;module$build$src$core$renderers$common$debug.stopDebugger=stopDebugger$$module$build$src$core$renderers$common$debug;var Debug$$module$build$src$core$renderers$common$debugger=class{constructor(a){this.constants=a;this.debugElements_=[];this.svgRoot_=null;this.randomColour_=""}clearElems(){for(let a=0;aa.height;e&&(b-=d);this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT, +{"class":"rowSpacerRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:b,width:a.width,height:d,stroke:e?"black":"blue",fill:"blue","fill-opacity":"0.5","stroke-width":"1px"},this.svgRoot_))}}drawSpacerElem(a,b,c){if(Debug$$module$build$src$core$renderers$common$debugger.config.elemSpacers){b=Math.abs(a.width);var d=0>a.width,e=d?a.xPos-b:a.xPos;c&&(e=-(e+b));this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"elemSpacerRect blockRenderDebug", +x:e,y:a.centerline-a.height/2,width:b,height:a.height,stroke:"pink",fill:d?"black":"pink","fill-opacity":"0.5","stroke-width":"1px"},this.svgRoot_))}}drawRenderedElem(a,b){if(Debug$$module$build$src$core$renderers$common$debugger.config.elems){let c=a.xPos;b&&(c=-(c+a.width));b=a.centerline-a.height/2;this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"rowRenderingRect blockRenderDebug",x:c,y:b,width:a.width,height:a.height, +stroke:"black",fill:"none","stroke-width":"1px"},this.svgRoot_));Types$$module$build$src$core$renderers$measurables$types.isField(a)&&a instanceof Field$$module$build$src$core$renderers$measurables$field&&a.field instanceof $.FieldLabel$$module$build$src$core$field_label&&this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"rowRenderingRect blockRenderDebug",x:c,y:b+this.constants.FIELD_TEXT_BASELINE,width:a.width,height:"0.1px", +stroke:"red",fill:"none","stroke-width":"0.5px"},this.svgRoot_))}Types$$module$build$src$core$renderers$measurables$types.isInput(a)&&a instanceof InputConnection$$module$build$src$core$renderers$measurables$input_connection&&Debug$$module$build$src$core$renderers$common$debugger.config.connections&&this.drawConnection(a.connectionModel)}drawConnection(a){if(Debug$$module$build$src$core$renderers$common$debugger.config.connections){var b="",c=0,d="";a.type===ConnectionType$$module$build$src$core$connection_type.INPUT_VALUE? +(c=4,b="magenta",d="none"):a.type===ConnectionType$$module$build$src$core$connection_type.OUTPUT_VALUE?(c=2,d=b="magenta"):a.type===ConnectionType$$module$build$src$core$connection_type.NEXT_STATEMENT?(c=4,b="goldenrod",d="none"):a.type===ConnectionType$$module$build$src$core$connection_type.PREVIOUS_STATEMENT&&(c=2,d=b="goldenrod");this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CIRCLE,{"class":"blockRenderDebug",cx:a.getOffsetInBlock().x, +cy:a.getOffsetInBlock().y,r:c,fill:d,stroke:b},this.svgRoot_))}}drawRenderedRow(a,b,c){Debug$$module$build$src$core$renderers$common$debugger.config.rows&&(this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"elemRenderingRect blockRenderDebug",x:c?-(a.xPos+a.width):a.xPos,y:a.yPos,width:a.width,height:a.height,stroke:"red",fill:"none","stroke-width":"1px"},this.svgRoot_)),Types$$module$build$src$core$renderers$measurables$types.isTopOrBottomRow(a)|| +Debug$$module$build$src$core$renderers$common$debugger.config.connectedBlockBounds&&this.debugElements_.push(createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{"class":"connectedBlockWidth blockRenderDebug",x:c?-(a.xPos+a.widthWithConnectedBlocks):a.xPos,y:a.yPos,width:a.widthWithConnectedBlocks,height:a.height,stroke:this.randomColour_,fill:"none","stroke-width":"1px","stroke-dasharray":"3,3"},this.svgRoot_)))}drawRowWithElements(a,b,c){for(let d=0;db-$.config$$module$build$src$core$config.currentConnectionPreference)}if(this.localConnection_||this.closestConnection_)console.error("Only one of localConnection_ and closestConnection_ was set.");else return!0}else return!(!this.localConnection_||!this.closestConnection_);console.error("Returning true from shouldUpdatePreviews, but it's not clear why.");return!0}getCandidate_(a){let b= +this.getStartRadius_(),c=null,d=null;this.markerConnection_&&this.markerConnection_.isConnected()||this.updateAvailableConnections();for(let e=0;ethis.previousScale_){b=c-this.previousScale_;b=0this.cachedPoints.size&&(this.cachedPoints.clear(),this.previousScale_=0)}getTouchPoint(a){return this.startWorkspace_?new Coordinate$$module$build$src$core$utils$coordinate(a.changedTouches? +a.changedTouches[0].pageX:a.pageX,a.changedTouches?a.changedTouches[0].pageY:a.pageY):null}},module$build$src$core$touch_gesture={};module$build$src$core$touch_gesture.TouchGesture=TouchGesture$$module$build$src$core$touch_gesture;var CATEGORY_NAME$$module$build$src$core$variables_dynamic="VARIABLE_DYNAMIC",onCreateVariableButtonClick_String$$module$build$src$core$variables_dynamic=stringButtonClickHandler$$module$build$src$core$variables_dynamic,onCreateVariableButtonClick_Number$$module$build$src$core$variables_dynamic=numberButtonClickHandler$$module$build$src$core$variables_dynamic,onCreateVariableButtonClick_Colour$$module$build$src$core$variables_dynamic=colourButtonClickHandler$$module$build$src$core$variables_dynamic, +module$build$src$core$variables_dynamic={};module$build$src$core$variables_dynamic.CATEGORY_NAME=CATEGORY_NAME$$module$build$src$core$variables_dynamic;module$build$src$core$variables_dynamic.flyoutCategory=flyoutCategory$$module$build$src$core$variables_dynamic;module$build$src$core$variables_dynamic.flyoutCategoryBlocks=flyoutCategoryBlocks$$module$build$src$core$variables_dynamic;module$build$src$core$variables_dynamic.onCreateVariableButtonClick_Colour=colourButtonClickHandler$$module$build$src$core$variables_dynamic; +module$build$src$core$variables_dynamic.onCreateVariableButtonClick_Number=numberButtonClickHandler$$module$build$src$core$variables_dynamic;module$build$src$core$variables_dynamic.onCreateVariableButtonClick_String=stringButtonClickHandler$$module$build$src$core$variables_dynamic;var ConnectionChecker$$module$build$src$core$connection_checker=class{canConnect(a,b,c,d){return this.canConnectWithReason(a,b,c,d)===Connection$$module$build$src$core$connection.CAN_CONNECT}canConnectWithReason(a,b,c,d){const e=this.doSafetyChecks(a,b);return e!==Connection$$module$build$src$core$connection.CAN_CONNECT?e:this.doTypeChecks(a,b)?c&&!this.doDragChecks(a,b,d||0)?Connection$$module$build$src$core$connection.REASON_DRAG_CHECKS_FAILED:Connection$$module$build$src$core$connection.CAN_CONNECT: +Connection$$module$build$src$core$connection.REASON_CHECKS_FAILED}getErrorMessage(a,b,c){switch(a){case Connection$$module$build$src$core$connection.REASON_SELF_CONNECTION:return"Attempted to connect a block to itself.";case Connection$$module$build$src$core$connection.REASON_DIFFERENT_WORKSPACES:return"Blocks not on same workspace.";case Connection$$module$build$src$core$connection.REASON_WRONG_TYPE:return"Attempt to connect incompatible types.";case Connection$$module$build$src$core$connection.REASON_TARGET_NULL:return"Target connection is null."; +case Connection$$module$build$src$core$connection.REASON_CHECKS_FAILED:return"Connection checks failed. "+(b+" expected "+b.getCheck()+", found "+c.getCheck());case Connection$$module$build$src$core$connection.REASON_SHADOW_PARENT:return"Connecting non-shadow to shadow block.";case Connection$$module$build$src$core$connection.REASON_DRAG_CHECKS_FAILED:return"Drag checks failed.";case Connection$$module$build$src$core$connection.REASON_PREVIOUS_AND_OUTPUT:return"Block would have an output and a previous connection."; +default:return"Unknown connection failure: this should never happen!"}}doSafetyChecks(a,b){if(!a||!b)return Connection$$module$build$src$core$connection.REASON_TARGET_NULL;let c,d,e;a.isSuperior()?(c=a.getSourceBlock(),d=b.getSourceBlock(),e=b):(d=a.getSourceBlock(),c=b.getSourceBlock(),e=a,a=b);return c===d?Connection$$module$build$src$core$connection.REASON_SELF_CONNECTION:e.type!==OPPOSITE_TYPE$$module$build$src$core$internal_constants[a.type]?Connection$$module$build$src$core$connection.REASON_WRONG_TYPE: +c.workspace!==d.workspace?Connection$$module$build$src$core$connection.REASON_DIFFERENT_WORKSPACES:c.isShadow()&&!d.isShadow()?Connection$$module$build$src$core$connection.REASON_SHADOW_PARENT:e.type===ConnectionType$$module$build$src$core$connection_type.OUTPUT_VALUE&&d.previousConnection&&d.previousConnection.isConnected()||e.type===ConnectionType$$module$build$src$core$connection_type.PREVIOUS_STATEMENT&&d.outputConnection&&d.outputConnection.isConnected()?Connection$$module$build$src$core$connection.REASON_PREVIOUS_AND_OUTPUT: +Connection$$module$build$src$core$connection.CAN_CONNECT}doTypeChecks(a,b){a=a.getCheck();b=b.getCheck();if(!a||!b)return!0;for(let c=0;cc||b.getSourceBlock().isInsertionMarker())return!1;switch(b.type){case ConnectionType$$module$build$src$core$connection_type.PREVIOUS_STATEMENT:return this.canConnectToPrevious_(a,b);case ConnectionType$$module$build$src$core$connection_type.OUTPUT_VALUE:if(b.isConnected()&& +!b.targetBlock().isInsertionMarker()||a.isConnected())return!1;break;case ConnectionType$$module$build$src$core$connection_type.INPUT_VALUE:if(b.isConnected()&&!b.targetBlock().isMovable()&&!b.targetBlock().isShadow())return!1;break;case ConnectionType$$module$build$src$core$connection_type.NEXT_STATEMENT:if(b.isConnected()&&!a.getSourceBlock().nextConnection&&!b.targetBlock().isShadow()&&b.targetBlock().nextConnection)return!1;break;default:return!1}return-1!==draggingConnections$$module$build$src$core$common.indexOf(b)? +!1:!0}canConnectToPrevious_(a,b){if(a.targetConnection||-1!==draggingConnections$$module$build$src$core$common.indexOf(b))return!1;if(!b.targetConnection)return!0;a=b.targetBlock();return a.isInsertionMarker()?!a.getPreviousBlock():!1}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.CONNECTION_CHECKER,DEFAULT$$module$build$src$core$registry,ConnectionChecker$$module$build$src$core$connection_checker);var module$build$src$core$connection_checker={}; +module$build$src$core$connection_checker.ConnectionChecker=ConnectionChecker$$module$build$src$core$connection_checker;var VarDelete$$module$build$src$core$events$events_var_delete=class extends VarBase$$module$build$src$core$events$events_var_base{constructor(a){super(a);this.type=VAR_DELETE$$module$build$src$core$events$utils;a&&(this.varType=a.type,this.varName=a.name)}toJson(){const a=super.toJson();if(!this.varType)throw Error("The var type is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson"); +a.varType=this.varType;a.varName=this.varName;return a}fromJson(a){super.fromJson(a);this.varType=a.varType;this.varName=a.varName}run(a){const b=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.varName)throw Error("The var name is undefined. Either pass a variable to the constructor, or call fromJson");a?b.deleteVariableById(this.varId):b.createVariable(this.varName,this.varType,this.varId)}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,VAR_DELETE$$module$build$src$core$events$utils,VarDelete$$module$build$src$core$events$events_var_delete);var module$build$src$core$events$events_var_delete={};module$build$src$core$events$events_var_delete.VarDelete=VarDelete$$module$build$src$core$events$events_var_delete;var VarRename$$module$build$src$core$events$events_var_rename=class extends VarBase$$module$build$src$core$events$events_var_base{constructor(a,b){super(a);this.type=VAR_RENAME$$module$build$src$core$events$utils;a&&(this.oldName=a.name,this.newName="undefined"===typeof b?"":b)}toJson(){const a=super.toJson();if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson"); +a.oldName=this.oldName;a.newName=this.newName;return a}fromJson(a){super.fromJson(a);this.oldName=a.oldName;this.newName=a.newName}run(a){const b=this.getEventWorkspace_();if(!this.varId)throw Error("The var ID is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.oldName)throw Error("The old var name is undefined. Either pass a variable to the constructor, or call fromJson");if(!this.newName)throw Error("The new var name is undefined. Either pass a value to the constructor, or call fromJson"); +a?b.renameVariableById(this.varId,this.newName):b.renameVariableById(this.varId,this.oldName)}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,VAR_RENAME$$module$build$src$core$events$utils,VarRename$$module$build$src$core$events$events_var_rename);var module$build$src$core$events$events_var_rename={};module$build$src$core$events$events_var_rename.VarRename=VarRename$$module$build$src$core$events$events_var_rename;var VariableMap$$module$build$src$core$variable_map=class{constructor(a){this.workspace=a;this.variableMap=new Map}clear(){this.variableMap.clear()}renameVariable(a,b){const c=this.getVariable(b,a.type),d=this.workspace.getAllBlocks(!1);setGroup$$module$build$src$core$events$utils(!0);try{c&&c.getId()!==a.getId()?this.renameVariableWithConflict_(a,b,c,d):this.renameVariableAndUses_(a,b,d)}finally{setGroup$$module$build$src$core$events$utils(!1)}}renameVariableById(a,b){const c=this.getVariableById(a); +if(!c)throw Error("Tried to rename a variable that didn't exist. ID: "+a);this.renameVariable(c,b)}renameVariableAndUses_(a,b,c){fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(VAR_RENAME$$module$build$src$core$events$utils))(a,b));a.name=b;for(b=0;b{e&&b&&this.deleteVariableInternal(b,d)})):this.deleteVariableInternal(b, +d)}else console.warn("Can't delete non-existent variable: "+a)}deleteVariableInternal(a,b){const c=getGroup$$module$build$src$core$events$utils();c||setGroup$$module$build$src$core$events$utils(!0);try{for(let d=0;d +a.name)}getVariableUsesById(a){const b=[],c=this.workspace.getAllBlocks(!1);for(let d=0;dthis.remainingCapacityOfType(c))return!1;b+=a[c]}return b>this.remainingCapacity()?!1:!0}hasBlockLimits(){return Infinity!==this.options.maxBlocks||!!this.options.maxInstances}getUndoStack(){return this.undoStack_}getRedoStack(){return this.redoStack_}undo(a){var b= +a?this.redoStack_:this.undoStack_,c=a?this.undoStack_:this.redoStack_;const d=b.pop();if(d){for(var e=[d];b.length&&d.group&&d.group===b[b.length-1].group;)e.push(b.pop());for(b=0;bthis.MAX_UNDO&&0<=this.MAX_UNDO;)this.undoStack_.shift();for(let b=0;bimage, .blocklyZoom>svg>image {\n opacity: .4;\n}\n\n.blocklyZoom>image:hover, .blocklyZoom>svg>image:hover {\n opacity: .6;\n}\n\n.blocklyZoom>image:active, .blocklyZoom>svg>image:active {\n opacity: .8;\n}\n");var module$build$src$core$zoom_controls={};module$build$src$core$zoom_controls.ZoomControls=ZoomControls$$module$build$src$core$zoom_controls;var ZOOM_TO_FIT_MARGIN$$module$build$src$core$workspace_svg=20,WorkspaceSvg$$module$build$src$core$workspace_svg=class extends Workspace$$module$build$src$core$workspace{constructor(a,b,c){super(a);this.resizeHandlerWrapper_=null;this.resizesEnabled_=this.isVisible_=this.rendered=!0;this.startScrollY=this.startScrollX=this.scrollY=this.scrollX=0;this.dragDeltaXY_=null;this.oldScale_=this.scale=1;this.oldLeft_=this.oldTop_=0;this.workspaceDragSurface_=this.blockDragSurface_=this.currentGesture_=this.toolbox_= +this.flyout_=this.scrollbar=this.trashcan=null;this.isDragSurfaceActive_=!1;this.inverseScreenCTM_=this.targetWorkspace=this.configureContextMenu=this.lastRecordedPageScroll_=this.injectionDiv_=null;this.inverseScreenCTMDirty_=!0;this.highlightedBlocks_=[];this.toolboxCategoryCallbacks=new Map;this.flyoutButtonCallbacks=new Map;this.cachedParentSvg_=null;this.keyboardAccessibilityMode=!1;this.topBoundedElements_=[];this.dragTargetAreas_=[];this.zoomControls_=null;this.metricsManager_=new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.METRICS_MANAGER, +a,!0))(this);this.getMetrics=a.getMetrics||this.metricsManager_.getMetrics.bind(this.metricsManager_);this.setMetrics=a.setMetrics||WorkspaceSvg$$module$build$src$core$workspace_svg.setTopLevelWorkspaceMetrics_;this.componentManager_=new ComponentManager$$module$build$src$core$component_manager;this.connectionDBList=ConnectionDB$$module$build$src$core$connection_db.init(this.connectionChecker);b&&(this.blockDragSurface_=b);c&&(this.workspaceDragSurface_=c);this.useWorkspaceDragSurface_=!!this.workspaceDragSurface_; +this.audioManager_=new WorkspaceAudio$$module$build$src$core$workspace_audio(a.parentWorkspace);this.grid_=this.options.gridPattern?new Grid$$module$build$src$core$grid(this.options.gridPattern,a.gridOptions):null;this.markerManager_=new MarkerManager$$module$build$src$core$marker_manager(this);$.module$build$src$core$variables&&flyoutCategory$$module$build$src$core$variables&&this.registerToolboxCategoryCallback(CATEGORY_NAME$$module$build$src$core$variables,flyoutCategory$$module$build$src$core$variables); +module$build$src$core$variables_dynamic&&flyoutCategory$$module$build$src$core$variables_dynamic&&this.registerToolboxCategoryCallback(CATEGORY_NAME$$module$build$src$core$variables_dynamic,flyoutCategory$$module$build$src$core$variables_dynamic);$.module$build$src$core$procedures&&flyoutCategory$$module$build$src$core$procedures&&(this.registerToolboxCategoryCallback(CATEGORY_NAME$$module$build$src$core$procedures,flyoutCategory$$module$build$src$core$procedures),this.addChangeListener(mutatorOpenListener$$module$build$src$core$procedures)); +this.themeManager_=this.options.parentWorkspace?this.options.parentWorkspace.getThemeManager():new ThemeManager$$module$build$src$core$theme_manager(this,this.options.theme||Classic$$module$build$src$core$theme$classic);this.themeManager_.subscribeWorkspace(this);let d;this.renderer_=init$$module$build$src$core$renderers$common$block_rendering(this.options.renderer||"geras",this.getTheme(),null!=(d=this.options.rendererOverrides)?d:void 0);this.cachedParentSvgSize_=new Size$$module$build$src$core$utils$size(0, +0)}getMarkerManager(){return this.markerManager_}getMetricsManager(){return this.metricsManager_}setMetricsManager(a){this.metricsManager_=a;this.getMetrics=this.metricsManager_.getMetrics.bind(this.metricsManager_)}getComponentManager(){return this.componentManager_}setCursorSvg(a){this.markerManager_.setCursorSvg(a)}setMarkerSvg(a){this.markerManager_.setMarkerSvg(a)}getMarker(a){return this.markerManager_?this.markerManager_.getMarker(a):null}getCursor(){return this.markerManager_?this.markerManager_.getCursor(): +null}getRenderer(){return this.renderer_}getThemeManager(){return this.themeManager_}getTheme(){return this.themeManager_.getTheme()}setTheme(a){a||(a=Classic$$module$build$src$core$theme$classic);this.themeManager_.setTheme(a)}refreshTheme(){this.svgGroup_&&this.renderer_.refreshDom(this.svgGroup_,this.getTheme());this.updateBlockStyles_(this.getAllBlocks(!1).filter(function(b){return!!b.getStyleName()}));this.refreshToolboxSelection();this.toolbox_&&this.toolbox_.refreshTheme();this.isVisible()&& +this.setVisible(!0);const a=new (get$$module$build$src$core$events$utils(THEME_CHANGE$$module$build$src$core$events$utils))(this.getTheme().name,this.id);fire$$module$build$src$core$events$utils(a)}updateBlockStyles_(a){for(let b=0,c;c=a[b];b++){const d=c.getStyleName();if(d){const e=c;e.setStyle(d);e.mutator&&e.mutator.updateBlockStyle()}}}getInverseScreenCTM(){if(this.inverseScreenCTMDirty_){const a=this.getParentSvg().getScreenCTM();a&&(this.inverseScreenCTM_=a.inverse(),this.inverseScreenCTMDirty_= +!1)}return this.inverseScreenCTM_}updateInverseScreenCTM(){this.inverseScreenCTMDirty_=!0}isVisible(){return this.isVisible_}getSvgXY(a){let b=0,c=0,d=1;if(containsNode$$module$build$src$core$utils$dom(this.getCanvas(),a)||containsNode$$module$build$src$core$utils$dom(this.getBubbleCanvas(),a))d=this.scale;do{const e=getRelativeXY$$module$build$src$core$utils$svg_math(a);if(a===this.getCanvas()||a===this.getBubbleCanvas())d=1;b+=e.x*d;c+=e.y*d;a=a.parentNode}while(a&&a!==this.getParentSvg());return new Coordinate$$module$build$src$core$utils$coordinate(b, +c)}getCachedParentSvgSize(){const a=this.cachedParentSvgSize_;return new Size$$module$build$src$core$utils$size(a.width,a.height)}getOriginOffsetInPixels(){return getInjectionDivXY$$module$build$src$core$utils$svg_math(this.getCanvas())}getInjectionDiv(){if(!this.injectionDiv_){let a=this.svgGroup_;for(;a;){if(-1!==(" "+(a.getAttribute("class")||"")+" ").indexOf(" injectionDiv ")){this.injectionDiv_=a;break}a=a.parentNode}}return this.injectionDiv_}getBlockCanvas(){return this.svgBlockCanvas_}setResizeHandlerWrapper(a){this.resizeHandlerWrapper_= +a}createDom(a){this.svgGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyWorkspace"});a&&(this.svgBackground_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.RECT,{height:"100%",width:"100%","class":a},this.svgGroup_),"blocklyMainBackground"===a&&this.grid_?this.svgBackground_.style.fill="url(#"+this.grid_.getPatternId()+")":this.themeManager_.subscribe(this.svgBackground_,"workspaceBackgroundColour", +"fill"));this.svgBlockCanvas_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyBlockCanvas"},this.svgGroup_);this.svgBubbleCanvas_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyBubbleCanvas"},this.svgGroup_);this.isFlyout||(conditionalBind$$module$build$src$core$browser_events(this.svgGroup_,"mousedown",this,this.onMouseDown_,!1,!0),document.body.addEventListener("wheel",function(){}), +conditionalBind$$module$build$src$core$browser_events(this.svgGroup_,"wheel",this,this.onMouseWheel_));this.options.hasCategories&&(this.toolbox_=new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.TOOLBOX,this.options,!0))(this));this.grid_&&this.grid_.update(this.scale);this.recordDragTargets();(a=getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.CURSOR,this.options))&&this.markerManager_.setCursor(new a);this.renderer_.createDom(this.svgGroup_, +this.getTheme());return this.svgGroup_}dispose(){this.rendered=!1;this.currentGesture_&&this.currentGesture_.cancel();this.svgGroup_&&removeNode$$module$build$src$core$utils$dom(this.svgGroup_);this.toolbox_&&(this.toolbox_.dispose(),this.toolbox_=null);this.flyout_&&(this.flyout_.dispose(),this.flyout_=null);this.trashcan&&(this.trashcan.dispose(),this.trashcan=null);this.scrollbar&&(this.scrollbar.dispose(),this.scrollbar=null);this.zoomControls_&&this.zoomControls_.dispose();this.audioManager_&& +this.audioManager_.dispose();this.grid_&&(this.grid_=null);this.renderer_.dispose();this.markerManager_&&this.markerManager_.dispose();super.dispose();this.themeManager_&&(this.themeManager_.unsubscribeWorkspace(this),this.themeManager_.unsubscribe(this.svgBackground_),this.options.parentWorkspace||this.themeManager_.dispose());this.connectionDBList.length=0;this.toolboxCategoryCallbacks.clear();this.flyoutButtonCallbacks.clear();if(!this.options.parentWorkspace){const a=this.getParentSvg();a&&a.parentNode&& +removeNode$$module$build$src$core$utils$dom(a.parentNode)}this.resizeHandlerWrapper_&&(unbind$$module$build$src$core$browser_events(this.resizeHandlerWrapper_),this.resizeHandlerWrapper_=null)}addTrashcan(){this.trashcan=WorkspaceSvg$$module$build$src$core$workspace_svg.newTrashcan(this);const a=this.trashcan.createDom();this.svgGroup_.insertBefore(a,this.svgBlockCanvas_)}static newTrashcan(a){throw Error("The implementation of newTrashcan should be monkey-patched in by blockly.ts");}addZoomControls(){this.zoomControls_= +new ZoomControls$$module$build$src$core$zoom_controls(this);const a=this.zoomControls_.createDom();this.svgGroup_.appendChild(a)}addFlyout(a){const b=new Options$$module$build$src$core$options({parentWorkspace:this,rtl:this.RTL,oneBasedIndex:this.options.oneBasedIndex,horizontalLayout:this.horizontalLayout,renderer:this.options.renderer,rendererOverrides:this.options.rendererOverrides,move:{scrollbars:!0}});b.toolboxPosition=this.options.toolboxPosition;this.flyout_=this.horizontalLayout?new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_HORIZONTAL_TOOLBOX, +this.options,!0))(b):new (getClassFromOptions$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_VERTICAL_TOOLBOX,this.options,!0))(b);this.flyout_.autoClose=!1;this.flyout_.getWorkspace().setVisible(!0);return this.flyout_.createDom(a)}getFlyout(a){return this.flyout_||a?this.flyout_:this.toolbox_?this.toolbox_.getFlyout():null}getToolbox(){return this.toolbox_}updateScreenCalculations_(){this.updateInverseScreenCTM();this.recordDragTargets()}resizeContents(){this.resizesEnabled_&& +this.rendered&&(this.scrollbar&&this.scrollbar.resize(),this.updateInverseScreenCTM())}resize(){this.toolbox_&&this.toolbox_.position();this.flyout_&&this.flyout_.position();const a=this.componentManager_.getComponents(ComponentManager$$module$build$src$core$component_manager.Capability.POSITIONABLE,!0),b=this.getMetricsManager().getUiMetrics(),c=[];for(let d=0,e;e=a[d];d++){e.position(b,c);const f=e.getBoundingRectangle();f&&c.push(f)}this.scrollbar&&this.scrollbar.resize();this.updateScreenCalculations_()}updateScreenCalculationsIfScrolled(){const a= +getDocumentScroll$$module$build$src$core$utils$svg_math();Coordinate$$module$build$src$core$utils$coordinate.equals(this.lastRecordedPageScroll_,a)||(this.lastRecordedPageScroll_=a,this.updateScreenCalculations_())}getCanvas(){return this.svgBlockCanvas_}setCachedParentSvgSize(a,b){const c=this.getParentSvg();null!=a&&(this.cachedParentSvgSize_.width=a,c.setAttribute("data-cached-width",a.toString()));null!=b&&(this.cachedParentSvgSize_.height=b,c.setAttribute("data-cached-height",b.toString()))}getBubbleCanvas(){return this.svgBubbleCanvas_}getParentSvg(){if(!this.cachedParentSvg_){let a= +this.svgGroup_;for(;a;){if("svg"===a.tagName){this.cachedParentSvg_=a;break}a=a.parentNode}}return this.cachedParentSvg_}maybeFireViewportChangeEvent(){if(isEnabled$$module$build$src$core$events$utils()){var a=this.scale,b=-this.scrollY,c=-this.scrollX;if(!(a===this.oldScale_&&1>Math.abs(b-this.oldTop_)&&1>Math.abs(c-this.oldLeft_))){var d=new (get$$module$build$src$core$events$utils(VIEWPORT_CHANGE$$module$build$src$core$events$utils))(b,c,a,this.id,this.oldScale_);this.oldScale_=a;this.oldTop_= +b;this.oldLeft_=c;fire$$module$build$src$core$events$utils(d)}}}translate(a,b){if(this.useWorkspaceDragSurface_&&this.isDragSurfaceActive_){var c;null==(c=this.workspaceDragSurface_)||c.translateSurface(a,b)}else c="translate("+a+","+b+") scale("+this.scale+")",this.svgBlockCanvas_.setAttribute("transform",c),this.svgBubbleCanvas_.setAttribute("transform",c);this.blockDragSurface_&&this.blockDragSurface_.translateAndScaleGroup(a,b,this.scale);this.grid_&&this.grid_.moveTo(a,b);this.maybeFireViewportChangeEvent()}resetDragSurface(){if(this.useWorkspaceDragSurface_){this.isDragSurfaceActive_= +!1;var a=this.workspaceDragSurface_.getSurfaceTranslation();this.workspaceDragSurface_.clearAndHide(this.svgGroup_);a="translate("+a.x+","+a.y+") scale("+this.scale+")";this.svgBlockCanvas_.setAttribute("transform",a);this.svgBubbleCanvas_.setAttribute("transform",a)}}setupDragSurface(){if(this.useWorkspaceDragSurface_&&!this.isDragSurfaceActive_){this.isDragSurfaceActive_=!0;var a=this.svgBlockCanvas_.previousSibling,b,c=parseInt(null!=(b=this.getParentSvg().getAttribute("width"))?b:"0"),d;b=parseInt(null!= +(d=this.getParentSvg().getAttribute("height"))?d:"0");d=getRelativeXY$$module$build$src$core$utils$svg_math(this.getCanvas());this.workspaceDragSurface_.setContentsAndShow(this.getCanvas(),this.getBubbleCanvas(),a,c,b,this.scale);this.workspaceDragSurface_.translateSurface(d.x,d.y)}}getBlockDragSurface(){return this.blockDragSurface_}getWidth(){const a=this.getMetrics();return a?a.viewWidth/this.scale:0}setVisible(a){this.isVisible_=a;if(this.svgGroup_)if(this.scrollbar&&this.scrollbar.setContainerVisible(a), +this.getFlyout()&&this.getFlyout().setContainerVisible(a),this.getParentSvg().style.display=a?"block":"none",this.toolbox_&&this.toolbox_.setVisible(a),a){a=this.getAllBlocks(!1);for(let b=a.length-1;0<=b;b--)a[b].markDirty();this.render();this.toolbox_&&this.toolbox_.position()}else this.hideChaff(!0)}render(){var a=this.getAllBlocks(!1);for(var b=a.length-1;0<=b;b--)a[b].render(!1);if(this.currentGesture_)for(a=this.currentGesture_.getInsertionMarkers(),b=0;b=Math.abs(d-l.x)&&1>=Math.abs(e-l.y)){f=!0;break}}if(!f){const h=c.getConnections_(!1);for(let k=0,l;l=h[k];k++)if(l.closest($.config$$module$build$src$core$config.snapRadius,new Coordinate$$module$build$src$core$utils$coordinate(d,e)).connection){f=!0; +break}}f&&(d=this.RTL?d-$.config$$module$build$src$core$config.snapRadius:d+$.config$$module$build$src$core$config.snapRadius,e+=2*$.config$$module$build$src$core$config.snapRadius)}while(f);c.moveTo(new Coordinate$$module$build$src$core$utils$coordinate(d,e))}}finally{enable$$module$build$src$core$events$utils()}isEnabled$$module$build$src$core$events$utils()&&!c.isShadow()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CREATE$$module$build$src$core$events$utils))(c)); +c.select();return c}pasteWorkspaceComment_(a){disable$$module$build$src$core$events$utils();let b;try{b=WorkspaceCommentSvg$$module$build$src$core$workspace_comment_svg.fromXmlRendered(a,this);let c,d=parseInt(null!=(c=a.getAttribute("x"))?c:"0"),e,f=parseInt(null!=(e=a.getAttribute("y"))?e:"0");isNaN(d)||isNaN(f)||(this.RTL&&(d=-d),b.moveBy(d+50,f+50))}finally{enable$$module$build$src$core$events$utils()}isEnabled$$module$build$src$core$events$utils()&&WorkspaceComment$$module$build$src$core$workspace_comment.fireCreateEvent(b); +b.select();return b}refreshToolboxSelection(){const a=this.isFlyout?this.targetWorkspace:this;a&&!a.currentGesture_&&a.toolbox_&&a.toolbox_.getFlyout()&&a.toolbox_.refreshSelection()}renameVariableById(a,b){super.renameVariableById(a,b);this.refreshToolboxSelection()}deleteVariableById(a){super.deleteVariableById(a);this.refreshToolboxSelection()}createVariable(a,b,c){a=super.createVariable(a,b,c);this.refreshToolboxSelection();return a}recordDragTargets(){const a=this.componentManager_.getComponents(ComponentManager$$module$build$src$core$component_manager.Capability.DRAG_TARGET, +!0);this.dragTargetAreas_=[];for(let b=0,c;c=a[b];b++){const d=c.getClientRect();d&&this.dragTargetAreas_.push({component:c,clientRect:d})}}newBlock(a,b){throw Error("The implementation of newBlock should be monkey-patched in by blockly.ts");}getDragTarget(a){for(let b=0,c;c=this.dragTargetAreas_[b];b++)if(c.clientRect.contains(a.clientX,a.clientY))return c.component;return null}onMouseDown_(a){const b=this.getGesture(a);b&&b.handleWsStart(a,this)}startDrag(a,b){a=mouseToSvg$$module$build$src$core$browser_events(a, +this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;this.dragDeltaXY_=Coordinate$$module$build$src$core$utils$coordinate.difference(b,a)}moveDrag(a){a=mouseToSvg$$module$build$src$core$browser_events(a,this.getParentSvg(),this.getInverseScreenCTM());a.x/=this.scale;a.y/=this.scale;return Coordinate$$module$build$src$core$utils$coordinate.sum(this.dragDeltaXY_,a)}isDragging(){return null!==this.currentGesture_&&this.currentGesture_.isDragging()}isDraggable(){return this.options.moveOptions&& +this.options.moveOptions.drag}isMovable(){return this.options.moveOptions&&!!this.options.moveOptions.scrollbars||this.options.moveOptions&&this.options.moveOptions.wheel||this.options.moveOptions&&this.options.moveOptions.drag||this.options.zoomOptions&&this.options.zoomOptions.wheel||this.options.zoomOptions&&this.options.zoomOptions.pinch}isMovableHorizontally(){const a=!!this.scrollbar;return this.isMovable()&&(!a||a&&this.scrollbar.canScrollHorizontally())}isMovableVertically(){const a=!!this.scrollbar; +return this.isMovable()&&(!a||a&&this.scrollbar.canScrollVertically())}onMouseWheel_(a){if(Gesture$$module$build$src$core$gesture.inProgress())a.preventDefault(),a.stopPropagation();else{var b=this.options.zoomOptions&&this.options.zoomOptions.wheel,c=this.options.moveOptions&&this.options.moveOptions.wheel;if(b||c){var d=getScrollDeltaPixels$$module$build$src$core$browser_events(a);if(MAC$$module$build$src$core$utils$useragent)var e=a.metaKey;b&&(a.ctrlKey||e||!c)?(d=-d.y/50,b=mouseToSvg$$module$build$src$core$browser_events(a, +this.getParentSvg(),this.getInverseScreenCTM()),this.zoom(b.x,b.y,d)):(b=this.scrollX-d.x,c=this.scrollY-d.y,a.shiftKey&&!d.x&&(b=this.scrollX-d.y,c=this.scrollY),this.scroll(b,c));a.preventDefault()}}}getBlocksBoundingBox(){const a=this.getTopBoundedElements();if(!a.length)return new Rect$$module$build$src$core$utils$rect(0,0,0,0);const b=a[0].getBoundingRectangle();for(let d=1;db.bottom&&(b.bottom=c.bottom),c.leftb.right&&(b.right=c.right))}return b}cleanUp(){this.setResizesEnabled(!1);setGroup$$module$build$src$core$events$utils(!0);const a=this.getTopBlocks(!0);let b=0;for(let c=0,d;d=a[c];c++){if(!d.isMovable())continue;const e=d.getRelativeToSurfaceXY();d.moveBy(-e.x,b-e.y);d.snapToGrid();b=d.getRelativeToSurfaceXY().y+d.getHeightWidth().height+this.renderer_.getConstants().MIN_BLOCK_HEIGHT}setGroup$$module$build$src$core$events$utils(!1); +this.setResizesEnabled(!0)}showContextMenu(a){if(!this.options.readOnly&&!this.isFlyout){var b=ContextMenuRegistry$$module$build$src$core$contextmenu_registry.registry.getContextMenuOptions(ContextMenuRegistry$$module$build$src$core$contextmenu_registry.ScopeType.WORKSPACE,{workspace:this});this.configureContextMenu&&this.configureContextMenu(b,a);show$$module$build$src$core$contextmenu(a,b,this.RTL)}}updateToolbox(a){if(a=convertToolboxDefToJson$$module$build$src$core$utils$toolbox(a)){if(!this.options.languageTree)throw Error("Existing toolbox is null. Can't create new toolbox."); +if(hasCategories$$module$build$src$core$utils$toolbox(a)){if(!this.toolbox_)throw Error("Existing toolbox has no categories. Can't change mode.");this.options.languageTree=a;this.toolbox_.render(a)}else{if(!this.flyout_)throw Error("Existing toolbox has categories. Can't change mode.");this.options.languageTree=a;this.flyout_.show(a)}}else if(this.options.languageTree)throw Error("Can't nullify an existing toolbox.");}markFocused(){this.options.parentWorkspace?this.options.parentWorkspace.markFocused(): +(setMainWorkspace$$module$build$src$core$common(this),this.setBrowserFocus())}setBrowserFocus(){document.activeElement&&document.activeElement instanceof HTMLElement&&document.activeElement.blur();try{this.getParentSvg().focus({preventScroll:!0})}catch(a){try{this.getParentSvg().parentElement.setActive()}catch(b){this.getParentSvg().parentElement.focus({preventScroll:!0})}}}zoom(a,b,c){c=Math.pow(this.options.zoomOptions.scaleSpeed,c);const d=this.scale*c;if(this.scale!==d){d>this.options.zoomOptions.maxScale? +c=this.options.zoomOptions.maxScale/this.scale:dthis.options.zoomOptions.maxScale?a=this.options.zoomOptions.maxScale:this.options.zoomOptions.minScale&&ac.autoHide(b))}static setTopLevelWorkspaceMetrics_(a){const b= +this.getMetrics();"number"===typeof a.x&&(this.scrollX=-(b.scrollLeft+(b.scrollWidth-b.viewWidth)*a.x));"number"===typeof a.y&&(this.scrollY=-(b.scrollTop+(b.scrollHeight-b.viewHeight)*a.y));this.translate(this.scrollX+b.absoluteLeft,this.scrollY+b.absoluteTop)}},module$build$src$core$workspace_svg={};module$build$src$core$workspace_svg.WorkspaceSvg=WorkspaceSvg$$module$build$src$core$workspace_svg;module$build$src$core$workspace_svg.resizeSvgContents=resizeSvgContents$$module$build$src$core$workspace_svg;var module$build$src$core$serialization$workspaces={};module$build$src$core$serialization$workspaces.load=load$$module$build$src$core$serialization$workspaces;module$build$src$core$serialization$workspaces.save=save$$module$build$src$core$serialization$workspaces;var VariableSerializer$$module$build$src$core$serialization$variables=class{constructor(){this.priority=VARIABLES$$module$build$src$core$serialization$priorities}save(a){const b=[];for(const c of a.getAllVariables())a={name:c.name,id:c.getId()},c.type&&(a.type=c.type),b.push(a);return b.length?b:null}load(a,b){for(const c of a)b.createVariable(c.name,c.type,c.id)}clear(a){a.getVariableMap().clear()}};register$$module$build$src$core$serialization$registry("variables",new VariableSerializer$$module$build$src$core$serialization$variables); +var module$build$src$core$serialization$variables={};var ConstantProvider$$module$build$src$core$renderers$zelos$constants=class extends ConstantProvider$$module$build$src$core$renderers$common$constants{constructor(){super();this.GRID_UNIT=4;this.CURSOR_COLOUR="#ffa200";this.CURSOR_RADIUS=5;this.JAGGED_TEETH_WIDTH=this.JAGGED_TEETH_HEIGHT=0;this.START_HAT_HEIGHT=22;this.START_HAT_WIDTH=96;this.SHAPES={HEXAGONAL:1,ROUND:2,SQUARE:3,PUZZLE:4,NOTCH:5};this.SHAPE_IN_SHAPE_PADDING={1:{0:5*this.GRID_UNIT,1:2*this.GRID_UNIT,2:5*this.GRID_UNIT,3:5*this.GRID_UNIT}, +2:{0:3*this.GRID_UNIT,1:3*this.GRID_UNIT,2:1*this.GRID_UNIT,3:2*this.GRID_UNIT},3:{0:2*this.GRID_UNIT,1:2*this.GRID_UNIT,2:2*this.GRID_UNIT,3:2*this.GRID_UNIT}};this.FULL_BLOCK_FIELDS=!0;this.FIELD_TEXT_FONTWEIGHT="bold";this.FIELD_TEXT_FONTFAMILY='"Helvetica Neue", "Segoe UI", Helvetica, sans-serif';this.FIELD_COLOUR_FULL_BLOCK=this.FIELD_TEXTINPUT_BOX_SHADOW=this.FIELD_DROPDOWN_SVG_ARROW=this.FIELD_DROPDOWN_COLOURED_DIV=this.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW=!0;this.SELECTED_GLOW_COLOUR="#fff200"; +this.SELECTED_GLOW_SIZE=.5;this.REPLACEMENT_GLOW_COLOUR="#fff200";this.REPLACEMENT_GLOW_SIZE=2;this.selectedGlowFilterId="";this.selectedGlowFilter_=null;this.replacementGlowFilterId="";this.SQUARED=this.ROUNDED=this.HEXAGONAL=this.replacementGlowFilter_=null;this.SMALL_PADDING=this.GRID_UNIT;this.MEDIUM_PADDING=2*this.GRID_UNIT;this.MEDIUM_LARGE_PADDING=3*this.GRID_UNIT;this.LARGE_PADDING=4*this.GRID_UNIT;this.CORNER_RADIUS=1*this.GRID_UNIT;this.NOTCH_WIDTH=9*this.GRID_UNIT;this.NOTCH_HEIGHT=2*this.GRID_UNIT; +this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT=3*this.GRID_UNIT;this.MIN_BLOCK_WIDTH=2*this.GRID_UNIT;this.MIN_BLOCK_HEIGHT=12*this.GRID_UNIT;this.EMPTY_STATEMENT_INPUT_HEIGHT=6*this.GRID_UNIT;this.TOP_ROW_MIN_HEIGHT=this.CORNER_RADIUS;this.TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT=this.LARGE_PADDING;this.BOTTOM_ROW_MIN_HEIGHT=this.CORNER_RADIUS;this.BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT=6*this.GRID_UNIT;this.STATEMENT_BOTTOM_SPACER=-this.NOTCH_HEIGHT;this.STATEMENT_INPUT_SPACER_MIN_WIDTH=40* +this.GRID_UNIT;this.STATEMENT_INPUT_PADDING_LEFT=4*this.GRID_UNIT;this.EMPTY_INLINE_INPUT_PADDING=4*this.GRID_UNIT;this.EMPTY_INLINE_INPUT_HEIGHT=8*this.GRID_UNIT;this.DUMMY_INPUT_MIN_HEIGHT=8*this.GRID_UNIT;this.DUMMY_INPUT_SHADOW_MIN_HEIGHT=6*this.GRID_UNIT;this.CURSOR_WS_WIDTH=20*this.GRID_UNIT;this.FIELD_TEXT_FONTSIZE=3*this.GRID_UNIT;this.FIELD_BORDER_RECT_RADIUS=this.CORNER_RADIUS;this.FIELD_BORDER_RECT_X_PADDING=2*this.GRID_UNIT;this.FIELD_BORDER_RECT_Y_PADDING=1.625*this.GRID_UNIT;this.FIELD_BORDER_RECT_HEIGHT= +8*this.GRID_UNIT;this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=8*this.GRID_UNIT;this.FIELD_DROPDOWN_SVG_ARROW_PADDING=this.FIELD_BORDER_RECT_X_PADDING;this.FIELD_COLOUR_DEFAULT_WIDTH=2*this.GRID_UNIT;this.FIELD_COLOUR_DEFAULT_HEIGHT=4*this.GRID_UNIT;this.FIELD_CHECKBOX_X_OFFSET=1*this.GRID_UNIT;this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH=12*this.GRID_UNIT}setFontConstants_(a){super.setFontConstants_(a);this.FIELD_DROPDOWN_BORDER_RECT_HEIGHT=this.FIELD_BORDER_RECT_HEIGHT=this.FIELD_TEXT_HEIGHT+2*this.FIELD_BORDER_RECT_Y_PADDING}init(){super.init(); +this.HEXAGONAL=this.makeHexagonal();this.ROUNDED=this.makeRounded();this.SQUARED=this.makeSquared();this.STATEMENT_INPUT_NOTCH_OFFSET=this.NOTCH_OFFSET_LEFT+this.INSIDE_CORNERS.rightWidth}setDynamicProperties_(a){super.setDynamicProperties_(a);this.SELECTED_GLOW_COLOUR=a.getComponentStyle("selectedGlowColour")||this.SELECTED_GLOW_COLOUR;const b=Number(a.getComponentStyle("selectedGlowSize"));this.SELECTED_GLOW_SIZE=b&&!isNaN(b)?b:this.SELECTED_GLOW_SIZE;this.REPLACEMENT_GLOW_COLOUR=a.getComponentStyle("replacementGlowColour")|| +this.REPLACEMENT_GLOW_COLOUR;this.REPLACEMENT_GLOW_SIZE=(a=Number(a.getComponentStyle("replacementGlowSize")))&&!isNaN(a)?a:this.REPLACEMENT_GLOW_SIZE}dispose(){super.dispose();this.selectedGlowFilter_&&removeNode$$module$build$src$core$utils$dom(this.selectedGlowFilter_);this.replacementGlowFilter_&&removeNode$$module$build$src$core$utils$dom(this.replacementGlowFilter_)}makeStartHat(){const a=this.START_HAT_HEIGHT,b=this.START_HAT_WIDTH,c=curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(25, +-a),point$$module$build$src$core$utils$svg_paths(71,-a),point$$module$build$src$core$utils$svg_paths(b,0)]);return{height:a,width:b,path:c}}makeHexagonal(){function a(c,d,e){var f=c/2;f=f>b?b:f;e=e?-1:1;c=(d?-1:1)*c/2;return lineTo$$module$build$src$core$utils$svg_paths(-e*f,c)+lineTo$$module$build$src$core$utils$svg_paths(e*f,c)}const b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH;return{type:this.SHAPES.HEXAGONAL,isDynamic:!0,width(c){c/=2;return c>b?b:c},height(c){return c},connectionOffsetY(c){return c/ +2},connectionOffsetX(c){return-c},pathDown(c){return a(c,!1,!1)},pathUp(c){return a(c,!0,!1)},pathRightDown(c){return a(c,!1,!0)},pathRightUp(c){return a(c,!1,!0)}}}makeRounded(){function a(d,e,f){const g=d>c?d-c:0;d=(d>c?c:d)/2;return arc$$module$build$src$core$utils$svg_paths("a","0 0,1",d,point$$module$build$src$core$utils$svg_paths((e?-1:1)*d,(e?-1:1)*d))+lineOnAxis$$module$build$src$core$utils$svg_paths("v",(f?1:-1)*g)+arc$$module$build$src$core$utils$svg_paths("a","0 0,1",d,point$$module$build$src$core$utils$svg_paths((e? +1:-1)*d,(e?-1:1)*d))}const b=this.MAX_DYNAMIC_CONNECTION_SHAPE_WIDTH,c=2*b;return{type:this.SHAPES.ROUND,isDynamic:!0,width(d){d/=2;return d>b?b:d},height(d){return d},connectionOffsetY(d){return d/2},connectionOffsetX(d){return-d},pathDown(d){return a(d,!1,!1)},pathUp(d){return a(d,!0,!1)},pathRightDown(d){return a(d,!1,!0)},pathRightUp(d){return a(d,!1,!0)}}}makeSquared(){function a(c,d,e){c-=2*b;return arc$$module$build$src$core$utils$svg_paths("a","0 0,1",b,point$$module$build$src$core$utils$svg_paths((d? +-1:1)*b,(d?-1:1)*b))+lineOnAxis$$module$build$src$core$utils$svg_paths("v",(e?1:-1)*c)+arc$$module$build$src$core$utils$svg_paths("a","0 0,1",b,point$$module$build$src$core$utils$svg_paths((d?1:-1)*b,(d?-1:1)*b))}const b=this.CORNER_RADIUS;return{type:this.SHAPES.SQUARE,isDynamic:!0,width(c){return b},height(c){return c},connectionOffsetY(c){return c/2},connectionOffsetX(c){return-c},pathDown(c){return a(c,!1,!1)},pathUp(c){return a(c,!0,!1)},pathRightDown(c){return a(c,!1,!0)},pathRightUp(c){return a(c, +!1,!0)}}}shapeFor(a){let b=a.getCheck();!b&&a.targetConnection&&(b=a.targetConnection.getCheck());switch(a.type){case ConnectionType$$module$build$src$core$connection_type.INPUT_VALUE:case ConnectionType$$module$build$src$core$connection_type.OUTPUT_VALUE:a=a.getSourceBlock().getOutputShape();if(null!==a)switch(a){case this.SHAPES.HEXAGONAL:return this.HEXAGONAL;case this.SHAPES.ROUND:return this.ROUNDED;case this.SHAPES.SQUARE:return this.SQUARED}if(b&&-1!==b.indexOf("Boolean"))return this.HEXAGONAL; +if(b&&-1!==b.indexOf("Number"))return this.ROUNDED;b&&b.indexOf("String");return this.ROUNDED;case ConnectionType$$module$build$src$core$connection_type.PREVIOUS_STATEMENT:case ConnectionType$$module$build$src$core$connection_type.NEXT_STATEMENT:return this.NOTCH;default:throw Error("Unknown type");}}makeNotch(){function a(l){return curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(l*e/2,0),point$$module$build$src$core$utils$svg_paths(l*e*3/4,g/2),point$$module$build$src$core$utils$svg_paths(l* +e,g)])+line$$module$build$src$core$utils$svg_paths([point$$module$build$src$core$utils$svg_paths(l*e,f)])+curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(l*e/4,g/2),point$$module$build$src$core$utils$svg_paths(l*e/2,g),point$$module$build$src$core$utils$svg_paths(l*e,g)])+lineOnAxis$$module$build$src$core$utils$svg_paths("h",l*d)+curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(l*e/2,0),point$$module$build$src$core$utils$svg_paths(l* +e*3/4,-(g/2)),point$$module$build$src$core$utils$svg_paths(l*e,-g)])+line$$module$build$src$core$utils$svg_paths([point$$module$build$src$core$utils$svg_paths(l*e,-f)])+curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(l*e/4,-(g/2)),point$$module$build$src$core$utils$svg_paths(l*e/2,-g),point$$module$build$src$core$utils$svg_paths(l*e,-g)])}const b=this.NOTCH_WIDTH,c=this.NOTCH_HEIGHT,d=b/3,e=d/3,f=c/2,g=f/2,h=a(1),k=a(-1);return{type:this.SHAPES.NOTCH, +width:b,height:c,pathLeft:h,pathRight:k}}makeInsideCorners(){const a=this.CORNER_RADIUS,b=arc$$module$build$src$core$utils$svg_paths("a","0 0,0",a,point$$module$build$src$core$utils$svg_paths(-a,a)),c=arc$$module$build$src$core$utils$svg_paths("a","0 0,1",a,point$$module$build$src$core$utils$svg_paths(-a,a)),d=arc$$module$build$src$core$utils$svg_paths("a","0 0,0",a,point$$module$build$src$core$utils$svg_paths(a,a)),e=arc$$module$build$src$core$utils$svg_paths("a","0 0,1",a,point$$module$build$src$core$utils$svg_paths(a, +a));return{width:a,height:a,pathTop:b,pathBottom:d,rightWidth:a,rightHeight:a,pathTopRight:c,pathBottomRight:e}}generateSecondaryColour_(a){return blend$$module$build$src$core$utils$colour("#000",a,.15)||a}generateTertiaryColour_(a){return blend$$module$build$src$core$utils$colour("#000",a,.25)||a}createDom(a,b,c){super.createDom(a,b,c);a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.DEFS,{},a);b=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FILTER, +{id:"blocklySelectedGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.SELECTED_GLOW_SIZE},b);c=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FECOMPONENTTRANSFER,{result:"outBlur"},b);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEFUNCA,{type:"table", +tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},c);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEFLOOD,{"flood-color":this.SELECTED_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},b);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},b);this.selectedGlowFilterId=b.id;this.selectedGlowFilter_=b;a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FILTER, +{id:"blocklyReplacementGlowFilter"+this.randomIdentifier,height:"160%",width:"180%",y:"-30%",x:"-40%"},a);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEGAUSSIANBLUR,{"in":"SourceGraphic",stdDeviation:this.REPLACEMENT_GLOW_SIZE},a);b=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FECOMPONENTTRANSFER,{result:"outBlur"},a);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEFUNCA,{type:"table", +tableValues:"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"},b);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FEFLOOD,{"flood-color":this.REPLACEMENT_GLOW_COLOUR,"flood-opacity":1,result:"outColor"},a);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FECOMPOSITE,{"in":"outColor",in2:"outBlur",operator:"in",result:"outGlow"},a);createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.FECOMPOSITE,{"in":"SourceGraphic", +in2:"outGlow",operator:"over"},a);this.replacementGlowFilterId=a.id;this.replacementGlowFilter_=a}getCSS_(a){return[`${a} .blocklyText,`,`${a} .blocklyFlyoutLabelText {`,`font: ${this.FIELD_TEXT_FONTWEIGHT} ${this.FIELD_TEXT_FONTSIZE}`+`pt ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${a} .blocklyText {`,"fill: #fff;","}",`${a} .blocklyNonEditableText>rect:not(.blocklyDropdownRect),`,`${a} .blocklyEditableText>rect:not(.blocklyDropdownRect) {`,`fill: ${this.FIELD_BORDER_RECT_COLOUR};`,"}",`${a} .blocklyNonEditableText>text,`, +`${a} .blocklyEditableText>text,`,`${a} .blocklyNonEditableText>g>text,`,`${a} .blocklyEditableText>g>text {`,"fill: #575E75;","}",`${a} .blocklyFlyoutLabelText {`,"fill: #575E75;","}",`${a} .blocklyText.blocklyBubbleText {`,"fill: #575E75;","}",`${a} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableText:not(.editing):hover>rect,",`${a} .blocklyDraggable:not(.blocklyDisabled)`," .blocklyEditableText:not(.editing):hover>.blocklyPath {","stroke: #fff;","stroke-width: 2;","}",`${a} .blocklyHtmlInput {`, +`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,`font-weight: ${this.FIELD_TEXT_FONTWEIGHT};`,"color: #575E75;","}",`${a} .blocklyDropdownText {`,"fill: #fff !important;","}",`${a}.blocklyWidgetDiv .goog-menuitem,`,`${a}.blocklyDropDownDiv .goog-menuitem {`,`font-family: ${this.FIELD_TEXT_FONTFAMILY};`,"}",`${a}.blocklyDropDownDiv .goog-menuitem-content {`,"color: #fff;","}",`${a} .blocklyHighlightedConnectionPath {`,`stroke: ${this.SELECTED_GLOW_COLOUR};`,"}",`${a} .blocklyDisabled > .blocklyOutlinePath {`, +`fill: url(#blocklyDisabledPattern${this.randomIdentifier})`,"}",`${a} .blocklyInsertionMarker>.blocklyPath {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;","}"]}},module$build$src$core$renderers$zelos$constants={};module$build$src$core$renderers$zelos$constants.ConstantProvider=ConstantProvider$$module$build$src$core$renderers$zelos$constants;var Drawer$$module$build$src$core$renderers$zelos$drawer=class extends Drawer$$module$build$src$core$renderers$common$drawer{constructor(a,b){super(a,b)}draw(){const a=this.block_.pathObject;a.beginDrawing();this.hideHiddenIcons_();this.drawOutline_();this.drawInternals_();a.setPath(this.outlinePath_+"\n"+this.inlinePath_);this.info_.RTL&&a.flipRTL();if(isDebuggerEnabled$$module$build$src$core$renderers$common$debug()){let b,c;null==(b=this.block_)||null==(c=b.renderingDebugger)||c.drawDebug(this.block_, +this.info_)}this.recordSizeOnBlock_();this.info_.outputConnection&&(a.outputShapeType=this.info_.outputConnection.shape.type);a.endDrawing()}drawOutline_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape&&!this.info_.hasStatementInput&&!this.info_.bottomRow.hasNextConnection?(this.drawFlatTop_(),this.drawRightDynamicConnection_(),this.drawFlatBottom_(),this.drawLeftDynamicConnection_()):super.drawOutline_()}drawLeft_(){this.info_.outputConnection&&this.info_.outputConnection.isDynamicShape? +this.drawLeftDynamicConnection_():super.drawLeft_()}drawRightSideRow_(a){if(!(0>=a.height))if(Types$$module$build$src$core$renderers$measurables$types.isSpacer(a)&&(a.precedesStatement||a.followsStatement)){var b=this.constants_.INSIDE_CORNERS.rightHeight;b=a.height-(a.precedesStatement?b:0);this.outlinePath_+=(a.followsStatement?this.constants_.INSIDE_CORNERS.pathBottomRight:"")+(0=c||0>=b)throw Error("Height and width values of an image field must be greater than 0.");this.size_=new Size$$module$build$src$core$utils$size(b,c+$.FieldImage$$module$build$src$core$field_image.Y_PADDING);this.imageHeight_=c;"function"===typeof e&&(this.clickHandler_=e);a!==Field$$module$build$src$core$field.SKIP_SETUP&&(g?this.configure_(g):(this.flipRtl_=!!f,this.altText_=replaceMessageReferences$$module$build$src$core$utils$parsing(d)||""),this.setValue(replaceMessageReferences$$module$build$src$core$utils$parsing(a)))}configure_(a){super.configure_(a); +a.flipRtl&&(this.flipRtl_=a.flipRtl);a.alt&&(this.altText_=replaceMessageReferences$$module$build$src$core$utils$parsing(a.alt))}initView(){this.imageElement_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.IMAGE,{height:this.imageHeight_+"px",width:this.size_.width+"px",alt:this.altText_},this.fieldGroup_);this.imageElement_.setAttributeNS(XLINK_NS$$module$build$src$core$utils$dom,"xlink:href",this.value_);this.clickHandler_&&(this.imageElement_.style.cursor= +"pointer")}updateSize_(){}doClassValidation_(a){return"string"!==typeof a?null:a}doValueUpdate_(a){this.value_=a;this.imageElement_&&this.imageElement_.setAttributeNS(XLINK_NS$$module$build$src$core$utils$dom,"xlink:href",String(this.value_))}getFlipRtl(){return this.flipRtl_}setAlt(a){a!==this.altText_&&(this.altText_=a||"",this.imageElement_&&this.imageElement_.setAttribute("alt",this.altText_))}showEditor_(){this.clickHandler_&&this.clickHandler_(this)}setOnClickHandler(a){this.clickHandler_=a}getText_(){return this.altText_}static fromJson(a){if(!a.src|| +!a.width||!a.height)throw Error("src, width, and height values for an image field arerequired. The width and height must be non-zero.");return new this(a.src,a.width,a.height,void 0,void 0,void 0,a)}};$.FieldImage$$module$build$src$core$field_image.Y_PADDING=1;register$$module$build$src$core$field_registry("field_image",$.FieldImage$$module$build$src$core$field_image);$.FieldImage$$module$build$src$core$field_image.prototype.DEFAULT_VALUE="";var module$build$src$core$field_image={}; +module$build$src$core$field_image.FieldImage=$.FieldImage$$module$build$src$core$field_image;$.FieldTextInput$$module$build$src$core$field_textinput=class extends Field$$module$build$src$core$field{constructor(a,b,c){super(Field$$module$build$src$core$field.SKIP_SETUP);this.spellcheck_=!0;this.htmlInput_=null;this.isTextValid_=this.isBeingEdited_=!1;this.onKeyInputWrapper_=this.onKeyDownWrapper_=null;this.fullBlockClickTarget_=!1;this.workspace_=null;this.SERIALIZABLE=!0;this.CURSOR="text";a!==Field$$module$build$src$core$field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}configure_(a){super.configure_(a); +void 0!==a.spellcheck&&(this.spellcheck_=a.spellcheck)}initView(){if(this.getConstants().FULL_BLOCK_FIELDS){let a=0,b=0;for(let c=0,d;d=this.getSourceBlock().inputList[c];c++){for(let e=0;d.fieldRow[e];e++)a++;d.connection&&b++}this.fullBlockClickTarget_=1>=a&&this.getSourceBlock().outputConnection&&!b}else this.fullBlockClickTarget_=!1;this.fullBlockClickTarget_?this.clickTarget_=this.sourceBlock_.getSvgRoot():this.createBorderRect_();this.createTextElement_()}doClassValidation_(a){return null=== +a||void 0===a?null:String(a)}doValueInvalid_(a){this.isBeingEdited_&&(this.isTextValid_=!1,a=this.value_,this.value_=this.htmlInput_.getAttribute("data-untyped-default-value"),this.sourceBlock_&&isEnabled$$module$build$src$core$events$utils()&&fire$$module$build$src$core$events$utils(new (get$$module$build$src$core$events$utils(CHANGE$$module$build$src$core$events$utils))(this.sourceBlock_,"field",this.name||null,a,this.value_)))}doValueUpdate_(a){this.isTextValid_=!0;this.value_=a;this.isBeingEdited_|| +(this.isDirty_=!0)}applyColour(){if(this.sourceBlock_&&this.getConstants().FULL_BLOCK_FIELDS){var a=this.sourceBlock_;if(this.borderRect_){if(!a.style.colourTertiary)throw Error("The renderer did not properly initialize the block style");this.borderRect_.setAttribute("stroke",a.style.colourTertiary)}else a.pathObject.svgPath.setAttribute("fill",this.getConstants().FIELD_BORDER_RECT_COLOUR)}}render_(){super.render_();if(this.isBeingEdited_){this.resizeEditor_();const a=this.htmlInput_;this.isTextValid_? +(removeClass$$module$build$src$core$utils$dom(a,"blocklyInvalidInput"),setState$$module$build$src$core$utils$aria(a,State$$module$build$src$core$utils$aria.INVALID,!1)):(addClass$$module$build$src$core$utils$dom(a,"blocklyInvalidInput"),setState$$module$build$src$core$utils$aria(a,State$$module$build$src$core$utils$aria.INVALID,!0))}}setSpellcheck(a){a!==this.spellcheck_&&(this.spellcheck_=a,this.htmlInput_&&this.htmlInput_.setAttribute("spellcheck",this.spellcheck_))}showEditor_(a,b){this.workspace_= +this.sourceBlock_.workspace;a=b||!1;!a&&(MOBILE$$module$build$src$core$utils$useragent||ANDROID$$module$build$src$core$utils$useragent||IPAD$$module$build$src$core$utils$useragent)?this.showPromptEditor_():this.showInlineEditor_(a)}showPromptEditor_(){prompt$$module$build$src$core$dialog(Msg$$module$build$src$core$msg.CHANGE_VALUE_TITLE,this.getText(),a=>{null!==a&&this.setValue(this.getValueFromEditorText_(a))})}showInlineEditor_(a){show$$module$build$src$core$widgetdiv(this,this.getSourceBlock().RTL, +this.widgetDispose_.bind(this));this.htmlInput_=this.widgetCreate_();this.isBeingEdited_=!0;a||(this.htmlInput_.focus({preventScroll:!0}),this.htmlInput_.select())}widgetCreate_(){setGroup$$module$build$src$core$events$utils(!0);const a=getDiv$$module$build$src$core$widgetdiv();var b=this.getClickTarget_();if(!b)throw Error("A click target has not been set.");addClass$$module$build$src$core$utils$dom(b,"editing");b=document.createElement("input");b.className="blocklyHtmlInput";b.setAttribute("spellcheck", +this.spellcheck_);const c=this.workspace_.getScale();var d=this.getConstants().FIELD_TEXT_FONTSIZE*c+"pt";a.style.fontSize=d;b.style.fontSize=d;d=$.FieldTextInput$$module$build$src$core$field_textinput.BORDERRADIUS*c+"px";if(this.fullBlockClickTarget_){d=this.getScaledBBox();d=(d.bottom-d.top)/2+"px";const e=this.getSourceBlock().getParent()?this.getSourceBlock().getParent().style.colourTertiary:this.sourceBlock_.style.colourTertiary;b.style.border=1*c+"px solid "+e;a.style.borderRadius=d;a.style.transition= +"box-shadow 0.25s ease 0s";this.getConstants().FIELD_TEXTINPUT_BOX_SHADOW&&(a.style.boxShadow="rgba(255, 255, 255, 0.3) 0 0 0 "+4*c+"px")}b.style.borderRadius=d;a.appendChild(b);b.value=b.defaultValue=this.getEditorText_(this.value_);b.setAttribute("data-untyped-default-value",this.value_);b.setAttribute("data-old-value","");this.resizeEditor_();this.bindInputEvents_(b);return b}widgetDispose_(){this.isBeingEdited_=!1;this.isTextValid_=!0;this.forceRerender();this.onFinishEditing_(this.value_);setGroup$$module$build$src$core$events$utils(!1); +this.unbindInputEvents_();var a=getDiv$$module$build$src$core$widgetdiv().style;a.width="auto";a.height="auto";a.fontSize="";a.transition="";a.boxShadow="";this.htmlInput_=null;a=this.getClickTarget_();if(!a)throw Error("A click target has not been set.");removeClass$$module$build$src$core$utils$dom(a,"editing")}onFinishEditing_(a){}bindInputEvents_(a){this.onKeyDownWrapper_=conditionalBind$$module$build$src$core$browser_events(a,"keydown",this,this.onHtmlInputKeyDown_);this.onKeyInputWrapper_=conditionalBind$$module$build$src$core$browser_events(a, +"input",this,this.onHtmlInputChange_)}unbindInputEvents_(){this.onKeyDownWrapper_&&(unbind$$module$build$src$core$browser_events(this.onKeyDownWrapper_),this.onKeyDownWrapper_=null);this.onKeyInputWrapper_&&(unbind$$module$build$src$core$browser_events(this.onKeyInputWrapper_),this.onKeyInputWrapper_=null)}onHtmlInputKeyDown_(a){a.keyCode===KeyCodes$$module$build$src$core$utils$keycodes.ENTER?(hide$$module$build$src$core$widgetdiv(),hideWithoutAnimation$$module$build$src$core$dropdowndiv()):a.keyCode=== +KeyCodes$$module$build$src$core$utils$keycodes.ESC?(this.setValue(this.htmlInput_.getAttribute("data-untyped-default-value")),hide$$module$build$src$core$widgetdiv(),hideWithoutAnimation$$module$build$src$core$dropdowndiv()):a.keyCode===KeyCodes$$module$build$src$core$utils$keycodes.TAB&&(hide$$module$build$src$core$widgetdiv(),hideWithoutAnimation$$module$build$src$core$dropdowndiv(),this.sourceBlock_.tab(this,!a.shiftKey),a.preventDefault())}onHtmlInputChange_(a){a=this.htmlInput_.value;a!==this.htmlInput_.getAttribute("data-old-value")&& +(this.htmlInput_.setAttribute("data-old-value",a),a=this.getValueFromEditorText_(a),this.setValue(a),this.forceRerender(),this.resizeEditor_())}setEditorValue_(a){this.isDirty_=!0;this.isBeingEdited_&&(this.htmlInput_.value=this.getEditorText_(a));this.setValue(a)}resizeEditor_(){const a=getDiv$$module$build$src$core$widgetdiv();var b=this.getScaledBBox();a.style.width=b.right-b.left+"px";a.style.height=b.bottom-b.top+"px";const c=this.getSourceBlock().RTL?b.right-a.offsetWidth:b.left;b=new Coordinate$$module$build$src$core$utils$coordinate(c, +b.top);a.style.left=b.x+"px";a.style.top=b.y+"px"}isTabNavigable(){return!0}getText_(){return this.isBeingEdited_&&this.htmlInput_?this.htmlInput_.value:null}getEditorText_(a){return String(a)}getValueFromEditorText_(a){return a}static fromJson(a){return new this(replaceMessageReferences$$module$build$src$core$utils$parsing(a.text),void 0,a)}};$.FieldTextInput$$module$build$src$core$field_textinput.BORDERRADIUS=4;register$$module$build$src$core$field_registry("field_input",$.FieldTextInput$$module$build$src$core$field_textinput); +$.FieldTextInput$$module$build$src$core$field_textinput.prototype.DEFAULT_VALUE="";var module$build$src$core$field_textinput={};module$build$src$core$field_textinput.FieldTextInput=$.FieldTextInput$$module$build$src$core$field_textinput;var BottomRow$$module$build$src$core$renderers$zelos$measurables$bottom_row=class extends BottomRow$$module$build$src$core$renderers$measurables$bottom_row{constructor(a){super(a)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(a){return!!a.outputConnection}hasRightSquareCorner(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection}},module$build$src$core$renderers$zelos$measurables$bottom_row={};module$build$src$core$renderers$zelos$measurables$bottom_row.BottomRow=BottomRow$$module$build$src$core$renderers$zelos$measurables$bottom_row;var StatementInput$$module$build$src$core$renderers$zelos$measurables$inputs=class extends StatementInput$$module$build$src$core$renderers$measurables$statement_input{constructor(a,b){super(a,b);this.connectedBottomNextConnection=!1;if(this.connectedBlock){for(a=this.connectedBlock;b=a.getNextBlock();)a=b;a.nextConnection||(this.height=this.connectedBlockHeight,this.connectedBottomNextConnection=!0)}}},module$build$src$core$renderers$zelos$measurables$inputs={}; +module$build$src$core$renderers$zelos$measurables$inputs.StatementInput=StatementInput$$module$build$src$core$renderers$zelos$measurables$inputs;var RightConnectionShape$$module$build$src$core$renderers$zelos$measurables$row_elements=class extends Measurable$$module$build$src$core$renderers$measurables$base{constructor(a){super(a);this.width=this.height=0;this.type|=Types$$module$build$src$core$renderers$measurables$types.getType("RIGHT_CONNECTION")}},module$build$src$core$renderers$zelos$measurables$row_elements={};module$build$src$core$renderers$zelos$measurables$row_elements.RightConnectionShape=RightConnectionShape$$module$build$src$core$renderers$zelos$measurables$row_elements;var TopRow$$module$build$src$core$renderers$zelos$measurables$top_row=class extends TopRow$$module$build$src$core$renderers$measurables$top_row{constructor(a){super(a)}endsWithElemSpacer(){return!1}hasLeftSquareCorner(a){const b=(a.hat?"cap"===a.hat:this.constants_.ADD_START_HATS)&&!a.outputConnection&&!a.previousConnection;return!!a.outputConnection||b}hasRightSquareCorner(a){return!!a.outputConnection&&!a.statementInputCount&&!a.nextConnection}},module$build$src$core$renderers$zelos$measurables$top_row= +{};module$build$src$core$renderers$zelos$measurables$top_row.TopRow=TopRow$$module$build$src$core$renderers$zelos$measurables$top_row;var RenderInfo$$module$build$src$core$renderers$zelos$info=class extends RenderInfo$$module$build$src$core$renderers$common$info{constructor(a,b){super(a,b);this.isInline=!0;this.renderer_=a;this.constants_=this.renderer_.getConstants();this.topRow=new TopRow$$module$build$src$core$renderers$zelos$measurables$top_row(this.constants_);this.bottomRow=new BottomRow$$module$build$src$core$renderers$zelos$measurables$bottom_row(this.constants_);this.isMultiRow=!b.getInputsInline()||b.isCollapsed();this.hasStatementInput= +0=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!d.precedesStatement;if(Types$$module$build$src$core$renderers$measurables$types.isInputRow(f)&&f.hasStatement){f.measure(); +let g,h;b=f.width-(null!=(h=null==(g=f.getLastInput())?void 0:g.width)?h:0)+a}else if(c&&(2===e||d)&&Types$$module$build$src$core$renderers$measurables$types.isInputRow(f)&&!f.hasStatement){d=f.xPos;c=null;for(let g=0;gc?c:this.height/2,b-c*(1-Math.sin(Math.acos((c-this.constants_.SMALL_PADDING)/c)));default:return 0}if(Types$$module$build$src$core$renderers$measurables$types.isInlineInput(a)&&a instanceof +InputConnection$$module$build$src$core$renderers$measurables$input_connection){const e=a.connectedBlock;a=e?e.pathObject.outputShapeType:a.shape.type;return null==a||e&&e.outputConnection&&(e.statementInputCount||e.nextConnection)||c===d.SHAPES.HEXAGONAL&&c!==a?0:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][a]}return Types$$module$build$src$core$renderers$measurables$types.isField(a)&&a instanceof Field$$module$build$src$core$renderers$measurables$field?c===d.SHAPES.ROUND&&a.field instanceof $.FieldTextInput$$module$build$src$core$field_textinput? +b-2.75*d.GRID_UNIT:b-this.constants_.SHAPE_IN_SHAPE_PADDING[c][0]:Types$$module$build$src$core$renderers$measurables$types.isIcon(a)?this.constants_.SMALL_PADDING:0}finalizeVerticalAlignment_(){if(!this.outputConnection)for(let d=2;d=this.rows.length-1?!!this.bottomRow.hasNextConnection:!!g.precedesStatement;if(a?this.topRow.hasPreviousConnection:e.followsStatement){var c=f.elements[1];c=3===f.elements.length&& +c instanceof Field$$module$build$src$core$renderers$measurables$field&&(c.field instanceof $.FieldLabel$$module$build$src$core$field_label||c.field instanceof $.FieldImage$$module$build$src$core$field_image);if(!a&&c)e.height-=this.constants_.SMALL_PADDING,g.height-=this.constants_.SMALL_PADDING,f.height-=this.constants_.MEDIUM_PADDING;else if(!a&&!b)e.height+=this.constants_.SMALL_PADDING;else if(b){a=!1;for(b=0;b.blocklyPathLight,`,`${a} .blocklyInsertionMarker>.blocklyPathDark {`,`fill-opacity: ${this.INSERTION_MARKER_OPACITY};`,"stroke: none;", +"}"])}},module$build$src$core$renderers$geras$constants={};module$build$src$core$renderers$geras$constants.ConstantProvider=ConstantProvider$$module$build$src$core$renderers$geras$constants;var Highlighter$$module$build$src$core$renderers$geras$highlighter=class{constructor(a){this.inlineSteps_=this.steps_="";this.info_=a;this.RTL_=this.info_.RTL;a=a.getRenderer();this.constants_=a.getConstants();this.highlightConstants_=a.getHighlightConstants();this.highlightOffset_=this.highlightConstants_.OFFSET;this.outsideCornerPaths_=this.highlightConstants_.OUTSIDE_CORNER;this.insideCornerPaths_=this.highlightConstants_.INSIDE_CORNER;this.puzzleTabPaths_=this.highlightConstants_.PUZZLE_TAB;this.notchPaths_= +this.highlightConstants_.NOTCH;this.startPaths_=this.highlightConstants_.START_HAT;this.jaggedTeethPaths_=this.highlightConstants_.JAGGED_TEETH}getPath(){return this.steps_+"\n"+this.inlineSteps_}drawTopCorner(a){this.steps_+=moveBy$$module$build$src$core$utils$svg_paths(a.xPos,this.info_.startY);for(let b=0,c;c=a.elements[b];b++)Types$$module$build$src$core$renderers$measurables$types.isLeftSquareCorner(c)?this.steps_+=this.highlightConstants_.START_POINT:Types$$module$build$src$core$renderers$measurables$types.isLeftRoundedCorner(c)? +this.steps_+=this.outsideCornerPaths_.topLeft(this.RTL_):Types$$module$build$src$core$renderers$measurables$types.isPreviousConnection(c)?this.steps_+=this.notchPaths_.pathLeft:Types$$module$build$src$core$renderers$measurables$types.isHat(c)?this.steps_+=this.startPaths_.path(this.RTL_):Types$$module$build$src$core$renderers$measurables$types.isSpacer(c)&&0!==c.width&&(this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("H",c.xPos+c.width-this.highlightOffset_));this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("H", +a.xPos+a.width-this.highlightOffset_)}drawJaggedEdge_(a){this.info_.RTL&&(this.steps_+=this.jaggedTeethPaths_.pathLeft+lineOnAxis$$module$build$src$core$utils$svg_paths("v",a.height-this.jaggedTeethPaths_.height-this.highlightOffset_))}drawValueInput(a){const b=a.getLastInput();if(this.RTL_){const c=a.height-b.connectionHeight;this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(b.xPos+b.width-this.highlightOffset_,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)+lineOnAxis$$module$build$src$core$utils$svg_paths("v", +c)}else this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(b.xPos+b.width,a.yPos)+this.puzzleTabPaths_.pathDown(this.RTL_)}drawStatementInput(a){const b=a.getLastInput();if(b)if(this.RTL_){const c=a.height-2*this.insideCornerPaths_.height;this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(b.xPos,a.yPos)+this.insideCornerPaths_.pathTop(this.RTL_)+lineOnAxis$$module$build$src$core$utils$svg_paths("v",c)+this.insideCornerPaths_.pathBottom(this.RTL_)+lineTo$$module$build$src$core$utils$svg_paths(a.width- +b.xPos-this.insideCornerPaths_.width,0)}else this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(b.xPos,a.yPos+a.height)+this.insideCornerPaths_.pathBottom(this.RTL_)+lineTo$$module$build$src$core$utils$svg_paths(a.width-b.xPos-this.insideCornerPaths_.width,0)}drawRightSideRow(a){const b=a.xPos+a.width-this.highlightOffset_;a instanceof SpacerRow$$module$build$src$core$renderers$measurables$spacer_row&&a.followsStatement&&(this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("H", +b));this.RTL_&&(this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("H",b),a.height>this.highlightOffset_&&(this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("V",a.yPos+a.height-this.highlightOffset_)))}drawBottomRow(a){if(this.RTL_)this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("V",a.baseline-this.highlightOffset_);else{const b=this.info_.bottomRow.elements[0];Types$$module$build$src$core$renderers$measurables$types.isLeftSquareCorner(b)?this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(a.xPos+ +this.highlightOffset_,a.baseline-this.highlightOffset_):Types$$module$build$src$core$renderers$measurables$types.isLeftRoundedCorner(b)&&(this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(a.xPos,a.baseline),this.steps_+=this.outsideCornerPaths_.bottomLeft())}}drawLeft(){var a=this.info_.outputConnection;a&&(a=a.connectionOffsetY+a.height,this.RTL_?this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(this.info_.startX,a):(this.steps_+=moveTo$$module$build$src$core$utils$svg_paths(this.info_.startX+ +this.highlightOffset_,this.info_.bottomRow.baseline-this.highlightOffset_),this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("V",a)),this.steps_+=this.puzzleTabPaths_.pathUp(this.RTL_));this.RTL_||(a=this.info_.topRow,Types$$module$build$src$core$renderers$measurables$types.isLeftRoundedCorner(a.elements[0])?this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("V",this.outsideCornerPaths_.height):this.steps_+=lineOnAxis$$module$build$src$core$utils$svg_paths("V",a.capline+this.highlightOffset_))}drawInlineInput(a){const b= +this.highlightOffset_,c=a.xPos+a.connectionWidth;var d=a.centerline-a.height/2;const e=a.width-a.connectionWidth,f=d+b;this.RTL_?(d=a.connectionOffsetY-b,a=a.height-(a.connectionOffsetY+a.connectionHeight)+b,this.inlineSteps_+=moveTo$$module$build$src$core$utils$svg_paths(c-b,f)+lineOnAxis$$module$build$src$core$utils$svg_paths("v",d)+this.puzzleTabPaths_.pathDown(this.RTL_)+lineOnAxis$$module$build$src$core$utils$svg_paths("v",a)+lineOnAxis$$module$build$src$core$utils$svg_paths("h",e)):this.inlineSteps_+= +moveTo$$module$build$src$core$utils$svg_paths(a.xPos+a.width+b,f)+lineOnAxis$$module$build$src$core$utils$svg_paths("v",a.height)+lineOnAxis$$module$build$src$core$utils$svg_paths("h",-e)+moveTo$$module$build$src$core$utils$svg_paths(c,d+a.connectionOffsetY)+this.puzzleTabPaths_.pathDown(this.RTL_)}},module$build$src$core$renderers$geras$highlighter={};module$build$src$core$renderers$geras$highlighter.Highlighter=Highlighter$$module$build$src$core$renderers$geras$highlighter;var Drawer$$module$build$src$core$renderers$geras$drawer=class extends Drawer$$module$build$src$core$renderers$common$drawer{constructor(a,b){super(a,b);this.highlighter_=new Highlighter$$module$build$src$core$renderers$geras$highlighter(b)}draw(){this.hideHiddenIcons_();this.drawOutline_();this.drawInternals_();const a=this.block_.pathObject;a.setPath(this.outlinePath_+"\n"+this.inlinePath_);a.setHighlightPath(this.highlighter_.getPath());this.info_.RTL&&a.flipRTL();if(isDebuggerEnabled$$module$build$src$core$renderers$common$debug()){let b, +c;null==(b=this.block_)||null==(c=b.renderingDebugger)||c.drawDebug(this.block_,this.info_)}this.recordSizeOnBlock_()}drawTop_(){this.highlighter_.drawTopCorner(this.info_.topRow);this.highlighter_.drawRightSideRow(this.info_.topRow);super.drawTop_()}drawJaggedEdge_(a){this.highlighter_.drawJaggedEdge_(a);super.drawJaggedEdge_(a)}drawValueInput_(a){this.highlighter_.drawValueInput(a);super.drawValueInput_(a)}drawStatementInput_(a){this.highlighter_.drawStatementInput(a);super.drawStatementInput_(a)}drawRightSideRow_(a){this.highlighter_.drawRightSideRow(a); +this.outlinePath_+=lineOnAxis$$module$build$src$core$utils$svg_paths("H",a.xPos+a.width)+lineOnAxis$$module$build$src$core$utils$svg_paths("V",a.yPos+a.height)}drawBottom_(){this.highlighter_.drawBottomRow(this.info_.bottomRow);super.drawBottom_()}drawLeft_(){this.highlighter_.drawLeft();super.drawLeft_()}drawInlineInput_(a){this.highlighter_.drawInlineInput(a);super.drawInlineInput_(a)}positionInlineInputConnection_(a){const b=a.centerline-a.height/2;if(a.connectionModel){let c=a.xPos+a.connectionWidth+ +this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(c*=-1);a.connectionModel.setOffsetInBlock(c,b+a.connectionOffsetY+this.constants_.DARK_PATH_OFFSET)}}positionStatementInputConnection_(a){const b=a.getLastInput();if(null==b?0:b.connectionModel){let c=a.xPos+a.statementEdge+b.notchOffset;c=this.info_.RTL?-1*c:c+this.constants_.DARK_PATH_OFFSET;b.connectionModel.setOffsetInBlock(c,a.yPos+this.constants_.DARK_PATH_OFFSET)}}positionExternalValueConnection_(a){const b=a.getLastInput();if(b&&b.connectionModel){let c= +a.xPos+a.width+this.constants_.DARK_PATH_OFFSET;this.info_.RTL&&(c*=-1);b.connectionModel.setOffsetInBlock(c,a.yPos)}}positionNextConnection_(){const a=this.info_.bottomRow;if(a.connection){const b=a.connection,c=b.xPos;b.connectionModel.setOffsetInBlock((this.info_.RTL?-c:c)+this.constants_.DARK_PATH_OFFSET/2,a.baseline+this.constants_.DARK_PATH_OFFSET)}}},module$build$src$core$renderers$geras$drawer={};module$build$src$core$renderers$geras$drawer.Drawer=Drawer$$module$build$src$core$renderers$geras$drawer;var HighlightConstantProvider$$module$build$src$core$renderers$geras$highlight_constants=class{constructor(a){this.OFFSET=.5;this.constantProvider=a;this.START_POINT=moveBy$$module$build$src$core$utils$svg_paths(this.OFFSET,this.OFFSET)}init(){this.INSIDE_CORNER=this.makeInsideCorner();this.OUTSIDE_CORNER=this.makeOutsideCorner();this.PUZZLE_TAB=this.makePuzzleTab();this.NOTCH=this.makeNotch();this.JAGGED_TEETH=this.makeJaggedTeeth();this.START_HAT=this.makeStartHat()}makeInsideCorner(){const a=this.constantProvider.CORNER_RADIUS, +b=this.OFFSET,c=(1-Math.SQRT1_2)*(a+b)-b,d=moveBy$$module$build$src$core$utils$svg_paths(c,c)+arc$$module$build$src$core$utils$svg_paths("a","0 0,0",a,point$$module$build$src$core$utils$svg_paths(-c-b,a-c)),e=arc$$module$build$src$core$utils$svg_paths("a","0 0,0",a+b,point$$module$build$src$core$utils$svg_paths(a+b,a+b)),f=moveBy$$module$build$src$core$utils$svg_paths(c,-c)+arc$$module$build$src$core$utils$svg_paths("a","0 0,0",a+b,point$$module$build$src$core$utils$svg_paths(a-c,c+b));return{width:a+ +b,height:a,pathTop(g){return g?d:""},pathBottom(g){return g?e:f}}}makeOutsideCorner(){const a=this.constantProvider.CORNER_RADIUS,b=this.OFFSET,c=(1-Math.SQRT1_2)*(a-b)+b,d=moveBy$$module$build$src$core$utils$svg_paths(c,c)+arc$$module$build$src$core$utils$svg_paths("a","0 0,1",a-b,point$$module$build$src$core$utils$svg_paths(a-c,-c+b)),e=moveBy$$module$build$src$core$utils$svg_paths(b,a)+arc$$module$build$src$core$utils$svg_paths("a","0 0,1",a-b,point$$module$build$src$core$utils$svg_paths(a,-a+ +b)),f=-c,g=moveBy$$module$build$src$core$utils$svg_paths(c,f)+arc$$module$build$src$core$utils$svg_paths("a","0 0,1",a-b,point$$module$build$src$core$utils$svg_paths(-c+b,-f-a));return{height:a,topLeft(h){return h?d:e},bottomLeft(){return g}}}makePuzzleTab(){const a=this.constantProvider.TAB_WIDTH,b=this.constantProvider.TAB_HEIGHT,c=moveBy$$module$build$src$core$utils$svg_paths(-2,-b+3.4)+lineTo$$module$build$src$core$utils$svg_paths(-.45*a,-2.1),d=lineOnAxis$$module$build$src$core$utils$svg_paths("v", +2.5)+moveBy$$module$build$src$core$utils$svg_paths(.97*-a,2.5)+curve$$module$build$src$core$utils$svg_paths("q",[point$$module$build$src$core$utils$svg_paths(.05*-a,10),point$$module$build$src$core$utils$svg_paths(.3*a,9.5)])+moveBy$$module$build$src$core$utils$svg_paths(.67*a,-1.9)+lineOnAxis$$module$build$src$core$utils$svg_paths("v",2.5),e=lineOnAxis$$module$build$src$core$utils$svg_paths("v",-1.5)+moveBy$$module$build$src$core$utils$svg_paths(-.92*a,-.5)+curve$$module$build$src$core$utils$svg_paths("q", +[point$$module$build$src$core$utils$svg_paths(-.19*a,-5.5),point$$module$build$src$core$utils$svg_paths(0,-11)])+moveBy$$module$build$src$core$utils$svg_paths(.92*a,1),f=moveBy$$module$build$src$core$utils$svg_paths(-5,b-.7)+lineTo$$module$build$src$core$utils$svg_paths(.46*a,-2.1);return{width:a,height:b,pathUp(g){return g?c:e},pathDown(g){return g?d:f}}}makeNotch(){return{pathLeft:lineOnAxis$$module$build$src$core$utils$svg_paths("h",this.OFFSET)+this.constantProvider.NOTCH.pathLeft}}makeJaggedTeeth(){return{pathLeft:lineTo$$module$build$src$core$utils$svg_paths(5.1, +2.6)+moveBy$$module$build$src$core$utils$svg_paths(-10.2,6.8)+lineTo$$module$build$src$core$utils$svg_paths(5.1,2.6),height:12,width:10.2}}makeStartHat(){const a=this.constantProvider.START_HAT.height,b=moveBy$$module$build$src$core$utils$svg_paths(25,-8.7)+curve$$module$build$src$core$utils$svg_paths("c",[point$$module$build$src$core$utils$svg_paths(29.7,-6.2),point$$module$build$src$core$utils$svg_paths(57.2,-.5),point$$module$build$src$core$utils$svg_paths(75,8.7)]),c=curve$$module$build$src$core$utils$svg_paths("c", +[point$$module$build$src$core$utils$svg_paths(17.8,-9.2),point$$module$build$src$core$utils$svg_paths(45.3,-14.9),point$$module$build$src$core$utils$svg_paths(75,-8.7)])+moveTo$$module$build$src$core$utils$svg_paths(100.5,a+.5);return{path(d){return d?b:c}}}},module$build$src$core$renderers$geras$highlight_constants={};module$build$src$core$renderers$geras$highlight_constants.HighlightConstantProvider=HighlightConstantProvider$$module$build$src$core$renderers$geras$highlight_constants;var InlineInput$$module$build$src$core$renderers$geras$measurables$inline_input=class extends InlineInput$$module$build$src$core$renderers$measurables$inline_input{constructor(a,b){super(a,b);this.constants_=a;this.connectedBlock&&(this.width+=this.constants_.DARK_PATH_OFFSET,this.height+=this.constants_.DARK_PATH_OFFSET)}},module$build$src$core$renderers$geras$measurables$inline_input={};module$build$src$core$renderers$geras$measurables$inline_input.InlineInput=InlineInput$$module$build$src$core$renderers$geras$measurables$inline_input;var StatementInput$$module$build$src$core$renderers$geras$measurables$statement_input=class extends StatementInput$$module$build$src$core$renderers$measurables$statement_input{constructor(a,b){super(a,b);this.constants_=a;this.connectedBlock&&(this.height+=this.constants_.DARK_PATH_OFFSET)}},module$build$src$core$renderers$geras$measurables$statement_input={};module$build$src$core$renderers$geras$measurables$statement_input.StatementInput=StatementInput$$module$build$src$core$renderers$geras$measurables$statement_input;var RenderInfo$$module$build$src$core$renderers$geras$info=class extends RenderInfo$$module$build$src$core$renderers$common$info{constructor(a,b){super(a,b);this.renderer_=a}getRenderer(){return this.renderer_}populateBottomRow_(){super.populateBottomRow_();this.block_.inputList.length&&this.block_.inputList[this.block_.inputList.length-1].type===inputTypes$$module$build$src$core$input_types.STATEMENT||(this.bottomRow.minHeight=this.constants_.MEDIUM_PADDING-this.constants_.DARK_PATH_OFFSET)}addInput_(a, +b){this.isInline&&a.type===inputTypes$$module$build$src$core$input_types.VALUE?(b.elements.push(new InlineInput$$module$build$src$core$renderers$geras$measurables$inline_input(this.constants_,a)),b.hasInlineInput=!0):a.type===inputTypes$$module$build$src$core$input_types.STATEMENT?(b.elements.push(new StatementInput$$module$build$src$core$renderers$geras$measurables$statement_input(this.constants_,a)),b.hasStatement=!0):a.type===inputTypes$$module$build$src$core$input_types.VALUE?(b.elements.push(new ExternalValueInput$$module$build$src$core$renderers$measurables$external_value_input(this.constants_, +a)),b.hasExternalInput=!0):a.type===inputTypes$$module$build$src$core$input_types.DUMMY&&(b.minHeight=Math.max(b.minHeight,this.constants_.DUMMY_INPUT_MIN_HEIGHT),b.hasDummyInput=!0);this.isInline||null!==b.align||(b.align=a.align)}addElemSpacing_(){let a=!1;for(let c=0,d;d=this.rows[c];c++)d.hasExternalInput&&(a=!0);for(let c=0,d;d=this.rows[c];c++){var b=d.elements;d.elements=[];d.startsWithElemSpacer()&&d.elements.push(new InRowSpacer$$module$build$src$core$renderers$measurables$in_row_spacer(this.constants_, +this.getInRowSpacing_(null,b[0])));if(b.length){for(let e=0;e{const c=this.targetWorkspace.getGesture(b); +c&&(c.setStartBlock(a),c.handleFlyoutStart(b,this))}}onMouseDown_(a){const b=this.targetWorkspace.getGesture(a);b&&b.handleFlyoutStart(a,this)}isBlockCreatable(a){return a.isEnabled()}createBlock(a){let b=null;disable$$module$build$src$core$events$utils();var c=this.targetWorkspace.getAllVariables();this.targetWorkspace.setResizesEnabled(!1);try{b=this.placeNewBlock_(a)}finally{enable$$module$build$src$core$events$utils()}this.targetWorkspace.hideChaff();a=getAddedVariables$$module$build$src$core$variables(this.targetWorkspace, +c);if(isEnabled$$module$build$src$core$events$utils()){setGroup$$module$build$src$core$events$utils(!0);for(c=0;c-b||a<-180+b||a>180-b?!0:!1}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const a=this.svgGroup_.getBoundingClientRect(), +b=a.left;return this.toolboxPosition_===Position$$module$build$src$core$utils$toolbox.LEFT?new Rect$$module$build$src$core$utils$rect(-1E9,1E9,-1E9,b+a.width):new Rect$$module$build$src$core$utils$rect(-1E9,1E9,b,1E9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let a=0;var b=this.workspace_.getTopBlocks(!1);for(let d=0,e;e=b[d];d++){var c=e.getHeightWidth().width;e.outputConnection&&(c-=this.tabWidth_);a=Math.max(a,c)}for(let d=0,e;e=this.buttons_[d];d++)a=Math.max(a,e.width);a+= +1.5*this.MARGIN+this.tabWidth_;a*=this.workspace_.scale;a+=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness;if(this.width_!==a){for(let d=0,e;e=b[d];d++){if(this.RTL){c=e.getRelativeToSurfaceXY().x;let f=a/this.workspace_.scale-this.MARGIN;e.outputConnection||(f-=this.tabWidth_);e.moveBy(f-c,0)}this.rectMap_.has(e)&&this.moveRectToBlock_(this.rectMap_.get(e),e)}if(this.RTL)for(let d=0,e;e=this.buttons_[d];d++)b=e.getPosition().y,e.moveTo(a/this.workspace_.scale-e.width-this.MARGIN-this.tabWidth_, +b);this.targetWorkspace.toolboxPosition!==this.toolboxPosition_||this.toolboxPosition_!==Position$$module$build$src$core$utils$toolbox.LEFT||this.targetWorkspace.getToolbox()||this.targetWorkspace.translate(this.targetWorkspace.scrollX+a,this.targetWorkspace.scrollY);this.width_=a;this.position();this.targetWorkspace.recordDragTargets()}}};VerticalFlyout$$module$build$src$core$flyout_vertical.registryName="verticalFlyout"; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_VERTICAL_TOOLBOX,DEFAULT$$module$build$src$core$registry,VerticalFlyout$$module$build$src$core$flyout_vertical);var module$build$src$core$flyout_vertical={};module$build$src$core$flyout_vertical.VerticalFlyout=VerticalFlyout$$module$build$src$core$flyout_vertical;var HorizontalFlyout$$module$build$src$core$flyout_horizontal=class extends Flyout$$module$build$src$core$flyout_base{constructor(a){super(a);this.horizontalLayout=!0}setMetrics_(a){if(this.isVisible()){var b=this.workspace_.getMetricsManager(),c=b.getScrollMetrics(),d=b.getViewMetrics();b=b.getAbsoluteMetrics();"number"===typeof a.x&&(this.workspace_.scrollX=-(c.left+(c.width-d.width)*a.x));this.workspace_.translate(this.workspace_.scrollX+b.left,this.workspace_.scrollY+b.top)}}getX(){return 0}getY(){if(!this.isVisible())return 0; +var a=this.targetWorkspace.getMetricsManager();const b=a.getAbsoluteMetrics(),c=a.getViewMetrics();a=a.getToolboxMetrics();const d=this.toolboxPosition_===Position$$module$build$src$core$utils$toolbox.TOP;return this.targetWorkspace.toolboxPosition===this.toolboxPosition_?this.targetWorkspace.getToolbox()?d?a.height:c.height-this.height_:d?0:c.height:d?0:c.height+b.top-this.height_}position(){if(this.isVisible()&&this.targetWorkspace.isVisible()){var a=this.targetWorkspace.getMetricsManager().getViewMetrics(); +this.width_=a.width;this.setBackgroundPath_(a.width-2*this.CORNER_RADIUS,this.height_-this.CORNER_RADIUS);a=this.getX();var b=this.getY();this.positionAt_(this.width_,this.height_,a,b)}}setBackgroundPath_(a,b){const c=this.toolboxPosition_===Position$$module$build$src$core$utils$toolbox.TOP,d=["M 0,"+(c?0:this.CORNER_RADIUS)];c?(d.push("h",a+2*this.CORNER_RADIUS),d.push("v",b),d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,this.CORNER_RADIUS),d.push("h",-a),d.push("a", +this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,-this.CORNER_RADIUS,-this.CORNER_RADIUS)):(d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,-this.CORNER_RADIUS),d.push("h",a),d.push("a",this.CORNER_RADIUS,this.CORNER_RADIUS,0,0,1,this.CORNER_RADIUS,this.CORNER_RADIUS),d.push("v",b),d.push("h",-a-2*this.CORNER_RADIUS));d.push("z");this.svgBackground_.setAttribute("d",d.join(" "))}scrollToStart(){let a;null==(a=this.workspace_.scrollbar)||a.setX(this.RTL?Infinity:0)}wheel_(a){var b= +getScrollDeltaPixels$$module$build$src$core$browser_events(a);if(b=b.x||b.y){const c=this.workspace_.getMetricsManager(),d=c.getScrollMetrics();b=c.getViewMetrics().left-d.left+b;let e;null==(e=this.workspace_.scrollbar)||e.setX(b);hide$$module$build$src$core$widgetdiv();hideWithoutAnimation$$module$build$src$core$dropdowndiv()}a.preventDefault();a.stopPropagation()}layout_(a,b){this.workspace_.scale=this.targetWorkspace.scale;const c=this.MARGIN;let d=c+this.tabWidth_;this.RTL&&(a=a.reverse());for(let h= +0,k;k=a[h];h++)if("block"===k.type){var e=k.block,f=e.getDescendants(!1);for(let m=0,n;n=f[m];m++)n.isInFlyout=!0;e.render();f=e.getSvgRoot();const l=e.getHeightWidth();var g=e.outputConnection?this.tabWidth_:0;g=this.RTL?d+l.width:d-g;e.moveBy(g,c);g=this.createRect_(e,g,c,l,h);d+=l.width+b[h];this.addBlockListeners_(f,e,g)}else"button"===k.type&&(e=k.button,this.initFlyoutButton_(e,d,c),d+=e.width+b[h])}isDragTowardWorkspace(a){a=Math.atan2(a.y,a.x)/Math.PI*180;const b=this.dragAngleRange_;return a< +90+b&&a>90-b||a>-90-b&&a<-90+b?!0:!1}getClientRect(){if(!this.svgGroup_||this.autoClose||!this.isVisible())return null;const a=this.svgGroup_.getBoundingClientRect(),b=a.top;return this.toolboxPosition_===Position$$module$build$src$core$utils$toolbox.TOP?new Rect$$module$build$src$core$utils$rect(-1E9,b+a.height,-1E9,1E9):new Rect$$module$build$src$core$utils$rect(b,1E9,-1E9,1E9)}reflowInternal_(){this.workspace_.scale=this.getFlyoutScale();let a=0;const b=this.workspace_.getTopBlocks(!1);for(let d= +0,e;e=b[d];d++)a=Math.max(a,e.getHeightWidth().height);const c=this.buttons_;for(let d=0,e;e=c[d];d++)a=Math.max(a,e.height);a+=1.5*this.MARGIN;a*=this.workspace_.scale;a+=Scrollbar$$module$build$src$core$scrollbar.scrollbarThickness;if(this.height_!==a){for(let d=0,e;e=b[d];d++)this.rectMap_.has(e)&&this.moveRectToBlock_(this.rectMap_.get(e),e);this.targetWorkspace.toolboxPosition!==this.toolboxPosition_||this.toolboxPosition_!==Position$$module$build$src$core$utils$toolbox.TOP||this.targetWorkspace.getToolbox()|| +this.targetWorkspace.translate(this.targetWorkspace.scrollX,this.targetWorkspace.scrollY+a);this.height_=a;this.position();this.targetWorkspace.recordDragTargets()}}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.FLYOUTS_HORIZONTAL_TOOLBOX,DEFAULT$$module$build$src$core$registry,HorizontalFlyout$$module$build$src$core$flyout_horizontal);var module$build$src$core$flyout_horizontal={};module$build$src$core$flyout_horizontal.HorizontalFlyout=HorizontalFlyout$$module$build$src$core$flyout_horizontal;var FieldVariable$$module$build$src$core$field_variable=class extends FieldDropdown$$module$build$src$core$field_dropdown{constructor(a,b,c,d,e){super(Field$$module$build$src$core$field.SKIP_SETUP);this.defaultType_="";this.variableTypes=[];this.variable_=null;this.SERIALIZABLE=!0;this.menuGenerator_=FieldVariable$$module$build$src$core$field_variable.dropdownCreate;this.defaultVariableName="string"===typeof a?a:"";this.size_=new Size$$module$build$src$core$utils$size(0,0);a!==Field$$module$build$src$core$field.SKIP_SETUP&& +(e?this.configure_(e):this.setTypes_(c,d),b&&this.setValidator(b))}configure_(a){super.configure_(a);this.setTypes_(a.variableTypes,a.defaultType)}initModel(){if(!this.variable_){var a=getOrCreateVariablePackage$$module$build$src$core$variables(this.getSourceBlock().workspace,null,this.defaultVariableName,this.defaultType_);this.doValueUpdate_(a.getId())}}shouldAddBorderRect_(){return super.shouldAddBorderRect_()&&(!this.getConstants().FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW||"variables_get"!==this.getSourceBlock().type)}fromXml(a){var b= +a.getAttribute("id");const c=a.textContent,d=a.getAttribute("variabletype")||a.getAttribute("variableType")||"";b=getOrCreateVariablePackage$$module$build$src$core$variables(this.getSourceBlock().workspace,b,c,d);if(null!==d&&d!==b.type)throw Error("Serialized variable type with id '"+b.getId()+"' had type "+b.type+", and does not match variable field that references it: "+domToText$$module$build$src$core$xml(a)+".");this.setValue(b.getId())}toXml(a){this.initModel();a.id=this.variable_.getId();a.textContent= +this.variable_.name;this.variable_.type&&a.setAttribute("variabletype",this.variable_.type);return a}saveState(a){var b=this.saveLegacyState(FieldVariable$$module$build$src$core$field_variable);if(null!==b)return b;this.initModel();b={id:this.variable_.getId()};a&&(b.name=this.variable_.name,b.type=this.variable_.type);return b}loadState(a){this.loadLegacyState(FieldVariable$$module$build$src$core$field_variable,a)||(a=getOrCreateVariablePackage$$module$build$src$core$variables(this.getSourceBlock().workspace, +a.id||null,a.name,a.type||""),this.setValue(a.getId()))}setSourceBlock(a){if(a.isShadow())throw Error("Variable fields are not allowed to exist on shadow blocks.");super.setSourceBlock(a)}getValue(){return this.variable_?this.variable_.getId():null}getText(){return this.variable_?this.variable_.name:""}getVariable(){return this.variable_}getValidator(){return this.variable_?this.validator_:null}doClassValidation_(a){if(null===a)return null;var b=getVariable$$module$build$src$core$variables(this.getSourceBlock().workspace, +a);if(!b)return console.warn("Variable id doesn't point to a real variable! ID was "+a),null;b=b.type;return this.typeIsAllowed_(b)?a:(console.warn("Variable type doesn't match this field! Type was "+b),null)}doValueUpdate_(a){this.variable_=getVariable$$module$build$src$core$variables(this.getSourceBlock().workspace,a);super.doValueUpdate_(a)}typeIsAllowed_(a){const b=this.getVariableTypes_();if(!b)return!0;for(let c=0;cthis.max_&&setState$$module$build$src$core$utils$aria(a, +State$$module$build$src$core$utils$aria.VALUEMAX,this.max_);return a}static fromJson(a){return new this(a.value,void 0,void 0,void 0,void 0,a)}};register$$module$build$src$core$field_registry("field_number",FieldNumber$$module$build$src$core$field_number);FieldNumber$$module$build$src$core$field_number.prototype.DEFAULT_VALUE=0;var module$build$src$core$field_number={};module$build$src$core$field_number.FieldNumber=FieldNumber$$module$build$src$core$field_number;var FieldMultilineInput$$module$build$src$core$field_multilineinput=class extends $.FieldTextInput$$module$build$src$core$field_textinput{constructor(a,b,c){super(Field$$module$build$src$core$field.SKIP_SETUP);this.textGroup_=null;this.maxLines_=Infinity;this.isOverflowedY_=!1;a!==Field$$module$build$src$core$field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}configure_(a){super.configure_(a);a.maxLines&&this.setMaxLines(a.maxLines)}toXml(a){a.textContent=this.getValue().replace(/\n/g, +" ");return a}fromXml(a){this.setValue(a.textContent.replace(/ /g,"\n"))}saveState(){const a=this.saveLegacyState(FieldMultilineInput$$module$build$src$core$field_multilineinput);return null!==a?a:this.getValue()}loadState(a){this.loadLegacyState(Field$$module$build$src$core$field,a)||this.setValue(a)}initView(){this.createBorderRect_();this.textGroup_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.G,{"class":"blocklyEditableText"},this.fieldGroup_)}getDisplayText_(){let a= +this.getText();if(!a)return Field$$module$build$src$core$field.NBSP;const b=a.split("\n");a="";const c=this.isOverflowedY_?this.maxLines_:b.length;for(let d=0;dthis.maxDisplayLength?e=e.substring(0,this.maxDisplayLength-4)+"...":this.isOverflowedY_&&d===c-1&&(e=e.substring(0,e.length-3)+"...");e=e.replace(/\s/g,Field$$module$build$src$core$field.NBSP);a+=e;d!==c-1&&(a+="\n")}this.getSourceBlock().RTL&&(a+="\u200f");return a}doValueUpdate_(a){super.doValueUpdate_(a);this.isOverflowedY_= +this.value_.split("\n").length>this.maxLines_}render_(){for(var a;a=this.textGroup_.firstChild;)this.textGroup_.removeChild(a);a=this.getDisplayText_().split("\n");let b=0;for(let c=0;ce&&(e=h);f+=this.getConstants().FIELD_TEXT_HEIGHT+(0this.maxDisplayLength&&(a[h]=a[h].substring(0,this.maxDisplayLength)); +g.textContent=a[h];const k=getFastTextWidth$$module$build$src$core$utils$dom(g,b,c,d);k>e&&(e=k)}e+=this.htmlInput_.offsetWidth-this.htmlInput_.clientWidth}this.borderRect_&&(f+=2*this.getConstants().FIELD_BORDER_RECT_Y_PADDING,e+=2*this.getConstants().FIELD_BORDER_RECT_X_PADDING,this.borderRect_.setAttribute("width",e),this.borderRect_.setAttribute("height",f));this.size_.width=e;this.size_.height=f;this.positionBorderRect_()}showEditor_(a,b){super.showEditor_(a,b);this.forceRerender()}widgetCreate_(){const a= +getDiv$$module$build$src$core$widgetdiv(),b=this.workspace_.getScale(),c=document.createElement("textarea");c.className="blocklyHtmlInput blocklyHtmlTextAreaInput";c.setAttribute("spellcheck",this.spellcheck_);var d=this.getConstants().FIELD_TEXT_FONTSIZE*b+"pt";a.style.fontSize=d;c.style.fontSize=d;c.style.borderRadius=$.FieldTextInput$$module$build$src$core$field_textinput.BORDERRADIUS*b+"px";d=this.getConstants().FIELD_BORDER_RECT_X_PADDING*b;const e=this.getConstants().FIELD_BORDER_RECT_Y_PADDING* +b/2;c.style.padding=e+"px "+d+"px "+e+"px "+d+"px";d=this.getConstants().FIELD_TEXT_HEIGHT+this.getConstants().FIELD_BORDER_RECT_Y_PADDING;c.style.lineHeight=d*b+"px";a.appendChild(c);c.value=c.defaultValue=this.getEditorText_(this.value_);c.setAttribute("data-untyped-default-value",this.value_);c.setAttribute("data-old-value","");GECKO$$module$build$src$core$utils$useragent?setTimeout(this.resizeEditor_.bind(this),0):this.resizeEditor_();this.bindInputEvents_(c);return c}setMaxLines(a){"number"=== +typeof a&&0a?0>e&&0e&&(e=0):0d-1&&fd-1&&e--:0>b?0>f&&(f=0):0Math.floor(c.length/d)-1&&(f=Math.floor(c.length/d)-1);this.setHighlightedCell_(this.picker_.childNodes[f].childNodes[e],f*d+e)}}onMouseMove_(a){const b=(a=a.target)&& +Number(a.getAttribute("data-index"));null!==b&&b!==this.highlightedIndex_&&this.setHighlightedCell_(a,b)}onMouseEnter_(){this.picker_.focus({preventScroll:!0})}onMouseLeave_(){this.picker_.blur();const a=this.getHighlighted_();a&&removeClass$$module$build$src$core$utils$dom(a,"blocklyColourHighlighted")}getHighlighted_(){if(!this.highlightedIndex_)return null;const a=this.columns_||FieldColour$$module$build$src$core$field_colour.COLUMNS,b=this.picker_.childNodes[Math.floor(this.highlightedIndex_/ +a)];return b?b.childNodes[this.highlightedIndex_%a]:null}setHighlightedCell_(a,b){const c=this.getHighlighted_();c&&removeClass$$module$build$src$core$utils$dom(c,"blocklyColourHighlighted");addClass$$module$build$src$core$utils$dom(a,"blocklyColourHighlighted");this.highlightedIndex_=b;setState$$module$build$src$core$utils$aria(this.picker_,State$$module$build$src$core$utils$aria.ACTIVEDESCENDANT,a.getAttribute("id"))}dropdownCreate_(){const a=this.columns_||FieldColour$$module$build$src$core$field_colour.COLUMNS, +b=this.colours_||FieldColour$$module$build$src$core$field_colour.COLOURS,c=this.titles_||FieldColour$$module$build$src$core$field_colour.TITLES,d=this.getValue(),e=document.createElement("table");e.className="blocklyColourTable";e.tabIndex=0;e.dir="ltr";setRole$$module$build$src$core$utils$aria(e,Role$$module$build$src$core$utils$aria.GRID);setState$$module$build$src$core$utils$aria(e,State$$module$build$src$core$utils$aria.EXPANDED,!0);setState$$module$build$src$core$utils$aria(e,State$$module$build$src$core$utils$aria.ROWCOUNT, +Math.floor(b.length/a));setState$$module$build$src$core$utils$aria(e,State$$module$build$src$core$utils$aria.COLCOUNT,a);let f;for(let g=0;gtr>td {\n border: .5px solid #888;\n box-sizing: border-box;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n padding: 0;\n width: 20px;\n}\n\n.blocklyColourTable>tr>td.blocklyColourHighlighted {\n border-color: #eee;\n box-shadow: 2px 2px 7px 2px rgba(0,0,0,.3);\n position: relative;\n}\n\n.blocklyColourSelected, .blocklyColourSelected:hover {\n border-color: #eee !important;\n outline: 1px solid #333;\n position: relative;\n}\n"); +register$$module$build$src$core$field_registry("field_colour",FieldColour$$module$build$src$core$field_colour);var module$build$src$core$field_colour={};module$build$src$core$field_colour.FieldColour=FieldColour$$module$build$src$core$field_colour;$.FieldCheckbox$$module$build$src$core$field_checkbox=class extends Field$$module$build$src$core$field{constructor(a,b,c){super(Field$$module$build$src$core$field.SKIP_SETUP);this.SERIALIZABLE=!0;this.CURSOR="default";this.checkChar_=$.FieldCheckbox$$module$build$src$core$field_checkbox.CHECK_CHAR;a!==Field$$module$build$src$core$field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}configure_(a){super.configure_(a);a.checkCharacter&&(this.checkChar_=a.checkCharacter)}saveState(){const a= +this.saveLegacyState($.FieldCheckbox$$module$build$src$core$field_checkbox);return null!==a?a:this.getValueBoolean()}initView(){super.initView();const a=this.getTextElement();addClass$$module$build$src$core$utils$dom(a,"blocklyCheckbox");a.style.display=this.value_?"block":"none"}render_(){this.textContent_&&(this.textContent_.nodeValue=this.getDisplayText_());this.updateSize_(this.getConstants().FIELD_CHECKBOX_X_OFFSET)}getDisplayText_(){return this.checkChar_}setCheckCharacter(a){this.checkChar_= +a||$.FieldCheckbox$$module$build$src$core$field_checkbox.CHECK_CHAR;this.forceRerender()}showEditor_(){this.setValue(!this.value_)}doClassValidation_(a){return!0===a||"TRUE"===a?"TRUE":!1===a||"FALSE"===a?"FALSE":null}doValueUpdate_(a){this.value_=this.convertValueToBool_(a);this.textElement_&&(this.textElement_.style.display=this.value_?"block":"none")}getValue(){return this.value_?"TRUE":"FALSE"}getValueBoolean(){return this.value_}getText(){return String(this.convertValueToBool_(this.value_))}convertValueToBool_(a){return"string"=== +typeof a?"TRUE"===a:!!a}static fromJson(a){return new this(a.checked,void 0,a)}};$.FieldCheckbox$$module$build$src$core$field_checkbox.CHECK_CHAR="\u2713";register$$module$build$src$core$field_registry("field_checkbox",$.FieldCheckbox$$module$build$src$core$field_checkbox);$.FieldCheckbox$$module$build$src$core$field_checkbox.prototype.DEFAULT_VALUE=!1;var module$build$src$core$field_checkbox={};module$build$src$core$field_checkbox.FieldCheckbox=$.FieldCheckbox$$module$build$src$core$field_checkbox;var FieldAngle$$module$build$src$core$field_angle=class extends $.FieldTextInput$$module$build$src$core$field_textinput{constructor(a,b,c){super(Field$$module$build$src$core$field.SKIP_SETUP);this.moveSurfaceWrapper_=this.clickSurfaceWrapper_=this.clickWrapper_=this.symbol_=this.line_=this.gauge_=this.editor_=null;this.SERIALIZABLE=!0;this.clockwise_=FieldAngle$$module$build$src$core$field_angle.CLOCKWISE;this.offset_=FieldAngle$$module$build$src$core$field_angle.OFFSET;this.wrap_=FieldAngle$$module$build$src$core$field_angle.WRAP; +this.round_=FieldAngle$$module$build$src$core$field_angle.ROUND;a!==Field$$module$build$src$core$field.SKIP_SETUP&&(c&&this.configure_(c),this.setValue(a),b&&this.setValidator(b))}configure_(a){super.configure_(a);switch(a.mode){case Mode$$module$build$src$core$field_angle.COMPASS:this.clockwise_=!0;this.offset_=90;break;case Mode$$module$build$src$core$field_angle.PROTRACTOR:this.clockwise_=!1,this.offset_=0}a.clockwise&&(this.clockwise_=a.clockwise);a.offset&&(this.offset_=a.offset);a.wrap&&(this.wrap_= +a.wrap);a.round&&(this.round_=a.round)}initView(){super.initView();this.symbol_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.TSPAN,{});this.symbol_.appendChild(document.createTextNode("\u00b0"));this.getTextElement().appendChild(this.symbol_)}render_(){super.render_();this.updateGraph_()}showEditor_(a){super.showEditor_(a,MOBILE$$module$build$src$core$utils$useragent||ANDROID$$module$build$src$core$utils$useragent||IPAD$$module$build$src$core$utils$useragent); +this.dropdownCreate_();getContentDiv$$module$build$src$core$dropdowndiv().appendChild(this.editor_);if(this.sourceBlock_ instanceof BlockSvg$$module$build$src$core$block_svg){if(!this.sourceBlock_.style.colourTertiary)throw Error("The renderer did not properly initialize the block style");setColour$$module$build$src$core$dropdowndiv(this.sourceBlock_.style.colourPrimary,this.sourceBlock_.style.colourTertiary)}showPositionedByField$$module$build$src$core$dropdowndiv(this,this.dropdownDispose_.bind(this)); +this.updateGraph_()}dropdownCreate_(){const a=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.SVG,{xmlns:SVG_NS$$module$build$src$core$utils$dom,"xmlns:html":HTML_NS$$module$build$src$core$utils$dom,"xmlns:xlink":XLINK_NS$$module$build$src$core$utils$dom,version:"1.1",height:2*FieldAngle$$module$build$src$core$field_angle.HALF+"px",width:2*FieldAngle$$module$build$src$core$field_angle.HALF+"px",style:"touch-action: none"}),b=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.CIRCLE, +{cx:FieldAngle$$module$build$src$core$field_angle.HALF,cy:FieldAngle$$module$build$src$core$field_angle.HALF,r:FieldAngle$$module$build$src$core$field_angle.RADIUS,"class":"blocklyAngleCircle"},a);this.gauge_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.PATH,{"class":"blocklyAngleGauge"},a);this.line_=createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{x1:FieldAngle$$module$build$src$core$field_angle.HALF,y1:FieldAngle$$module$build$src$core$field_angle.HALF, +"class":"blocklyAngleLine"},a);for(let c=0;360>c;c+=15)createSvgElement$$module$build$src$core$utils$dom(Svg$$module$build$src$core$utils$svg.LINE,{x1:FieldAngle$$module$build$src$core$field_angle.HALF+FieldAngle$$module$build$src$core$field_angle.RADIUS,y1:FieldAngle$$module$build$src$core$field_angle.HALF,x2:FieldAngle$$module$build$src$core$field_angle.HALF+FieldAngle$$module$build$src$core$field_angle.RADIUS-(0===c%45?10:5),y2:FieldAngle$$module$build$src$core$field_angle.HALF,"class":"blocklyAngleMarks", +transform:"rotate("+c+","+FieldAngle$$module$build$src$core$field_angle.HALF+","+FieldAngle$$module$build$src$core$field_angle.HALF+")"},a);this.clickWrapper_=conditionalBind$$module$build$src$core$browser_events(a,"click",this,this.hide_);this.clickSurfaceWrapper_=conditionalBind$$module$build$src$core$browser_events(b,"click",this,this.onMouseMove_,!0,!0);this.moveSurfaceWrapper_=conditionalBind$$module$build$src$core$browser_events(b,"mousemove",this,this.onMouseMove_,!0,!0);this.editor_=a}dropdownDispose_(){this.clickWrapper_&& +(unbind$$module$build$src$core$browser_events(this.clickWrapper_),this.clickWrapper_=null);this.clickSurfaceWrapper_&&(unbind$$module$build$src$core$browser_events(this.clickSurfaceWrapper_),this.clickSurfaceWrapper_=null);this.moveSurfaceWrapper_&&(unbind$$module$build$src$core$browser_events(this.moveSurfaceWrapper_),this.moveSurfaceWrapper_=null);this.line_=this.gauge_=null}hide_(){hideIfOwner$$module$build$src$core$dropdowndiv(this);hide$$module$build$src$core$widgetdiv()}onMouseMove_(a){var b= +this.gauge_.ownerSVGElement.getBoundingClientRect();const c=a.clientX-b.left-FieldAngle$$module$build$src$core$field_angle.HALF;a=a.clientY-b.top-FieldAngle$$module$build$src$core$field_angle.HALF;b=Math.atan(-a/c);isNaN(b)||(b=toDegrees$$module$build$src$core$utils$math(b),0>c?b+=180:0a&&(a+=360);a>this.wrap_&&(a-=360);return a}static fromJson(a){return new this(a.angle,void 0,a)}};FieldAngle$$module$build$src$core$field_angle.ROUND=15;FieldAngle$$module$build$src$core$field_angle.HALF=50;FieldAngle$$module$build$src$core$field_angle.CLOCKWISE=!1;FieldAngle$$module$build$src$core$field_angle.OFFSET=0; +FieldAngle$$module$build$src$core$field_angle.WRAP=360;FieldAngle$$module$build$src$core$field_angle.RADIUS=FieldAngle$$module$build$src$core$field_angle.HALF-1;register$$module$build$src$core$css("\n.blocklyAngleCircle {\n stroke: #444;\n stroke-width: 1;\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyAngleMarks {\n stroke: #444;\n stroke-width: 1;\n}\n\n.blocklyAngleGauge {\n fill: #f88;\n fill-opacity: .8;\n pointer-events: none;\n}\n\n.blocklyAngleLine {\n stroke: #f00;\n stroke-width: 2;\n stroke-linecap: round;\n pointer-events: none;\n}\n"); +register$$module$build$src$core$field_registry("field_angle",FieldAngle$$module$build$src$core$field_angle);FieldAngle$$module$build$src$core$field_angle.prototype.DEFAULT_VALUE=0;var Mode$$module$build$src$core$field_angle;(function(a){a.COMPASS="compass";a.PROTRACTOR="protractor"})(Mode$$module$build$src$core$field_angle||(Mode$$module$build$src$core$field_angle={}));var module$build$src$core$field_angle={};module$build$src$core$field_angle.FieldAngle=FieldAngle$$module$build$src$core$field_angle; +module$build$src$core$field_angle.Mode=Mode$$module$build$src$core$field_angle;var BlockMove$$module$build$src$core$events$events_block_move=class extends BlockBase$$module$build$src$core$events$events_block_base{constructor(a){super(a);this.type=MOVE$$module$build$src$core$events$utils;a&&(a.isShadow()&&(this.recordUndo=!1),a=this.currentLocation_(),this.oldParentId=a.parentId,this.oldInputName=a.inputName,this.oldCoordinate=a.coordinate)}toJson(){const a=super.toJson();a.newParentId=this.newParentId;a.newInputName=this.newInputName;this.newCoordinate&&(a.newCoordinate=`${Math.round(this.newCoordinate.x)}, `+ +`${Math.round(this.newCoordinate.y)}`);this.recordUndo||(a.recordUndo=this.recordUndo);return a}fromJson(a){super.fromJson(a);this.newParentId=a.newParentId;this.newInputName=a.newInputName;if(a.newCoordinate){const b=a.newCoordinate.split(",");this.newCoordinate=new Coordinate$$module$build$src$core$utils$coordinate(Number(b[0]),Number(b[1]))}void 0!==a.recordUndo&&(this.recordUndo=a.recordUndo)}recordNew(){const a=this.currentLocation_();this.newParentId=a.parentId;this.newInputName=a.inputName; +this.newCoordinate=a.coordinate}currentLocation_(){var a=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var b=a.getBlockById(this.blockId);if(!b)throw Error("The block associated with the block move event could not be found");a={};const c=b.getParent();if(c){if(a.parentId=c.id,b=c.getInputWithBlock(b))a.inputName=b.name}else a.coordinate=b.getRelativeToSurfaceXY();return a}isNull(){return this.oldParentId=== +this.newParentId&&this.oldInputName===this.newInputName&&Coordinate$$module$build$src$core$utils$coordinate.equals(this.oldCoordinate,this.newCoordinate)}run(a){var b=this.getEventWorkspace_();if(!this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson");var c=b.getBlockById(this.blockId);if(c){var d=a?this.newParentId:this.oldParentId,e=a?this.newInputName:this.oldInputName;a=a?this.newCoordinate:this.oldCoordinate;if(d){var f=b.getBlockById(d); +if(!f){console.warn("Can't connect to non-existent block: "+d);return}}c.getParent()&&c.unplug();if(a)e=c.getRelativeToSurfaceXY(),c.moveBy(a.x-e.x,a.y-e.y);else{b=c.outputConnection;if(!b||c.previousConnection&&c.previousConnection.isConnected())b=c.previousConnection;let g;c=b.type;if(e){if(c=f.getInput(e))g=c.connection}else c===ConnectionType$$module$build$src$core$connection_type.PREVIOUS_STATEMENT&&(g=f.nextConnection);g?b.connect(g):console.warn("Can't connect to non-existent input: "+e)}}else console.warn("Can't move non-existent block: "+ +this.blockId)}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,MOVE$$module$build$src$core$events$utils,BlockMove$$module$build$src$core$events$events_block_move);var module$build$src$core$events$events_block_move={};module$build$src$core$events$events_block_move.BlockMove=BlockMove$$module$build$src$core$events$events_block_move;var CommentBase$$module$build$src$core$events$events_comment_base=class extends Abstract$$module$build$src$core$events$events_abstract{constructor(a){super();this.isBlank=!a;a&&(this.commentId=a.id,this.workspaceId=a.workspace.id,this.group=getGroup$$module$build$src$core$events$utils(),this.recordUndo=getRecordUndo$$module$build$src$core$events$utils())}toJson(){const a=super.toJson();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson"); +a.commentId=this.commentId;return a}fromJson(a){super.fromJson(a);this.commentId=a.commentId}static CommentCreateDeleteHelper(a,b){var c=a.getEventWorkspace_();if(b){b=createElement$$module$build$src$core$utils$xml("xml");if(!a.xml)throw Error("Ecountered a comment event without proper xml");b.appendChild(a.xml);domToWorkspace$$module$build$src$core$xml(b,c)}else{if(!a.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");(c=c.getCommentById(a.commentId))? +c.dispose():console.warn("Can't uncreate non-existent comment: "+a.commentId)}}},module$build$src$core$events$events_comment_base={};module$build$src$core$events$events_comment_base.CommentBase=CommentBase$$module$build$src$core$events$events_comment_base;var CommentChange$$module$build$src$core$events$events_comment_change=class extends CommentBase$$module$build$src$core$events$events_comment_base{constructor(a,b,c){super(a);this.type=COMMENT_CHANGE$$module$build$src$core$events$utils;a&&(this.oldContents_="undefined"===typeof b?"":b,this.newContents_="undefined"===typeof c?"":c)}toJson(){const a=super.toJson();if(!this.oldContents_)throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson");if(!this.newContents_)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson"); +a.oldContents=this.oldContents_;a.newContents=this.newContents_;return a}fromJson(a){super.fromJson(a);this.oldContents_=a.oldContents;this.newContents_=a.newContents}isNull(){return this.oldContents_===this.newContents_}run(a){var b=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson");if(b=b.getCommentById(this.commentId)){var c=a?this.newContents_:this.oldContents_;if(!c){if(a)throw Error("The new contents is undefined. Either pass a value to the constructor, or call fromJson"); +throw Error("The old contents is undefined. Either pass a value to the constructor, or call fromJson");}b.setContent(c)}else console.warn("Can't change non-existent comment: "+this.commentId)}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,COMMENT_CHANGE$$module$build$src$core$events$utils,CommentChange$$module$build$src$core$events$events_comment_change);var module$build$src$core$events$events_comment_change={}; +module$build$src$core$events$events_comment_change.CommentChange=CommentChange$$module$build$src$core$events$events_comment_change;var CommentCreate$$module$build$src$core$events$events_comment_create=class extends CommentBase$$module$build$src$core$events$events_comment_base{constructor(a){super(a);this.type=COMMENT_CREATE$$module$build$src$core$events$utils;a&&(this.xml=a.toXmlWithXY())}toJson(){const a=super.toJson();if(!this.xml)throw Error("The comment XML is undefined. Either pass a comment to the constructor, or call fromJson");a.xml=domToText$$module$build$src$core$xml(this.xml);return a}fromJson(a){super.fromJson(a); +this.xml=textToDom$$module$build$src$core$xml(a.xml)}run(a){CommentBase$$module$build$src$core$events$events_comment_base.CommentCreateDeleteHelper(this,a)}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,COMMENT_CREATE$$module$build$src$core$events$utils,CommentCreate$$module$build$src$core$events$events_comment_create);var module$build$src$core$events$events_comment_create={};module$build$src$core$events$events_comment_create.CommentCreate=CommentCreate$$module$build$src$core$events$events_comment_create;var CommentDelete$$module$build$src$core$events$events_comment_delete=class extends CommentBase$$module$build$src$core$events$events_comment_base{constructor(a){super(a);this.type=COMMENT_DELETE$$module$build$src$core$events$utils;a&&(this.xml=a.toXmlWithXY())}run(a){CommentBase$$module$build$src$core$events$events_comment_base.CommentCreateDeleteHelper(this,!a)}}; +register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,COMMENT_DELETE$$module$build$src$core$events$utils,CommentDelete$$module$build$src$core$events$events_comment_delete);var module$build$src$core$events$events_comment_delete={};module$build$src$core$events$events_comment_delete.CommentDelete=CommentDelete$$module$build$src$core$events$events_comment_delete;var CommentMove$$module$build$src$core$events$events_comment_move=class extends CommentBase$$module$build$src$core$events$events_comment_base{constructor(a){super(a);this.type=COMMENT_MOVE$$module$build$src$core$events$utils;a&&(this.comment_=a,this.oldCoordinate_=a.getXY())}recordNew(){if(this.newCoordinate_)throw Error("Tried to record the new position of a comment on the same event twice.");if(!this.comment_)throw Error("The comment is undefined. Pass a comment to the constructor if you want to use the record functionality"); +this.newCoordinate_=this.comment_.getXY()}setOldCoordinate(a){this.oldCoordinate_=a}toJson(){const a=super.toJson();if(!this.oldCoordinate_)throw Error("The old comment position is undefined. Either pass a comment to the constructor, or call fromJson");if(!this.newCoordinate_)throw Error("The new comment position is undefined. Either call recordNew, or call fromJson");a.oldCoordinate=`${Math.round(this.oldCoordinate_.x)}, `+`${Math.round(this.oldCoordinate_.y)}`;a.newCoordinate=Math.round(this.newCoordinate_.x)+ +","+Math.round(this.newCoordinate_.y);return a}fromJson(a){super.fromJson(a);let b=a.oldCoordinate.split(",");this.oldCoordinate_=new Coordinate$$module$build$src$core$utils$coordinate(Number(b[0]),Number(b[1]));b=a.newCoordinate.split(",");this.newCoordinate_=new Coordinate$$module$build$src$core$utils$coordinate(Number(b[0]),Number(b[1]))}isNull(){return Coordinate$$module$build$src$core$utils$coordinate.equals(this.oldCoordinate_,this.newCoordinate_)}run(a){var b=this.getEventWorkspace_();if(!this.commentId)throw Error("The comment ID is undefined. Either pass a comment to the constructor, or call fromJson"); +if(b=b.getCommentById(this.commentId)){a=a?this.newCoordinate_:this.oldCoordinate_;if(!a)throw Error("Either oldCoordinate_ or newCoordinate_ is undefined. Either pass a comment to the constructor and call recordNew, or call fromJson");var c=b.getXY();b.moveBy(a.x-c.x,a.y-c.y)}else console.warn("Can't move non-existent comment: "+this.commentId)}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,COMMENT_MOVE$$module$build$src$core$events$utils,CommentMove$$module$build$src$core$events$events_comment_move); +var module$build$src$core$events$events_comment_move={};module$build$src$core$events$events_comment_move.CommentMove=CommentMove$$module$build$src$core$events$events_comment_move;var BlockDrag$$module$build$src$core$events$events_block_drag=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b,c){super(a?a.workspace.id:void 0);this.type=BLOCK_DRAG$$module$build$src$core$events$utils;a&&(this.blockId=a.id,this.isStart=b,this.blocks=c)}toJson(){const a=super.toJson();if(void 0===this.isStart)throw Error("Whether this event is the start of a drag is undefined. Either pass the value to the constructor, or call fromJson");if(void 0===this.blockId)throw Error("The block ID is undefined. Either pass a block to the constructor, or call fromJson"); +a.isStart=this.isStart;a.blockId=this.blockId;a.blocks=this.blocks;return a}fromJson(a){super.fromJson(a);this.isStart=a.isStart;this.blockId=a.blockId;this.blocks=a.blocks}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,BLOCK_DRAG$$module$build$src$core$events$utils,BlockDrag$$module$build$src$core$events$events_block_drag);var module$build$src$core$events$events_block_drag={};module$build$src$core$events$events_block_drag.BlockDrag=BlockDrag$$module$build$src$core$events$events_block_drag;var Ui$$module$build$src$core$events$events_ui=class extends UiBase$$module$build$src$core$events$events_ui_base{constructor(a,b,c,d){super(a?a.workspace.id:void 0);this.type=UI$$module$build$src$core$events$utils;this.blockId=a?a.id:null;this.element="undefined"===typeof b?"":b;this.oldValue="undefined"===typeof c?"":c;this.newValue="undefined"===typeof d?"":d}toJson(){const a=super.toJson();a.element=this.element;void 0!==this.newValue&&(a.newValue=this.newValue);this.blockId&&(a.blockId=this.blockId); +return a}fromJson(a){super.fromJson(a);this.element=a.element;this.newValue=a.newValue;this.blockId=a.blockId}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,UI$$module$build$src$core$events$utils,Ui$$module$build$src$core$events$events_ui);var module$build$src$core$events$events_ui={};module$build$src$core$events$events_ui.Ui=Ui$$module$build$src$core$events$events_ui;var FinishedLoading$$module$build$src$core$events$workspace_events=class extends Abstract$$module$build$src$core$events$events_abstract{constructor(a){super();this.isBlank=!0;this.recordUndo=!1;this.type=FINISHED_LOADING$$module$build$src$core$events$utils;this.isBlank=!!a;a&&(this.workspaceId=a.id)}toJson(){const a=super.toJson();if(!this.workspaceId)throw Error("The workspace ID is undefined. Either pass a workspace to the constructor, or call fromJson");a.workspaceId=this.workspaceId;return a}fromJson(a){super.fromJson(a); +this.workspaceId=a.workspaceId}};register$$module$build$src$core$registry(Type$$module$build$src$core$registry.EVENT,FINISHED_LOADING$$module$build$src$core$events$utils,FinishedLoading$$module$build$src$core$events$workspace_events);var module$build$src$core$events$workspace_events={};module$build$src$core$events$workspace_events.FinishedLoading=FinishedLoading$$module$build$src$core$events$workspace_events;var Abstract$$module$build$src$core$events$events,BLOCK_CHANGE$$module$build$src$core$events$events,BLOCK_CREATE$$module$build$src$core$events$events,BLOCK_DELETE$$module$build$src$core$events$events,BLOCK_DRAG$$module$build$src$core$events$events,BLOCK_MOVE$$module$build$src$core$events$events,BUBBLE_OPEN$$module$build$src$core$events$events,BUMP_EVENTS$$module$build$src$core$events$events,CHANGE$$module$build$src$core$events$events,CLICK$$module$build$src$core$events$events,COMMENT_CHANGE$$module$build$src$core$events$events, +COMMENT_CREATE$$module$build$src$core$events$events,COMMENT_DELETE$$module$build$src$core$events$events,COMMENT_MOVE$$module$build$src$core$events$events,CREATE$$module$build$src$core$events$events,DELETE$$module$build$src$core$events$events,FINISHED_LOADING$$module$build$src$core$events$events,MARKER_MOVE$$module$build$src$core$events$events,MOVE$$module$build$src$core$events$events,SELECTED$$module$build$src$core$events$events,THEME_CHANGE$$module$build$src$core$events$events,TOOLBOX_ITEM_SELECT$$module$build$src$core$events$events, +TRASHCAN_OPEN$$module$build$src$core$events$events,UI$$module$build$src$core$events$events,VAR_CREATE$$module$build$src$core$events$events,VAR_DELETE$$module$build$src$core$events$events,VAR_RENAME$$module$build$src$core$events$events,VIEWPORT_CHANGE$$module$build$src$core$events$events,clearPendingUndo$$module$build$src$core$events$events,disable$$module$build$src$core$events$events,enable$$module$build$src$core$events$events,filter$$module$build$src$core$events$events,fire$$module$build$src$core$events$events, +fromJson$$module$build$src$core$events$events,getDescendantIds$$module$build$src$core$events$events,get$$module$build$src$core$events$events,getGroup$$module$build$src$core$events$events,getRecordUndo$$module$build$src$core$events$events,isEnabled$$module$build$src$core$events$events,setGroup$$module$build$src$core$events$events,setRecordUndo$$module$build$src$core$events$events,disableOrphans$$module$build$src$core$events$events;Abstract$$module$build$src$core$events$events=Abstract$$module$build$src$core$events$events_abstract; +BLOCK_CHANGE$$module$build$src$core$events$events=CHANGE$$module$build$src$core$events$utils;BLOCK_CREATE$$module$build$src$core$events$events=CREATE$$module$build$src$core$events$utils;BLOCK_DELETE$$module$build$src$core$events$events=DELETE$$module$build$src$core$events$utils;BLOCK_DRAG$$module$build$src$core$events$events=BLOCK_DRAG$$module$build$src$core$events$utils;BLOCK_MOVE$$module$build$src$core$events$events=MOVE$$module$build$src$core$events$utils; +BUBBLE_OPEN$$module$build$src$core$events$events=BUBBLE_OPEN$$module$build$src$core$events$utils;BUMP_EVENTS$$module$build$src$core$events$events=BUMP_EVENTS$$module$build$src$core$events$utils;CHANGE$$module$build$src$core$events$events=CHANGE$$module$build$src$core$events$utils;CLICK$$module$build$src$core$events$events=CLICK$$module$build$src$core$events$utils;COMMENT_CHANGE$$module$build$src$core$events$events=COMMENT_CHANGE$$module$build$src$core$events$utils; +COMMENT_CREATE$$module$build$src$core$events$events=COMMENT_CREATE$$module$build$src$core$events$utils;COMMENT_DELETE$$module$build$src$core$events$events=COMMENT_DELETE$$module$build$src$core$events$utils;COMMENT_MOVE$$module$build$src$core$events$events=COMMENT_MOVE$$module$build$src$core$events$utils;CREATE$$module$build$src$core$events$events=CREATE$$module$build$src$core$events$utils;DELETE$$module$build$src$core$events$events=DELETE$$module$build$src$core$events$utils; +FINISHED_LOADING$$module$build$src$core$events$events=FINISHED_LOADING$$module$build$src$core$events$utils;MARKER_MOVE$$module$build$src$core$events$events=MARKER_MOVE$$module$build$src$core$events$utils;MOVE$$module$build$src$core$events$events=MOVE$$module$build$src$core$events$utils;SELECTED$$module$build$src$core$events$events=SELECTED$$module$build$src$core$events$utils;THEME_CHANGE$$module$build$src$core$events$events=THEME_CHANGE$$module$build$src$core$events$utils; +TOOLBOX_ITEM_SELECT$$module$build$src$core$events$events=TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils;TRASHCAN_OPEN$$module$build$src$core$events$events=TRASHCAN_OPEN$$module$build$src$core$events$utils;UI$$module$build$src$core$events$events=UI$$module$build$src$core$events$utils;VAR_CREATE$$module$build$src$core$events$events=VAR_CREATE$$module$build$src$core$events$utils;VAR_DELETE$$module$build$src$core$events$events=VAR_DELETE$$module$build$src$core$events$utils; +VAR_RENAME$$module$build$src$core$events$events=VAR_RENAME$$module$build$src$core$events$utils;VIEWPORT_CHANGE$$module$build$src$core$events$events=VIEWPORT_CHANGE$$module$build$src$core$events$utils;clearPendingUndo$$module$build$src$core$events$events=clearPendingUndo$$module$build$src$core$events$utils;disable$$module$build$src$core$events$events=disable$$module$build$src$core$events$utils;enable$$module$build$src$core$events$events=enable$$module$build$src$core$events$utils; +filter$$module$build$src$core$events$events=filter$$module$build$src$core$events$utils;fire$$module$build$src$core$events$events=fire$$module$build$src$core$events$utils;fromJson$$module$build$src$core$events$events=fromJson$$module$build$src$core$events$utils;getDescendantIds$$module$build$src$core$events$events=getDescendantIds$$module$build$src$core$events$utils;get$$module$build$src$core$events$events=get$$module$build$src$core$events$utils;getGroup$$module$build$src$core$events$events=getGroup$$module$build$src$core$events$utils; +getRecordUndo$$module$build$src$core$events$events=getRecordUndo$$module$build$src$core$events$utils;isEnabled$$module$build$src$core$events$events=isEnabled$$module$build$src$core$events$utils;setGroup$$module$build$src$core$events$events=setGroup$$module$build$src$core$events$utils;setRecordUndo$$module$build$src$core$events$events=setRecordUndo$$module$build$src$core$events$utils;disableOrphans$$module$build$src$core$events$events=disableOrphans$$module$build$src$core$events$utils; +$.module$build$src$core$events$events={};$.module$build$src$core$events$events.Abstract=Abstract$$module$build$src$core$events$events_abstract;$.module$build$src$core$events$events.BLOCK_CHANGE=CHANGE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BLOCK_CREATE=CREATE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BLOCK_DELETE=DELETE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BLOCK_DRAG=BLOCK_DRAG$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.BLOCK_MOVE=MOVE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BUBBLE_OPEN=BUBBLE_OPEN$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BUMP_EVENTS=BUMP_EVENTS$$module$build$src$core$events$utils;$.module$build$src$core$events$events.BlockBase=BlockBase$$module$build$src$core$events$events_block_base;$.module$build$src$core$events$events.BlockChange=BlockChange$$module$build$src$core$events$events_block_change; +$.module$build$src$core$events$events.BlockCreate=BlockCreate$$module$build$src$core$events$events_block_create;$.module$build$src$core$events$events.BlockDelete=BlockDelete$$module$build$src$core$events$events_block_delete;$.module$build$src$core$events$events.BlockDrag=BlockDrag$$module$build$src$core$events$events_block_drag;$.module$build$src$core$events$events.BlockMove=BlockMove$$module$build$src$core$events$events_block_move;$.module$build$src$core$events$events.BubbleOpen=BubbleOpen$$module$build$src$core$events$events_bubble_open; +$.module$build$src$core$events$events.BubbleType=BubbleType$$module$build$src$core$events$events_bubble_open;$.module$build$src$core$events$events.CHANGE=CHANGE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.CLICK=CLICK$$module$build$src$core$events$utils;$.module$build$src$core$events$events.COMMENT_CHANGE=COMMENT_CHANGE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.COMMENT_CREATE=COMMENT_CREATE$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.COMMENT_DELETE=COMMENT_DELETE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.COMMENT_MOVE=COMMENT_MOVE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.CREATE=CREATE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.Click=Click$$module$build$src$core$events$events_click;$.module$build$src$core$events$events.ClickTarget=ClickTarget$$module$build$src$core$events$events_click; +$.module$build$src$core$events$events.CommentBase=CommentBase$$module$build$src$core$events$events_comment_base;$.module$build$src$core$events$events.CommentChange=CommentChange$$module$build$src$core$events$events_comment_change;$.module$build$src$core$events$events.CommentCreate=CommentCreate$$module$build$src$core$events$events_comment_create;$.module$build$src$core$events$events.CommentDelete=CommentDelete$$module$build$src$core$events$events_comment_delete; +$.module$build$src$core$events$events.CommentMove=CommentMove$$module$build$src$core$events$events_comment_move;$.module$build$src$core$events$events.DELETE=DELETE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.FINISHED_LOADING=FINISHED_LOADING$$module$build$src$core$events$utils;$.module$build$src$core$events$events.FinishedLoading=FinishedLoading$$module$build$src$core$events$workspace_events;$.module$build$src$core$events$events.MARKER_MOVE=MARKER_MOVE$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.MOVE=MOVE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.MarkerMove=MarkerMove$$module$build$src$core$events$events_marker_move;$.module$build$src$core$events$events.SELECTED=SELECTED$$module$build$src$core$events$utils;$.module$build$src$core$events$events.Selected=Selected$$module$build$src$core$events$events_selected;$.module$build$src$core$events$events.THEME_CHANGE=THEME_CHANGE$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.TOOLBOX_ITEM_SELECT=TOOLBOX_ITEM_SELECT$$module$build$src$core$events$utils;$.module$build$src$core$events$events.TRASHCAN_OPEN=TRASHCAN_OPEN$$module$build$src$core$events$utils;$.module$build$src$core$events$events.ThemeChange=ThemeChange$$module$build$src$core$events$events_theme_change;$.module$build$src$core$events$events.ToolboxItemSelect=ToolboxItemSelect$$module$build$src$core$events$events_toolbox_item_select; +$.module$build$src$core$events$events.TrashcanOpen=TrashcanOpen$$module$build$src$core$events$events_trashcan_open;$.module$build$src$core$events$events.UI=UI$$module$build$src$core$events$utils;$.module$build$src$core$events$events.Ui=Ui$$module$build$src$core$events$events_ui;$.module$build$src$core$events$events.UiBase=UiBase$$module$build$src$core$events$events_ui_base;$.module$build$src$core$events$events.VAR_CREATE=VAR_CREATE$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.VAR_DELETE=VAR_DELETE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.VAR_RENAME=VAR_RENAME$$module$build$src$core$events$utils;$.module$build$src$core$events$events.VIEWPORT_CHANGE=VIEWPORT_CHANGE$$module$build$src$core$events$utils;$.module$build$src$core$events$events.VarBase=VarBase$$module$build$src$core$events$events_var_base;$.module$build$src$core$events$events.VarCreate=VarCreate$$module$build$src$core$events$events_var_create; +$.module$build$src$core$events$events.VarDelete=VarDelete$$module$build$src$core$events$events_var_delete;$.module$build$src$core$events$events.VarRename=VarRename$$module$build$src$core$events$events_var_rename;$.module$build$src$core$events$events.ViewportChange=ViewportChange$$module$build$src$core$events$events_viewport;$.module$build$src$core$events$events.clearPendingUndo=clearPendingUndo$$module$build$src$core$events$utils;$.module$build$src$core$events$events.disable=disable$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.disableOrphans=disableOrphans$$module$build$src$core$events$utils;$.module$build$src$core$events$events.enable=enable$$module$build$src$core$events$utils;$.module$build$src$core$events$events.filter=filter$$module$build$src$core$events$utils;$.module$build$src$core$events$events.fire=fire$$module$build$src$core$events$utils;$.module$build$src$core$events$events.fromJson=fromJson$$module$build$src$core$events$utils;$.module$build$src$core$events$events.get=get$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.getDescendantIds=getDescendantIds$$module$build$src$core$events$utils;$.module$build$src$core$events$events.getGroup=getGroup$$module$build$src$core$events$utils;$.module$build$src$core$events$events.getRecordUndo=getRecordUndo$$module$build$src$core$events$utils;$.module$build$src$core$events$events.isEnabled=isEnabled$$module$build$src$core$events$utils;$.module$build$src$core$events$events.setGroup=setGroup$$module$build$src$core$events$utils; +$.module$build$src$core$events$events.setRecordUndo=setRecordUndo$$module$build$src$core$events$utils;registerDefaultOptions$$module$build$src$core$contextmenu_items();var module$build$src$core$contextmenu_items={};module$build$src$core$contextmenu_items.registerCleanup=registerCleanup$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerCollapse=registerCollapse$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerCollapseExpandBlock=registerCollapseExpandBlock$$module$build$src$core$contextmenu_items; +module$build$src$core$contextmenu_items.registerComment=registerComment$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerDefaultOptions=registerDefaultOptions$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerDelete=registerDelete$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerDeleteAll=registerDeleteAll$$module$build$src$core$contextmenu_items; +module$build$src$core$contextmenu_items.registerDisable=registerDisable$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerDuplicate=registerDuplicate$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerExpand=registerExpand$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerHelp=registerHelp$$module$build$src$core$contextmenu_items; +module$build$src$core$contextmenu_items.registerInline=registerInline$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerRedo=registerRedo$$module$build$src$core$contextmenu_items;module$build$src$core$contextmenu_items.registerUndo=registerUndo$$module$build$src$core$contextmenu_items;var BlockDragger$$module$build$src$core$block_dragger=class{constructor(a,b){this.dragTarget_=null;this.wouldDeleteBlock_=!1;this.draggingBlock_=a;this.draggedConnectionManager_=new InsertionMarkerManager$$module$build$src$core$insertion_marker_manager(this.draggingBlock_);this.workspace_=b;this.startXY_=this.draggingBlock_.getRelativeToSurfaceXY();this.dragIconData_=initIconData$$module$build$src$core$block_dragger(a)}dispose(){this.dragIconData_.length=0;this.draggedConnectionManager_&&this.draggedConnectionManager_.dispose()}startDrag(a, +b){getGroup$$module$build$src$core$events$utils()||setGroup$$module$build$src$core$events$utils(!0);this.fireDragStartEvent_();this.workspace_.isMutator&&this.draggingBlock_.bringToFront();startTextWidthCache$$module$build$src$core$utils$dom();this.workspace_.setResizesEnabled(!1);disconnectUiStop$$module$build$src$core$block_animations();this.shouldDisconnect_(b)&&this.disconnectBlock_(b,a);this.draggingBlock_.setDragging(!0);this.draggingBlock_.moveToDragSurface()}shouldDisconnect_(a){return!!(this.draggingBlock_.getParent()|| +a&&this.draggingBlock_.nextConnection&&this.draggingBlock_.nextConnection.targetBlock())}disconnectBlock_(a,b){this.draggingBlock_.unplug(a);a=this.pixelsToWorkspaceUnits_(b);a=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startXY_,a);this.draggingBlock_.translate(a.x,a.y);disconnectUiEffect$$module$build$src$core$block_animations(this.draggingBlock_);this.draggedConnectionManager_.updateAvailableConnections()}fireDragStartEvent_(){const a=new (get$$module$build$src$core$events$utils(BLOCK_DRAG$$module$build$src$core$events$utils))(this.draggingBlock_, +!0,this.draggingBlock_.getDescendants(!1));fire$$module$build$src$core$events$utils(a)}drag(a,b){b=this.pixelsToWorkspaceUnits_(b);var c=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startXY_,b);this.draggingBlock_.moveDuringDrag(c);this.dragIcons_(b);c=this.dragTarget_;this.dragTarget_=this.workspace_.getDragTarget(a);this.draggedConnectionManager_.update(b,this.dragTarget_);a=this.wouldDeleteBlock_;this.wouldDeleteBlock_=this.draggedConnectionManager_.wouldDeleteBlock();a!==this.wouldDeleteBlock_&& +this.updateCursorDuringBlockDrag_();this.dragTarget_!==c&&(c&&c.onDragExit(this.draggingBlock_),this.dragTarget_&&this.dragTarget_.onDragEnter(this.draggingBlock_));this.dragTarget_&&this.dragTarget_.onDragOver(this.draggingBlock_)}endDrag(a,b){this.drag(a,b);this.dragIconData_=[];this.fireDragEndEvent_();stopTextWidthCache$$module$build$src$core$utils$dom();disconnectUiStop$$module$build$src$core$block_animations();a=null;this.dragTarget_&&this.dragTarget_.shouldPreventMove(this.draggingBlock_)? +b=this.startXY_:(b=this.getNewLocationAfterDrag_(b),a=b.delta,b=b.newLocation);this.draggingBlock_.moveOffDragSurface(b);if(this.dragTarget_)this.dragTarget_.onDrop(this.draggingBlock_);this.maybeDeleteBlock_()||(this.draggingBlock_.setDragging(!1),a?this.updateBlockAfterMove_(a):bumpObjectIntoBounds$$module$build$src$core$bump_objects(this.draggingBlock_.workspace,this.workspace_.getMetricsManager().getScrollMetrics(!0),this.draggingBlock_));this.workspace_.setResizesEnabled(!0);setGroup$$module$build$src$core$events$utils(!1)}getNewLocationAfterDrag_(a){a= +this.pixelsToWorkspaceUnits_(a);const b=Coordinate$$module$build$src$core$utils$coordinate.sum(this.startXY_,a);return{delta:a,newLocation:b}}maybeDeleteBlock_(){return this.wouldDeleteBlock_?(this.fireMoveEvent_(),this.draggingBlock_.dispose(!1,!0),draggingConnections$$module$build$src$core$common.length=0,!0):!1}updateBlockAfterMove_(a){this.draggingBlock_.moveConnections(a.x,a.y);this.fireMoveEvent_();this.draggedConnectionManager_.wouldConnectBlock()?this.draggedConnectionManager_.applyConnections(): +this.draggingBlock_.render();this.draggingBlock_.scheduleSnapAndBump()}fireDragEndEvent_(){const a=new (get$$module$build$src$core$events$utils(BLOCK_DRAG$$module$build$src$core$events$utils))(this.draggingBlock_,!1,this.draggingBlock_.getDescendants(!1));fire$$module$build$src$core$events$utils(a)}updateToolboxStyle_(a){const b=this.workspace_.getToolbox();if(b){const c=this.draggingBlock_.isDeletable()?"blocklyToolboxDelete":"blocklyToolboxGrab";a&&"function"===typeof b.removeStyle?b.removeStyle(c): +a||"function"!==typeof b.addStyle||b.addStyle(c)}}fireMoveEvent_(){const a=new (get$$module$build$src$core$events$utils(MOVE$$module$build$src$core$events$utils))(this.draggingBlock_);a.oldCoordinate=this.startXY_;a.recordNew();fire$$module$build$src$core$events$utils(a)}updateCursorDuringBlockDrag_(){this.draggingBlock_.setDeleteStyle(this.wouldDeleteBlock_)}pixelsToWorkspaceUnits_(a){a=new Coordinate$$module$build$src$core$utils$coordinate(a.x/this.workspace_.scale,a.y/this.workspace_.scale);this.workspace_.isMutator&& +a.scale(1/this.workspace_.options.parentWorkspace.scale);return a}dragIcons_(a){for(let b=0;b void;\n preventDefault: () => void;\n}\n\n/** Length in ms for a touch to become a long press. */\nconst LONGPRESS = 750;\n\n/**\n * Whether touch is enabled in the browser.\n * Copied from Closure's goog.events.BrowserFeature.TOUCH_ENABLED\n */\nexport const TOUCH_ENABLED = 'ontouchstart' in globalThis ||\n !!(globalThis['document'] && document.documentElement &&\n 'ontouchstart' in\n document.documentElement) || // IE10 uses non-standard touch events,\n // so it has a different check.\n !!(globalThis['navigator'] &&\n (globalThis['navigator']['maxTouchPoints'] ||\n (globalThis['navigator'] as any)['msMaxTouchPoints']));\n\n/** Which touch events are we currently paying attention to? */\nlet touchIdentifier_: string|null = null;\n\n/**\n * The TOUCH_MAP lookup dictionary specifies additional touch events to fire,\n * in conjunction with mouse events.\n *\n * @alias Blockly.Touch.TOUCH_MAP\n */\nexport const TOUCH_MAP: {[key: string]: string[]} = globalThis['PointerEvent'] ?\n {\n 'mousedown': ['pointerdown'],\n 'mouseenter': ['pointerenter'],\n 'mouseleave': ['pointerleave'],\n 'mousemove': ['pointermove'],\n 'mouseout': ['pointerout'],\n 'mouseover': ['pointerover'],\n 'mouseup': ['pointerup', 'pointercancel'],\n 'touchend': ['pointerup'],\n 'touchcancel': ['pointercancel'],\n } :\n {\n 'mousedown': ['touchstart'],\n 'mousemove': ['touchmove'],\n 'mouseup': ['touchend', 'touchcancel'],\n };\n\n/** PID of queued long-press task. */\nlet longPid_: AnyDuringMigration = 0;\n\n/**\n * Context menus on touch devices are activated using a long-press.\n * Unfortunately the contextmenu touch event is currently (2015) only supported\n * by Chrome. This function is fired on any touchstart event, queues a task,\n * which after about a second opens the context menu. The tasks is killed\n * if the touch event terminates early.\n *\n * @param e Touch start event.\n * @param gesture The gesture that triggered this longStart.\n * @alias Blockly.Touch.longStart\n * @internal\n */\nexport function longStart(e: Event, gesture: Gesture) {\n longStop();\n // Punt on multitouch events.\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'Event'.\n if ((e as AnyDuringMigration).changedTouches &&\n (e as AnyDuringMigration).changedTouches.length !== 1) {\n return;\n }\n longPid_ = setTimeout(function() {\n // TODO(#6097): Make types accurate, possibly by refactoring touch handling.\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'Event'.\n const typelessEvent = e as AnyDuringMigration;\n // Additional check to distinguish between touch events and pointer events\n if (typelessEvent.changedTouches) {\n // TouchEvent\n typelessEvent.button = 2; // Simulate a right button click.\n // e was a touch event. It needs to pretend to be a mouse event.\n typelessEvent.clientX = typelessEvent.changedTouches[0].clientX;\n typelessEvent.clientY = typelessEvent.changedTouches[0].clientY;\n }\n\n // Let the gesture route the right-click correctly.\n if (gesture) {\n gesture.handleRightClick(e);\n }\n }, LONGPRESS);\n}\n\n/**\n * Nope, that's not a long-press. Either touchend or touchcancel was fired,\n * or a drag hath begun. Kill the queued long-press task.\n *\n * @alias Blockly.Touch.longStop\n * @internal\n */\nexport function longStop() {\n if (longPid_) {\n clearTimeout(longPid_);\n longPid_ = 0;\n }\n}\n\n/**\n * Clear the touch identifier that tracks which touch stream to pay attention\n * to. This ends the current drag/gesture and allows other pointers to be\n * captured.\n *\n * @alias Blockly.Touch.clearTouchIdentifier\n */\nexport function clearTouchIdentifier() {\n touchIdentifier_ = null;\n}\n\n/**\n * Decide whether Blockly should handle or ignore this event.\n * Mouse and touch events require special checks because we only want to deal\n * with one touch stream at a time. All other events should always be handled.\n *\n * @param e The event to check.\n * @returns True if this event should be passed through to the registered\n * handler; false if it should be blocked.\n * @alias Blockly.Touch.shouldHandleEvent\n */\nexport function shouldHandleEvent(e: Event|PseudoEvent): boolean {\n return !isMouseOrTouchEvent(e) || checkTouchIdentifier(e);\n}\n\n/**\n * Get the touch identifier from the given event. If it was a mouse event, the\n * identifier is the string 'mouse'.\n *\n * @param e Mouse event or touch event.\n * @returns The touch identifier from the first changed touch, if defined.\n * Otherwise 'mouse'.\n * @alias Blockly.Touch.getTouchIdentifierFromEvent\n */\nexport function getTouchIdentifierFromEvent(e: Event|PseudoEvent): string {\n if (e instanceof MouseEvent) {\n return 'mouse';\n }\n\n if (e instanceof PointerEvent) {\n return String(e.pointerId);\n }\n\n /**\n * TODO(#6097): Fix types. This is a catch-all for everything but mouse\n * and pointer events.\n */\n const pseudoEvent = /** {!PseudoEvent} */ e;\n\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'. AnyDuringMigration because: Property\n // 'changedTouches' does not exist on type 'PseudoEvent | Event'.\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'. AnyDuringMigration because: Property\n // 'changedTouches' does not exist on type 'PseudoEvent | Event'.\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'.\n return (pseudoEvent as AnyDuringMigration).changedTouches &&\n (pseudoEvent as AnyDuringMigration).changedTouches[0] &&\n (pseudoEvent as AnyDuringMigration).changedTouches[0].identifier !==\n undefined &&\n (pseudoEvent as AnyDuringMigration).changedTouches[0].identifier !==\n null ?\n String((pseudoEvent as AnyDuringMigration).changedTouches[0].identifier) :\n 'mouse';\n}\n\n/**\n * Check whether the touch identifier on the event matches the current saved\n * identifier. If there is no identifier, that means it's a mouse event and\n * we'll use the identifier \"mouse\". This means we won't deal well with\n * multiple mice being used at the same time. That seems okay.\n * If the current identifier was unset, save the identifier from the\n * event. This starts a drag/gesture, during which touch events with other\n * identifiers will be silently ignored.\n *\n * @param e Mouse event or touch event.\n * @returns Whether the identifier on the event matches the current saved\n * identifier.\n * @alias Blockly.Touch.checkTouchIdentifier\n */\nexport function checkTouchIdentifier(e: Event|PseudoEvent): boolean {\n const identifier = getTouchIdentifierFromEvent(e);\n\n // if (touchIdentifier_) is insufficient because Android touch\n // identifiers may be zero.\n if (touchIdentifier_ !== undefined && touchIdentifier_ !== null) {\n // We're already tracking some touch/mouse event. Is this from the same\n // source?\n return touchIdentifier_ === identifier;\n }\n if (e.type === 'mousedown' || e.type === 'touchstart' ||\n e.type === 'pointerdown') {\n // No identifier set yet, and this is the start of a drag. Set it and\n // return.\n touchIdentifier_ = identifier;\n return true;\n }\n // There was no identifier yet, but this wasn't a start event so we're going\n // to ignore it. This probably means that another drag finished while this\n // pointer was down.\n return false;\n}\n\n/**\n * Set an event's clientX and clientY from its first changed touch. Use this to\n * make a touch event work in a mouse event handler.\n *\n * @param e A touch event.\n * @alias Blockly.Touch.setClientFromTouch\n */\nexport function setClientFromTouch(e: Event|PseudoEvent) {\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'.\n if (e.type.startsWith('touch') && (e as AnyDuringMigration).changedTouches) {\n // Map the touch event's properties to the event.\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'.\n const touchPoint = (e as AnyDuringMigration).changedTouches[0];\n // AnyDuringMigration because: Property 'clientX' does not exist on type\n // 'PseudoEvent | Event'.\n (e as AnyDuringMigration).clientX = touchPoint.clientX;\n // AnyDuringMigration because: Property 'clientY' does not exist on type\n // 'PseudoEvent | Event'.\n (e as AnyDuringMigration).clientY = touchPoint.clientY;\n }\n}\n\n/**\n * Check whether a given event is a mouse, touch, or pointer event.\n *\n * @param e An event.\n * @returns True if it is a mouse, touch, or pointer event; false otherwise.\n * @alias Blockly.Touch.isMouseOrTouchEvent\n */\nexport function isMouseOrTouchEvent(e: Event|PseudoEvent): boolean {\n return e.type.startsWith('touch') || e.type.startsWith('mouse') ||\n e.type.startsWith('pointer');\n}\n\n/**\n * Check whether a given event is a touch event or a pointer event.\n *\n * @param e An event.\n * @returns True if it is a touch or pointer event; false otherwise.\n * @alias Blockly.Touch.isTouchEvent\n */\nexport function isTouchEvent(e: Event|PseudoEvent): boolean {\n return e.type.startsWith('touch') || e.type.startsWith('pointer');\n}\n\n/**\n * Split an event into an array of events, one per changed touch or mouse\n * point.\n *\n * @param e A mouse event or a touch event with one or more changed touches.\n * @returns An array of events or pseudo events.\n * Each pseudo-touch event will have exactly one changed touch and there\n * will be no real touch events.\n * @alias Blockly.Touch.splitEventByTouches\n */\nexport function splitEventByTouches(e: Event): Array {\n const events = [];\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'.\n if ((e as AnyDuringMigration).changedTouches) {\n // AnyDuringMigration because: Property 'changedTouches' does not exist on\n // type 'PseudoEvent | Event'.\n for (let i = 0; i < (e as AnyDuringMigration).changedTouches.length; i++) {\n const newEvent = {\n type: e.type,\n // AnyDuringMigration because: Property 'changedTouches' does not exist\n // on type 'PseudoEvent | Event'.\n changedTouches: [(e as AnyDuringMigration).changedTouches[i]],\n target: e.target,\n stopPropagation() {\n e.stopPropagation();\n },\n preventDefault() {\n e.preventDefault();\n },\n };\n events[i] = newEvent;\n }\n } else {\n events.push(e);\n }\n // AnyDuringMigration because: Type '(Event | { type: string; changedTouches:\n // Touch[]; target: EventTarget | null; stopPropagation(): void;\n // preventDefault(): void; })[]' is not assignable to type '(PseudoEvent |\n // Event)[]'.\n return events as AnyDuringMigration;\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Browser event handling.\n *\n * @namespace Blockly.browserEvents\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.browserEvents');\n\nimport * as Touch from './touch.js';\nimport * as userAgent from './utils/useragent.js';\n\n\n/**\n * Blockly opaque event data used to unbind events when using\n * `bind` and `conditionalBind`.\n *\n * @alias Blockly.browserEvents.Data\n */\nexport type Data = [EventTarget, string, (e: Event) => void][];\n\n/**\n * The multiplier for scroll wheel deltas using the line delta mode.\n * See https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode\n * for more information on deltaMode.\n */\nconst LINE_MODE_MULTIPLIER = 40;\n\n/**\n * The multiplier for scroll wheel deltas using the page delta mode.\n * See https://developer.mozilla.org/en-US/docs/Web/API/WheelEvent/deltaMode\n * for more information on deltaMode.\n */\nconst PAGE_MODE_MULTIPLIER = 125;\n\n/**\n * Bind an event handler that can be ignored if it is not part of the active\n * touch stream.\n * Use this for events that either start or continue a multi-part gesture (e.g.\n * mousedown or mousemove, which may be part of a drag or click).\n *\n * @param node Node upon which to listen.\n * @param name Event name to listen to (e.g. 'mousedown').\n * @param thisObject The value of 'this' in the function.\n * @param func Function to call when event is triggered.\n * @param opt_noCaptureIdentifier True if triggering on this event should not\n * block execution of other event handlers on this touch or other\n * simultaneous touches. False by default.\n * @param opt_noPreventDefault True if triggering on this event should prevent\n * the default handler. False by default. If opt_noPreventDefault is\n * provided, opt_noCaptureIdentifier must also be provided.\n * @returns Opaque data that can be passed to unbindEvent_.\n * @alias Blockly.browserEvents.conditionalBind\n */\nexport function conditionalBind(\n node: EventTarget, name: string, thisObject: Object|null, func: Function,\n opt_noCaptureIdentifier?: boolean, opt_noPreventDefault?: boolean): Data {\n let handled = false;\n /**\n *\n * @param e\n */\n function wrapFunc(e: Event) {\n const captureIdentifier = !opt_noCaptureIdentifier;\n // Handle each touch point separately. If the event was a mouse event, this\n // will hand back an array with one element, which we're fine handling.\n const events = Touch.splitEventByTouches(e);\n for (let i = 0; i < events.length; i++) {\n const event = events[i];\n if (captureIdentifier && !Touch.shouldHandleEvent(event)) {\n continue;\n }\n Touch.setClientFromTouch(event);\n if (thisObject) {\n func.call(thisObject, event);\n } else {\n func(event);\n }\n handled = true;\n }\n }\n\n const bindData: Data = [];\n if (globalThis['PointerEvent'] && name in Touch.TOUCH_MAP) {\n for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) {\n const type = Touch.TOUCH_MAP[name][i];\n node.addEventListener(type, wrapFunc, false);\n bindData.push([node, type, wrapFunc]);\n }\n } else {\n node.addEventListener(name, wrapFunc, false);\n bindData.push([node, name, wrapFunc]);\n\n // Add equivalent touch event.\n if (name in Touch.TOUCH_MAP) {\n const touchWrapFunc = (e: Event) => {\n wrapFunc(e);\n // Calling preventDefault stops the browser from scrolling/zooming the\n // page.\n const preventDef = !opt_noPreventDefault;\n if (handled && preventDef) {\n e.preventDefault();\n }\n };\n for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) {\n const type = Touch.TOUCH_MAP[name][i];\n node.addEventListener(type, touchWrapFunc, false);\n bindData.push([node, type, touchWrapFunc]);\n }\n }\n }\n return bindData;\n}\n\n/**\n * Bind an event handler that should be called regardless of whether it is part\n * of the active touch stream.\n * Use this for events that are not part of a multi-part gesture (e.g.\n * mouseover for tooltips).\n *\n * @param node Node upon which to listen.\n * @param name Event name to listen to (e.g. 'mousedown').\n * @param thisObject The value of 'this' in the function.\n * @param func Function to call when event is triggered.\n * @returns Opaque data that can be passed to unbindEvent_.\n * @alias Blockly.browserEvents.bind\n */\nexport function bind(\n node: EventTarget, name: string, thisObject: Object|null,\n func: Function): Data {\n /**\n *\n * @param e\n */\n function wrapFunc(e: Event) {\n if (thisObject) {\n func.call(thisObject, e);\n } else {\n func(e);\n }\n }\n\n const bindData: Data = [];\n if (globalThis['PointerEvent'] && name in Touch.TOUCH_MAP) {\n for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) {\n const type = Touch.TOUCH_MAP[name][i];\n node.addEventListener(type, wrapFunc, false);\n bindData.push([node, type, wrapFunc]);\n }\n } else {\n node.addEventListener(name, wrapFunc, false);\n bindData.push([node, name, wrapFunc]);\n\n // Add equivalent touch event.\n if (name in Touch.TOUCH_MAP) {\n const touchWrapFunc = (e: Event) => {\n // Punt on multitouch events.\n if (e instanceof TouchEvent && e.changedTouches &&\n e.changedTouches.length === 1) {\n // Map the touch event's properties to the event.\n const touchPoint = e.changedTouches[0];\n // TODO (6311): We are trying to make a touch event look like a mouse\n // event, which is not allowed, because it requires adding more\n // properties to the event. How do we want to deal with this?\n (e as AnyDuringMigration).clientX = touchPoint.clientX;\n (e as AnyDuringMigration).clientY = touchPoint.clientY;\n }\n wrapFunc(e);\n\n // Stop the browser from scrolling/zooming the page.\n e.preventDefault();\n };\n for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) {\n const type = Touch.TOUCH_MAP[name][i];\n node.addEventListener(type, touchWrapFunc, false);\n bindData.push([node, type, touchWrapFunc]);\n }\n }\n }\n return bindData;\n}\n\n/**\n * Unbind one or more events event from a function call.\n *\n * @param bindData Opaque data from bindEvent_.\n * This list is emptied during the course of calling this function.\n * @returns The function call.\n * @alias Blockly.browserEvents.unbind\n */\nexport function unbind(bindData: Data): (e: Event) => void {\n // Accessing an element of the last property of the array is unsafe if the\n // bindData is an empty array. But that should never happen because developers\n // should only pass Data from bind or conditionalBind.\n const callback = bindData[bindData.length - 1][2];\n while (bindData.length) {\n const bindDatum = bindData.pop();\n const node = bindDatum![0];\n const name = bindDatum![1];\n const func = bindDatum![2];\n node.removeEventListener(name, func, false);\n }\n return callback;\n}\n\n/**\n * Returns true if this event is targeting a text input widget?\n *\n * @param e An event.\n * @returns True if text input.\n * @alias Blockly.browserEvents.isTargetInput\n */\nexport function isTargetInput(e: Event): boolean {\n if (e.target instanceof HTMLElement) {\n if (e.target.isContentEditable ||\n e.target.getAttribute('data-is-text-input') === 'true') {\n return true;\n }\n\n if (e.target instanceof HTMLInputElement) {\n const target = e.target;\n return target.type === 'text' || target.type === 'number' ||\n target.type === 'email' || target.type === 'password' ||\n target.type === 'search' || target.type === 'tel' ||\n target.type === 'url';\n }\n\n if (e.target instanceof HTMLTextAreaElement) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Returns true this event is a right-click.\n *\n * @param e Mouse event.\n * @returns True if right-click.\n * @alias Blockly.browserEvents.isRightButton\n */\nexport function isRightButton(e: MouseEvent): boolean {\n if (e.ctrlKey && userAgent.MAC) {\n // Control-clicking on Mac OS X is treated as a right-click.\n // WebKit on Mac OS X fails to change button to 2 (but Gecko does).\n return true;\n }\n return e.button === 2;\n}\n\n/**\n * Returns the converted coordinates of the given mouse event.\n * The origin (0,0) is the top-left corner of the Blockly SVG.\n *\n * @param e Mouse event.\n * @param svg SVG element.\n * @param matrix Inverted screen CTM to use.\n * @returns Object with .x and .y properties.\n * @alias Blockly.browserEvents.mouseToSvg\n */\nexport function mouseToSvg(\n e: MouseEvent, svg: SVGSVGElement, matrix: SVGMatrix|null): SVGPoint {\n const svgPoint = svg.createSVGPoint();\n svgPoint.x = e.clientX;\n svgPoint.y = e.clientY;\n\n if (!matrix) {\n matrix = svg.getScreenCTM()!.inverse();\n }\n return svgPoint.matrixTransform(matrix);\n}\n\n/**\n * Returns the scroll delta of a mouse event in pixel units.\n *\n * @param e Mouse event.\n * @returns Scroll delta object with .x and .y properties.\n * @alias Blockly.browserEvents.getScrollDeltaPixels\n */\nexport function getScrollDeltaPixels(e: WheelEvent): {x: number, y: number} {\n switch (e.deltaMode) {\n case 0x00: // Pixel mode.\n default:\n return {x: e.deltaX, y: e.deltaY};\n case 0x01: // Line mode.\n return {\n x: e.deltaX * LINE_MODE_MULTIPLIER,\n y: e.deltaY * LINE_MODE_MULTIPLIER,\n };\n case 0x02: // Page mode.\n return {\n x: e.deltaX * PAGE_MODE_MULTIPLIER,\n y: e.deltaY * PAGE_MODE_MULTIPLIER,\n };\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Common functions used both internally and externally, but which\n * must not be at the top level to avoid circular dependencies.\n *\n * @namespace Blockly.common\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.common');\n\n/* eslint-disable-next-line no-unused-vars */\nimport type {Block} from './block.js';\nimport {BlockDefinition, Blocks} from './blocks.js';\nimport type {Connection} from './connection.js';\nimport type {ICopyable} from './interfaces/i_copyable.js';\nimport type {Workspace} from './workspace.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/** Database of all workspaces. */\nconst WorkspaceDB_ = Object.create(null);\n\n\n/**\n * Find the workspace with the specified ID.\n *\n * @param id ID of workspace to find.\n * @returns The sought after workspace or null if not found.\n */\nexport function getWorkspaceById(id: string): Workspace|null {\n return WorkspaceDB_[id] || null;\n}\n\n/**\n * Find all workspaces.\n *\n * @returns Array of workspaces.\n */\nexport function getAllWorkspaces(): Workspace[] {\n const workspaces = [];\n for (const workspaceId in WorkspaceDB_) {\n workspaces.push(WorkspaceDB_[workspaceId]);\n }\n return workspaces;\n}\n\n/**\n * Register a workspace in the workspace db.\n *\n * @param workspace\n */\nexport function registerWorkspace(workspace: Workspace) {\n WorkspaceDB_[workspace.id] = workspace;\n}\n\n/**\n * Unregister a workspace from the workspace db.\n *\n * @param workspace\n */\nexport function unregisterWorkpace(workspace: Workspace) {\n delete WorkspaceDB_[workspace.id];\n}\n\n/**\n * The main workspace most recently used.\n * Set by Blockly.WorkspaceSvg.prototype.markFocused\n */\nlet mainWorkspace: Workspace;\n\n/**\n * Returns the last used top level workspace (based on focus). Try not to use\n * this function, particularly if there are multiple Blockly instances on a\n * page.\n *\n * @returns The main workspace.\n * @alias Blockly.common.getMainWorkspace\n */\nexport function getMainWorkspace(): Workspace {\n return mainWorkspace;\n}\n\n/**\n * Sets last used main workspace.\n *\n * @param workspace The most recently used top level workspace.\n * @alias Blockly.common.setMainWorkspace\n */\nexport function setMainWorkspace(workspace: Workspace) {\n mainWorkspace = workspace;\n}\n\n/**\n * Currently selected copyable object.\n */\nlet selected: ICopyable|null = null;\n\n/**\n * Returns the currently selected copyable object.\n *\n * @alias Blockly.common.getSelected\n */\nexport function getSelected(): ICopyable|null {\n return selected;\n}\n\n/**\n * Sets the currently selected block. This function does not visually mark the\n * block as selected or fire the required events. If you wish to\n * programmatically select a block, use `BlockSvg#select`.\n *\n * @param newSelection The newly selected block.\n * @alias Blockly.common.setSelected\n * @internal\n */\nexport function setSelected(newSelection: ICopyable|null) {\n selected = newSelection;\n}\n\n/**\n * Container element in which to render the WidgetDiv, DropDownDiv and Tooltip.\n */\nlet parentContainer: Element|null;\n\n/**\n * Get the container element in which to render the WidgetDiv, DropDownDiv and\n * Tooltip.\n *\n * @returns The parent container.\n * @alias Blockly.common.getParentContainer\n */\nexport function getParentContainer(): Element|null {\n return parentContainer;\n}\n\n/**\n * Set the parent container. This is the container element that the WidgetDiv,\n * DropDownDiv, and Tooltip are rendered into the first time `Blockly.inject`\n * is called.\n * This method is a NOP if called after the first `Blockly.inject`.\n *\n * @param newParent The container element.\n * @alias Blockly.common.setParentContainer\n */\nexport function setParentContainer(newParent: Element) {\n parentContainer = newParent;\n}\n\n/**\n * Size the SVG image to completely fill its container. Call this when the view\n * actually changes sizes (e.g. on a window resize/device orientation change).\n * See workspace.resizeContents to resize the workspace when the contents\n * change (e.g. when a block is added or removed).\n * Record the height/width of the SVG image.\n *\n * @param workspace Any workspace in the SVG.\n * @alias Blockly.common.svgResize\n */\nexport function svgResize(workspace: WorkspaceSvg) {\n let mainWorkspace = workspace;\n while (mainWorkspace.options.parentWorkspace) {\n mainWorkspace = mainWorkspace.options.parentWorkspace;\n }\n const svg = mainWorkspace.getParentSvg();\n const cachedSize = mainWorkspace.getCachedParentSvgSize();\n const div = svg.parentElement;\n if (!(div instanceof HTMLElement)) {\n // Workspace deleted, or something.\n return;\n }\n\n const width = div.offsetWidth;\n const height = div.offsetHeight;\n if (cachedSize.width !== width) {\n svg.setAttribute('width', width + 'px');\n mainWorkspace.setCachedParentSvgSize(width, null);\n }\n if (cachedSize.height !== height) {\n svg.setAttribute('height', height + 'px');\n mainWorkspace.setCachedParentSvgSize(null, height);\n }\n mainWorkspace.resize();\n}\n\n/**\n * All of the connections on blocks that are currently being dragged.\n */\nexport const draggingConnections: Connection[] = [];\n\n/**\n * Get a map of all the block's descendants mapping their type to the number of\n * children with that type.\n *\n * @param block The block to map.\n * @param opt_stripFollowing Optionally ignore all following\n * statements (blocks that are not inside a value or statement input\n * of the block).\n * @returns Map of types to type counts for descendants of the bock.\n * @alias Blockly.common.getBlockTypeCounts\n */\nexport function getBlockTypeCounts(\n block: Block, opt_stripFollowing?: boolean): {[key: string]: number} {\n const typeCountsMap = Object.create(null);\n const descendants = block.getDescendants(true);\n if (opt_stripFollowing) {\n const nextBlock = block.getNextBlock();\n if (nextBlock) {\n const index = descendants.indexOf(nextBlock);\n descendants.splice(index, descendants.length - index);\n }\n }\n for (let i = 0, checkBlock; checkBlock = descendants[i]; i++) {\n if (typeCountsMap[checkBlock.type]) {\n typeCountsMap[checkBlock.type]++;\n } else {\n typeCountsMap[checkBlock.type] = 1;\n }\n }\n return typeCountsMap;\n}\n\n/**\n * Helper function for defining a block from JSON. The resulting function has\n * the correct value of jsonDef at the point in code where jsonInit is called.\n *\n * @param jsonDef The JSON definition of a block.\n * @returns A function that calls jsonInit with the correct value\n * of jsonDef.\n */\nfunction jsonInitFactory(jsonDef: AnyDuringMigration): () => void {\n return function(this: Block) {\n this.jsonInit(jsonDef);\n };\n}\n\n/**\n * Define blocks from an array of JSON block definitions, as might be generated\n * by the Blockly Developer Tools.\n *\n * @param jsonArray An array of JSON block definitions.\n * @alias Blockly.common.defineBlocksWithJsonArray\n */\nexport function defineBlocksWithJsonArray(jsonArray: AnyDuringMigration[]) {\n TEST_ONLY.defineBlocksWithJsonArrayInternal(jsonArray);\n}\n\n/**\n * Private version of defineBlocksWithJsonArray for stubbing in tests.\n */\nfunction defineBlocksWithJsonArrayInternal(jsonArray: AnyDuringMigration[]) {\n defineBlocks(createBlockDefinitionsFromJsonArray(jsonArray));\n}\n\n/**\n * Define blocks from an array of JSON block definitions, as might be generated\n * by the Blockly Developer Tools.\n *\n * @param jsonArray An array of JSON block definitions.\n * @returns A map of the block\n * definitions created.\n * @alias Blockly.common.defineBlocksWithJsonArray\n */\nexport function createBlockDefinitionsFromJsonArray(\n jsonArray: AnyDuringMigration[]): {[key: string]: BlockDefinition} {\n const blocks: {[key: string]: BlockDefinition} = {};\n for (let i = 0; i < jsonArray.length; i++) {\n const elem = jsonArray[i];\n if (!elem) {\n console.warn(`Block definition #${i} in JSON array is ${elem}. Skipping`);\n continue;\n }\n const type = elem['type'];\n if (!type) {\n console.warn(\n `Block definition #${i} in JSON array is missing a type attribute. ` +\n 'Skipping.');\n continue;\n }\n blocks[type] = {init: jsonInitFactory(elem)};\n }\n return blocks;\n}\n\n/**\n * Add the specified block definitions to the block definitions\n * dictionary (Blockly.Blocks).\n *\n * @param blocks A map of block\n * type names to block definitions.\n * @alias Blockly.common.defineBlocks\n */\nexport function defineBlocks(blocks: {[key: string]: BlockDefinition}) {\n // Iterate over own enumerable properties.\n for (const type of Object.keys(blocks)) {\n const definition = blocks[type];\n if (type in Blocks) {\n console.warn(`Block definiton \"${type}\" overwrites previous definition.`);\n }\n Blocks[type] = definition;\n }\n}\n\nexport const TEST_ONLY = {defineBlocksWithJsonArrayInternal};\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods for DOM manipulation.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.dom\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.dom');\n\nimport type {Svg} from './svg.js';\n\n\n/**\n * Required name space for SVG elements.\n *\n * @alias Blockly.utils.dom.SVG_NS\n */\nexport const SVG_NS = 'http://www.w3.org/2000/svg';\n\n/**\n * Required name space for HTML elements.\n *\n * @alias Blockly.utils.dom.HTML_NS\n */\nexport const HTML_NS = 'http://www.w3.org/1999/xhtml';\n\n/**\n * Required name space for XLINK elements.\n *\n * @alias Blockly.utils.dom.XLINK_NS\n */\nexport const XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/**\n * Node type constants.\n * https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n *\n * @alias Blockly.utils.dom.NodeType\n */\nexport enum NodeType {\n ELEMENT_NODE = 1,\n TEXT_NODE = 3,\n COMMENT_NODE = 8,\n DOCUMENT_POSITION_CONTAINED_BY = 16\n}\n\n/** Temporary cache of text widths. */\nlet cacheWidths: {[key: string]: number}|null = null;\n\n/** Number of current references to cache. */\nlet cacheReference = 0;\n\n/** A HTML canvas context used for computing text width. */\nlet canvasContext: CanvasRenderingContext2D|null = null;\n\n/**\n * Helper method for creating SVG elements.\n *\n * @param name Element's tag name.\n * @param attrs Dictionary of attribute names and values.\n * @param opt_parent Optional parent on which to append the element.\n * @returns if name is a string or a more specific type if it a member of Svg.\n * @alias Blockly.utils.dom.createSvgElement\n */\nexport function createSvgElement(\n name: string|Svg, attrs: {[key: string]: string|number},\n opt_parent?: Element|null): T {\n const e = document.createElementNS(SVG_NS, String(name)) as T;\n for (const key in attrs) {\n e.setAttribute(key, `${attrs[key]}`);\n }\n if (opt_parent) {\n opt_parent.appendChild(e);\n }\n return e;\n}\n\n/**\n * Add a CSS class to a element.\n *\n * Handles multiple space-separated classes for legacy reasons.\n *\n * @param element DOM element to add class to.\n * @param className Name of class to add.\n * @returns True if class was added, false if already present.\n * @alias Blockly.utils.dom.addClass\n */\nexport function addClass(element: Element, className: string): boolean {\n const classNames = className.split(' ');\n if (classNames.every((name) => element.classList.contains(name))) {\n return false;\n }\n element.classList.add(...classNames);\n return true;\n}\n\n/**\n * Removes multiple classes from an element.\n *\n * @param element DOM element to remove classes from.\n * @param classNames A string of one or multiple class names for an element.\n * @alias Blockly.utils.dom.removeClasses\n */\nexport function removeClasses(element: Element, classNames: string) {\n element.classList.remove(...classNames.split(' '));\n}\n\n/**\n * Remove a CSS class from a element.\n *\n * Handles multiple space-separated classes for legacy reasons.\n *\n * @param element DOM element to remove class from.\n * @param className Name of class to remove.\n * @returns True if class was removed, false if never present.\n * @alias Blockly.utils.dom.removeClass\n */\nexport function removeClass(element: Element, className: string): boolean {\n const classNames = className.split(' ');\n if (classNames.every((name) => !element.classList.contains(name))) {\n return false;\n }\n element.classList.remove(...classNames);\n return true;\n}\n\n/**\n * Checks if an element has the specified CSS class.\n *\n * @param element DOM element to check.\n * @param className Name of class to check.\n * @returns True if class exists, false otherwise.\n * @alias Blockly.utils.dom.hasClass\n */\nexport function hasClass(element: Element, className: string): boolean {\n return element.classList.contains(className);\n}\n\n/**\n * Removes a node from its parent. No-op if not attached to a parent.\n *\n * @param node The node to remove.\n * @returns The node removed if removed; else, null.\n * @alias Blockly.utils.dom.removeNode\n */\n// Copied from Closure goog.dom.removeNode\nexport function removeNode(node: Node|null): Node|null {\n return node && node.parentNode ? node.parentNode.removeChild(node) : null;\n}\n\n/**\n * Insert a node after a reference node.\n * Contrast with node.insertBefore function.\n *\n * @param newNode New element to insert.\n * @param refNode Existing element to precede new node.\n * @alias Blockly.utils.dom.insertAfter\n */\nexport function insertAfter(newNode: Element, refNode: Element) {\n const siblingNode = refNode.nextSibling;\n const parentNode = refNode.parentNode;\n if (!parentNode) {\n throw Error('Reference node has no parent.');\n }\n if (siblingNode) {\n parentNode.insertBefore(newNode, siblingNode);\n } else {\n parentNode.appendChild(newNode);\n }\n}\n\n/**\n * Whether a node contains another node.\n *\n * @param parent The node that should contain the other node.\n * @param descendant The node to test presence of.\n * @returns Whether the parent node contains the descendant node.\n * @alias Blockly.utils.dom.containsNode\n */\nexport function containsNode(parent: Node, descendant: Node): boolean {\n return !!(\n parent.compareDocumentPosition(descendant) &\n NodeType.DOCUMENT_POSITION_CONTAINED_BY);\n}\n\n/**\n * Sets the CSS transform property on an element. This function sets the\n * non-vendor-prefixed and vendor-prefixed versions for backwards compatibility\n * with older browsers. See https://caniuse.com/#feat=transforms2d\n *\n * @param element Element to which the CSS transform will be applied.\n * @param transform The value of the CSS `transform` property.\n * @alias Blockly.utils.dom.setCssTransform\n */\nexport function setCssTransform(\n element: HTMLElement|SVGElement, transform: string) {\n element.style['transform'] = transform;\n element.style['-webkit-transform' as any] = transform;\n}\n\n/**\n * Start caching text widths. Every call to this function MUST also call\n * stopTextWidthCache. Caches must not survive between execution threads.\n *\n * @alias Blockly.utils.dom.startTextWidthCache\n */\nexport function startTextWidthCache() {\n cacheReference++;\n if (!cacheWidths) {\n cacheWidths = Object.create(null);\n }\n}\n\n/**\n * Stop caching field widths. Unless caching was already on when the\n * corresponding call to startTextWidthCache was made.\n *\n * @alias Blockly.utils.dom.stopTextWidthCache\n */\nexport function stopTextWidthCache() {\n cacheReference--;\n if (!cacheReference) {\n cacheWidths = null;\n }\n}\n\n/**\n * Gets the width of a text element, caching it in the process.\n *\n * @param textElement An SVG 'text' element.\n * @returns Width of element.\n * @alias Blockly.utils.dom.getTextWidth\n */\nexport function getTextWidth(textElement: SVGTextElement): number {\n const key = textElement.textContent + '\\n' + textElement.className.baseVal;\n let width;\n // Return the cached width if it exists.\n if (cacheWidths) {\n width = cacheWidths[key];\n if (width) {\n return width;\n }\n }\n\n // Attempt to compute fetch the width of the SVG text element.\n try {\n width = textElement.getComputedTextLength();\n } catch (e) {\n // In other cases where we fail to get the computed text. Instead, use an\n // approximation and do not cache the result. At some later point in time\n // when the block is inserted into the visible DOM, this method will be\n // called again and, at that point in time, will not throw an exception.\n return textElement.textContent!.length * 8;\n }\n\n // Cache the computed width and return.\n if (cacheWidths) {\n cacheWidths[key] = width;\n }\n return width;\n}\n\n/**\n * Gets the width of a text element using a faster method than `getTextWidth`.\n * This method requires that we know the text element's font family and size in\n * advance. Similar to `getTextWidth`, we cache the width we compute.\n *\n * @param textElement An SVG 'text' element.\n * @param fontSize The font size to use.\n * @param fontWeight The font weight to use.\n * @param fontFamily The font family to use.\n * @returns Width of element.\n * @alias Blockly.utils.dom.getFastTextWidth\n */\nexport function getFastTextWidth(\n textElement: SVGTextElement, fontSize: number, fontWeight: string,\n fontFamily: string): number {\n return getFastTextWidthWithSizeString(\n textElement, fontSize + 'pt', fontWeight, fontFamily);\n}\n\n/**\n * Gets the width of a text element using a faster method than `getTextWidth`.\n * This method requires that we know the text element's font family and size in\n * advance. Similar to `getTextWidth`, we cache the width we compute.\n * This method is similar to `getFastTextWidth` but expects the font size\n * parameter to be a string.\n *\n * @param textElement An SVG 'text' element.\n * @param fontSize The font size to use.\n * @param fontWeight The font weight to use.\n * @param fontFamily The font family to use.\n * @returns Width of element.\n * @alias Blockly.utils.dom.getFastTextWidthWithSizeString\n */\nexport function getFastTextWidthWithSizeString(\n textElement: SVGTextElement, fontSize: string, fontWeight: string,\n fontFamily: string): number {\n const text = textElement.textContent;\n const key = text + '\\n' + textElement.className.baseVal;\n let width;\n\n // Return the cached width if it exists.\n if (cacheWidths) {\n width = cacheWidths[key];\n if (width) {\n return width;\n }\n }\n\n if (!canvasContext) {\n // Inject the canvas element used for computing text widths.\n const computeCanvas = (document.createElement('canvas'));\n computeCanvas.className = 'blocklyComputeCanvas';\n document.body.appendChild(computeCanvas);\n\n // Initialize the HTML canvas context and set the font.\n // The context font must match blocklyText's fontsize and font-family\n // set in CSS.\n canvasContext = computeCanvas.getContext('2d') as CanvasRenderingContext2D;\n }\n // Set the desired font size and family.\n canvasContext.font = fontWeight + ' ' + fontSize + ' ' + fontFamily;\n\n // Measure the text width using the helper canvas context.\n if (text) {\n width = canvasContext.measureText(text).width;\n } else {\n width = 0;\n }\n\n // Cache the computed width and return.\n if (cacheWidths) {\n cacheWidths[key] = width;\n }\n return width;\n}\n\n/**\n * Measure a font's metrics. The height and baseline values.\n *\n * @param text Text to measure the font dimensions of.\n * @param fontSize The font size to use.\n * @param fontWeight The font weight to use.\n * @param fontFamily The font family to use.\n * @returns Font measurements.\n * @alias Blockly.utils.dom.measureFontMetrics\n */\nexport function measureFontMetrics(\n text: string, fontSize: string, fontWeight: string,\n fontFamily: string): {height: number, baseline: number} {\n const span = (document.createElement('span'));\n span.style.font = fontWeight + ' ' + fontSize + ' ' + fontFamily;\n span.textContent = text;\n\n const block = (document.createElement('div'));\n block.style.width = '1px';\n block.style.height = '0';\n\n const div = (document.createElement('div'));\n div.setAttribute('style', 'position: fixed; top: 0; left: 0; display: flex;');\n div.appendChild(span);\n div.appendChild(block);\n\n document.body.appendChild(div);\n const result = {\n height: 0,\n baseline: 0,\n };\n try {\n div.style.alignItems = 'baseline';\n result.baseline = block.offsetTop - span.offsetTop;\n div.style.alignItems = 'flex-end';\n result.height = block.offsetTop - span.offsetTop;\n } finally {\n document.body.removeChild(div);\n }\n return result;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods for math.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.math\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.math');\n\n\n/**\n * Converts degrees to radians.\n * Copied from Closure's goog.math.toRadians.\n *\n * @param angleDegrees Angle in degrees.\n * @returns Angle in radians.\n * @alias Blockly.utils.math.toRadians\n */\nexport function toRadians(angleDegrees: number): number {\n return angleDegrees * Math.PI / 180;\n}\n\n/**\n * Converts radians to degrees.\n * Copied from Closure's goog.math.toDegrees.\n *\n * @param angleRadians Angle in radians.\n * @returns Angle in degrees.\n * @alias Blockly.utils.math.toDegrees\n */\nexport function toDegrees(angleRadians: number): number {\n return angleRadians * 180 / Math.PI;\n}\n\n/**\n * Clamp the provided number between the lower bound and the upper bound.\n *\n * @param lowerBound The desired lower bound.\n * @param number The number to clamp.\n * @param upperBound The desired upper bound.\n * @returns The clamped number.\n * @alias Blockly.utils.math.clamp\n */\nexport function clamp(\n lowerBound: number, number: number, upperBound: number): number {\n if (upperBound < lowerBound) {\n const temp = upperBound;\n upperBound = lowerBound;\n lowerBound = temp;\n }\n return Math.max(lowerBound, Math.min(number, upperBound));\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Helper function for warning developers about deprecations.\n * This method is not specific to Blockly.\n *\n * @namespace Blockly.utils.deprecation\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.deprecation');\n\n\n/**\n * Warn developers that a function or property is deprecated.\n *\n * @param name The name of the function or property.\n * @param deprecationDate The date of deprecation. Prefer 'version n.0.0'\n * format, and fall back to 'month yyyy' or 'quarter yyyy' format.\n * @param deletionDate The date of deletion. Prefer 'version n.0.0'\n * format, and fall back to 'month yyyy' or 'quarter yyyy' format.\n * @param opt_use The name of a function or property to use instead, if any.\n * @alias Blockly.utils.deprecation.warn\n * @internal\n */\nexport function warn(\n name: string, deprecationDate: string, deletionDate: string,\n opt_use?: string) {\n let msg = name + ' was deprecated in ' + deprecationDate +\n ' and will be deleted in ' + deletionDate + '.';\n if (opt_use) {\n msg += '\\nUse ' + opt_use + ' instead.';\n }\n console.warn(msg);\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utilities for element styles.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.style\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.style');\n\nimport * as deprecation from './deprecation.js';\nimport {Coordinate} from './coordinate.js';\nimport {Rect} from './rect.js';\nimport {Size} from './size.js';\n\n\n/**\n * Gets the height and width of an element.\n * Similar to Closure's goog.style.getSize\n *\n * @param element Element to get size of.\n * @returns Object with width/height properties.\n * @alias Blockly.utils.style.getSize\n */\nexport function getSize(element: Element): Size {\n return TEST_ONLY.getSizeInternal(element);\n}\n\n/**\n * Private version of getSize for stubbing in tests.\n */\nfunction getSizeInternal(element: Element): Size {\n if (getComputedStyle(element, 'display') !== 'none') {\n return getSizeWithDisplay(element);\n }\n\n // Evaluate size with a temporary element.\n // AnyDuringMigration because: Property 'style' does not exist on type\n // 'Element'.\n const style = (element as AnyDuringMigration).style;\n const originalDisplay = style.display;\n const originalVisibility = style.visibility;\n const originalPosition = style.position;\n\n style.visibility = 'hidden';\n style.position = 'absolute';\n style.display = 'inline';\n\n const offsetWidth = (element as HTMLElement).offsetWidth;\n const offsetHeight = (element as HTMLElement).offsetHeight;\n\n style.display = originalDisplay;\n style.position = originalPosition;\n style.visibility = originalVisibility;\n\n return new Size(offsetWidth, offsetHeight);\n}\n\n/**\n * Gets the height and width of an element when the display is not none.\n *\n * @param element Element to get size of.\n * @returns Object with width/height properties.\n */\nfunction getSizeWithDisplay(element: Element): Size {\n const offsetWidth = (element as HTMLElement).offsetWidth;\n const offsetHeight = (element as HTMLElement).offsetHeight;\n return new Size(offsetWidth, offsetHeight);\n}\n\n/**\n * Retrieves a computed style value of a node. It returns empty string\n * if the property requested is an SVG one and it has not been\n * explicitly set (firefox and webkit).\n *\n * Copied from Closure's goog.style.getComputedStyle\n *\n * @param element Element to get style of.\n * @param property Property to get (camel-case).\n * @returns Style value.\n * @alias Blockly.utils.style.getComputedStyle\n */\nexport function getComputedStyle(element: Element, property: string): string {\n const styles = window.getComputedStyle(element);\n // element.style[..] is undefined for browser specific styles\n // as 'filter'.\n return (styles as AnyDuringMigration)[property] ||\n styles.getPropertyValue(property);\n}\n\n/**\n * Gets the cascaded style value of a node, or null if the value cannot be\n * computed (only Internet Explorer can do this).\n *\n * Copied from Closure's goog.style.getCascadedStyle\n *\n * @param element Element to get style of.\n * @param style Property to get (camel-case).\n * @returns Style value.\n * @deprecated No longer provided by Blockly.\n * @alias Blockly.utils.style.getCascadedStyle\n */\nexport function getCascadedStyle(element: Element, style: string): string {\n deprecation.warn(\n 'Blockly.utils.style.getCascadedStyle', 'version 9', 'version 10');\n // AnyDuringMigration because: Property 'currentStyle' does not exist on type\n // 'Element'. AnyDuringMigration because: Property 'currentStyle' does not\n // exist on type 'Element'.\n return (element as AnyDuringMigration).currentStyle ?\n (element as AnyDuringMigration).currentStyle[style] :\n '' as string;\n}\n\n/**\n * Returns a Coordinate object relative to the top-left of the HTML document.\n * Similar to Closure's goog.style.getPageOffset\n *\n * @param el Element to get the page offset for.\n * @returns The page offset.\n * @alias Blockly.utils.style.getPageOffset\n */\nexport function getPageOffset(el: Element): Coordinate {\n const pos = new Coordinate(0, 0);\n const box = el.getBoundingClientRect();\n const documentElement = document.documentElement;\n // Must add the scroll coordinates in to get the absolute page offset\n // of element since getBoundingClientRect returns relative coordinates to\n // the viewport.\n const scrollCoord = new Coordinate(\n window.pageXOffset || documentElement.scrollLeft,\n window.pageYOffset || documentElement.scrollTop);\n pos.x = box.left + scrollCoord.x;\n pos.y = box.top + scrollCoord.y;\n\n return pos;\n}\n\n/**\n * Calculates the viewport coordinates relative to the document.\n * Similar to Closure's goog.style.getViewportPageOffset\n *\n * @returns The page offset of the viewport.\n * @alias Blockly.utils.style.getViewportPageOffset\n */\nexport function getViewportPageOffset(): Coordinate {\n const body = document.body;\n const documentElement = document.documentElement;\n const scrollLeft = body.scrollLeft || documentElement.scrollLeft;\n const scrollTop = body.scrollTop || documentElement.scrollTop;\n return new Coordinate(scrollLeft, scrollTop);\n}\n\n/**\n * Gets the computed border widths (on all sides) in pixels\n * Copied from Closure's goog.style.getBorderBox\n *\n * @param element The element to get the border widths for.\n * @returns The computed border widths.\n * @alias Blockly.utils.style.getBorderBox\n */\nexport function getBorderBox(element: Element): Rect {\n const left = parseFloat(getComputedStyle(element, 'borderLeftWidth'));\n const right = parseFloat(getComputedStyle(element, 'borderRightWidth'));\n const top = parseFloat(getComputedStyle(element, 'borderTopWidth'));\n const bottom = parseFloat(getComputedStyle(element, 'borderBottomWidth'));\n\n return new Rect(top, bottom, left, right);\n}\n\n/**\n * Changes the scroll position of `container` with the minimum amount so\n * that the content and the borders of the given `element` become visible.\n * If the element is bigger than the container, its top left corner will be\n * aligned as close to the container's top left corner as possible.\n * Copied from Closure's goog.style.scrollIntoContainerView\n *\n * @param element The element to make visible.\n * @param container The container to scroll. If not set, then the document\n * scroll element will be used.\n * @param opt_center Whether to center the element in the container.\n * Defaults to false.\n * @alias Blockly.utils.style.scrollIntoContainerView\n */\nexport function scrollIntoContainerView(\n element: Element, container: Element, opt_center?: boolean) {\n const offset = getContainerOffsetToScrollInto(element, container, opt_center);\n container.scrollLeft = offset.x;\n container.scrollTop = offset.y;\n}\n\n/**\n * Calculate the scroll position of `container` with the minimum amount so\n * that the content and the borders of the given `element` become visible.\n * If the element is bigger than the container, its top left corner will be\n * aligned as close to the container's top left corner as possible.\n * Copied from Closure's goog.style.getContainerOffsetToScrollInto\n *\n * @param element The element to make visible.\n * @param container The container to scroll. If not set, then the document\n * scroll element will be used.\n * @param opt_center Whether to center the element in the container.\n * Defaults to false.\n * @returns The new scroll position of the container.\n * @alias Blockly.utils.style.getContainerOffsetToScrollInto\n */\nexport function getContainerOffsetToScrollInto(\n element: Element, container: Element, opt_center?: boolean): Coordinate {\n // Absolute position of the element's border's top left corner.\n const elementPos = getPageOffset(element);\n // Absolute position of the container's border's top left corner.\n const containerPos = getPageOffset(container);\n const containerBorder = getBorderBox(container);\n // Relative pos. of the element's border box to the container's content box.\n const relX = elementPos.x - containerPos.x - containerBorder.left;\n const relY = elementPos.y - containerPos.y - containerBorder.top;\n // How much the element can move in the container, i.e. the difference between\n // the element's bottom-right-most and top-left-most position where it's\n // fully visible.\n const elementSize = getSizeWithDisplay(element);\n const spaceX = container.clientWidth - elementSize.width;\n const spaceY = container.clientHeight - elementSize.height;\n let scrollLeft = container.scrollLeft;\n let scrollTop = container.scrollTop;\n if (opt_center) {\n // All browsers round non-integer scroll positions down.\n scrollLeft += relX - spaceX / 2;\n scrollTop += relY - spaceY / 2;\n } else {\n // This formula was designed to give the correct scroll values in the\n // following cases:\n // - element is higher than container (spaceY < 0) => scroll down by relY\n // - element is not higher that container (spaceY >= 0):\n // - it is above container (relY < 0) => scroll up by abs(relY)\n // - it is below container (relY > spaceY) => scroll down by relY - spaceY\n // - it is in the container => don't scroll\n scrollLeft += Math.min(relX, Math.max(relX - spaceX, 0));\n scrollTop += Math.min(relY, Math.max(relY - spaceY, 0));\n }\n return new Coordinate(scrollLeft, scrollTop);\n}\n\nexport const TEST_ONLY = {\n getSizeInternal,\n};\n","/**\n * @license\n * Copyright 2016 Massachusetts Institute of Technology\n * All rights reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * A div that floats on top of the workspace, for drop-down menus.\n *\n * @class\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.dropDownDiv');\n\nimport type {BlockSvg} from './block_svg.js';\nimport * as common from './common.js';\nimport * as dom from './utils/dom.js';\nimport type {Field} from './field.js';\nimport * as math from './utils/math.js';\nimport {Rect} from './utils/rect.js';\nimport type {Size} from './utils/size.js';\nimport * as style from './utils/style.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/**\n * Arrow size in px. Should match the value in CSS\n * (need to position pre-render).\n */\nexport const ARROW_SIZE = 16;\n\n/**\n * Drop-down border size in px. Should match the value in CSS (need to position\n * the arrow).\n */\nexport const BORDER_SIZE = 1;\n\n/**\n * Amount the arrow must be kept away from the edges of the main drop-down div,\n * in px.\n */\nexport const ARROW_HORIZONTAL_PADDING = 12;\n\n/** Amount drop-downs should be padded away from the source, in px. */\nexport const PADDING_Y = 16;\n\n/** Length of animations in seconds. */\nexport const ANIMATION_TIME = 0.25;\n\n/**\n * Timer for animation out, to be cleared if we need to immediately hide\n * without disrupting new shows.\n */\nlet animateOutTimer: ReturnType|null = null;\n\n/** Callback for when the drop-down is hidden. */\nlet onHide: Function|null = null;\n\n/** A class name representing the current owner's workspace renderer. */\nlet renderedClassName = '';\n\n/** A class name representing the current owner's workspace theme. */\nlet themeClassName = '';\n\n/** The content element. */\nlet div: HTMLDivElement;\n\n/** The content element. */\nlet content: HTMLDivElement;\n\n/** The arrow element. */\nlet arrow: HTMLDivElement;\n\n/**\n * Drop-downs will appear within the bounds of this element if possible.\n * Set in setBoundsElement.\n */\nlet boundsElement: Element|null = null;\n\n/** The object currently using the drop-down. */\nlet owner: Field|null = null;\n\n/** Whether the dropdown was positioned to a field or the source block. */\nlet positionToField: boolean|null = null;\n\n/**\n * Dropdown bounds info object used to encapsulate sizing information about a\n * bounding element (bounding box and width/height).\n */\nexport interface BoundsInfo {\n top: number;\n left: number;\n bottom: number;\n right: number;\n width: number;\n height: number;\n}\n\n/** Dropdown position metrics. */\nexport interface PositionMetrics {\n initialX: number;\n initialY: number;\n finalX: number;\n finalY: number;\n arrowX: number|null;\n arrowY: number|null;\n arrowAtTop: boolean|null;\n arrowVisible: boolean;\n}\n\n/**\n * Create and insert the DOM element for this div.\n *\n * @internal\n */\nexport function createDom() {\n if (div) {\n return; // Already created.\n }\n div = document.createElement('div');\n div.className = 'blocklyDropDownDiv';\n const parentDiv = common.getParentContainer() || document.body;\n parentDiv.appendChild(div);\n\n content = document.createElement('div');\n content.className = 'blocklyDropDownContent';\n div.appendChild(content);\n\n arrow = document.createElement('div');\n arrow.className = 'blocklyDropDownArrow';\n div.appendChild(arrow);\n\n div.style.opacity = '0';\n // Transition animation for transform: translate() and opacity.\n div.style.transition = 'transform ' + ANIMATION_TIME + 's, ' +\n 'opacity ' + ANIMATION_TIME + 's';\n\n // Handle focusin/out events to add a visual indicator when\n // a child is focused or blurred.\n div.addEventListener('focusin', function() {\n dom.addClass(div, 'blocklyFocused');\n });\n div.addEventListener('focusout', function() {\n dom.removeClass(div, 'blocklyFocused');\n });\n}\n\n/**\n * Set an element to maintain bounds within. Drop-downs will appear\n * within the box of this element if possible.\n *\n * @param boundsElem Element to bind drop-down to.\n */\nexport function setBoundsElement(boundsElem: Element|null) {\n boundsElement = boundsElem;\n}\n\n/**\n * Provide the div for inserting content into the drop-down.\n *\n * @returns Div to populate with content.\n */\nexport function getContentDiv(): Element {\n return content;\n}\n\n/** Clear the content of the drop-down. */\nexport function clearContent() {\n content.textContent = '';\n content.style.width = '';\n}\n\n/**\n * Set the colour for the drop-down.\n *\n * @param backgroundColour Any CSS colour for the background.\n * @param borderColour Any CSS colour for the border.\n */\nexport function setColour(backgroundColour: string, borderColour: string) {\n div.style.backgroundColor = backgroundColour;\n div.style.borderColor = borderColour;\n}\n\n/**\n * Shortcut to show and place the drop-down with positioning determined\n * by a particular block. The primary position will be below the block,\n * and the secondary position above the block. Drop-down will be\n * constrained to the block's workspace.\n *\n * @param field The field showing the drop-down.\n * @param block Block to position the drop-down around.\n * @param opt_onHide Optional callback for when the drop-down is hidden.\n * @param opt_secondaryYOffset Optional Y offset for above-block positioning.\n * @returns True if the menu rendered below block; false if above.\n */\nexport function showPositionedByBlock(\n field: Field, block: BlockSvg, opt_onHide?: Function,\n opt_secondaryYOffset?: number): boolean {\n return showPositionedByRect(\n getScaledBboxOfBlock(block), field, opt_onHide, opt_secondaryYOffset);\n}\n\n/**\n * Shortcut to show and place the drop-down with positioning determined\n * by a particular field. The primary position will be below the field,\n * and the secondary position above the field. Drop-down will be\n * constrained to the block's workspace.\n *\n * @param field The field to position the dropdown against.\n * @param opt_onHide Optional callback for when the drop-down is hidden.\n * @param opt_secondaryYOffset Optional Y offset for above-block positioning.\n * @returns True if the menu rendered below block; false if above.\n */\nexport function showPositionedByField(\n field: Field, opt_onHide?: Function,\n opt_secondaryYOffset?: number): boolean {\n positionToField = true;\n return showPositionedByRect(\n getScaledBboxOfField(field), field, opt_onHide, opt_secondaryYOffset);\n}\n/**\n * Get the scaled bounding box of a block.\n *\n * @param block The block.\n * @returns The scaled bounding box of the block.\n */\nfunction getScaledBboxOfBlock(block: BlockSvg): Rect {\n const blockSvg = block.getSvgRoot();\n const scale = block.workspace.scale;\n const scaledHeight = block.height * scale;\n const scaledWidth = block.width * scale;\n const xy = style.getPageOffset(blockSvg);\n return new Rect(xy.y, xy.y + scaledHeight, xy.x, xy.x + scaledWidth);\n}\n\n/**\n * Get the scaled bounding box of a field.\n *\n * @param field The field.\n * @returns The scaled bounding box of the field.\n */\nfunction getScaledBboxOfField(field: Field): Rect {\n const bBox = field.getScaledBBox();\n return new Rect(bBox.top, bBox.bottom, bBox.left, bBox.right);\n}\n\n/**\n * Helper method to show and place the drop-down with positioning determined\n * by a scaled bounding box. The primary position will be below the rect,\n * and the secondary position above the rect. Drop-down will be constrained to\n * the block's workspace.\n *\n * @param bBox The scaled bounding box.\n * @param field The field to position the dropdown against.\n * @param opt_onHide Optional callback for when the drop-down is hidden.\n * @param opt_secondaryYOffset Optional Y offset for above-block positioning.\n * @returns True if the menu rendered below block; false if above.\n */\nfunction showPositionedByRect(\n bBox: Rect, field: Field, opt_onHide?: Function,\n opt_secondaryYOffset?: number): boolean {\n // If we can fit it, render below the block.\n const primaryX = bBox.left + (bBox.right - bBox.left) / 2;\n const primaryY = bBox.bottom;\n // If we can't fit it, render above the entire parent block.\n const secondaryX = primaryX;\n let secondaryY = bBox.top;\n if (opt_secondaryYOffset) {\n secondaryY += opt_secondaryYOffset;\n }\n const sourceBlock = field.getSourceBlock() as BlockSvg;\n // Set bounds to main workspace; show the drop-down.\n let workspace = sourceBlock.workspace;\n while (workspace.options.parentWorkspace) {\n workspace = workspace.options.parentWorkspace;\n }\n setBoundsElement(workspace.getParentSvg().parentNode as Element | null);\n return show(\n field, sourceBlock.RTL, primaryX, primaryY, secondaryX, secondaryY,\n opt_onHide);\n}\n\n/**\n * Show and place the drop-down.\n * The drop-down is placed with an absolute \"origin point\" (x, y) - i.e.,\n * the arrow will point at this origin and box will positioned below or above\n * it. If we can maintain the container bounds at the primary point, the arrow\n * will point there, and the container will be positioned below it.\n * If we can't maintain the container bounds at the primary point, fall-back to\n * the secondary point and position above.\n *\n * @param newOwner The object showing the drop-down\n * @param rtl Right-to-left (true) or left-to-right (false).\n * @param primaryX Desired origin point x, in absolute px.\n * @param primaryY Desired origin point y, in absolute px.\n * @param secondaryX Secondary/alternative origin point x, in absolute px.\n * @param secondaryY Secondary/alternative origin point y, in absolute px.\n * @param opt_onHide Optional callback for when the drop-down is hidden.\n * @returns True if the menu rendered at the primary origin point.\n * @internal\n */\nexport function show(\n newOwner: Field, rtl: boolean, primaryX: number, primaryY: number,\n secondaryX: number, secondaryY: number, opt_onHide?: Function): boolean {\n owner = newOwner;\n onHide = opt_onHide || null;\n // Set direction.\n div.style.direction = rtl ? 'rtl' : 'ltr';\n\n const mainWorkspace = common.getMainWorkspace() as WorkspaceSvg;\n renderedClassName = mainWorkspace.getRenderer().getClassName();\n themeClassName = mainWorkspace.getTheme().getClassName();\n if (renderedClassName) {\n dom.addClass(div, renderedClassName);\n }\n if (themeClassName) {\n dom.addClass(div, themeClassName);\n }\n\n // When we change `translate` multiple times in close succession,\n // Chrome may choose to wait and apply them all at once.\n // Since we want the translation to initial X, Y to be immediate,\n // and the translation to final X, Y to be animated,\n // we saw problems where both would be applied after animation was turned on,\n // making the dropdown appear to fly in from (0, 0).\n // Using both `left`, `top` for the initial translation and then `translate`\n // for the animated transition to final X, Y is a workaround.\n return positionInternal(primaryX, primaryY, secondaryX, secondaryY);\n}\n\nconst internal = {\n /**\n * Get sizing info about the bounding element.\n *\n * @returns An object containing size information about the bounding element\n * (bounding box and width/height).\n */\n getBoundsInfo: function(): BoundsInfo {\n const boundPosition = style.getPageOffset(boundsElement as Element);\n const boundSize = style.getSize(boundsElement as Element);\n\n return {\n left: boundPosition.x,\n right: boundPosition.x + boundSize.width,\n top: boundPosition.y,\n bottom: boundPosition.y + boundSize.height,\n width: boundSize.width,\n height: boundSize.height,\n };\n },\n\n /**\n * Helper to position the drop-down and the arrow, maintaining bounds.\n * See explanation of origin points in show.\n *\n * @param primaryX Desired origin point x, in absolute px.\n * @param primaryY Desired origin point y, in absolute px.\n * @param secondaryX Secondary/alternative origin point x, in absolute px.\n * @param secondaryY Secondary/alternative origin point y, in absolute px.\n * @returns Various final metrics, including rendered positions for drop-down\n * and arrow.\n */\n getPositionMetrics: function(\n primaryX: number, primaryY: number, secondaryX: number,\n secondaryY: number): PositionMetrics {\n const boundsInfo = internal.getBoundsInfo();\n const divSize = style.getSize(div as Element);\n\n // Can we fit in-bounds below the target?\n if (primaryY + divSize.height < boundsInfo.bottom) {\n return getPositionBelowMetrics(primaryX, primaryY, boundsInfo, divSize);\n }\n // Can we fit in-bounds above the target?\n if (secondaryY - divSize.height > boundsInfo.top) {\n return getPositionAboveMetrics(\n secondaryX, secondaryY, boundsInfo, divSize);\n }\n // Can we fit outside the workspace bounds (but inside the window)\n // below?\n if (primaryY + divSize.height < document.documentElement.clientHeight) {\n return getPositionBelowMetrics(primaryX, primaryY, boundsInfo, divSize);\n }\n // Can we fit outside the workspace bounds (but inside the window)\n // above?\n if (secondaryY - divSize.height > document.documentElement.clientTop) {\n return getPositionAboveMetrics(\n secondaryX, secondaryY, boundsInfo, divSize);\n }\n\n // Last resort, render at top of page.\n return getPositionTopOfPageMetrics(primaryX, boundsInfo, divSize);\n },\n};\n\n/**\n * Get the metrics for positioning the div below the source.\n *\n * @param primaryX Desired origin point x, in absolute px.\n * @param primaryY Desired origin point y, in absolute px.\n * @param boundsInfo An object containing size information about the bounding\n * element (bounding box and width/height).\n * @param divSize An object containing information about the size of the\n * DropDownDiv (width & height).\n * @returns Various final metrics, including rendered positions for drop-down\n * and arrow.\n */\nfunction getPositionBelowMetrics(\n primaryX: number, primaryY: number, boundsInfo: BoundsInfo,\n divSize: Size): PositionMetrics {\n const xCoords =\n getPositionX(primaryX, boundsInfo.left, boundsInfo.right, divSize.width);\n\n const arrowY = -(ARROW_SIZE / 2 + BORDER_SIZE);\n const finalY = primaryY + PADDING_Y;\n\n return {\n initialX: xCoords.divX,\n initialY: primaryY,\n finalX: xCoords.divX, // X position remains constant during animation.\n finalY,\n arrowX: xCoords.arrowX,\n arrowY,\n arrowAtTop: true,\n arrowVisible: true,\n };\n}\n\n/**\n * Get the metrics for positioning the div above the source.\n *\n * @param secondaryX Secondary/alternative origin point x, in absolute px.\n * @param secondaryY Secondary/alternative origin point y, in absolute px.\n * @param boundsInfo An object containing size information about the bounding\n * element (bounding box and width/height).\n * @param divSize An object containing information about the size of the\n * DropDownDiv (width & height).\n * @returns Various final metrics, including rendered positions for drop-down\n * and arrow.\n */\nfunction getPositionAboveMetrics(\n secondaryX: number, secondaryY: number, boundsInfo: BoundsInfo,\n divSize: Size): PositionMetrics {\n const xCoords = getPositionX(\n secondaryX, boundsInfo.left, boundsInfo.right, divSize.width);\n\n const arrowY = divSize.height - BORDER_SIZE * 2 - ARROW_SIZE / 2;\n const finalY = secondaryY - divSize.height - PADDING_Y;\n const initialY = secondaryY - divSize.height; // No padding on Y.\n\n return {\n initialX: xCoords.divX,\n initialY,\n finalX: xCoords.divX, // X position remains constant during animation.\n finalY,\n arrowX: xCoords.arrowX,\n arrowY,\n arrowAtTop: false,\n arrowVisible: true,\n };\n}\n\n/**\n * Get the metrics for positioning the div at the top of the page.\n *\n * @param sourceX Desired origin point x, in absolute px.\n * @param boundsInfo An object containing size information about the bounding\n * element (bounding box and width/height).\n * @param divSize An object containing information about the size of the\n * DropDownDiv (width & height).\n * @returns Various final metrics, including rendered positions for drop-down\n * and arrow.\n */\nfunction getPositionTopOfPageMetrics(\n sourceX: number, boundsInfo: BoundsInfo, divSize: Size): PositionMetrics {\n const xCoords =\n getPositionX(sourceX, boundsInfo.left, boundsInfo.right, divSize.width);\n\n // No need to provide arrow-specific information because it won't be visible.\n return {\n initialX: xCoords.divX,\n initialY: 0,\n finalX: xCoords.divX, // X position remains constant during animation.\n finalY: 0, // Y position remains constant during animation.\n arrowAtTop: null,\n arrowX: null,\n arrowY: null,\n arrowVisible: false,\n };\n}\n\n/**\n * Get the x positions for the left side of the DropDownDiv and the arrow,\n * accounting for the bounds of the workspace.\n *\n * @param sourceX Desired origin point x, in absolute px.\n * @param boundsLeft The left edge of the bounding element, in absolute px.\n * @param boundsRight The right edge of the bounding element, in absolute px.\n * @param divWidth The width of the div in px.\n * @returns An object containing metrics for the x positions of the left side of\n * the DropDownDiv and the arrow.\n * @internal\n */\nexport function getPositionX(\n sourceX: number, boundsLeft: number, boundsRight: number,\n divWidth: number): {divX: number, arrowX: number} {\n let divX = sourceX;\n // Offset the topLeft coord so that the dropdowndiv is centered.\n divX -= divWidth / 2;\n // Fit the dropdowndiv within the bounds of the workspace.\n divX = math.clamp(boundsLeft, divX, boundsRight - divWidth);\n\n let arrowX = sourceX;\n // Offset the arrow coord so that the arrow is centered.\n arrowX -= ARROW_SIZE / 2;\n // Convert the arrow position to be relative to the top left of the div.\n let relativeArrowX = arrowX - divX;\n const horizPadding = ARROW_HORIZONTAL_PADDING;\n // Clamp the arrow position so that it stays attached to the dropdowndiv.\n relativeArrowX = math.clamp(\n horizPadding, relativeArrowX, divWidth - horizPadding - ARROW_SIZE);\n\n return {arrowX: relativeArrowX, divX};\n}\n\n/**\n * Is the container visible?\n *\n * @returns True if visible.\n */\nexport function isVisible(): boolean {\n return !!owner;\n}\n\n/**\n * Hide the menu only if it is owned by the provided object.\n *\n * @param divOwner Object which must be owning the drop-down to hide.\n * @param opt_withoutAnimation True if we should hide the dropdown without\n * animating.\n * @returns True if hidden.\n */\nexport function hideIfOwner(\n divOwner: Field, opt_withoutAnimation?: boolean): boolean {\n if (owner === divOwner) {\n if (opt_withoutAnimation) {\n hideWithoutAnimation();\n } else {\n hide();\n }\n return true;\n }\n return false;\n}\n\n/** Hide the menu, triggering animation. */\nexport function hide() {\n // Start the animation by setting the translation and fading out.\n // Reset to (initialX, initialY) - i.e., no translation.\n div.style.transform = 'translate(0, 0)';\n div.style.opacity = '0';\n // Finish animation - reset all values to default.\n animateOutTimer = setTimeout(function() {\n hideWithoutAnimation();\n }, ANIMATION_TIME * 1000);\n if (onHide) {\n onHide();\n onHide = null;\n }\n}\n\n/** Hide the menu, without animation. */\nexport function hideWithoutAnimation() {\n if (!isVisible()) {\n return;\n }\n if (animateOutTimer) {\n clearTimeout(animateOutTimer);\n }\n\n // Reset style properties in case this gets called directly\n // instead of hide() - see discussion on #2551.\n div.style.transform = '';\n div.style.left = '';\n div.style.top = '';\n div.style.opacity = '0';\n div.style.display = 'none';\n div.style.backgroundColor = '';\n div.style.borderColor = '';\n\n if (onHide) {\n onHide();\n onHide = null;\n }\n clearContent();\n owner = null;\n\n if (renderedClassName) {\n dom.removeClass(div, renderedClassName);\n renderedClassName = '';\n }\n if (themeClassName) {\n dom.removeClass(div, themeClassName);\n themeClassName = '';\n }\n (common.getMainWorkspace() as WorkspaceSvg).markFocused();\n}\n\n/**\n * Set the dropdown div's position.\n *\n * @param primaryX Desired origin point x, in absolute px.\n * @param primaryY Desired origin point y, in absolute px.\n * @param secondaryX Secondary/alternative origin point x, in absolute px.\n * @param secondaryY Secondary/alternative origin point y, in absolute px.\n * @returns True if the menu rendered at the primary origin point.\n */\nfunction positionInternal(\n primaryX: number, primaryY: number, secondaryX: number,\n secondaryY: number): boolean {\n const metrics =\n internal.getPositionMetrics(primaryX, primaryY, secondaryX, secondaryY);\n\n // Update arrow CSS.\n if (metrics.arrowVisible) {\n arrow.style.display = '';\n arrow.style.transform = 'translate(' + metrics.arrowX + 'px,' +\n metrics.arrowY + 'px) rotate(45deg)';\n arrow.setAttribute(\n 'class',\n metrics.arrowAtTop ? 'blocklyDropDownArrow blocklyArrowTop' :\n 'blocklyDropDownArrow blocklyArrowBottom');\n } else {\n arrow.style.display = 'none';\n }\n\n const initialX = Math.floor(metrics.initialX);\n const initialY = Math.floor(metrics.initialY);\n const finalX = Math.floor(metrics.finalX);\n const finalY = Math.floor(metrics.finalY);\n\n // First apply initial translation.\n div.style.left = initialX + 'px';\n div.style.top = initialY + 'px';\n\n // Show the div.\n div.style.display = 'block';\n div.style.opacity = '1';\n // Add final translate, animated through `transition`.\n // Coordinates are relative to (initialX, initialY),\n // where the drop-down is absolutely positioned.\n const dx = finalX - initialX;\n const dy = finalY - initialY;\n div.style.transform = 'translate(' + dx + 'px,' + dy + 'px)';\n\n return !!metrics.arrowAtTop;\n}\n\n/**\n * Repositions the dropdownDiv on window resize. If it doesn't know how to\n * calculate the new position, it will just hide it instead.\n *\n * @internal\n */\nexport function repositionForWindowResize() {\n // This condition mainly catches the dropdown div when it is being used as a\n // dropdown. It is important not to close it in this case because on Android,\n // when a field is focused, the soft keyboard opens triggering a window resize\n // event and we want the dropdown div to stick around so users can type into\n // it.\n if (owner) {\n const block = owner.getSourceBlock() as BlockSvg;\n const bBox = positionToField ? getScaledBboxOfField(owner) :\n getScaledBboxOfBlock(block);\n // If we can fit it, render below the block.\n const primaryX = bBox.left + (bBox.right - bBox.left) / 2;\n const primaryY = bBox.bottom;\n // If we can't fit it, render above the entire parent block.\n const secondaryX = primaryX;\n const secondaryY = bBox.top;\n positionInternal(primaryX, primaryY, secondaryX, secondaryY);\n } else {\n hide();\n }\n}\n\nexport const TEST_ONLY = internal;\n","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * This file is a universal registry that provides generic methods\n * for registering and unregistering different types of classes.\n *\n * @namespace Blockly.registry\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.registry');\n\nimport type {Abstract} from './events/events_abstract.js';\nimport type {Field} from './field.js';\nimport type {IBlockDragger} from './interfaces/i_block_dragger.js';\nimport type {IConnectionChecker} from './interfaces/i_connection_checker.js';\nimport type {IFlyout} from './interfaces/i_flyout.js';\nimport type {IMetricsManager} from './interfaces/i_metrics_manager.js';\nimport type {ISerializer} from './interfaces/i_serializer.js';\nimport type {IToolbox} from './interfaces/i_toolbox.js';\nimport type {Cursor} from './keyboard_nav/cursor.js';\nimport type {Options} from './options.js';\nimport type {Renderer} from './renderers/common/renderer.js';\nimport type {Theme} from './theme.js';\nimport type {ToolboxItem} from './toolbox/toolbox_item.js';\n\n\n/**\n * A map of maps. With the keys being the type and name of the class we are\n * registering and the value being the constructor function.\n * e.g. {'field': {'field_angle': Blockly.FieldAngle}}\n */\nconst typeMap: {\n [key: string]:\n {[key: string]: (new () => AnyDuringMigration)|AnyDuringMigration}\n} = Object.create(null);\nexport const TEST_ONLY = {typeMap};\n\n/**\n * A map of maps. With the keys being the type and caseless name of the class we\n * are registring, and the value being the most recent cased name for that\n * registration.\n */\nconst nameMap: {[key: string]: {[key: string]: string}} = Object.create(null);\n\n/**\n * The string used to register the default class for a type of plugin.\n *\n * @alias Blockly.registry.DEFAULT\n */\nexport const DEFAULT = 'default';\n\n/**\n * A name with the type of the element stored in the generic.\n *\n * @alias Blockly.registry.Type\n */\nexport class Type<_T> {\n /** @param name The name of the registry type. */\n constructor(private readonly name: string) {}\n\n /**\n * Returns the name of the type.\n *\n * @returns The name.\n */\n toString(): string {\n return this.name;\n }\n\n static CONNECTION_CHECKER = new Type('connectionChecker');\n\n static CURSOR = new Type('cursor');\n\n static EVENT = new Type('event');\n\n static FIELD = new Type('field');\n\n static RENDERER = new Type('renderer');\n\n static TOOLBOX = new Type('toolbox');\n\n static THEME = new Type('theme');\n\n static TOOLBOX_ITEM = new Type('toolboxItem');\n\n static FLYOUTS_VERTICAL_TOOLBOX = new Type('flyoutsVerticalToolbox');\n\n static FLYOUTS_HORIZONTAL_TOOLBOX =\n new Type('flyoutsHorizontalToolbox');\n\n static METRICS_MANAGER = new Type('metricsManager');\n\n static BLOCK_DRAGGER = new Type('blockDragger');\n\n /** @internal */\n static SERIALIZER = new Type('serializer');\n}\n\n/**\n * Registers a class based on a type and name.\n *\n * @param type The type of the plugin.\n * (e.g. Field, Renderer)\n * @param name The plugin's name. (Ex. field_angle, geras)\n * @param registryItem The class or object to register.\n * @param opt_allowOverrides True to prevent an error when overriding an already\n * registered item.\n * @throws {Error} if the type or name is empty, a name with the given type has\n * already been registered, or if the given class or object is not valid for\n * its type.\n * @alias Blockly.registry.register\n */\nexport function register(\n type: string|Type, name: string,\n registryItem: (new (...p1: AnyDuringMigration[]) => T)|null|\n AnyDuringMigration,\n opt_allowOverrides?: boolean): void {\n if (!(type instanceof Type) && typeof type !== 'string' ||\n String(type).trim() === '') {\n throw Error(\n 'Invalid type \"' + type + '\". The type must be a' +\n ' non-empty string or a Blockly.registry.Type.');\n }\n type = String(type).toLowerCase();\n\n if (typeof name !== 'string' || name.trim() === '') {\n throw Error(\n 'Invalid name \"' + name + '\". The name must be a' +\n ' non-empty string.');\n }\n const caselessName = name.toLowerCase();\n if (!registryItem) {\n throw Error('Can not register a null value');\n }\n let typeRegistry = typeMap[type];\n let nameRegistry = nameMap[type];\n // If the type registry has not been created, create it.\n if (!typeRegistry) {\n typeRegistry = typeMap[type] = Object.create(null);\n nameRegistry = nameMap[type] = Object.create(null);\n }\n\n // Validate that the given class has all the required properties.\n validate(type, registryItem);\n\n // Don't throw an error if opt_allowOverrides is true.\n if (!opt_allowOverrides && typeRegistry[caselessName]) {\n throw Error(\n 'Name \"' + caselessName + '\" with type \"' + type +\n '\" already registered.');\n }\n typeRegistry[caselessName] = registryItem;\n nameRegistry[caselessName] = name;\n}\n\n/**\n * Checks the given registry item for properties that are required based on the\n * type.\n *\n * @param type The type of the plugin. (e.g. Field, Renderer)\n * @param registryItem A class or object that we are checking for the required\n * properties.\n */\nfunction validate(type: string, registryItem: Function|AnyDuringMigration) {\n switch (type) {\n case String(Type.FIELD):\n if (typeof registryItem.fromJson !== 'function') {\n throw Error('Type \"' + type + '\" must have a fromJson function');\n }\n break;\n }\n}\n\n/**\n * Unregisters the registry item with the given type and name.\n *\n * @param type The type of the plugin.\n * (e.g. Field, Renderer)\n * @param name The plugin's name. (Ex. field_angle, geras)\n * @alias Blockly.registry.unregister\n */\nexport function unregister(type: string|Type, name: string) {\n type = String(type).toLowerCase();\n name = name.toLowerCase();\n const typeRegistry = typeMap[type];\n if (!typeRegistry || !typeRegistry[name]) {\n console.warn(\n 'Unable to unregister [' + name + '][' + type + '] from the ' +\n 'registry.');\n return;\n }\n delete typeMap[type][name];\n delete nameMap[type][name];\n}\n\n/**\n * Gets the registry item for the given name and type. This can be either a\n * class or an object.\n *\n * @param type The type of the plugin.\n * (e.g. Field, Renderer)\n * @param name The plugin's name. (Ex. field_angle, geras)\n * @param opt_throwIfMissing Whether or not to throw an error if we are unable\n * to find the plugin.\n * @returns The class or object with the given name and type or null if none\n * exists.\n */\nfunction getItem(\n type: string|Type, name: string, opt_throwIfMissing?: boolean):\n (new (...p1: AnyDuringMigration[]) => T)|null|AnyDuringMigration {\n type = String(type).toLowerCase();\n name = name.toLowerCase();\n const typeRegistry = typeMap[type];\n if (!typeRegistry || !typeRegistry[name]) {\n const msg = 'Unable to find [' + name + '][' + type + '] in the registry.';\n if (opt_throwIfMissing) {\n throw new Error(\n msg + ' You must require or register a ' + type + ' plugin.');\n } else {\n console.warn(msg);\n }\n return null;\n }\n return typeRegistry[name];\n}\n\n/**\n * Returns whether or not the registry contains an item with the given type and\n * name.\n *\n * @param type The type of the plugin.\n * (e.g. Field, Renderer)\n * @param name The plugin's name. (Ex. field_angle, geras)\n * @returns True if the registry has an item with the given type and name, false\n * otherwise.\n * @alias Blockly.registry.hasItem\n */\nexport function hasItem(type: string|Type, name: string): boolean {\n type = String(type).toLowerCase();\n name = name.toLowerCase();\n const typeRegistry = typeMap[type];\n if (!typeRegistry) {\n return false;\n }\n return !!typeRegistry[name];\n}\n\n/**\n * Gets the class for the given name and type.\n *\n * @param type The type of the plugin.\n * (e.g. Field, Renderer)\n * @param name The plugin's name. (Ex. field_angle, geras)\n * @param opt_throwIfMissing Whether or not to throw an error if we are unable\n * to find the plugin.\n * @returns The class with the given name and type or null if none exists.\n * @alias Blockly.registry.getClass\n */\nexport function getClass(\n type: string|Type, name: string, opt_throwIfMissing?: boolean):\n (new (...p1: AnyDuringMigration[]) => T)|null {\n return getItem(type, name, opt_throwIfMissing) as (\n new (...p1: AnyDuringMigration[]) => T) |\n null;\n}\n\n/**\n * Gets the object for the given name and type.\n *\n * @param type The type of the plugin.\n * (e.g. Category)\n * @param name The plugin's name. (Ex. logic_category)\n * @param opt_throwIfMissing Whether or not to throw an error if we are unable\n * to find the object.\n * @returns The object with the given name and type or null if none exists.\n * @alias Blockly.registry.getObject\n */\nexport function getObject(\n type: string|Type, name: string, opt_throwIfMissing?: boolean): T|null {\n return getItem(type, name, opt_throwIfMissing) as T;\n}\n\n/**\n * Returns a map of items registered with the given type.\n *\n * @param type The type of the plugin. (e.g. Category)\n * @param opt_cased Whether or not to return a map with cased keys (rather than\n * caseless keys). False by default.\n * @param opt_throwIfMissing Whether or not to throw an error if we are unable\n * to find the object. False by default.\n * @returns A map of objects with the given type, or null if none exists.\n * @alias Blockly.registry.getAllItems\n */\nexport function getAllItems(\n type: string|Type, opt_cased?: boolean, opt_throwIfMissing?: boolean):\n {[key: string]: T|null|(new (...p1: AnyDuringMigration[]) => T)}|null {\n type = String(type).toLowerCase();\n const typeRegistry = typeMap[type];\n if (!typeRegistry) {\n const msg = `Unable to find [${type}] in the registry.`;\n if (opt_throwIfMissing) {\n throw new Error(`${msg} You must require or register a ${type} plugin.`);\n } else {\n console.warn(msg);\n }\n return null;\n }\n if (!opt_cased) {\n return typeRegistry;\n }\n const nameRegistry = nameMap[type];\n const casedRegistry = Object.create(null);\n const keys = Object.keys(typeRegistry);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n casedRegistry[nameRegistry[key]] = typeRegistry[key];\n }\n return casedRegistry;\n}\n\n/**\n * Gets the class from Blockly options for the given type.\n * This is used for plugins that override a built in feature. (e.g. Toolbox)\n *\n * @param type The type of the plugin.\n * @param options The option object to check for the given plugin.\n * @param opt_throwIfMissing Whether or not to throw an error if we are unable\n * to find the plugin.\n * @returns The class for the plugin.\n * @alias Blockly.registry.getClassFromOptions\n */\nexport function getClassFromOptions(\n type: Type, options: Options, opt_throwIfMissing?: boolean):\n (new (...p1: AnyDuringMigration[]) => T)|null {\n const typeName = type.toString();\n const plugin = options.plugins[typeName] || DEFAULT;\n\n // If the user passed in a plugin class instead of a registered plugin name.\n if (typeof plugin === 'function') {\n return plugin;\n }\n return getClass(type, plugin, opt_throwIfMissing);\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Generators for unique IDs.\n *\n * @namespace Blockly.utils.idGenerator\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.idGenerator');\n\n/**\n * Legal characters for the universally unique IDs. Should be all on\n * a US keyboard. No characters that conflict with XML or JSON.\n * Requests to remove additional 'problematic' characters from this\n * soup will be denied. That's your failure to properly escape in\n * your own environment. Issues #251, #625, #682, #1304.\n */\nconst soup = '!#$%()*+,-./:;=?@[]^_`{|}~' +\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\n/**\n * Namespace object for internal implementations we want to be able to\n * stub in tests. Do not use externally.\n *\n * @internal\n */\nconst internal = {\n /**\n * Generate a random unique ID. This should be globally unique.\n * 87 characters ^ 20 length is greater than 128 bits (better than a UUID).\n *\n * @returns A globally unique ID string.\n */\n genUid: () => {\n const length = 20;\n const soupLength = soup.length;\n const id = [];\n for (let i = 0; i < length; i++) {\n id[i] = soup.charAt(Math.random() * soupLength);\n }\n return id.join('');\n },\n};\nexport const TEST_ONLY = internal;\n\n/** Next unique ID to use. */\nlet nextId = 0;\n\n/**\n * Generate the next unique element IDs.\n * IDs are compatible with the HTML4 'id' attribute restrictions:\n * Use only ASCII letters, digits, '_', '-' and '.'\n *\n * For UUIDs use genUid (below) instead; this ID generator should\n * primarily be used for IDs that end up in the DOM.\n *\n * @returns The next unique identifier.\n * @alias Blockly.utils.idGenerator.getNextUniqueId\n */\nexport function getNextUniqueId(): string {\n return 'blockly-' + (nextId++).toString(36);\n}\n\n/**\n * Generate a random unique ID.\n *\n * @see internal.genUid\n * @returns A globally unique ID string.\n * @alias Blockly.utils.idGenerator.genUid\n */\nexport function genUid(): string {\n return internal.genUid();\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Helper methods for events that are fired as a result of\n * actions in Blockly's editor.\n *\n * @namespace Blockly.Events.utils\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Events.utils');\n\nimport type {Block} from '../block.js';\nimport * as common from '../common.js';\nimport * as registry from '../registry.js';\nimport * as idGenerator from '../utils/idgenerator.js';\nimport type {Workspace} from '../workspace.js';\nimport type {WorkspaceSvg} from '../workspace_svg.js';\n\nimport type {Abstract} from './events_abstract.js';\nimport type {BlockChange} from './events_block_change.js';\nimport type {BlockCreate} from './events_block_create.js';\nimport type {BlockMove} from './events_block_move.js';\nimport type {CommentCreate} from './events_comment_create.js';\nimport type {CommentMove} from './events_comment_move.js';\nimport type {ViewportChange} from './events_viewport.js';\n\n\n/** Group ID for new events. Grouped events are indivisible. */\nlet group = '';\n\n/** Sets whether the next event should be added to the undo stack. */\nlet recordUndo = true;\n\n/**\n * Sets whether events should be added to the undo stack.\n *\n * @param newValue True if events should be added to the undo stack.\n * @alias Blockly.Events.utils.setRecordUndo\n */\nexport function setRecordUndo(newValue: boolean) {\n recordUndo = newValue;\n}\n\n/**\n * Returns whether or not events will be added to the undo stack.\n *\n * @returns True if events will be added to the undo stack.\n * @alias Blockly.Events.utils.getRecordUndo\n */\nexport function getRecordUndo(): boolean {\n return recordUndo;\n}\n\n/** Allow change events to be created and fired. */\nlet disabled = 0;\n\n/**\n * Name of event that creates a block. Will be deprecated for BLOCK_CREATE.\n *\n * @alias Blockly.Events.utils.CREATE\n */\nexport const CREATE = 'create';\n\n/**\n * Name of event that creates a block.\n *\n * @alias Blockly.Events.utils.BLOCK_CREATE\n */\nexport const BLOCK_CREATE = CREATE;\n\n/**\n * Name of event that deletes a block. Will be deprecated for BLOCK_DELETE.\n *\n * @alias Blockly.Events.utils.DELETE\n */\nexport const DELETE = 'delete';\n\n/**\n * Name of event that deletes a block.\n *\n * @alias Blockly.Events.utils.BLOCK_DELETE\n */\nexport const BLOCK_DELETE = DELETE;\n\n/**\n * Name of event that changes a block. Will be deprecated for BLOCK_CHANGE.\n *\n * @alias Blockly.Events.utils.CHANGE\n */\nexport const CHANGE = 'change';\n\n/**\n * Name of event that changes a block.\n *\n * @alias Blockly.Events.utils.BLOCK_CHANGE\n */\nexport const BLOCK_CHANGE = CHANGE;\n\n/**\n * Name of event that moves a block. Will be deprecated for BLOCK_MOVE.\n *\n * @alias Blockly.Events.utils.MOVE\n */\nexport const MOVE = 'move';\n\n/**\n * Name of event that moves a block.\n *\n * @alias Blockly.Events.utils.BLOCK_MOVE\n */\nexport const BLOCK_MOVE = MOVE;\n\n/**\n * Name of event that creates a variable.\n *\n * @alias Blockly.Events.utils.VAR_CREATE\n */\nexport const VAR_CREATE = 'var_create';\n\n/**\n * Name of event that deletes a variable.\n *\n * @alias Blockly.Events.utils.VAR_DELETE\n */\nexport const VAR_DELETE = 'var_delete';\n\n/**\n * Name of event that renames a variable.\n *\n * @alias Blockly.Events.utils.VAR_RENAME\n */\nexport const VAR_RENAME = 'var_rename';\n\n/**\n * Name of generic event that records a UI change.\n *\n * @alias Blockly.Events.utils.UI\n */\nexport const UI = 'ui';\n\n/**\n * Name of event that record a block drags a block.\n *\n * @alias Blockly.Events.utils.BLOCK_DRAG\n */\nexport const BLOCK_DRAG = 'drag';\n\n/**\n * Name of event that records a change in selected element.\n *\n * @alias Blockly.Events.utils.SELECTED\n */\nexport const SELECTED = 'selected';\n\n/**\n * Name of event that records a click.\n *\n * @alias Blockly.Events.utils.CLICK\n */\nexport const CLICK = 'click';\n\n/**\n * Name of event that records a marker move.\n *\n * @alias Blockly.Events.utils.MARKER_MOVE\n */\nexport const MARKER_MOVE = 'marker_move';\n\n/**\n * Name of event that records a bubble open.\n *\n * @alias Blockly.Events.utils.BUBBLE_OPEN\n */\nexport const BUBBLE_OPEN = 'bubble_open';\n\n/**\n * Name of event that records a trashcan open.\n *\n * @alias Blockly.Events.utils.TRASHCAN_OPEN\n */\nexport const TRASHCAN_OPEN = 'trashcan_open';\n\n/**\n * Name of event that records a toolbox item select.\n *\n * @alias Blockly.Events.utils.TOOLBOX_ITEM_SELECT\n */\nexport const TOOLBOX_ITEM_SELECT = 'toolbox_item_select';\n\n/**\n * Name of event that records a theme change.\n *\n * @alias Blockly.Events.utils.THEME_CHANGE\n */\nexport const THEME_CHANGE = 'theme_change';\n\n/**\n * Name of event that records a viewport change.\n *\n * @alias Blockly.Events.utils.VIEWPORT_CHANGE\n */\nexport const VIEWPORT_CHANGE = 'viewport_change';\n\n/**\n * Name of event that creates a comment.\n *\n * @alias Blockly.Events.utils.COMMENT_CREATE\n */\nexport const COMMENT_CREATE = 'comment_create';\n\n/**\n * Name of event that deletes a comment.\n *\n * @alias Blockly.Events.utils.COMMENT_DELETE\n */\nexport const COMMENT_DELETE = 'comment_delete';\n\n/**\n * Name of event that changes a comment.\n *\n * @alias Blockly.Events.utils.COMMENT_CHANGE\n */\nexport const COMMENT_CHANGE = 'comment_change';\n\n/**\n * Name of event that moves a comment.\n *\n * @alias Blockly.Events.utils.COMMENT_MOVE\n */\nexport const COMMENT_MOVE = 'comment_move';\n\n/**\n * Name of event that records a workspace load.\n *\n * @alias Blockly.Events.utils.FINISHED_LOADING\n */\nexport const FINISHED_LOADING = 'finished_loading';\n\n/**\n * Type of events that cause objects to be bumped back into the visible\n * portion of the workspace.\n *\n * Not to be confused with bumping so that disconnected connections do not\n * appear connected.\n *\n * @alias Blockly.Events.utils.BumpEvent\n */\nexport type BumpEvent = BlockCreate|BlockMove|CommentCreate|CommentMove;\n\n/**\n * List of events that cause objects to be bumped back into the visible\n * portion of the workspace.\n *\n * Not to be confused with bumping so that disconnected connections do not\n * appear connected.\n *\n * @alias Blockly.Events.utils.BUMP_EVENTS\n */\nexport const BUMP_EVENTS: string[] =\n [BLOCK_CREATE, BLOCK_MOVE, COMMENT_CREATE, COMMENT_MOVE];\n\n/** List of events queued for firing. */\nconst FIRE_QUEUE: Abstract[] = [];\n\n/**\n * Create a custom event and fire it.\n *\n * @param event Custom data for event.\n * @alias Blockly.Events.utils.fire\n */\nexport function fire(event: Abstract) {\n TEST_ONLY.fireInternal(event);\n}\n\n/**\n * Private version of fireInternal for stubbing in tests.\n */\nfunction fireInternal(event: Abstract) {\n if (!isEnabled()) {\n return;\n }\n if (!FIRE_QUEUE.length) {\n // First event added; schedule a firing of the event queue.\n setTimeout(fireNow, 0);\n }\n FIRE_QUEUE.push(event);\n}\n\n\n/** Fire all queued events. */\nfunction fireNow() {\n const queue = filter(FIRE_QUEUE, true);\n FIRE_QUEUE.length = 0;\n for (let i = 0, event; event = queue[i]; i++) {\n if (!event.workspaceId) {\n continue;\n }\n const eventWorkspace = common.getWorkspaceById(event.workspaceId);\n if (eventWorkspace) {\n eventWorkspace.fireChangeListener(event);\n }\n }\n}\n\n/**\n * Filter the queued events and merge duplicates.\n *\n * @param queueIn Array of events.\n * @param forward True if forward (redo), false if backward (undo).\n * @returns Array of filtered events.\n * @alias Blockly.Events.utils.filter\n */\nexport function filter(queueIn: Abstract[], forward: boolean): Abstract[] {\n let queue = queueIn.slice();\n // Shallow copy of queue.\n if (!forward) {\n // Undo is merged in reverse order.\n queue.reverse();\n }\n const mergedQueue = [];\n const hash = Object.create(null);\n // Merge duplicates.\n for (let i = 0, event; event = queue[i]; i++) {\n if (!event.isNull()) {\n // Treat all UI events as the same type in hash table.\n const eventType = event.isUiEvent ? UI : event.type;\n // TODO(#5927): Check whether `blockId` exists before accessing it.\n const blockId = (event as AnyDuringMigration).blockId;\n const key = [eventType, blockId, event.workspaceId].join(' ');\n\n const lastEntry = hash[key];\n const lastEvent = lastEntry ? lastEntry.event : null;\n if (!lastEntry) {\n // Each item in the hash table has the event and the index of that event\n // in the input array. This lets us make sure we only merge adjacent\n // move events.\n hash[key] = {event, index: i};\n mergedQueue.push(event);\n } else if (event.type === MOVE && lastEntry.index === i - 1) {\n const moveEvent = event as BlockMove;\n // Merge move events.\n lastEvent.newParentId = moveEvent.newParentId;\n lastEvent.newInputName = moveEvent.newInputName;\n lastEvent.newCoordinate = moveEvent.newCoordinate;\n lastEntry.index = i;\n } else if (\n event.type === CHANGE &&\n (event as BlockChange).element === lastEvent.element &&\n (event as BlockChange).name === lastEvent.name) {\n const changeEvent = event as BlockChange;\n // Merge change events.\n lastEvent.newValue = changeEvent.newValue;\n } else if (event.type === VIEWPORT_CHANGE) {\n const viewportEvent = event as ViewportChange;\n // Merge viewport change events.\n lastEvent.viewTop = viewportEvent.viewTop;\n lastEvent.viewLeft = viewportEvent.viewLeft;\n lastEvent.scale = viewportEvent.scale;\n lastEvent.oldScale = viewportEvent.oldScale;\n } else if (event.type === CLICK && lastEvent.type === BUBBLE_OPEN) {\n // Drop click events caused by opening/closing bubbles.\n } else {\n // Collision: newer events should merge into this event to maintain\n // order.\n hash[key] = {event, index: i};\n mergedQueue.push(event);\n }\n }\n }\n // Filter out any events that have become null due to merging.\n queue = mergedQueue.filter(function(e) {\n return !e.isNull();\n });\n if (!forward) {\n // Restore undo order.\n queue.reverse();\n }\n // Move mutation events to the top of the queue.\n // Intentionally skip first event.\n for (let i = 1, event; event = queue[i]; i++) {\n // AnyDuringMigration because: Property 'element' does not exist on type\n // 'Abstract'.\n if (event.type === CHANGE &&\n (event as AnyDuringMigration).element === 'mutation') {\n queue.unshift(queue.splice(i, 1)[0]);\n }\n }\n return queue;\n}\n\n/**\n * Modify pending undo events so that when they are fired they don't land\n * in the undo stack. Called by Workspace.clearUndo.\n *\n * @alias Blockly.Events.utils.clearPendingUndo\n */\nexport function clearPendingUndo() {\n for (let i = 0, event; event = FIRE_QUEUE[i]; i++) {\n event.recordUndo = false;\n }\n}\n\n/**\n * Stop sending events. Every call to this function MUST also call enable.\n *\n * @alias Blockly.Events.utils.disable\n */\nexport function disable() {\n disabled++;\n}\n\n/**\n * Start sending events. Unless events were already disabled when the\n * corresponding call to disable was made.\n *\n * @alias Blockly.Events.utils.enable\n */\nexport function enable() {\n disabled--;\n}\n\n/**\n * Returns whether events may be fired or not.\n *\n * @returns True if enabled.\n * @alias Blockly.Events.utils.isEnabled\n */\nexport function isEnabled(): boolean {\n return disabled === 0;\n}\n\n/**\n * Current group.\n *\n * @returns ID string.\n * @alias Blockly.Events.utils.getGroup\n */\nexport function getGroup(): string {\n return group;\n}\n\n/**\n * Start or stop a group.\n *\n * @param state True to start new group, false to end group.\n * String to set group explicitly.\n * @alias Blockly.Events.utils.setGroup\n */\nexport function setGroup(state: boolean|string) {\n TEST_ONLY.setGroupInternal(state);\n}\n\n/**\n * Private version of setGroup for stubbing in tests.\n */\nfunction setGroupInternal(state: boolean|string) {\n if (typeof state === 'boolean') {\n group = state ? idGenerator.genUid() : '';\n } else {\n group = state;\n }\n}\n\n/**\n * Compute a list of the IDs of the specified block and all its descendants.\n *\n * @param block The root block.\n * @returns List of block IDs.\n * @alias Blockly.Events.utils.getDescendantIds\n * @internal\n */\nexport function getDescendantIds(block: Block): string[] {\n const ids = [];\n const descendants = block.getDescendants(false);\n for (let i = 0, descendant; descendant = descendants[i]; i++) {\n ids[i] = descendant.id;\n }\n return ids;\n}\n\n/**\n * Decode the JSON into an event.\n *\n * @param json JSON representation.\n * @param workspace Target workspace for event.\n * @returns The event represented by the JSON.\n * @throws {Error} if an event type is not found in the registry.\n * @alias Blockly.Events.utils.fromJson\n */\nexport function fromJson(\n json: AnyDuringMigration, workspace: Workspace): Abstract {\n const eventClass = get(json['type']);\n if (!eventClass) {\n throw Error('Unknown event type.');\n }\n const event = new eventClass();\n event.fromJson(json);\n event.workspaceId = workspace.id;\n return event;\n}\n\n/**\n * Gets the class for a specific event type from the registry.\n *\n * @param eventType The type of the event to get.\n * @returns The event class with the given type.\n * @alias Blockly.Events.utils.get\n */\nexport function get(eventType: string):\n (new (...p1: AnyDuringMigration[]) => Abstract) {\n const event = registry.getClass(registry.Type.EVENT, eventType);\n if (!event) {\n throw new Error(`Event type ${eventType} not found in registry.`);\n }\n return event;\n}\n\n/**\n * Enable/disable a block depending on whether it is properly connected.\n * Use this on applications where all blocks should be connected to a top block.\n * Recommend setting the 'disable' option to 'false' in the config so that\n * users don't try to re-enable disabled orphan blocks.\n *\n * @param event Custom data for event.\n * @alias Blockly.Events.utils.disableOrphans\n */\nexport function disableOrphans(event: Abstract) {\n if (event.type === MOVE || event.type === CREATE) {\n const blockEvent = event as BlockMove | BlockCreate;\n if (!blockEvent.workspaceId) {\n return;\n }\n const eventWorkspace =\n common.getWorkspaceById(blockEvent.workspaceId) as WorkspaceSvg;\n if (!blockEvent.blockId) {\n throw new Error('Encountered a blockEvent without a proper blockId');\n }\n let block = eventWorkspace.getBlockById(blockEvent.blockId);\n if (block) {\n // Changing blocks as part of this event shouldn't be undoable.\n const initialUndoFlag = recordUndo;\n try {\n recordUndo = false;\n const parent = block.getParent();\n if (parent && parent.isEnabled()) {\n const children = block.getDescendants(false);\n for (let i = 0, child; child = children[i]; i++) {\n child.setEnabled(true);\n }\n } else if (\n (block.outputConnection || block.previousConnection) &&\n !eventWorkspace.isDragging()) {\n do {\n block.setEnabled(false);\n block = block.getNextBlock();\n } while (block);\n }\n } finally {\n recordUndo = initialUndoFlag;\n }\n }\n }\n}\n\nexport const TEST_ONLY = {\n FIRE_QUEUE,\n fireNow,\n fireInternal,\n setGroupInternal,\n};\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * XML element manipulation.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.xml\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.xml');\n\n\n/**\n * Namespace for Blockly's XML.\n *\n * @alias Blockly.utils.xml.NAME_SPACE\n */\nexport const NAME_SPACE = 'https://developers.google.com/blockly/xml';\n\n/**\n * The Document object to use. By default this is just document, but\n * the Node.js build of Blockly (see scripts/package/node/core.js)\n * calls setDocument to supply a Document implementation from the\n * jsdom package instead.\n */\nlet xmlDocument: Document = globalThis['document'];\n\n/**\n * Get the document object to use for XML serialization.\n *\n * @returns The document object.\n * @alias Blockly.utils.xml.getDocument\n */\nexport function getDocument(): Document {\n return xmlDocument;\n}\n\n/**\n * Get the document object to use for XML serialization.\n *\n * @param document The document object to use.\n * @alias Blockly.utils.xml.setDocument\n */\nexport function setDocument(document: Document) {\n xmlDocument = document;\n}\n\n/**\n * Create DOM element for XML.\n *\n * @param tagName Name of DOM element.\n * @returns New DOM element.\n * @alias Blockly.utils.xml.createElement\n */\nexport function createElement(tagName: string): Element {\n return xmlDocument.createElementNS(NAME_SPACE, tagName);\n}\n\n/**\n * Create text element for XML.\n *\n * @param text Text content.\n * @returns New DOM text node.\n * @alias Blockly.utils.xml.createTextNode\n */\nexport function createTextNode(text: string): Text {\n return xmlDocument.createTextNode(text);\n}\n\n/**\n * Converts an XML string into a DOM tree.\n *\n * @param text XML string.\n * @returns The DOM document.\n * @throws if XML doesn't parse.\n * @alias Blockly.utils.xml.textToDomDocument\n */\nexport function textToDomDocument(text: string): Document {\n const oParser = new DOMParser();\n return oParser.parseFromString(text, 'text/xml');\n}\n\n/**\n * Converts a DOM structure into plain text.\n * Currently the text format is fairly ugly: all one line with no whitespace.\n *\n * @param dom A tree of XML nodes.\n * @returns Text representation.\n * @alias Blockly.utils.xml.domToText\n */\nexport function domToText(dom: Node): string {\n const oSerializer = new XMLSerializer();\n return oSerializer.serializeToString(dom);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Wrapper functions around JS functions for showing alert/confirmation dialogs.\n *\n * @namespace Blockly.dialog\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.dialog');\n\n\nlet alertImplementation = function(message: string, opt_callback?: () => void) {\n window.alert(message);\n if (opt_callback) {\n opt_callback();\n }\n};\n\nlet confirmImplementation = function(\n message: string, callback: (result: boolean) => void) {\n callback(window.confirm(message));\n};\n\nlet promptImplementation = function(\n message: string, defaultValue: string,\n callback: (result: string|null) => void) {\n callback(window.prompt(message, defaultValue));\n};\n\n/**\n * Wrapper to window.alert() that app developers may override via setAlert to\n * provide alternatives to the modal browser window.\n *\n * @param message The message to display to the user.\n * @param opt_callback The callback when the alert is dismissed.\n * @alias Blockly.dialog.alert\n */\nexport function alert(message: string, opt_callback?: () => void) {\n alertImplementation(message, opt_callback);\n}\n\n/**\n * Sets the function to be run when Blockly.dialog.alert() is called.\n *\n * @param alertFunction The function to be run.\n * @see Blockly.dialog.alert\n * @alias Blockly.dialog.setAlert\n */\nexport function setAlert(alertFunction: (p1: string, p2?: () => void) => void) {\n alertImplementation = alertFunction;\n}\n\n/**\n * Wrapper to window.confirm() that app developers may override via setConfirm\n * to provide alternatives to the modal browser window.\n *\n * @param message The message to display to the user.\n * @param callback The callback for handling user response.\n * @alias Blockly.dialog.confirm\n */\nexport function confirm(message: string, callback: (p1: boolean) => void) {\n TEST_ONLY.confirmInternal(message, callback);\n}\n\n/**\n * Private version of confirm for stubbing in tests.\n */\nfunction confirmInternal(message: string, callback: (p1: boolean) => void) {\n confirmImplementation(message, callback);\n}\n\n\n/**\n * Sets the function to be run when Blockly.dialog.confirm() is called.\n *\n * @param confirmFunction The function to be run.\n * @see Blockly.dialog.confirm\n * @alias Blockly.dialog.setConfirm\n */\nexport function setConfirm(\n confirmFunction: (p1: string, p2: (p1: boolean) => void) => void) {\n confirmImplementation = confirmFunction;\n}\n\n/**\n * Wrapper to window.prompt() that app developers may override via setPrompt to\n * provide alternatives to the modal browser window. Built-in browser prompts\n * are often used for better text input experience on mobile device. We strongly\n * recommend testing mobile when overriding this.\n *\n * @param message The message to display to the user.\n * @param defaultValue The value to initialize the prompt with.\n * @param callback The callback for handling user response.\n * @alias Blockly.dialog.prompt\n */\nexport function prompt(\n message: string, defaultValue: string,\n callback: (p1: string|null) => void) {\n promptImplementation(message, defaultValue, callback);\n}\n\n/**\n * Sets the function to be run when Blockly.dialog.prompt() is called.\n *\n * @param promptFunction The function to be run.\n * @see Blockly.dialog.prompt\n * @alias Blockly.dialog.setPrompt\n */\nexport function setPrompt(\n promptFunction: (p1: string, p2: string, p3: (p1: string|null) => void) =>\n void) {\n promptImplementation = promptFunction;\n}\n\nexport const TEST_ONLY = {\n confirmInternal,\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility functions for handling variables.\n *\n * @namespace Blockly.Variables\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Variables');\n\nimport {Blocks} from './blocks.js';\nimport * as dialog from './dialog.js';\nimport {Msg} from './msg.js';\nimport * as utilsXml from './utils/xml.js';\nimport {VariableModel} from './variable_model.js';\nimport type {Workspace} from './workspace.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\nimport * as Xml from './xml.js';\n\n\n/**\n * String for use in the \"custom\" attribute of a category in toolbox XML.\n * This string indicates that the category should be dynamically populated with\n * variable blocks.\n * See also Blockly.Procedures.CATEGORY_NAME and\n * Blockly.VariablesDynamic.CATEGORY_NAME.\n *\n * @alias Blockly.Variables.CATEGORY_NAME\n */\nexport const CATEGORY_NAME = 'VARIABLE';\n\n/**\n * Find all user-created variables that are in use in the workspace.\n * For use by generators.\n * To get a list of all variables on a workspace, including unused variables,\n * call Workspace.getAllVariables.\n *\n * @param ws The workspace to search for variables.\n * @returns Array of variable models.\n * @alias Blockly.Variables.allUsedVarModels\n */\nexport function allUsedVarModels(ws: Workspace): VariableModel[] {\n const blocks = ws.getAllBlocks(false);\n const variables = new Set();\n // Iterate through every block and add each variable to the set.\n for (let i = 0; i < blocks.length; i++) {\n const blockVariables = blocks[i].getVarModels();\n if (blockVariables) {\n for (let j = 0; j < blockVariables.length; j++) {\n const variable = blockVariables[j];\n const id = variable.getId();\n if (id) {\n variables.add(variable);\n }\n }\n }\n }\n // Convert the set into a list.\n return Array.from(variables.values());\n}\n\n/**\n * Find all developer variables used by blocks in the workspace.\n * Developer variables are never shown to the user, but are declared as global\n * variables in the generated code.\n * To declare developer variables, define the getDeveloperVariables function on\n * your block and return a list of variable names.\n * For use by generators.\n *\n * @param workspace The workspace to search.\n * @returns A list of non-duplicated variable names.\n * @alias Blockly.Variables.allDeveloperVariables\n */\nexport function allDeveloperVariables(workspace: Workspace): string[] {\n const blocks = workspace.getAllBlocks(false);\n const variables = new Set();\n for (let i = 0, block; block = blocks[i]; i++) {\n const getDeveloperVariables = block.getDeveloperVariables;\n if (getDeveloperVariables) {\n const devVars = getDeveloperVariables();\n for (let j = 0; j < devVars.length; j++) {\n variables.add(devVars[j]);\n }\n }\n }\n // Convert the set into a list.\n return Array.from(variables.values());\n}\n\n/**\n * Construct the elements (blocks and button) required by the flyout for the\n * variable category.\n *\n * @param workspace The workspace containing variables.\n * @returns Array of XML elements.\n * @alias Blockly.Variables.flyoutCategory\n */\nexport function flyoutCategory(workspace: WorkspaceSvg): Element[] {\n let xmlList = new Array();\n const button = document.createElement('button');\n button.setAttribute('text', '%{BKY_NEW_VARIABLE}');\n button.setAttribute('callbackKey', 'CREATE_VARIABLE');\n\n workspace.registerButtonCallback('CREATE_VARIABLE', function(button) {\n createVariableButtonHandler(button.getTargetWorkspace());\n });\n\n xmlList.push(button);\n\n const blockList = flyoutCategoryBlocks(workspace);\n xmlList = xmlList.concat(blockList);\n return xmlList;\n}\n\n/**\n * Construct the blocks required by the flyout for the variable category.\n *\n * @param workspace The workspace containing variables.\n * @returns Array of XML block elements.\n * @alias Blockly.Variables.flyoutCategoryBlocks\n */\nexport function flyoutCategoryBlocks(workspace: Workspace): Element[] {\n const variableModelList = workspace.getVariablesOfType('');\n\n const xmlList = [];\n if (variableModelList.length > 0) {\n // New variables are added to the end of the variableModelList.\n const mostRecentVariable = variableModelList[variableModelList.length - 1];\n if (Blocks['variables_set']) {\n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'variables_set');\n block.setAttribute('gap', Blocks['math_change'] ? '8' : '24');\n block.appendChild(generateVariableFieldDom(mostRecentVariable));\n xmlList.push(block);\n }\n if (Blocks['math_change']) {\n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'math_change');\n block.setAttribute('gap', Blocks['variables_get'] ? '20' : '8');\n block.appendChild(generateVariableFieldDom(mostRecentVariable));\n const value = Xml.textToDom(\n '' +\n '' +\n '1' +\n '' +\n '');\n block.appendChild(value);\n xmlList.push(block);\n }\n\n if (Blocks['variables_get']) {\n variableModelList.sort(VariableModel.compareByName);\n for (let i = 0, variable; variable = variableModelList[i]; i++) {\n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'variables_get');\n block.setAttribute('gap', '8');\n block.appendChild(generateVariableFieldDom(variable));\n xmlList.push(block);\n }\n }\n }\n return xmlList;\n}\n\n/** @alias Blockly.Variables.VAR_LETTER_OPTIONS */\nexport const VAR_LETTER_OPTIONS = 'ijkmnopqrstuvwxyzabcdefgh';\n\n/**\n * Return a new variable name that is not yet being used. This will try to\n * generate single letter variable names in the range 'i' to 'z' to start with.\n * If no unique name is located it will try 'i' to 'z', 'a' to 'h',\n * then 'i2' to 'z2' etc. Skip 'l'.\n *\n * @param workspace The workspace to be unique in.\n * @returns New variable name.\n * @alias Blockly.Variables.generateUniqueName\n */\nexport function generateUniqueName(workspace: Workspace): string {\n return TEST_ONLY.generateUniqueNameInternal(workspace);\n}\n\n/**\n * Private version of generateUniqueName for stubbing in tests.\n */\nfunction generateUniqueNameInternal(workspace: Workspace): string {\n return generateUniqueNameFromOptions(\n VAR_LETTER_OPTIONS.charAt(0), workspace.getAllVariableNames());\n}\n\n/**\n * Returns a unique name that is not present in the usedNames array. This\n * will try to generate single letter names in the range a - z (skip l). It\n * will start with the character passed to startChar.\n *\n * @param startChar The character to start the search at.\n * @param usedNames A list of all of the used names.\n * @returns A unique name that is not present in the usedNames array.\n * @alias Blockly.Variables.generateUniqueNameFromOptions\n */\nexport function generateUniqueNameFromOptions(\n startChar: string, usedNames: string[]): string {\n if (!usedNames.length) {\n return startChar;\n }\n\n const letters = VAR_LETTER_OPTIONS;\n let suffix = '';\n let letterIndex = letters.indexOf(startChar);\n let potName = startChar;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let inUse = false;\n for (let i = 0; i < usedNames.length; i++) {\n if (usedNames[i].toLowerCase() === potName) {\n inUse = true;\n break;\n }\n }\n if (!inUse) {\n return potName;\n }\n\n letterIndex++;\n if (letterIndex === letters.length) {\n // Reached the end of the character sequence so back to 'i'.\n letterIndex = 0;\n suffix = `${Number(suffix) + 1}`;\n }\n potName = letters.charAt(letterIndex) + suffix;\n }\n}\n\n/**\n * Handles \"Create Variable\" button in the default variables toolbox category.\n * It will prompt the user for a variable name, including re-prompts if a name\n * is already in use among the workspace's variables.\n *\n * Custom button handlers can delegate to this function, allowing variables\n * types and after-creation processing. More complex customization (e.g.,\n * prompting for variable type) is beyond the scope of this function.\n *\n * @param workspace The workspace on which to create the variable.\n * @param opt_callback A callback. It will be passed an acceptable new variable\n * name, or null if change is to be aborted (cancel button), or undefined if\n * an existing variable was chosen.\n * @param opt_type The type of the variable like 'int', 'string', or ''. This\n * will default to '', which is a specific type.\n * @alias Blockly.Variables.createVariableButtonHandler\n */\nexport function createVariableButtonHandler(\n workspace: Workspace, opt_callback?: (p1?: string|null) => void,\n opt_type?: string) {\n const type = opt_type || '';\n // This function needs to be named so it can be called recursively.\n function promptAndCheckWithAlert(defaultName: string) {\n promptName(Msg['NEW_VARIABLE_TITLE'], defaultName, function(text) {\n if (text) {\n const existing = nameUsedWithAnyType(text, workspace);\n if (existing) {\n let msg;\n if (existing.type === type) {\n msg = Msg['VARIABLE_ALREADY_EXISTS'].replace('%1', existing.name);\n } else {\n msg = Msg['VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE'];\n msg = msg.replace('%1', existing.name).replace('%2', existing.type);\n }\n dialog.alert(msg, function() {\n promptAndCheckWithAlert(text);\n });\n } else {\n // No conflict\n workspace.createVariable(text, type);\n if (opt_callback) {\n opt_callback(text);\n }\n }\n } else {\n // User canceled prompt.\n if (opt_callback) {\n opt_callback(null);\n }\n }\n });\n }\n promptAndCheckWithAlert('');\n}\n\n/**\n * Opens a prompt that allows the user to enter a new name for a variable.\n * Triggers a rename if the new name is valid. Or re-prompts if there is a\n * collision.\n *\n * @param workspace The workspace on which to rename the variable.\n * @param variable Variable to rename.\n * @param opt_callback A callback. It will be passed an acceptable new variable\n * name, or null if change is to be aborted (cancel button), or undefined if\n * an existing variable was chosen.\n * @alias Blockly.Variables.renameVariable\n */\nexport function renameVariable(\n workspace: Workspace, variable: VariableModel,\n opt_callback?: (p1?: string|null) => void) {\n // This function needs to be named so it can be called recursively.\n function promptAndCheckWithAlert(defaultName: string) {\n const promptText =\n Msg['RENAME_VARIABLE_TITLE'].replace('%1', variable.name);\n promptName(promptText, defaultName, function(newName) {\n if (newName) {\n const existing =\n nameUsedWithOtherType(newName, variable.type, workspace);\n if (existing) {\n const msg = Msg['VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE']\n .replace('%1', existing.name)\n .replace('%2', existing.type);\n dialog.alert(msg, function() {\n promptAndCheckWithAlert(newName);\n });\n } else {\n workspace.renameVariableById(variable.getId(), newName);\n if (opt_callback) {\n opt_callback(newName);\n }\n }\n } else {\n // User canceled prompt.\n if (opt_callback) {\n opt_callback(null);\n }\n }\n });\n }\n promptAndCheckWithAlert('');\n}\n\n/**\n * Prompt the user for a new variable name.\n *\n * @param promptText The string of the prompt.\n * @param defaultText The default value to show in the prompt's field.\n * @param callback A callback. It will be passed the new variable name, or null\n * if the user picked something illegal.\n * @alias Blockly.Variables.promptName\n */\nexport function promptName(\n promptText: string, defaultText: string,\n callback: (p1: string|null) => void) {\n dialog.prompt(promptText, defaultText, function(newVar) {\n // Merge runs of whitespace. Strip leading and trailing whitespace.\n // Beyond this, all names are legal.\n if (newVar) {\n newVar = newVar.replace(/[\\s\\xa0]+/g, ' ').trim();\n if (newVar === Msg['RENAME_VARIABLE'] || newVar === Msg['NEW_VARIABLE']) {\n // Ok, not ALL names are legal...\n newVar = null;\n }\n }\n callback(newVar);\n });\n}\n/**\n * Check whether there exists a variable with the given name but a different\n * type.\n *\n * @param name The name to search for.\n * @param type The type to exclude from the search.\n * @param workspace The workspace to search for the variable.\n * @returns The variable with the given name and a different type, or null if\n * none was found.\n */\nfunction nameUsedWithOtherType(\n name: string, type: string, workspace: Workspace): VariableModel|null {\n const allVariables = workspace.getVariableMap().getAllVariables();\n\n name = name.toLowerCase();\n for (let i = 0, variable; variable = allVariables[i]; i++) {\n if (variable.name.toLowerCase() === name && variable.type !== type) {\n return variable;\n }\n }\n return null;\n}\n\n/**\n * Check whether there exists a variable with the given name of any type.\n *\n * @param name The name to search for.\n * @param workspace The workspace to search for the variable.\n * @returns The variable with the given name, or null if none was found.\n * @alias Blockly.Variables.nameUsedWithAnyType\n */\nexport function nameUsedWithAnyType(\n name: string, workspace: Workspace): VariableModel|null {\n const allVariables = workspace.getVariableMap().getAllVariables();\n\n name = name.toLowerCase();\n for (let i = 0, variable; variable = allVariables[i]; i++) {\n if (variable.name.toLowerCase() === name) {\n return variable;\n }\n }\n return null;\n}\n\n/**\n * Generate DOM objects representing a variable field.\n *\n * @param variableModel The variable model to represent.\n * @returns The generated DOM.\n * @alias Blockly.Variables.generateVariableFieldDom\n */\nexport function generateVariableFieldDom(variableModel: VariableModel):\n Element {\n /* Generates the following XML:\n * foo\n */\n const field = utilsXml.createElement('field');\n field.setAttribute('name', 'VAR');\n field.setAttribute('id', variableModel.getId());\n field.setAttribute('variabletype', variableModel.type);\n const name = utilsXml.createTextNode(variableModel.name);\n field.appendChild(name);\n return field;\n}\n\n/**\n * Helper function to look up or create a variable on the given workspace.\n * If no variable exists, creates and returns it.\n *\n * @param workspace The workspace to search for the variable. It may be a\n * flyout workspace or main workspace.\n * @param id The ID to use to look up or create the variable, or null.\n * @param opt_name The string to use to look up or create the variable.\n * @param opt_type The type to use to look up or create the variable.\n * @returns The variable corresponding to the given ID or name + type\n * combination.\n * @alias Blockly.Variables.getOrCreateVariablePackage\n */\nexport function getOrCreateVariablePackage(\n workspace: Workspace, id: string|null, opt_name?: string,\n opt_type?: string): VariableModel {\n let variable = getVariable(workspace, id, opt_name, opt_type);\n if (!variable) {\n variable = createVariable(workspace, id, opt_name, opt_type);\n }\n return variable;\n}\n\n/**\n * Look up a variable on the given workspace.\n * Always looks in the main workspace before looking in the flyout workspace.\n * Always prefers lookup by ID to lookup by name + type.\n *\n * @param workspace The workspace to search for the variable. It may be a\n * flyout workspace or main workspace.\n * @param id The ID to use to look up the variable, or null.\n * @param opt_name The string to use to look up the variable.\n * Only used if lookup by ID fails.\n * @param opt_type The type to use to look up the variable.\n * Only used if lookup by ID fails.\n * @returns The variable corresponding to the given ID or name + type\n * combination, or null if not found.\n * @alias Blockly.Variables.getVariable\n */\nexport function getVariable(\n workspace: Workspace, id: string|null, opt_name?: string,\n opt_type?: string): VariableModel|null {\n const potentialVariableMap = workspace.getPotentialVariableMap();\n let variable = null;\n // Try to just get the variable, by ID if possible.\n if (id) {\n // Look in the real variable map before checking the potential variable map.\n variable = workspace.getVariableById(id);\n if (!variable && potentialVariableMap) {\n variable = potentialVariableMap.getVariableById(id);\n }\n if (variable) {\n return variable;\n }\n }\n // If there was no ID, or there was an ID but it didn't match any variables,\n // look up by name and type.\n if (opt_name) {\n if (opt_type === undefined) {\n throw Error('Tried to look up a variable by name without a type');\n }\n // Otherwise look up by name and type.\n variable = workspace.getVariable(opt_name, opt_type);\n if (!variable && potentialVariableMap) {\n variable = potentialVariableMap.getVariable(opt_name, opt_type);\n }\n }\n return variable;\n}\n\n/**\n * Helper function to create a variable on the given workspace.\n *\n * @param workspace The workspace in which to create the variable. It may be a\n * flyout workspace or main workspace.\n * @param id The ID to use to create the variable, or null.\n * @param opt_name The string to use to create the variable.\n * @param opt_type The type to use to create the variable.\n * @returns The variable corresponding to the given ID or name + type\n * combination.\n */\nfunction createVariable(\n workspace: Workspace, id: string|null, opt_name?: string,\n opt_type?: string): VariableModel {\n const potentialVariableMap = workspace.getPotentialVariableMap();\n // Variables without names get uniquely named for this workspace.\n if (!opt_name) {\n const ws =\n (workspace.isFlyout ? (workspace as WorkspaceSvg).targetWorkspace :\n workspace);\n opt_name = generateUniqueName(ws!);\n }\n\n // Create a potential variable if in the flyout.\n let variable = null;\n if (potentialVariableMap) {\n variable = potentialVariableMap.createVariable(opt_name, opt_type, id);\n } else {\n // In the main workspace, create a real variable.\n variable = workspace.createVariable(opt_name, opt_type, id);\n }\n return variable;\n}\n\n/**\n * Helper function to get the list of variables that have been added to the\n * workspace after adding a new block, using the given list of variables that\n * were in the workspace before the new block was added.\n *\n * @param workspace The workspace to inspect.\n * @param originalVariables The array of variables that existed in the workspace\n * before adding the new block.\n * @returns The new array of variables that were freshly added to the workspace\n * after creating the new block, or [] if no new variables were added to the\n * workspace.\n * @alias Blockly.Variables.getAddedVariables\n * @internal\n */\nexport function getAddedVariables(\n workspace: Workspace, originalVariables: VariableModel[]): VariableModel[] {\n const allCurrentVariables = workspace.getAllVariables();\n const addedVariables = [];\n if (originalVariables.length !== allCurrentVariables.length) {\n for (let i = 0; i < allCurrentVariables.length; i++) {\n const variable = allCurrentVariables[i];\n // For any variable that is present in allCurrentVariables but not\n // present in originalVariables, add the variable to addedVariables.\n if (originalVariables.indexOf(variable) === -1) {\n addedVariables.push(variable);\n }\n }\n }\n return addedVariables;\n}\n\nexport const TEST_ONLY = {\n generateUniqueNameInternal,\n};\n","/**\n * @license\n * Copyright 2013 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Inject Blockly's CSS synchronously.\n *\n * @namespace Blockly.Css\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Css');\n\n\n/** Has CSS already been injected? */\nlet injected = false;\n\n/**\n * Add some CSS to the blob that will be injected later. Allows optional\n * components such as fields and the toolbox to store separate CSS.\n *\n * @param cssContent Multiline CSS string or an array of single lines of CSS.\n * @alias Blockly.Css.register\n */\nexport function register(cssContent: string) {\n if (injected) {\n throw Error('CSS already injected');\n }\n content += '\\n' + cssContent;\n}\n\n/**\n * Inject the CSS into the DOM. This is preferable over using a regular CSS\n * file since:\n * a) It loads synchronously and doesn't force a redraw later.\n * b) It speeds up loading by not blocking on a separate HTTP transfer.\n * c) The CSS content may be made dynamic depending on init options.\n *\n * @param hasCss If false, don't inject CSS (providing CSS becomes the\n * document's responsibility).\n * @param pathToMedia Path from page to the Blockly media directory.\n * @alias Blockly.Css.inject\n */\nexport function inject(hasCss: boolean, pathToMedia: string) {\n // Only inject the CSS once.\n if (injected) {\n return;\n }\n injected = true;\n if (!hasCss) {\n return;\n }\n // Strip off any trailing slash (either Unix or Windows).\n const mediaPath = pathToMedia.replace(/[\\\\/]$/, '');\n const cssContent = content.replace(/<<>>/g, mediaPath);\n // Cleanup the collected css content after injecting it to the DOM.\n content = '';\n\n // Inject CSS tag at start of head.\n const cssNode = document.createElement('style');\n cssNode.id = 'blockly-common-style';\n const cssTextNode = document.createTextNode(cssContent);\n cssNode.appendChild(cssTextNode);\n document.head.insertBefore(cssNode, document.head.firstChild);\n}\n\n/**\n * The CSS content for Blockly.\n *\n * @alias Blockly.Css.content\n */\nlet content = `\n.blocklySvg {\n background-color: #fff;\n outline: none;\n overflow: hidden; /* IE overflows by default. */\n position: absolute;\n display: block;\n}\n\n.blocklyWidgetDiv {\n display: none;\n position: absolute;\n z-index: 99999; /* big value for bootstrap3 compatibility */\n}\n\n.injectionDiv {\n height: 100%;\n position: relative;\n overflow: hidden; /* So blocks in drag surface disappear at edges */\n touch-action: none;\n}\n\n.blocklyNonSelectable {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n}\n\n.blocklyWsDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n}\n\n/* Added as a separate rule with multiple classes to make it more specific\n than a bootstrap rule that selects svg:root. See issue #1275 for context.\n*/\n.blocklyWsDragSurface.blocklyOverflowVisible {\n overflow: visible;\n}\n\n.blocklyBlockDragSurface {\n display: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: visible !important;\n z-index: 50; /* Display below toolbox, but above everything else. */\n}\n\n.blocklyBlockCanvas.blocklyCanvasTransitioning,\n.blocklyBubbleCanvas.blocklyCanvasTransitioning {\n transition: transform .5s;\n}\n\n.blocklyTooltipDiv {\n background-color: #ffffc7;\n border: 1px solid #ddc;\n box-shadow: 4px 4px 20px 1px rgba(0,0,0,.15);\n color: #000;\n display: none;\n font: 9pt sans-serif;\n opacity: .9;\n padding: 2px;\n position: absolute;\n z-index: 100000; /* big value for bootstrap3 compatibility */\n}\n\n.blocklyDropDownDiv {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1000;\n display: none;\n border: 1px solid;\n border-color: #dadce0;\n background-color: #fff;\n border-radius: 2px;\n padding: 4px;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownContent {\n max-height: 300px; // @todo: spec for maximum height.\n overflow: auto;\n overflow-x: hidden;\n position: relative;\n}\n\n.blocklyDropDownArrow {\n position: absolute;\n left: 0;\n top: 0;\n width: 16px;\n height: 16px;\n z-index: -1;\n background-color: inherit;\n border-color: inherit;\n}\n\n.blocklyDropDownButton {\n display: inline-block;\n float: left;\n padding: 0;\n margin: 4px;\n border-radius: 4px;\n outline: none;\n border: 1px solid;\n transition: box-shadow .1s;\n cursor: pointer;\n}\n\n.blocklyArrowTop {\n border-top: 1px solid;\n border-left: 1px solid;\n border-top-left-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyArrowBottom {\n border-bottom: 1px solid;\n border-right: 1px solid;\n border-bottom-right-radius: 4px;\n border-color: inherit;\n}\n\n.blocklyResizeSE {\n cursor: se-resize;\n fill: #aaa;\n}\n\n.blocklyResizeSW {\n cursor: sw-resize;\n fill: #aaa;\n}\n\n.blocklyResizeLine {\n stroke: #515A5A;\n stroke-width: 1;\n}\n\n.blocklyHighlightedConnectionPath {\n fill: none;\n stroke: #fc3;\n stroke-width: 4px;\n}\n\n.blocklyPathLight {\n fill: none;\n stroke-linecap: round;\n stroke-width: 1;\n}\n\n.blocklySelected>.blocklyPathLight {\n display: none;\n}\n\n.blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don't support grab */\n cursor: url(\"<<>>/handopen.cur\"), auto;\n cursor: grab;\n cursor: -webkit-grab;\n}\n\n /* backup for browsers (e.g. IE11) that don't support grabbing */\n.blocklyDragging {\n /* backup for browsers (e.g. IE11) that don't support grabbing */\n cursor: url(\"<<>>/handclosed.cur\"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n /* Changes cursor on mouse down. Not effective in Firefox because of\n https://bugzilla.mozilla.org/show_bug.cgi?id=771241 */\n.blocklyDraggable:active {\n /* backup for browsers (e.g. IE11) that don't support grabbing */\n cursor: url(\"<<>>/handclosed.cur\"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n/* Change the cursor on the whole drag surface in case the mouse gets\n ahead of block during a drag. This way the cursor is still a closed hand.\n */\n.blocklyBlockDragSurface .blocklyDraggable {\n /* backup for browsers (e.g. IE11) that don't support grabbing */\n cursor: url(\"<<>>/handclosed.cur\"), auto;\n cursor: grabbing;\n cursor: -webkit-grabbing;\n}\n\n.blocklyDragging.blocklyDraggingDelete {\n cursor: url(\"<<>>/handdelete.cur\"), auto;\n}\n\n.blocklyDragging>.blocklyPath,\n.blocklyDragging>.blocklyPathLight {\n fill-opacity: .8;\n stroke-opacity: .8;\n}\n\n.blocklyDragging>.blocklyPathDark {\n display: none;\n}\n\n.blocklyDisabled>.blocklyPath {\n fill-opacity: .5;\n stroke-opacity: .5;\n}\n\n.blocklyDisabled>.blocklyPathLight,\n.blocklyDisabled>.blocklyPathDark {\n display: none;\n}\n\n.blocklyInsertionMarker>.blocklyPath,\n.blocklyInsertionMarker>.blocklyPathLight,\n.blocklyInsertionMarker>.blocklyPathDark {\n fill-opacity: .2;\n stroke: none;\n}\n\n.blocklyMultilineText {\n font-family: monospace;\n}\n\n.blocklyNonEditableText>text {\n pointer-events: none;\n}\n\n.blocklyFlyout {\n position: absolute;\n z-index: 20;\n}\n\n.blocklyText text {\n cursor: default;\n}\n\n/*\n Don't allow users to select text. It gets annoying when trying to\n drag a block and selected text moves instead.\n*/\n.blocklySvg text,\n.blocklyBlockDragSurface text {\n user-select: none;\n -ms-user-select: none;\n -webkit-user-select: none;\n cursor: inherit;\n}\n\n.blocklyHidden {\n display: none;\n}\n\n.blocklyFieldDropdown:not(.blocklyHidden) {\n display: block;\n}\n\n.blocklyIconGroup {\n cursor: default;\n}\n\n.blocklyIconGroup:not(:hover),\n.blocklyIconGroupReadonly {\n opacity: .6;\n}\n\n.blocklyIconShape {\n fill: #00f;\n stroke: #fff;\n stroke-width: 1px;\n}\n\n.blocklyIconSymbol {\n fill: #fff;\n}\n\n.blocklyMinimalBody {\n margin: 0;\n padding: 0;\n}\n\n.blocklyHtmlInput {\n border: none;\n border-radius: 4px;\n height: 100%;\n margin: 0;\n outline: none;\n padding: 0;\n width: 100%;\n text-align: center;\n display: block;\n box-sizing: border-box;\n}\n\n/* Edge and IE introduce a close icon when the input value is longer than a\n certain length. This affects our sizing calculations of the text input.\n Hiding the close icon to avoid that. */\n.blocklyHtmlInput::-ms-clear {\n display: none;\n}\n\n.blocklyMainBackground {\n stroke-width: 1;\n stroke: #c6c6c6; /* Equates to #ddd due to border being off-pixel. */\n}\n\n.blocklyMutatorBackground {\n fill: #fff;\n stroke: #ddd;\n stroke-width: 1;\n}\n\n.blocklyFlyoutBackground {\n fill: #ddd;\n fill-opacity: .8;\n}\n\n.blocklyMainWorkspaceScrollbar {\n z-index: 20;\n}\n\n.blocklyFlyoutScrollbar {\n z-index: 30;\n}\n\n.blocklyScrollbarHorizontal,\n.blocklyScrollbarVertical {\n position: absolute;\n outline: none;\n}\n\n.blocklyScrollbarBackground {\n opacity: 0;\n}\n\n.blocklyScrollbarHandle {\n fill: #ccc;\n}\n\n.blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyScrollbarHandle:hover {\n fill: #bbb;\n}\n\n/* Darken flyout scrollbars due to being on a grey background. */\n/* By contrast, workspace scrollbars are on a white background. */\n.blocklyFlyout .blocklyScrollbarHandle {\n fill: #bbb;\n}\n\n.blocklyFlyout .blocklyScrollbarBackground:hover+.blocklyScrollbarHandle,\n.blocklyFlyout .blocklyScrollbarHandle:hover {\n fill: #aaa;\n}\n\n.blocklyInvalidInput {\n background: #faa;\n}\n\n.blocklyVerticalMarker {\n stroke-width: 3px;\n fill: rgba(255,255,255,.5);\n pointer-events: none;\n}\n\n.blocklyComputeCanvas {\n position: absolute;\n width: 0;\n height: 0;\n}\n\n.blocklyNoPointerEvents {\n pointer-events: none;\n}\n\n.blocklyContextMenu {\n border-radius: 4px;\n max-height: 100%;\n}\n\n.blocklyDropdownMenu {\n border-radius: 2px;\n padding: 0 !important;\n}\n\n.blocklyDropdownMenu .blocklyMenuItem {\n /* 28px on the left for icon or checkbox. */\n padding-left: 28px;\n}\n\n/* BiDi override for the resting state. */\n.blocklyDropdownMenu .blocklyMenuItemRtl {\n /* Flip left/right padding for BiDi. */\n padding-left: 5px;\n padding-right: 28px;\n}\n\n.blocklyWidgetDiv .blocklyMenu {\n background: #fff;\n border: 1px solid transparent;\n box-shadow: 0 0 3px 1px rgba(0,0,0,.3);\n font: normal 13px Arial, sans-serif;\n margin: 0;\n outline: none;\n padding: 4px 0;\n position: absolute;\n overflow-y: auto;\n overflow-x: hidden;\n max-height: 100%;\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n.blocklyWidgetDiv .blocklyMenu.blocklyFocused {\n box-shadow: 0 0 6px 1px rgba(0,0,0,.3);\n}\n\n.blocklyDropDownDiv .blocklyMenu {\n background: inherit; /* Compatibility with gapi, reset from goog-menu */\n border: inherit; /* Compatibility with gapi, reset from goog-menu */\n font: normal 13px \"Helvetica Neue\", Helvetica, sans-serif;\n outline: none;\n position: relative; /* Compatibility with gapi, reset from goog-menu */\n z-index: 20000; /* Arbitrary, but some apps depend on it... */\n}\n\n/* State: resting. */\n.blocklyMenuItem {\n border: none;\n color: #000;\n cursor: pointer;\n list-style: none;\n margin: 0;\n /* 7em on the right for shortcut. */\n min-width: 7em;\n padding: 6px 15px;\n white-space: nowrap;\n}\n\n/* State: disabled. */\n.blocklyMenuItemDisabled {\n color: #ccc;\n cursor: inherit;\n}\n\n/* State: hover. */\n.blocklyMenuItemHighlight {\n background-color: rgba(0,0,0,.1);\n}\n\n/* State: selected/checked. */\n.blocklyMenuItemCheckbox {\n height: 16px;\n position: absolute;\n width: 16px;\n}\n\n.blocklyMenuItemSelected .blocklyMenuItemCheckbox {\n background: url(<<>>/sprites.png) no-repeat -48px -16px;\n float: left;\n margin-left: -24px;\n position: static; /* Scroll with the menu. */\n}\n\n.blocklyMenuItemRtl .blocklyMenuItemCheckbox {\n float: right;\n margin-right: -24px;\n}\n`;\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods realted to figuring out positions of SVG elements.\n *\n * @namespace Blockly.utils.svgMath\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.svgMath');\n\nimport type {WorkspaceSvg} from '../workspace_svg.js';\n\nimport {Coordinate} from './coordinate.js';\nimport * as deprecation from './deprecation.js';\nimport {Rect} from './rect.js';\nimport * as style from './style.js';\n\n\n/**\n * Static regex to pull the x,y values out of an SVG translate() directive.\n * Note that Firefox and IE (9,10) return 'translate(12)' instead of\n * 'translate(12, 0)'.\n * Note that IE (9,10) returns 'translate(16 8)' instead of 'translate(16, 8)'.\n * Note that IE has been reported to return scientific notation (0.123456e-42).\n */\nconst XY_REGEX = /translate\\(\\s*([-+\\d.e]+)([ ,]\\s*([-+\\d.e]+)\\s*)?/;\n\n/**\n * Static regex to pull the x,y values out of a translate() or translate3d()\n * style property.\n * Accounts for same exceptions as XY_REGEX.\n */\nconst XY_STYLE_REGEX =\n /transform:\\s*translate(?:3d)?\\(\\s*([-+\\d.e]+)\\s*px([ ,]\\s*([-+\\d.e]+)\\s*px)?/;\n\n/**\n * Return the coordinates of the top-left corner of this element relative to\n * its parent. Only for SVG elements and children (e.g. rect, g, path).\n *\n * @param element SVG element to find the coordinates of.\n * @returns Object with .x and .y properties.\n * @alias Blockly.utils.svgMath.getRelativeXY\n */\nexport function getRelativeXY(element: Element): Coordinate {\n const xy = new Coordinate(0, 0);\n // First, check for x and y attributes.\n // Checking for the existence of x/y properties is faster than getAttribute.\n // However, x/y contains an SVGAnimatedLength object, so rely on getAttribute\n // to get the number.\n const x = (element as any).x && element.getAttribute('x');\n const y = (element as any).y && element.getAttribute('y');\n if (x) {\n xy.x = parseInt(x);\n }\n if (y) {\n xy.y = parseInt(y);\n }\n // Second, check for transform=\"translate(...)\" attribute.\n const transform = element.getAttribute('transform');\n const r = transform && transform.match(XY_REGEX);\n if (r) {\n xy.x += Number(r[1]);\n if (r[3]) {\n xy.y += Number(r[3]);\n }\n }\n\n // Then check for style = transform: translate(...) or translate3d(...)\n const style = element.getAttribute('style');\n if (style && style.indexOf('translate') > -1) {\n const styleComponents = style.match(XY_STYLE_REGEX);\n if (styleComponents) {\n xy.x += Number(styleComponents[1]);\n if (styleComponents[3]) {\n xy.y += Number(styleComponents[3]);\n }\n }\n }\n return xy;\n}\n\n/**\n * Return the coordinates of the top-left corner of this element relative to\n * the div Blockly was injected into.\n *\n * @param element SVG element to find the coordinates of. If this is not a child\n * of the div Blockly was injected into, the behaviour is undefined.\n * @returns Object with .x and .y properties.\n * @alias Blockly.utils.svgMath.getInjectionDivXY\n */\nexport function getInjectionDivXY(element: Element): Coordinate {\n let x = 0;\n let y = 0;\n while (element) {\n const xy = getRelativeXY(element);\n x = x + xy.x;\n y = y + xy.y;\n const classes = element.getAttribute('class') || '';\n if ((' ' + classes + ' ').indexOf(' injectionDiv ') !== -1) {\n break;\n }\n element = element.parentNode as Element;\n }\n return new Coordinate(x, y);\n}\n\n/**\n * Check if 3D transforms are supported by adding an element\n * and attempting to set the property.\n *\n * @returns True if 3D transforms are supported.\n * @deprecated No longer provided by Blockly.\n * @alias Blockly.utils.svgMath.is3dSupported\n */\nexport function is3dSupported(): boolean {\n // All browsers support translate3d in 2022.\n deprecation.warn(\n 'Blockly.utils.svgMath.is3dSupported', 'version 9', 'version 10');\n return true;\n}\n\n/**\n * Get the position of the current viewport in window coordinates. This takes\n * scroll into account.\n *\n * @returns An object containing window width, height, and scroll position in\n * window coordinates.\n * @alias Blockly.utils.svgMath.getViewportBBox\n * @internal\n */\nexport function getViewportBBox(): Rect {\n // Pixels, in window coordinates.\n const scrollOffset = style.getViewportPageOffset();\n return new Rect(\n scrollOffset.y, document.documentElement.clientHeight + scrollOffset.y,\n scrollOffset.x, document.documentElement.clientWidth + scrollOffset.x);\n}\n\n/**\n * Gets the document scroll distance as a coordinate object.\n * Copied from Closure's goog.dom.getDocumentScroll.\n *\n * @returns Object with values 'x' and 'y'.\n * @alias Blockly.utils.svgMath.getDocumentScroll\n */\nexport function getDocumentScroll(): Coordinate {\n const el = document.documentElement;\n const win = window;\n return new Coordinate(\n win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);\n}\n\n/**\n * Converts screen coordinates to workspace coordinates.\n *\n * @param ws The workspace to find the coordinates on.\n * @param screenCoordinates The screen coordinates to be converted to workspace\n * coordinates\n * @returns The workspace coordinates.\n * @alias Blockly.utils.svgMath.screenToWsCoordinates\n */\nexport function screenToWsCoordinates(\n ws: WorkspaceSvg, screenCoordinates: Coordinate): Coordinate {\n const screenX = screenCoordinates.x;\n const screenY = screenCoordinates.y;\n\n const injectionDiv = ws.getInjectionDiv();\n // Bounding rect coordinates are in client coordinates, meaning that they\n // are in pixels relative to the upper left corner of the visible browser\n // window. These coordinates change when you scroll the browser window.\n const boundingRect = injectionDiv.getBoundingClientRect();\n\n // The client coordinates offset by the injection div's upper left corner.\n const clientOffsetPixels =\n new Coordinate(screenX - boundingRect.left, screenY - boundingRect.top);\n\n // The offset in pixels between the main workspace's origin and the upper\n // left corner of the injection div.\n const mainOffsetPixels = ws.getOriginOffsetInPixels();\n\n // The position of the new comment in pixels relative to the origin of the\n // main workspace.\n const finalOffsetPixels =\n Coordinate.difference(clientOffsetPixels, mainOffsetPixels);\n // The position in main workspace coordinates.\n const finalOffsetMainWs = finalOffsetPixels.scale(1 / ws.scale);\n return finalOffsetMainWs;\n}\n\nexport const TEST_ONLY = {\n XY_REGEX,\n XY_STYLE_REGEX,\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * XML reader and writer.\n *\n * @namespace Blockly.Xml\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Xml');\n\nimport type {Block} from './block.js';\nimport type {BlockSvg} from './block_svg.js';\nimport type {Connection} from './connection.js';\nimport * as eventUtils from './events/utils.js';\nimport type {Field} from './field.js';\nimport {inputTypes} from './input_types.js';\nimport * as dom from './utils/dom.js';\nimport {Size} from './utils/size.js';\nimport * as utilsXml from './utils/xml.js';\nimport type {VariableModel} from './variable_model.js';\nimport * as Variables from './variables.js';\nimport type {Workspace} from './workspace.js';\nimport {WorkspaceComment} from './workspace_comment.js';\nimport {WorkspaceCommentSvg} from './workspace_comment_svg.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/**\n * Encode a block tree as XML.\n *\n * @param workspace The workspace containing blocks.\n * @param opt_noId True if the encoder should skip the block IDs.\n * @returns XML DOM element.\n * @alias Blockly.Xml.workspaceToDom\n */\nexport function workspaceToDom(\n workspace: Workspace, opt_noId?: boolean): Element {\n const treeXml = utilsXml.createElement('xml');\n const variablesElement =\n variablesToDom(Variables.allUsedVarModels(workspace));\n if (variablesElement.hasChildNodes()) {\n treeXml.appendChild(variablesElement);\n }\n const comments = workspace.getTopComments(true);\n for (let i = 0; i < comments.length; i++) {\n const comment = comments[i];\n treeXml.appendChild(comment.toXmlWithXY(opt_noId));\n }\n const blocks = workspace.getTopBlocks(true);\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i];\n treeXml.appendChild(blockToDomWithXY(block, opt_noId));\n }\n return treeXml;\n}\n\n/**\n * Encode a list of variables as XML.\n *\n * @param variableList List of all variable models.\n * @returns Tree of XML elements.\n * @alias Blockly.Xml.variablesToDom\n */\nexport function variablesToDom(variableList: VariableModel[]): Element {\n const variables = utilsXml.createElement('variables');\n for (let i = 0; i < variableList.length; i++) {\n const variable = variableList[i];\n const element = utilsXml.createElement('variable');\n element.appendChild(utilsXml.createTextNode(variable.name));\n if (variable.type) {\n element.setAttribute('type', variable.type);\n }\n element.id = variable.getId();\n variables.appendChild(element);\n }\n return variables;\n}\n\n/**\n * Encode a block subtree as XML with XY coordinates.\n *\n * @param block The root block to encode.\n * @param opt_noId True if the encoder should skip the block ID.\n * @returns Tree of XML elements or an empty document fragment if the block was\n * an insertion marker.\n * @alias Blockly.Xml.blockToDomWithXY\n */\nexport function blockToDomWithXY(block: Block, opt_noId?: boolean): Element|\n DocumentFragment {\n if (block.isInsertionMarker()) { // Skip over insertion markers.\n block = block.getChildren(false)[0];\n if (!block) {\n // Disappears when appended.\n return new DocumentFragment();\n }\n }\n\n let width = 0; // Not used in LTR.\n if (block.workspace.RTL) {\n width = block.workspace.getWidth();\n }\n\n const element = blockToDom(block, opt_noId);\n const xy = block.getRelativeToSurfaceXY();\n // AnyDuringMigration because: Property 'setAttribute' does not exist on type\n // 'Element | DocumentFragment'.\n (element as AnyDuringMigration)\n .setAttribute('x', Math.round(block.workspace.RTL ? width - xy.x : xy.x));\n // AnyDuringMigration because: Property 'setAttribute' does not exist on type\n // 'Element | DocumentFragment'.\n (element as AnyDuringMigration).setAttribute('y', Math.round(xy.y));\n return element;\n}\n\n/**\n * Encode a field as XML.\n *\n * @param field The field to encode.\n * @returns XML element, or null if the field did not need to be serialized.\n */\nfunction fieldToDom(field: Field): Element|null {\n if (field.isSerializable()) {\n const container = utilsXml.createElement('field');\n container.setAttribute('name', field.name || '');\n return field.toXml(container);\n }\n return null;\n}\n\n/**\n * Encode all of a block's fields as XML and attach them to the given tree of\n * XML elements.\n *\n * @param block A block with fields to be encoded.\n * @param element The XML element to which the field DOM should be attached.\n */\nfunction allFieldsToDom(block: Block, element: Element) {\n for (let i = 0; i < block.inputList.length; i++) {\n const input = block.inputList[i];\n for (let j = 0; j < input.fieldRow.length; j++) {\n const field = input.fieldRow[j];\n const fieldDom = fieldToDom(field);\n if (fieldDom) {\n element.appendChild(fieldDom);\n }\n }\n }\n}\n\n/**\n * Encode a block subtree as XML.\n *\n * @param block The root block to encode.\n * @param opt_noId True if the encoder should skip the block ID.\n * @returns Tree of XML elements or an empty document fragment if the block was\n * an insertion marker.\n * @alias Blockly.Xml.blockToDom\n */\nexport function blockToDom(block: Block, opt_noId?: boolean): Element|\n DocumentFragment {\n // Skip over insertion markers.\n if (block.isInsertionMarker()) {\n const child = block.getChildren(false)[0];\n if (child) {\n return blockToDom(child);\n } else {\n // Disappears when appended.\n return new DocumentFragment();\n }\n }\n\n const element = utilsXml.createElement(block.isShadow() ? 'shadow' : 'block');\n element.setAttribute('type', block.type);\n if (!opt_noId) {\n // It's important to use setAttribute here otherwise IE11 won't serialize\n // the block's ID when domToText is called.\n element.setAttribute('id', block.id);\n }\n if (block.mutationToDom) {\n // Custom data for an advanced block.\n const mutation = block.mutationToDom();\n if (mutation && (mutation.hasChildNodes() || mutation.hasAttributes())) {\n element.appendChild(mutation);\n }\n }\n\n allFieldsToDom(block, element);\n\n const commentText = block.getCommentText();\n if (commentText) {\n const size = block.commentModel.size;\n const pinned = block.commentModel.pinned;\n\n const commentElement = utilsXml.createElement('comment');\n commentElement.appendChild(utilsXml.createTextNode(commentText));\n // AnyDuringMigration because: Argument of type 'boolean' is not assignable\n // to parameter of type 'string'.\n commentElement.setAttribute('pinned', pinned as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type 'number' is not assignable\n // to parameter of type 'string'.\n commentElement.setAttribute('h', size.height as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type 'number' is not assignable\n // to parameter of type 'string'.\n commentElement.setAttribute('w', size.width as AnyDuringMigration);\n\n element.appendChild(commentElement);\n }\n\n if (block.data) {\n const dataElement = utilsXml.createElement('data');\n dataElement.appendChild(utilsXml.createTextNode(block.data));\n element.appendChild(dataElement);\n }\n\n for (let i = 0; i < block.inputList.length; i++) {\n const input = block.inputList[i];\n let container: Element;\n let empty = true;\n if (input.type === inputTypes.DUMMY) {\n continue;\n } else {\n const childBlock = input.connection!.targetBlock();\n if (input.type === inputTypes.VALUE) {\n container = utilsXml.createElement('value');\n } else if (input.type === inputTypes.STATEMENT) {\n container = utilsXml.createElement('statement');\n }\n const childShadow = input.connection!.getShadowDom();\n if (childShadow && (!childBlock || !childBlock.isShadow())) {\n container!.appendChild(cloneShadow(childShadow, opt_noId));\n }\n if (childBlock) {\n const childElem = blockToDom(childBlock, opt_noId);\n if (childElem.nodeType === dom.NodeType.ELEMENT_NODE) {\n container!.appendChild(childElem);\n empty = false;\n }\n }\n }\n container!.setAttribute('name', input.name);\n if (!empty) {\n element.appendChild(container!);\n }\n }\n if (block.inputsInline !== undefined &&\n block.inputsInline !== block.inputsInlineDefault) {\n element.setAttribute('inline', block.inputsInline.toString());\n }\n if (block.isCollapsed()) {\n element.setAttribute('collapsed', 'true');\n }\n if (!block.isEnabled()) {\n element.setAttribute('disabled', 'true');\n }\n if (!block.isDeletable() && !block.isShadow()) {\n element.setAttribute('deletable', 'false');\n }\n if (!block.isMovable() && !block.isShadow()) {\n element.setAttribute('movable', 'false');\n }\n if (!block.isEditable()) {\n element.setAttribute('editable', 'false');\n }\n\n const nextBlock = block.getNextBlock();\n let container: Element;\n if (nextBlock) {\n const nextElem = blockToDom(nextBlock, opt_noId);\n if (nextElem.nodeType === dom.NodeType.ELEMENT_NODE) {\n container = utilsXml.createElement('next');\n container.appendChild(nextElem);\n element.appendChild(container);\n }\n }\n const nextShadow =\n block.nextConnection && block.nextConnection.getShadowDom();\n if (nextShadow && (!nextBlock || !nextBlock.isShadow())) {\n container!.appendChild(cloneShadow(nextShadow, opt_noId));\n }\n\n return element;\n}\n\n/**\n * Deeply clone the shadow's DOM so that changes don't back-wash to the block.\n *\n * @param shadow A tree of XML elements.\n * @param opt_noId True if the encoder should skip the block ID.\n * @returns A tree of XML elements.\n */\nfunction cloneShadow(shadow: Element, opt_noId?: boolean): Element {\n shadow = shadow.cloneNode(true) as Element;\n // Walk the tree looking for whitespace. Don't prune whitespace in a tag.\n let node: Node|null = shadow;\n let textNode;\n while (node) {\n if (opt_noId && node.nodeName === 'shadow') {\n // Strip off IDs from shadow blocks. There should never be a 'block' as\n // a child of a 'shadow', so no need to check that.\n (node as Element).removeAttribute('id');\n }\n if (node.firstChild) {\n node = node.firstChild;\n } else {\n while (node && !node.nextSibling) {\n textNode = node;\n node = node.parentNode;\n if (textNode.nodeType === dom.NodeType.TEXT_NODE &&\n (textNode as Text).data.trim() === '' &&\n node?.firstChild !== textNode) {\n // Prune whitespace after a tag.\n dom.removeNode(textNode);\n }\n }\n if (node) {\n textNode = node;\n node = node.nextSibling;\n if (textNode.nodeType === dom.NodeType.TEXT_NODE &&\n (textNode as Text).data.trim() === '') {\n // Prune whitespace before a tag.\n dom.removeNode(textNode);\n }\n }\n }\n }\n return shadow;\n}\n\n/**\n * Converts a DOM structure into plain text.\n * Currently the text format is fairly ugly: all one line with no whitespace,\n * unless the DOM itself has whitespace built-in.\n *\n * @param dom A tree of XML nodes.\n * @returns Text representation.\n * @alias Blockly.Xml.domToText\n */\nexport function domToText(dom: Node): string {\n const text = utilsXml.domToText(dom);\n // Unpack self-closing tags. These tags fail when embedded in HTML.\n // -> \n return text.replace(/<(\\w+)([^<]*)\\/>/g, '<$1$2>');\n}\n\n/**\n * Converts a DOM structure into properly indented text.\n *\n * @param dom A tree of XML elements.\n * @returns Text representation.\n * @alias Blockly.Xml.domToPrettyText\n */\nexport function domToPrettyText(dom: Node): string {\n // This function is not guaranteed to be correct for all XML.\n // But it handles the XML that Blockly generates.\n const blob = domToText(dom);\n // Place every open and close tag on its own line.\n const lines = blob.split('<');\n // Indent every line.\n let indent = '';\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line[0] === '/') {\n indent = indent.substring(2);\n }\n lines[i] = indent + '<' + line;\n if (line[0] !== '/' && line.slice(-2) !== '/>') {\n indent += ' ';\n }\n }\n // Pull simple tags back together.\n // E.g. \n let text = lines.join('\\n');\n text = text.replace(/(<(\\w+)\\b[^>]*>[^\\n]*)\\n *<\\/\\2>/g, '$1');\n // Trim leading blank line.\n return text.replace(/^\\n/, '');\n}\n\n/**\n * Converts an XML string into a DOM structure.\n *\n * @param text An XML string.\n * @returns A DOM object representing the singular child of the document\n * element.\n * @throws if the text doesn't parse.\n * @alias Blockly.Xml.textToDom\n */\nexport function textToDom(text: string): Element {\n const doc = utilsXml.textToDomDocument(text);\n if (!doc || !doc.documentElement ||\n doc.getElementsByTagName('parsererror').length) {\n throw Error('textToDom was unable to parse: ' + text);\n }\n return doc.documentElement;\n}\n\n/**\n * Clear the given workspace then decode an XML DOM and\n * create blocks on the workspace.\n *\n * @param xml XML DOM.\n * @param workspace The workspace.\n * @returns An array containing new block IDs.\n * @alias Blockly.Xml.clearWorkspaceAndLoadFromXml\n */\nexport function clearWorkspaceAndLoadFromXml(\n xml: Element, workspace: WorkspaceSvg): string[] {\n workspace.setResizesEnabled(false);\n workspace.clear();\n // AnyDuringMigration because: Argument of type 'WorkspaceSvg' is not\n // assignable to parameter of type 'Workspace'.\n const blockIds = domToWorkspace(xml, workspace as AnyDuringMigration);\n workspace.setResizesEnabled(true);\n return blockIds;\n}\n\n/**\n * Decode an XML DOM and create blocks on the workspace.\n *\n * @param xml XML DOM.\n * @param workspace The workspace.\n * @returns An array containing new block IDs.\n * @suppress {strictModuleDepCheck} Suppress module check while workspace\n * comments are not bundled in.\n * @alias Blockly.Xml.domToWorkspace\n */\nexport function domToWorkspace(xml: Element, workspace: Workspace): string[] {\n let width = 0; // Not used in LTR.\n if (workspace.RTL) {\n width = workspace.getWidth();\n }\n const newBlockIds = []; // A list of block IDs added by this call.\n dom.startTextWidthCache();\n const existingGroup = eventUtils.getGroup();\n if (!existingGroup) {\n eventUtils.setGroup(true);\n }\n\n // Disable workspace resizes as an optimization.\n // Assume it is rendered so we can check.\n if ((workspace as WorkspaceSvg).setResizesEnabled) {\n (workspace as WorkspaceSvg).setResizesEnabled(false);\n }\n let variablesFirst = true;\n try {\n for (let i = 0, xmlChild; xmlChild = xml.childNodes[i]; i++) {\n const name = xmlChild.nodeName.toLowerCase();\n const xmlChildElement = xmlChild as Element;\n if (name === 'block' ||\n name === 'shadow' && !eventUtils.getRecordUndo()) {\n // Allow top-level shadow blocks if recordUndo is disabled since\n // that means an undo is in progress. Such a block is expected\n // to be moved to a nested destination in the next operation.\n const block = domToBlock(xmlChildElement, workspace);\n newBlockIds.push(block.id);\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n const blockX = xmlChildElement.hasAttribute('x') ?\n parseInt(xmlChildElement.getAttribute('x') as AnyDuringMigration) :\n 10;\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n const blockY = xmlChildElement.hasAttribute('y') ?\n parseInt(xmlChildElement.getAttribute('y') as AnyDuringMigration) :\n 10;\n if (!isNaN(blockX) && !isNaN(blockY)) {\n block.moveBy(workspace.RTL ? width - blockX : blockX, blockY);\n }\n variablesFirst = false;\n } else if (name === 'shadow') {\n throw TypeError('Shadow block cannot be a top-level block.');\n } else if (name === 'comment') {\n if (workspace.rendered) {\n WorkspaceCommentSvg.fromXmlRendered(\n xmlChildElement, workspace as WorkspaceSvg, width);\n } else {\n WorkspaceComment.fromXml(xmlChildElement, workspace);\n }\n } else if (name === 'variables') {\n if (variablesFirst) {\n domToVariables(xmlChildElement, workspace);\n } else {\n throw Error(\n '\\'variables\\' tag must exist once before block and ' +\n 'shadow tag elements in the workspace XML, but it was found in ' +\n 'another location.');\n }\n variablesFirst = false;\n }\n }\n } finally {\n if (!existingGroup) {\n eventUtils.setGroup(false);\n }\n dom.stopTextWidthCache();\n }\n // Re-enable workspace resizing.\n if ((workspace as WorkspaceSvg).setResizesEnabled) {\n (workspace as WorkspaceSvg).setResizesEnabled(true);\n }\n eventUtils.fire(new (eventUtils.get(eventUtils.FINISHED_LOADING))(workspace));\n return newBlockIds;\n}\n\n/**\n * Decode an XML DOM and create blocks on the workspace. Position the new\n * blocks immediately below prior blocks, aligned by their starting edge.\n *\n * @param xml The XML DOM.\n * @param workspace The workspace to add to.\n * @returns An array containing new block IDs.\n * @alias Blockly.Xml.appendDomToWorkspace\n */\nexport function appendDomToWorkspace(\n xml: Element, workspace: WorkspaceSvg): string[] {\n // First check if we have a WorkspaceSvg, otherwise the blocks have no shape\n // and the position does not matter.\n // Assume it is rendered so we can check.\n if (!(workspace as WorkspaceSvg).getBlocksBoundingBox) {\n return domToWorkspace(xml, workspace);\n }\n\n const bbox = (workspace as WorkspaceSvg).getBlocksBoundingBox();\n // Load the new blocks into the workspace and get the IDs of the new blocks.\n const newBlockIds = domToWorkspace(xml, workspace);\n if (bbox && bbox.top !== bbox.bottom) { // Check if any previous block.\n let offsetY = 0; // Offset to add to y of the new block.\n let offsetX = 0;\n const farY = bbox.bottom; // Bottom position.\n const topX = workspace.RTL ? bbox.right : bbox.left; // X of bounding box.\n // Check position of the new blocks.\n let newLeftX = Infinity; // X of top left corner.\n let newRightX = -Infinity; // X of top right corner.\n let newY = Infinity; // Y of top corner.\n const ySeparation = 10;\n for (let i = 0; i < newBlockIds.length; i++) {\n const blockXY =\n workspace.getBlockById(newBlockIds[i])!.getRelativeToSurfaceXY();\n if (blockXY.y < newY) {\n newY = blockXY.y;\n }\n if (blockXY.x < newLeftX) { // if we left align also on x\n newLeftX = blockXY.x;\n }\n if (blockXY.x > newRightX) { // if we right align also on x\n newRightX = blockXY.x;\n }\n }\n offsetY = farY - newY + ySeparation;\n offsetX = workspace.RTL ? topX - newRightX : topX - newLeftX;\n for (let i = 0; i < newBlockIds.length; i++) {\n const block = workspace.getBlockById(newBlockIds[i]);\n block!.moveBy(offsetX, offsetY);\n }\n }\n return newBlockIds;\n}\n\n/**\n * Decode an XML block tag and create a block (and possibly sub blocks) on the\n * workspace.\n *\n * @param xmlBlock XML block element.\n * @param workspace The workspace.\n * @returns The root block created.\n * @alias Blockly.Xml.domToBlock\n */\nexport function domToBlock(xmlBlock: Element, workspace: Workspace): Block {\n // Create top-level block.\n eventUtils.disable();\n const variablesBeforeCreation = workspace.getAllVariables();\n let topBlock;\n try {\n topBlock = domToBlockHeadless(xmlBlock, workspace);\n // Generate list of all blocks.\n if (workspace.rendered) {\n const topBlockSvg = topBlock as BlockSvg;\n const blocks = topBlock.getDescendants(false);\n topBlockSvg.setConnectionTracking(false);\n // Render each block.\n for (let i = blocks.length - 1; i >= 0; i--) {\n (blocks[i] as BlockSvg).initSvg();\n }\n for (let i = blocks.length - 1; i >= 0; i--) {\n (blocks[i] as BlockSvg).render(false);\n }\n // Populating the connection database may be deferred until after the\n // blocks have rendered.\n setTimeout(function() {\n if (!topBlockSvg.disposed) {\n topBlockSvg.setConnectionTracking(true);\n }\n }, 1);\n topBlockSvg.updateDisabled();\n // Allow the scrollbars to resize and move based on the new contents.\n // TODO(@picklesrus): #387. Remove when domToBlock avoids resizing.\n (workspace as WorkspaceSvg).resizeContents();\n } else {\n const blocks = topBlock.getDescendants(false);\n for (let i = blocks.length - 1; i >= 0; i--) {\n blocks[i].initModel();\n }\n }\n } finally {\n eventUtils.enable();\n }\n if (eventUtils.isEnabled()) {\n // AnyDuringMigration because: Property 'get' does not exist on type\n // '(name: string) => void'.\n const newVariables =\n Variables.getAddedVariables(workspace, variablesBeforeCreation);\n // Fire a VarCreate event for each (if any) new variable created.\n for (let i = 0; i < newVariables.length; i++) {\n const thisVariable = newVariables[i];\n eventUtils.fire(\n new (eventUtils.get(eventUtils.VAR_CREATE))(thisVariable));\n }\n // Block events come after var events, in case they refer to newly created\n // variables.\n eventUtils.fire(new (eventUtils.get(eventUtils.CREATE))(topBlock));\n }\n return topBlock;\n}\n\n/**\n * Decode an XML list of variables and add the variables to the workspace.\n *\n * @param xmlVariables List of XML variable elements.\n * @param workspace The workspace to which the variable should be added.\n * @alias Blockly.Xml.domToVariables\n */\nexport function domToVariables(xmlVariables: Element, workspace: Workspace) {\n for (let i = 0; i < xmlVariables.children.length; i++) {\n const xmlChild = xmlVariables.children[i];\n const type = xmlChild.getAttribute('type');\n const id = xmlChild.getAttribute('id');\n const name = xmlChild.textContent;\n\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n workspace.createVariable(name as AnyDuringMigration, type, id);\n }\n}\n\n/** A mapping of nodeName to node for child nodes of xmlBlock. */\ninterface childNodeTagMap {\n mutation: Element[];\n comment: Element[];\n data: Element[];\n field: Element[];\n input: Element[];\n next: Element[];\n}\n\n/**\n * Creates a mapping of childNodes for each supported XML tag for the provided\n * xmlBlock. Logs a warning for any encountered unsupported tags.\n *\n * @param xmlBlock XML block element.\n * @returns The childNode map from nodeName to node.\n */\nfunction mapSupportedXmlTags(xmlBlock: Element): childNodeTagMap {\n const childNodeMap = {\n mutation: new Array(),\n comment: new Array(),\n data: new Array(),\n field: new Array(),\n input: new Array(),\n next: new Array(),\n };\n for (let i = 0; i < xmlBlock.children.length; i++) {\n const xmlChild = xmlBlock.children[i];\n if (xmlChild.nodeType === dom.NodeType.TEXT_NODE) {\n // Ignore any text at the level. It's all whitespace anyway.\n continue;\n }\n switch (xmlChild.nodeName.toLowerCase()) {\n case 'mutation':\n childNodeMap.mutation.push(xmlChild);\n break;\n case 'comment':\n childNodeMap.comment.push(xmlChild);\n break;\n case 'data':\n childNodeMap.data.push(xmlChild);\n break;\n case 'title':\n // Titles were renamed to field in December 2013.\n // Fall through.\n case 'field':\n childNodeMap.field.push(xmlChild);\n break;\n case 'value':\n case 'statement':\n childNodeMap.input.push(xmlChild);\n break;\n case 'next':\n childNodeMap.next.push(xmlChild);\n break;\n default:\n // Unknown tag; ignore. Same principle as HTML parsers.\n console.warn('Ignoring unknown tag: ' + xmlChild.nodeName);\n }\n }\n return childNodeMap;\n}\n\n/**\n * Applies mutation tag child nodes to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param block The block to apply the child nodes on.\n * @returns True if mutation may have added some elements that need\n * initialization (requiring initSvg call).\n */\nfunction applyMutationTagNodes(xmlChildren: Element[], block: Block): boolean {\n let shouldCallInitSvg = false;\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n // Custom data for an advanced block.\n if (block.domToMutation) {\n block.domToMutation(xmlChild);\n if ((block as BlockSvg).initSvg) {\n // Mutation may have added some elements that need initializing.\n shouldCallInitSvg = true;\n }\n }\n }\n return shouldCallInitSvg;\n}\n\n/**\n * Applies comment tag child nodes to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param block The block to apply the child nodes on.\n */\nfunction applyCommentTagNodes(xmlChildren: Element[], block: Block) {\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n const text = xmlChild.textContent;\n const pinned = xmlChild.getAttribute('pinned') === 'true';\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n const width = parseInt(xmlChild.getAttribute('w') as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n const height = parseInt(xmlChild.getAttribute('h') as AnyDuringMigration);\n\n block.setCommentText(text);\n block.commentModel.pinned = pinned;\n if (!isNaN(width) && !isNaN(height)) {\n block.commentModel.size = new Size(width, height);\n }\n\n if (pinned && (block as BlockSvg).getCommentIcon && !block.isInFlyout) {\n const blockSvg = block as BlockSvg;\n setTimeout(function() {\n blockSvg.getCommentIcon()!.setVisible(true);\n }, 1);\n }\n }\n}\n\n/**\n * Applies data tag child nodes to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param block The block to apply the child nodes on.\n */\nfunction applyDataTagNodes(xmlChildren: Element[], block: Block) {\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n block.data = xmlChild.textContent;\n }\n}\n\n/**\n * Applies field tag child nodes to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param block The block to apply the child nodes on.\n */\nfunction applyFieldTagNodes(xmlChildren: Element[], block: Block) {\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n const nodeName = xmlChild.getAttribute('name');\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n domToField(block, nodeName as AnyDuringMigration, xmlChild);\n }\n}\n\n/**\n * Finds any enclosed blocks or shadows within this XML node.\n *\n * @param xmlNode The XML node to extract child block info from.\n * @returns Any found child block.\n */\nfunction findChildBlocks(xmlNode: Element):\n {childBlockElement: Element|null, childShadowElement: Element|null} {\n const childBlockInfo = {childBlockElement: null, childShadowElement: null};\n for (let i = 0; i < xmlNode.childNodes.length; i++) {\n const xmlChild = xmlNode.childNodes[i];\n if (xmlChild.nodeType === dom.NodeType.ELEMENT_NODE) {\n if (xmlChild.nodeName.toLowerCase() === 'block') {\n // AnyDuringMigration because: Type 'Element' is not assignable to type\n // 'null'.\n childBlockInfo.childBlockElement =\n xmlChild as Element as AnyDuringMigration;\n } else if (xmlChild.nodeName.toLowerCase() === 'shadow') {\n // AnyDuringMigration because: Type 'Element' is not assignable to type\n // 'null'.\n childBlockInfo.childShadowElement =\n xmlChild as Element as AnyDuringMigration;\n }\n }\n }\n return childBlockInfo;\n}\n/**\n * Applies input child nodes (value or statement) to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param workspace The workspace containing the given block.\n * @param block The block to apply the child nodes on.\n * @param prototypeName The prototype name of the block.\n */\nfunction applyInputTagNodes(\n xmlChildren: Element[], workspace: Workspace, block: Block,\n prototypeName: string) {\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n const nodeName = xmlChild.getAttribute('name');\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string'.\n const input = block.getInput(nodeName as AnyDuringMigration);\n if (!input) {\n console.warn(\n 'Ignoring non-existent input ' + nodeName + ' in block ' +\n prototypeName);\n break;\n }\n const childBlockInfo = findChildBlocks(xmlChild);\n if (childBlockInfo.childBlockElement) {\n if (!input.connection) {\n throw TypeError('Input connection does not exist.');\n }\n domToBlockHeadless(\n childBlockInfo.childBlockElement, workspace, input.connection, false);\n }\n // Set shadow after so we don't create a shadow we delete immediately.\n if (childBlockInfo.childShadowElement) {\n input.connection?.setShadowDom(childBlockInfo.childShadowElement);\n }\n }\n}\n\n/**\n * Applies next child nodes to the given block.\n *\n * @param xmlChildren Child nodes.\n * @param workspace The workspace containing the given block.\n * @param block The block to apply the child nodes on.\n */\nfunction applyNextTagNodes(\n xmlChildren: Element[], workspace: Workspace, block: Block) {\n for (let i = 0; i < xmlChildren.length; i++) {\n const xmlChild = xmlChildren[i];\n const childBlockInfo = findChildBlocks(xmlChild);\n if (childBlockInfo.childBlockElement) {\n if (!block.nextConnection) {\n throw TypeError('Next statement does not exist.');\n }\n // If there is more than one XML 'next' tag.\n if (block.nextConnection.isConnected()) {\n throw TypeError('Next statement is already connected.');\n }\n // Create child block.\n domToBlockHeadless(\n childBlockInfo.childBlockElement, workspace, block.nextConnection,\n true);\n }\n // Set shadow after so we don't create a shadow we delete immediately.\n if (childBlockInfo.childShadowElement && block.nextConnection) {\n block.nextConnection.setShadowDom(childBlockInfo.childShadowElement);\n }\n }\n}\n\n/**\n * Decode an XML block tag and create a block (and possibly sub blocks) on the\n * workspace.\n *\n * @param xmlBlock XML block element.\n * @param workspace The workspace.\n * @param parentConnection The parent connection to to connect this block to\n * after instantiating.\n * @param connectedToParentNext Whether the provided parent connection is a next\n * connection, rather than output or statement.\n * @returns The root block created.\n */\nfunction domToBlockHeadless(\n xmlBlock: Element, workspace: Workspace, parentConnection?: Connection,\n connectedToParentNext?: boolean): Block {\n let block = null;\n const prototypeName = xmlBlock.getAttribute('type');\n if (!prototypeName) {\n throw TypeError('Block type unspecified: ' + xmlBlock.outerHTML);\n }\n const id = xmlBlock.getAttribute('id');\n // AnyDuringMigration because: Argument of type 'string | null' is not\n // assignable to parameter of type 'string | undefined'.\n block = workspace.newBlock(prototypeName, id as AnyDuringMigration);\n\n // Preprocess childNodes so tags can be processed in a consistent order.\n const xmlChildNameMap = mapSupportedXmlTags(xmlBlock);\n\n const shouldCallInitSvg =\n applyMutationTagNodes(xmlChildNameMap.mutation, block);\n applyCommentTagNodes(xmlChildNameMap.comment, block);\n applyDataTagNodes(xmlChildNameMap.data, block);\n\n // Connect parent after processing mutation and before setting fields.\n if (parentConnection) {\n if (connectedToParentNext) {\n if (block.previousConnection) {\n parentConnection.connect(block.previousConnection);\n } else {\n throw TypeError('Next block does not have previous statement.');\n }\n } else {\n if (block.outputConnection) {\n parentConnection.connect(block.outputConnection);\n } else if (block.previousConnection) {\n parentConnection.connect(block.previousConnection);\n } else {\n throw TypeError(\n 'Child block does not have output or previous statement.');\n }\n }\n }\n\n applyFieldTagNodes(xmlChildNameMap.field, block);\n applyInputTagNodes(xmlChildNameMap.input, workspace, block, prototypeName);\n applyNextTagNodes(xmlChildNameMap.next, workspace, block);\n\n if (shouldCallInitSvg) {\n // This shouldn't even be called here\n // (ref: https://github.com/google/blockly/pull/4296#issuecomment-884226021\n // But the XML serializer/deserializer is iceboxed so I'm not going to fix\n // it.\n (block as BlockSvg).initSvg();\n }\n\n const inline = xmlBlock.getAttribute('inline');\n if (inline) {\n block.setInputsInline(inline === 'true');\n }\n const disabled = xmlBlock.getAttribute('disabled');\n if (disabled) {\n block.setEnabled(disabled !== 'true' && disabled !== 'disabled');\n }\n const deletable = xmlBlock.getAttribute('deletable');\n if (deletable) {\n block.setDeletable(deletable === 'true');\n }\n const movable = xmlBlock.getAttribute('movable');\n if (movable) {\n block.setMovable(movable === 'true');\n }\n const editable = xmlBlock.getAttribute('editable');\n if (editable) {\n block.setEditable(editable === 'true');\n }\n const collapsed = xmlBlock.getAttribute('collapsed');\n if (collapsed) {\n block.setCollapsed(collapsed === 'true');\n }\n if (xmlBlock.nodeName.toLowerCase() === 'shadow') {\n // Ensure all children are also shadows.\n const children = block.getChildren(false);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (!child.isShadow()) {\n throw TypeError('Shadow block not allowed non-shadow child.');\n }\n }\n // Ensure this block doesn't have any variable inputs.\n if (block.getVarModels().length) {\n throw TypeError('Shadow blocks cannot have variable references.');\n }\n block.setShadow(true);\n }\n return block;\n}\n\n/**\n * Decode an XML field tag and set the value of that field on the given block.\n *\n * @param block The block that is currently being deserialized.\n * @param fieldName The name of the field on the block.\n * @param xml The field tag to decode.\n */\nfunction domToField(block: Block, fieldName: string, xml: Element) {\n const field = block.getField(fieldName);\n if (!field) {\n console.warn(\n 'Ignoring non-existent field ' + fieldName + ' in block ' + block.type);\n return;\n }\n field.fromXml(xml);\n}\n\n/**\n * Remove any 'next' block (statements in a stack).\n *\n * @param xmlBlock XML block element or an empty DocumentFragment if the block\n * was an insertion marker.\n * @alias Blockly.Xml.deleteNext\n */\nexport function deleteNext(xmlBlock: Element|DocumentFragment) {\n for (let i = 0; i < xmlBlock.childNodes.length; i++) {\n const child = xmlBlock.childNodes[i];\n if (child.nodeName.toLowerCase() === 'next') {\n xmlBlock.removeChild(child);\n break;\n }\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods for string manipulation.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.string\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.string');\n\nimport * as deprecation from './deprecation.js';\n\n\n/**\n * Fast prefix-checker.\n * Copied from Closure's goog.string.startsWith.\n *\n * @param str The string to check.\n * @param prefix A string to look for at the start of `str`.\n * @returns True if `str` begins with `prefix`.\n * @alias Blockly.utils.string.startsWith\n * @deprecated Use built-in **string.startsWith** instead.\n */\nexport function startsWith(str: string, prefix: string): boolean {\n deprecation.warn(\n 'Blockly.utils.string.startsWith()', 'April 2022', 'April 2023',\n 'Use built-in string.startsWith');\n return str.startsWith(prefix);\n}\n\n/**\n * Given an array of strings, return the length of the shortest one.\n *\n * @param array Array of strings.\n * @returns Length of shortest string.\n * @alias Blockly.utils.string.shortestStringLength\n */\nexport function shortestStringLength(array: string[]): number {\n if (!array.length) {\n return 0;\n }\n return array\n .reduce(function(a, b) {\n return a.length < b.length ? a : b;\n })\n .length;\n}\n\n/**\n * Given an array of strings, return the length of the common prefix.\n * Words may not be split. Any space after a word is included in the length.\n *\n * @param array Array of strings.\n * @param opt_shortest Length of shortest string.\n * @returns Length of common prefix.\n * @alias Blockly.utils.string.commonWordPrefix\n */\nexport function commonWordPrefix(\n array: string[], opt_shortest?: number): number {\n if (!array.length) {\n return 0;\n } else if (array.length === 1) {\n return array[0].length;\n }\n let wordPrefix = 0;\n const max = opt_shortest || shortestStringLength(array);\n let len;\n for (len = 0; len < max; len++) {\n const letter = array[0][len];\n for (let i = 1; i < array.length; i++) {\n if (letter !== array[i][len]) {\n return wordPrefix;\n }\n }\n if (letter === ' ') {\n wordPrefix = len + 1;\n }\n }\n for (let i = 1; i < array.length; i++) {\n const letter = array[i][len];\n if (letter && letter !== ' ') {\n return wordPrefix;\n }\n }\n return max;\n}\n\n/**\n * Given an array of strings, return the length of the common suffix.\n * Words may not be split. Any space after a word is included in the length.\n *\n * @param array Array of strings.\n * @param opt_shortest Length of shortest string.\n * @returns Length of common suffix.\n * @alias Blockly.utils.string.commonWordSuffix\n */\nexport function commonWordSuffix(\n array: string[], opt_shortest?: number): number {\n if (!array.length) {\n return 0;\n } else if (array.length === 1) {\n return array[0].length;\n }\n let wordPrefix = 0;\n const max = opt_shortest || shortestStringLength(array);\n let len;\n for (len = 0; len < max; len++) {\n const letter = array[0].substr(-len - 1, 1);\n for (let i = 1; i < array.length; i++) {\n if (letter !== array[i].substr(-len - 1, 1)) {\n return wordPrefix;\n }\n }\n if (letter === ' ') {\n wordPrefix = len + 1;\n }\n }\n for (let i = 1; i < array.length; i++) {\n const letter = array[i].charAt(array[i].length - len - 1);\n if (letter && letter !== ' ') {\n return wordPrefix;\n }\n }\n return max;\n}\n\n/**\n * Wrap text to the specified width.\n *\n * @param text Text to wrap.\n * @param limit Width to wrap each line.\n * @returns Wrapped text.\n * @alias Blockly.utils.string.wrap\n */\nexport function wrap(text: string, limit: number): string {\n const lines = text.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n lines[i] = wrapLine(lines[i], limit);\n }\n return lines.join('\\n');\n}\n\n/**\n * Wrap single line of text to the specified width.\n *\n * @param text Text to wrap.\n * @param limit Width to wrap each line.\n * @returns Wrapped text.\n */\nfunction wrapLine(text: string, limit: number): string {\n if (text.length <= limit) {\n // Short text, no need to wrap.\n return text;\n }\n // Split the text into words.\n const words = text.trim().split(/\\s+/);\n // Set limit to be the length of the largest word.\n for (let i = 0; i < words.length; i++) {\n if (words[i].length > limit) {\n limit = words[i].length;\n }\n }\n\n let lastScore;\n let score = -Infinity;\n let lastText;\n let lineCount = 1;\n do {\n lastScore = score;\n lastText = text;\n // Create a list of booleans representing if a space (false) or\n // a break (true) appears after each word.\n let wordBreaks = [];\n // Seed the list with evenly spaced linebreaks.\n const steps = words.length / lineCount;\n let insertedBreaks = 1;\n for (let i = 0; i < words.length - 1; i++) {\n if (insertedBreaks < (i + 1.5) / steps) {\n insertedBreaks++;\n wordBreaks[i] = true;\n } else {\n wordBreaks[i] = false;\n }\n }\n wordBreaks = wrapMutate(words, wordBreaks, limit);\n score = wrapScore(words, wordBreaks, limit);\n text = wrapToText(words, wordBreaks);\n lineCount++;\n } while (score > lastScore);\n return lastText;\n}\n\n/**\n * Compute a score for how good the wrapping is.\n *\n * @param words Array of each word.\n * @param wordBreaks Array of line breaks.\n * @param limit Width to wrap each line.\n * @returns Larger the better.\n */\nfunction wrapScore(\n words: string[], wordBreaks: boolean[], limit: number): number {\n // If this function becomes a performance liability, add caching.\n // Compute the length of each line.\n const lineLengths = [0];\n const linePunctuation = [];\n for (let i = 0; i < words.length; i++) {\n lineLengths[lineLengths.length - 1] += words[i].length;\n if (wordBreaks[i] === true) {\n lineLengths.push(0);\n linePunctuation.push(words[i].charAt(words[i].length - 1));\n } else if (wordBreaks[i] === false) {\n lineLengths[lineLengths.length - 1]++;\n }\n }\n const maxLength = Math.max(...lineLengths);\n\n let score = 0;\n for (let i = 0; i < lineLengths.length; i++) {\n // Optimize for width.\n // -2 points per char over limit (scaled to the power of 1.5).\n score -= Math.pow(Math.abs(limit - lineLengths[i]), 1.5) * 2;\n // Optimize for even lines.\n // -1 point per char smaller than max (scaled to the power of 1.5).\n score -= Math.pow(maxLength - lineLengths[i], 1.5);\n // Optimize for structure.\n // Add score to line endings after punctuation.\n if ('.?!'.indexOf(linePunctuation[i]) !== -1) {\n score += limit / 3;\n } else if (',;)]}'.indexOf(linePunctuation[i]) !== -1) {\n score += limit / 4;\n }\n }\n // All else being equal, the last line should not be longer than the\n // previous line. For example, this looks wrong:\n // aaa bbb\n // ccc ddd eee\n if (lineLengths.length > 1 &&\n lineLengths[lineLengths.length - 1] <=\n lineLengths[lineLengths.length - 2]) {\n score += 0.5;\n }\n return score;\n}\n/**\n * Mutate the array of line break locations until an optimal solution is found.\n * No line breaks are added or deleted, they are simply moved around.\n *\n * @param words Array of each word.\n * @param wordBreaks Array of line breaks.\n * @param limit Width to wrap each line.\n * @returns New array of optimal line breaks.\n */\nfunction wrapMutate(\n words: string[], wordBreaks: boolean[], limit: number): boolean[] {\n let bestScore = wrapScore(words, wordBreaks, limit);\n let bestBreaks;\n // Try shifting every line break forward or backward.\n for (let i = 0; i < wordBreaks.length - 1; i++) {\n if (wordBreaks[i] === wordBreaks[i + 1]) {\n continue;\n }\n const mutatedWordBreaks = (new Array()).concat(wordBreaks);\n mutatedWordBreaks[i] = !mutatedWordBreaks[i];\n mutatedWordBreaks[i + 1] = !mutatedWordBreaks[i + 1];\n const mutatedScore = wrapScore(words, mutatedWordBreaks, limit);\n if (mutatedScore > bestScore) {\n bestScore = mutatedScore;\n bestBreaks = mutatedWordBreaks;\n }\n }\n if (bestBreaks) {\n // Found an improvement. See if it may be improved further.\n return wrapMutate(words, bestBreaks, limit);\n }\n // No improvements found. Done.\n return wordBreaks;\n}\n\n/**\n * Reassemble the array of words into text, with the specified line breaks.\n *\n * @param words Array of each word.\n * @param wordBreaks Array of line breaks.\n * @returns Plain text.\n */\nfunction wrapToText(words: string[], wordBreaks: boolean[]): string {\n const text = [];\n for (let i = 0; i < words.length; i++) {\n text.push(words[i]);\n if (wordBreaks[i] !== undefined) {\n text.push(wordBreaks[i] ? '\\n' : ' ');\n }\n }\n return text.join('');\n}\n\n/**\n * Is the given string a number (includes negative and decimals).\n *\n * @param str Input string.\n * @returns True if number, false otherwise.\n * @alias Blockly.utils.string.isNumber\n */\nexport function isNumber(str: string): boolean {\n return /^\\s*-?\\d+(\\.\\d+)?\\s*$/.test(str);\n}\n","/**\n * @license\n * Copyright 2011 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Library to create tooltips for Blockly.\n * First, call createDom() after onload.\n * Second, set the 'tooltip' property on any SVG element that needs a tooltip.\n * If the tooltip is a string, or a function that returns a string, that message\n * will be displayed. If the tooltip is an SVG element, then that object's\n * tooltip will be used. Third, call bindMouseEvents(e) passing the SVG element.\n *\n * @namespace Blockly.Tooltip\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Tooltip');\n\nimport * as browserEvents from './browser_events.js';\nimport * as common from './common.js';\nimport * as blocklyString from './utils/string.js';\n\n\n/**\n * A type which can define a tooltip.\n * Either a string, an object containing a tooltip property, or a function which\n * returns either a string, or another arbitrarily nested function which\n * eventually unwinds to a string.\n *\n * @alias Blockly.Tooltip.TipInfo\n */\nexport type TipInfo =\n string|{tooltip: AnyDuringMigration}|(() => TipInfo|string|Function);\n\n/**\n * A function that renders custom tooltip UI.\n * 1st parameter: the div element to render content into.\n * 2nd parameter: the element being moused over (i.e., the element for which the\n * tooltip should be shown).\n *\n * @alias Blockly.Tooltip.CustomTooltip\n */\nexport type CustomTooltip = (p1: Element, p2: Element) => AnyDuringMigration;\n\n/**\n * An optional function that renders custom tooltips into the provided DIV. If\n * this is defined, the function will be called instead of rendering the default\n * tooltip UI.\n */\nlet customTooltip: CustomTooltip|undefined = undefined;\n\n/**\n * Sets a custom function that will be called if present instead of the default\n * tooltip UI.\n *\n * @param customFn A custom tooltip used to render an alternate tooltip UI.\n * @alias Blockly.Tooltip.setCustomTooltip\n */\nexport function setCustomTooltip(customFn: CustomTooltip) {\n customTooltip = customFn;\n}\n\n/**\n * Gets the custom tooltip function.\n *\n * @returns The custom tooltip function, if defined.\n */\nexport function getCustomTooltip(): CustomTooltip|undefined {\n return customTooltip;\n}\n\n/** Is a tooltip currently showing? */\nlet visible = false;\n\n/**\n * Returns whether or not a tooltip is showing\n *\n * @returns True if a tooltip is showing\n * @alias Blockly.Tooltip.isVisible\n */\nexport function isVisible(): boolean {\n return visible;\n}\n\n/** Is someone else blocking the tooltip from being shown? */\nlet blocked = false;\n\n/**\n * Maximum width (in characters) of a tooltip.\n *\n * @alias Blockly.Tooltip.LIMIT\n */\nexport const LIMIT = 50;\n\n/** PID of suspended thread to clear tooltip on mouse out. */\nlet mouseOutPid: AnyDuringMigration = 0;\n\n/** PID of suspended thread to show the tooltip. */\nlet showPid: AnyDuringMigration = 0;\n\n/**\n * Last observed X location of the mouse pointer (freezes when tooltip appears).\n */\nlet lastX = 0;\n\n/**\n * Last observed Y location of the mouse pointer (freezes when tooltip appears).\n */\nlet lastY = 0;\n\n/** Current element being pointed at. */\nlet element: AnyDuringMigration = null;\n\n/**\n * Once a tooltip has opened for an element, that element is 'poisoned' and\n * cannot respawn a tooltip until the pointer moves over a different element.\n */\nlet poisonedElement: AnyDuringMigration = null;\n\n/**\n * Horizontal offset between mouse cursor and tooltip.\n *\n * @alias Blockly.Tooltip.OFFSET_X\n */\nexport const OFFSET_X = 0;\n\n/**\n * Vertical offset between mouse cursor and tooltip.\n *\n * @alias Blockly.Tooltip.OFFSET_Y\n */\nexport const OFFSET_Y = 10;\n\n/**\n * Radius mouse can move before killing tooltip.\n *\n * @alias Blockly.Tooltip.RADIUS_OK\n */\nexport const RADIUS_OK = 10;\n\n/**\n * Delay before tooltip appears.\n *\n * @alias Blockly.Tooltip.HOVER_MS\n */\nexport const HOVER_MS = 750;\n\n/**\n * Horizontal padding between tooltip and screen edge.\n *\n * @alias Blockly.Tooltip.MARGINS\n */\nexport const MARGINS = 5;\n\n/** The HTML container. Set once by createDom. */\nlet containerDiv: HTMLDivElement|null = null;\n\n/**\n * Returns the HTML tooltip container.\n *\n * @returns The HTML tooltip container.\n * @alias Blockly.Tooltip.getDiv\n */\nexport function getDiv(): HTMLDivElement|null {\n return containerDiv;\n}\n\n/**\n * Returns the tooltip text for the given element.\n *\n * @param object The object to get the tooltip text of.\n * @returns The tooltip text of the element.\n * @alias Blockly.Tooltip.getTooltipOfObject\n */\nexport function getTooltipOfObject(object: AnyDuringMigration|null): string {\n const obj = getTargetObject(object);\n if (obj) {\n let tooltip = obj.tooltip;\n while (typeof tooltip === 'function') {\n tooltip = tooltip();\n }\n if (typeof tooltip !== 'string') {\n throw Error('Tooltip function must return a string.');\n }\n return tooltip;\n }\n return '';\n}\n\n/**\n * Returns the target object that the given object is targeting for its\n * tooltip. Could be the object itself.\n *\n * @param obj The object are trying to find the target tooltip object of.\n * @returns The target tooltip object.\n */\nfunction getTargetObject(obj: object|null): {tooltip: AnyDuringMigration}|null {\n while (obj && (obj as any).tooltip) {\n if (typeof (obj as any).tooltip === 'string' ||\n typeof (obj as any).tooltip === 'function') {\n return obj as {tooltip: string | (() => string)};\n }\n obj = (obj as any).tooltip;\n }\n return null;\n}\n\n/**\n * Create the tooltip div and inject it onto the page.\n *\n * @alias Blockly.Tooltip.createDom\n */\nexport function createDom() {\n if (containerDiv) {\n return; // Already created.\n }\n // Create an HTML container for popup overlays (e.g. editor widgets).\n containerDiv = document.createElement('div');\n containerDiv.className = 'blocklyTooltipDiv';\n const container = common.getParentContainer() || document.body;\n container.appendChild(containerDiv);\n}\n\n/**\n * Binds the required mouse events onto an SVG element.\n *\n * @param element SVG element onto which tooltip is to be bound.\n * @alias Blockly.Tooltip.bindMouseEvents\n */\nexport function bindMouseEvents(element: Element) {\n // TODO (#6097): Don't stash wrapper info on the DOM.\n (element as AnyDuringMigration).mouseOverWrapper_ =\n browserEvents.bind(element, 'mouseover', null, onMouseOver);\n (element as AnyDuringMigration).mouseOutWrapper_ =\n browserEvents.bind(element, 'mouseout', null, onMouseOut);\n\n // Don't use bindEvent_ for mousemove since that would create a\n // corresponding touch handler, even though this only makes sense in the\n // context of a mouseover/mouseout.\n element.addEventListener('mousemove', onMouseMove, false);\n}\n\n/**\n * Unbinds tooltip mouse events from the SVG element.\n *\n * @param element SVG element onto which tooltip is bound.\n * @alias Blockly.Tooltip.unbindMouseEvents\n */\nexport function unbindMouseEvents(element: Element|null) {\n if (!element) {\n return;\n }\n // TODO (#6097): Don't stash wrapper info on the DOM.\n browserEvents.unbind((element as AnyDuringMigration).mouseOverWrapper_);\n browserEvents.unbind((element as AnyDuringMigration).mouseOutWrapper_);\n element.removeEventListener('mousemove', onMouseMove);\n}\n\n/**\n * Hide the tooltip if the mouse is over a different object.\n * Initialize the tooltip to potentially appear for this object.\n *\n * @param e Mouse event.\n */\nfunction onMouseOver(e: Event) {\n if (blocked) {\n // Someone doesn't want us to show tooltips.\n return;\n }\n // If the tooltip is an object, treat it as a pointer to the next object in\n // the chain to look at. Terminate when a string or function is found.\n const newElement = getTargetObject(e.currentTarget);\n if (element !== newElement) {\n hide();\n poisonedElement = null;\n element = newElement;\n }\n // Forget about any immediately preceding mouseOut event.\n clearTimeout(mouseOutPid);\n}\n\n/**\n * Hide the tooltip if the mouse leaves the object and enters the workspace.\n *\n * @param _e Mouse event.\n */\nfunction onMouseOut(_e: Event) {\n if (blocked) {\n // Someone doesn't want us to show tooltips.\n return;\n }\n // Moving from one element to another (overlapping or with no gap) generates\n // a mouseOut followed instantly by a mouseOver. Fork off the mouseOut\n // event and kill it if a mouseOver is received immediately.\n // This way the task only fully executes if mousing into the void.\n mouseOutPid = setTimeout(function() {\n element = null;\n poisonedElement = null;\n hide();\n }, 1);\n clearTimeout(showPid);\n}\n\n/**\n * When hovering over an element, schedule a tooltip to be shown. If a tooltip\n * is already visible, hide it if the mouse strays out of a certain radius.\n *\n * @param e Mouse event.\n */\nfunction onMouseMove(e: Event) {\n if (!element || !(element as AnyDuringMigration).tooltip) {\n // No tooltip here to show.\n return;\n } else if (blocked) {\n // Someone doesn't want us to show tooltips. We are probably handling a\n // user gesture, such as a click or drag.\n return;\n }\n if (visible) {\n // Compute the distance between the mouse position when the tooltip was\n // shown and the current mouse position. Pythagorean theorem.\n // AnyDuringMigration because: Property 'pageX' does not exist on type\n // 'Event'.\n const dx = lastX - (e as AnyDuringMigration).pageX;\n // AnyDuringMigration because: Property 'pageY' does not exist on type\n // 'Event'.\n const dy = lastY - (e as AnyDuringMigration).pageY;\n if (Math.sqrt(dx * dx + dy * dy) > RADIUS_OK) {\n hide();\n }\n } else if (poisonedElement !== element) {\n // The mouse moved, clear any previously scheduled tooltip.\n clearTimeout(showPid);\n // Maybe this time the mouse will stay put. Schedule showing of tooltip.\n // AnyDuringMigration because: Property 'pageX' does not exist on type\n // 'Event'.\n lastX = (e as AnyDuringMigration).pageX;\n // AnyDuringMigration because: Property 'pageY' does not exist on type\n // 'Event'.\n lastY = (e as AnyDuringMigration).pageY;\n showPid = setTimeout(show, HOVER_MS);\n }\n}\n\n/**\n * Dispose of the tooltip.\n *\n * @alias Blockly.Tooltip.dispose\n * @internal\n */\nexport function dispose() {\n element = null;\n poisonedElement = null;\n hide();\n}\n\n/**\n * Hide the tooltip.\n *\n * @alias Blockly.Tooltip.hide\n */\nexport function hide() {\n if (visible) {\n visible = false;\n if (containerDiv) {\n containerDiv.style.display = 'none';\n }\n }\n if (showPid) {\n clearTimeout(showPid);\n }\n}\n\n/**\n * Hide any in-progress tooltips and block showing new tooltips until the next\n * call to unblock().\n *\n * @alias Blockly.Tooltip.block\n * @internal\n */\nexport function block() {\n hide();\n blocked = true;\n}\n\n/**\n * Unblock tooltips: allow them to be scheduled and shown according to their own\n * logic.\n *\n * @alias Blockly.Tooltip.unblock\n * @internal\n */\nexport function unblock() {\n blocked = false;\n}\n\n/** Renders the tooltip content into the tooltip div. */\nfunction renderContent() {\n if (!containerDiv || !element) {\n // This shouldn't happen, but if it does, we can't render.\n return;\n }\n if (typeof customTooltip === 'function') {\n customTooltip(containerDiv, element);\n } else {\n renderDefaultContent();\n }\n}\n\n/** Renders the default tooltip UI. */\nfunction renderDefaultContent() {\n let tip = getTooltipOfObject(element);\n tip = blocklyString.wrap(tip, LIMIT);\n // Create new text, line by line.\n const lines = tip.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const div = (document.createElement('div'));\n div.appendChild(document.createTextNode(lines[i]));\n containerDiv!.appendChild(div);\n }\n}\n\n/**\n * Gets the coordinates for the tooltip div, taking into account the edges of\n * the screen to prevent showing the tooltip offscreen.\n *\n * @param rtl True if the tooltip should be in right-to-left layout.\n * @returns Coordinates at which the tooltip div should be placed.\n */\nfunction getPosition(rtl: boolean): {x: number, y: number} {\n // Position the tooltip just below the cursor.\n const windowWidth = document.documentElement.clientWidth;\n const windowHeight = document.documentElement.clientHeight;\n\n let anchorX = lastX;\n if (rtl) {\n anchorX -= OFFSET_X + containerDiv!.offsetWidth;\n } else {\n anchorX += OFFSET_X;\n }\n\n let anchorY = lastY + OFFSET_Y;\n if (anchorY + containerDiv!.offsetHeight > windowHeight + window.scrollY) {\n // Falling off the bottom of the screen; shift the tooltip up.\n anchorY -= containerDiv!.offsetHeight + 2 * OFFSET_Y;\n }\n\n if (rtl) {\n // Prevent falling off left edge in RTL mode.\n anchorX = Math.max(MARGINS - window.scrollX, anchorX);\n } else {\n if (anchorX + containerDiv!.offsetWidth >\n windowWidth + window.scrollX - 2 * MARGINS) {\n // Falling off the right edge of the screen;\n // clamp the tooltip on the edge.\n anchorX = windowWidth - containerDiv!.offsetWidth - 2 * MARGINS;\n }\n }\n\n return {x: anchorX, y: anchorY};\n}\n\n/** Create the tooltip and show it. */\nfunction show() {\n if (blocked) {\n // Someone doesn't want us to show tooltips.\n return;\n }\n poisonedElement = element;\n if (!containerDiv) {\n return;\n }\n // Erase all existing text.\n containerDiv.textContent = '';\n\n // Add new content.\n renderContent();\n\n // Display the tooltip.\n const rtl = (element as any).RTL;\n containerDiv.style.direction = rtl ? 'rtl' : 'ltr';\n containerDiv.style.display = 'block';\n visible = true;\n\n const {x, y} = getPosition(rtl);\n containerDiv.style.left = x + 'px';\n containerDiv.style.top = y + 'px';\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods for colour manipulation.\n *\n * @namespace Blockly.utils.colour\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.colour');\n\n\n/**\n * The richness of block colours, regardless of the hue.\n * Must be in the range of 0 (inclusive) to 1 (exclusive).\n *\n * @alias Blockly.utils.colour.hsvSaturation\n */\nlet hsvSaturation = 0.45;\n\n/**\n * Get the richness of block colours, regardless of the hue.\n *\n * @alias Blockly.utils.colour.getHsvSaturation\n * @returns The current richness.\n * @internal\n */\nexport function getHsvSaturation(): number {\n return hsvSaturation;\n}\n\n/**\n * Set the richness of block colours, regardless of the hue.\n *\n * @param newSaturation The new richness, in the range of 0 (inclusive) to 1\n * (exclusive)\n * @alias Blockly.utils.colour.setHsvSaturation\n * @internal\n */\nexport function setHsvSaturation(newSaturation: number) {\n hsvSaturation = newSaturation;\n}\n\n/**\n * The intensity of block colours, regardless of the hue.\n * Must be in the range of 0 (inclusive) to 1 (exclusive).\n *\n * @alias Blockly.utils.colour.hsvValue\n */\nlet hsvValue = 0.65;\n\n/**\n * Get the intensity of block colours, regardless of the hue.\n *\n * @alias Blockly.utils.colour.getHsvValue\n * @returns The current intensity.\n * @internal\n */\nexport function getHsvValue(): number {\n return hsvValue;\n}\n\n/**\n * Set the intensity of block colours, regardless of the hue.\n *\n * @param newValue The new intensity, in the range of 0 (inclusive) to 1\n * (exclusive)\n * @alias Blockly.utils.colour.setHsvValue\n * @internal\n */\nexport function setHsvValue(newValue: number) {\n hsvValue = newValue;\n}\n\n/**\n * Parses a colour from a string.\n * .parse('red') = '#ff0000'\n * .parse('#f00') = '#ff0000'\n * .parse('#ff0000') = '#ff0000'\n * .parse('0xff0000') = '#ff0000'\n * .parse('rgb(255, 0, 0)') = '#ff0000'\n *\n * @param str Colour in some CSS format.\n * @returns A string containing a hex representation of the colour, or null if\n * can't be parsed.\n * @alias Blockly.utils.colour.parse\n */\nexport function parse(str: string|number): string|null {\n str = String(str).toLowerCase().trim();\n let hex = names[str];\n if (hex) {\n // e.g. 'red'\n return hex;\n }\n hex = str.substring(0, 2) === '0x' ? '#' + str.substring(2) : str;\n hex = hex[0] === '#' ? hex : '#' + hex;\n if (/^#[0-9a-f]{6}$/.test(hex)) {\n // e.g. '#00ff88'\n return hex;\n }\n if (/^#[0-9a-f]{3}$/.test(hex)) {\n // e.g. '#0f8'\n return ['#', hex[1], hex[1], hex[2], hex[2], hex[3], hex[3]].join('');\n }\n const rgb = str.match(/^(?:rgb)?\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)$/);\n if (rgb) {\n // e.g. 'rgb(0, 128, 255)'\n const r = Number(rgb[1]);\n const g = Number(rgb[2]);\n const b = Number(rgb[3]);\n if (r >= 0 && r < 256 && g >= 0 && g < 256 && b >= 0 && b < 256) {\n return rgbToHex(r, g, b);\n }\n }\n return null;\n}\n\n/**\n * Converts a colour from RGB to hex representation.\n *\n * @param r Amount of red, int between 0 and 255.\n * @param g Amount of green, int between 0 and 255.\n * @param b Amount of blue, int between 0 and 255.\n * @returns Hex representation of the colour.\n * @alias Blockly.utils.colour.rgbToHex\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const rgb = r << 16 | g << 8 | b;\n if (r < 0x10) {\n return '#' + (0x1000000 | rgb).toString(16).substr(1);\n }\n return '#' + rgb.toString(16);\n}\n\n/**\n * Converts a colour to RGB.\n *\n * @param colour String representing colour in any colour format ('#ff0000',\n * 'red', '0xff000', etc).\n * @returns RGB representation of the colour.\n * @alias Blockly.utils.colour.hexToRgb\n */\nexport function hexToRgb(colour: string): number[] {\n const hex = parse(colour);\n if (!hex) {\n return [0, 0, 0];\n }\n\n const rgb = parseInt(hex.substr(1), 16);\n const r = rgb >> 16;\n const g = rgb >> 8 & 255;\n const b = rgb & 255;\n\n return [r, g, b];\n}\n\n/**\n * Converts an HSV triplet to hex representation.\n *\n * @param h Hue value in [0, 360].\n * @param s Saturation value in [0, 1].\n * @param v Brightness in [0, 255].\n * @returns Hex representation of the colour.\n * @alias Blockly.utils.colour.hsvToHex\n */\nexport function hsvToHex(h: number, s: number, v: number): string {\n let red = 0;\n let green = 0;\n let blue = 0;\n if (s === 0) {\n red = v;\n green = v;\n blue = v;\n } else {\n const sextant = Math.floor(h / 60);\n const remainder = h / 60 - sextant;\n const val1 = v * (1 - s);\n const val2 = v * (1 - s * remainder);\n const val3 = v * (1 - s * (1 - remainder));\n switch (sextant) {\n case 1:\n red = val2;\n green = v;\n blue = val1;\n break;\n case 2:\n red = val1;\n green = v;\n blue = val3;\n break;\n case 3:\n red = val1;\n green = val2;\n blue = v;\n break;\n case 4:\n red = val3;\n green = val1;\n blue = v;\n break;\n case 5:\n red = v;\n green = val1;\n blue = val2;\n break;\n case 6:\n case 0:\n red = v;\n green = val3;\n blue = val1;\n break;\n }\n }\n return rgbToHex(Math.floor(red), Math.floor(green), Math.floor(blue));\n}\n\n/**\n * Blend two colours together, using the specified factor to indicate the\n * weight given to the first colour.\n *\n * @param colour1 First colour.\n * @param colour2 Second colour.\n * @param factor The weight to be given to colour1 over colour2.\n * Values should be in the range [0, 1].\n * @returns Combined colour represented in hex.\n * @alias Blockly.utils.colour.blend\n */\nexport function blend(colour1: string, colour2: string, factor: number): string|\n null {\n const hex1 = parse(colour1);\n if (!hex1) {\n return null;\n }\n const hex2 = parse(colour2);\n if (!hex2) {\n return null;\n }\n const rgb1 = hexToRgb(hex1);\n const rgb2 = hexToRgb(hex2);\n const r = Math.round(rgb2[0] + factor * (rgb1[0] - rgb2[0]));\n const g = Math.round(rgb2[1] + factor * (rgb1[1] - rgb2[1]));\n const b = Math.round(rgb2[2] + factor * (rgb1[2] - rgb2[2]));\n return rgbToHex(r, g, b);\n}\n\n/**\n * A map that contains the 16 basic colour keywords as defined by W3C:\n * https://www.w3.org/TR/2018/REC-css-color-3-20180619/#html4\n * The keys of this map are the lowercase \"readable\" names of the colours,\n * while the values are the \"hex\" values.\n *\n * @alias Blockly.utils.colour.names\n */\nexport const names: {[key: string]: string} = {\n 'aqua': '#00ffff',\n 'black': '#000000',\n 'blue': '#0000ff',\n 'fuchsia': '#ff00ff',\n 'gray': '#808080',\n 'green': '#008000',\n 'lime': '#00ff00',\n 'maroon': '#800000',\n 'navy': '#000080',\n 'olive': '#808000',\n 'purple': '#800080',\n 'red': '#ff0000',\n 'silver': '#c0c0c0',\n 'teal': '#008080',\n 'white': '#ffffff',\n 'yellow': '#ffff00',\n};\n\n/**\n * Convert a hue (HSV model) into an RGB hex triplet.\n *\n * @param hue Hue on a colour wheel (0-360).\n * @returns RGB code, e.g. '#5ba65b'.\n * @alias Blockly.utils.colour.hueToHex\n */\nexport function hueToHex(hue: number): string {\n return hsvToHex(hue, hsvSaturation, hsvValue * 255);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @namespace Blockly.utils.parsing\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.parsing');\n\nimport {Msg} from '../msg.js';\n\nimport * as colourUtils from './colour.js';\n\n\n/**\n * Internal implementation of the message reference and interpolation token\n * parsing used by tokenizeInterpolation() and replaceMessageReferences().\n *\n * @param message Text which might contain string table references and\n * interpolation tokens.\n * @param parseInterpolationTokens Option to parse numeric\n * interpolation tokens (%1, %2, ...) when true.\n * @returns Array of strings and numbers.\n */\nfunction tokenizeInterpolationInternal(\n message: string, parseInterpolationTokens: boolean): (string|number)[] {\n const tokens = [];\n const chars = message.split('');\n chars.push( // End marker.\n '');\n // Parse the message with a finite state machine.\n // 0 - Base case.\n // 1 - % found.\n // 2 - Digit found.\n // 3 - Message ref found.\n let state = 0;\n const buffer = new Array();\n let number = null;\n for (let i = 0; i < chars.length; i++) {\n const c = chars[i];\n if (state === 0) { // Start escape.\n if (c === '%') {\n const text = buffer.join('');\n if (text) {\n tokens.push(text);\n }\n buffer.length = 0;\n state = 1;\n } else {\n buffer.push(c); // Regular char.\n }\n } else if (state === 1) {\n if (c === '%') {\n buffer.push(c); // Escaped %: %%\n state = 0;\n } else if (parseInterpolationTokens && '0' <= c && c <= '9') {\n state = 2;\n number = c;\n const text = buffer.join('');\n if (text) {\n tokens.push(text);\n }\n buffer.length = 0;\n } else if (c === '{') {\n state = 3;\n } else {\n buffer.push('%', c); // Not recognized. Return as literal.\n state = 0;\n }\n } else if (state === 2) {\n if ('0' <= c && c <= '9') {\n number += c; // Multi-digit number.\n } else {\n tokens.push(parseInt(number ?? '', 10));\n i--; // Parse this char again.\n state = 0;\n }\n } else if (state === 3) { // String table reference\n if (c === '') {\n // Premature end before closing '}'\n buffer.splice(0, 0, '%{'); // Re-insert leading delimiter\n i--; // Parse this char again.\n state = 0; // and parse as string literal.\n } else if (c !== '}') {\n buffer.push(c);\n } else {\n const rawKey = buffer.join('');\n if (/[A-Z]\\w*/i.test(rawKey)) { // Strict matching\n // Found a valid string key. Attempt case insensitive match.\n const keyUpper = rawKey.toUpperCase();\n\n // BKY_ is the prefix used to namespace the strings used in\n // Blockly core files and the predefined blocks in ../blocks/.\n // These strings are defined in ../msgs/ files.\n const bklyKey =\n keyUpper.startsWith('BKY_') ? keyUpper.substring(4) : null;\n if (bklyKey && bklyKey in Msg) {\n const rawValue = Msg[bklyKey];\n if (typeof rawValue === 'string') {\n // Attempt to dereference substrings, too, appending to the\n // end.\n Array.prototype.push.apply(\n tokens,\n tokenizeInterpolationInternal(\n rawValue, parseInterpolationTokens));\n } else if (parseInterpolationTokens) {\n // When parsing interpolation tokens, numbers are special\n // placeholders (%1, %2, etc). Make sure all other values are\n // strings.\n tokens.push(String(rawValue));\n } else {\n tokens.push(rawValue);\n }\n } else {\n // No entry found in the string table. Pass reference as string.\n tokens.push('%{' + rawKey + '}');\n }\n buffer.length = 0; // Clear the array\n state = 0;\n } else {\n tokens.push('%{' + rawKey + '}');\n buffer.length = 0;\n state = 0; // and parse as string literal.\n }\n }\n }\n }\n let text = buffer.join('');\n if (text) {\n tokens.push(text);\n }\n\n // Merge adjacent text tokens into a single string.\n const mergedTokens = [];\n buffer.length = 0;\n for (let i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'string') {\n buffer.push(tokens[i] as string);\n } else {\n text = buffer.join('');\n if (text) {\n mergedTokens.push(text);\n }\n buffer.length = 0;\n mergedTokens.push(tokens[i]);\n }\n }\n text = buffer.join('');\n if (text) {\n mergedTokens.push(text);\n }\n buffer.length = 0;\n\n return mergedTokens;\n}\n\n/**\n * Parse a string with any number of interpolation tokens (%1, %2, ...).\n * It will also replace string table references (e.g., %{bky_my_msg} and\n * %{BKY_MY_MSG} will both be replaced with the value in\n * Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped\n * (e.g., '%%').\n *\n * @param message Text which might contain string table references and\n * interpolation tokens.\n * @returns Array of strings and numbers.\n * @alias Blockly.utils.parsing.tokenizeInterpolation\n */\nexport function tokenizeInterpolation(message: string): (string|number)[] {\n return tokenizeInterpolationInternal(message, true);\n}\n\n/**\n * Replaces string table references in a message, if the message is a string.\n * For example, \"%{bky_my_msg}\" and \"%{BKY_MY_MSG}\" will both be replaced with\n * the value in Msg['MY_MSG'].\n *\n * @param message Message, which may be a string that contains\n * string table references.\n * @returns String with message references replaced.\n * @alias Blockly.utils.parsing.replaceMessageReferences\n */\nexport function replaceMessageReferences(message: string|any): string {\n if (typeof message !== 'string') {\n return message;\n }\n const interpolatedResult = tokenizeInterpolationInternal(message, false);\n // When parseInterpolationTokens === false, interpolatedResult should be at\n // most length 1.\n return interpolatedResult.length ? String(interpolatedResult[0]) : '';\n}\n\n/**\n * Validates that any %{MSG_KEY} references in the message refer to keys of\n * the Msg string table.\n *\n * @param message Text which might contain string table references.\n * @returns True if all message references have matching values.\n * Otherwise, false.\n * @alias Blockly.utils.parsing.checkMessageReferences\n */\nexport function checkMessageReferences(message: string): boolean {\n let validSoFar = true;\n\n const msgTable = Msg;\n // TODO (#1169): Implement support for other string tables,\n // prefixes other than BKY_.\n const m = message.match(/%{BKY_[A-Z]\\w*}/ig);\n if (m) {\n for (let i = 0; i < m.length; i++) {\n const msgKey = m[i].toUpperCase();\n if (msgTable[msgKey.slice(6, -1)] === undefined) {\n console.warn('No message string for ' + m[i] + ' in ' + message);\n validSoFar = false; // Continue to report other errors.\n }\n }\n }\n\n return validSoFar;\n}\n\n/**\n * Parse a block colour from a number or string, as provided in a block\n * definition.\n *\n * @param colour HSV hue value (0 to 360), #RRGGBB string,\n * or a message reference string pointing to one of those two values.\n * @returns An object containing the colour as\n * a #RRGGBB string, and the hue if the input was an HSV hue value.\n * @throws {Error} If the colour cannot be parsed.\n * @alias Blockly.utils.parsing.parseBlockColour\n */\nexport function parseBlockColour(colour: number|\n string): {hue: number|null, hex: string} {\n const dereferenced =\n typeof colour === 'string' ? replaceMessageReferences(colour) : colour;\n\n const hue = Number(dereferenced);\n if (!isNaN(hue) && 0 <= hue && hue <= 360) {\n return {\n hue: hue,\n hex: colourUtils.hsvToHex(\n hue, colourUtils.getHsvSaturation(), colourUtils.getHsvValue() * 255),\n };\n } else {\n const hex = colourUtils.parse(dereferenced);\n if (hex) {\n // Only store hue if colour is set as a hue.\n return {hue: null, hex: hex};\n } else {\n let errorMsg = 'Invalid colour: \"' + dereferenced + '\"';\n if (colour !== dereferenced) {\n errorMsg += ' (from \"' + colour + '\")';\n }\n throw Error(errorMsg);\n }\n }\n}\n","/**\n * @license\n * Copyright 2013 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * A div that floats on top of Blockly. This singleton contains\n * temporary HTML UI widgets that the user is currently interacting with.\n * E.g. text input areas, colour pickers, context menus.\n *\n * @namespace Blockly.WidgetDiv\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.WidgetDiv');\n\nimport * as common from './common.js';\nimport * as dom from './utils/dom.js';\nimport type {Rect} from './utils/rect.js';\nimport type {Size} from './utils/size.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/** The object currently using this container. */\nlet owner: unknown = null;\n\n/** Optional cleanup function set by whichever object uses the widget. */\nlet dispose: (() => void)|null = null;\n\n/** A class name representing the current owner's workspace renderer. */\nlet rendererClassName = '';\n\n/** A class name representing the current owner's workspace theme. */\nlet themeClassName = '';\n\n/** The HTML container for popup overlays (e.g. editor widgets). */\nlet containerDiv: HTMLDivElement|null;\n\n/**\n * Returns the HTML container for editor widgets.\n *\n * @returns The editor widget container.\n * @alias Blockly.WidgetDiv.getDiv\n */\nexport function getDiv(): HTMLDivElement|null {\n return containerDiv;\n}\n\n/**\n * Allows unit tests to reset the div. Do not use outside of tests.\n *\n * @param newDiv The new value for the DIV field.\n * @alias Blockly.WidgetDiv.testOnly_setDiv\n * @internal\n */\nexport function testOnly_setDiv(newDiv: HTMLDivElement|null) {\n containerDiv = newDiv;\n}\n\n/**\n * Create the widget div and inject it onto the page.\n *\n * @alias Blockly.WidgetDiv.createDom\n */\nexport function createDom() {\n if (containerDiv) {\n return; // Already created.\n }\n\n containerDiv = document.createElement('div') as HTMLDivElement;\n containerDiv.className = 'blocklyWidgetDiv';\n const container = common.getParentContainer() || document.body;\n container.appendChild(containerDiv);\n}\n\n/**\n * Initialize and display the widget div. Close the old one if needed.\n *\n * @param newOwner The object that will be using this container.\n * @param rtl Right-to-left (true) or left-to-right (false).\n * @param newDispose Optional cleanup function to be run when the widget is\n * closed.\n * @alias Blockly.WidgetDiv.show\n */\nexport function show(newOwner: unknown, rtl: boolean, newDispose: () => void) {\n hide();\n owner = newOwner;\n dispose = newDispose;\n const div = containerDiv;\n if (!div) return;\n div.style.direction = rtl ? 'rtl' : 'ltr';\n div.style.display = 'block';\n const mainWorkspace = common.getMainWorkspace() as WorkspaceSvg;\n rendererClassName = mainWorkspace.getRenderer().getClassName();\n themeClassName = mainWorkspace.getTheme().getClassName();\n if (rendererClassName) {\n dom.addClass(div, rendererClassName);\n }\n if (themeClassName) {\n dom.addClass(div, themeClassName);\n }\n}\n\n/**\n * Destroy the widget and hide the div.\n *\n * @alias Blockly.WidgetDiv.hide\n */\nexport function hide() {\n if (!isVisible()) {\n return;\n }\n owner = null;\n\n const div = containerDiv;\n if (!div) return;\n div.style.display = 'none';\n div.style.left = '';\n div.style.top = '';\n dispose && dispose();\n dispose = null;\n div.textContent = '';\n\n if (rendererClassName) {\n dom.removeClass(div, rendererClassName);\n rendererClassName = '';\n }\n if (themeClassName) {\n dom.removeClass(div, themeClassName);\n themeClassName = '';\n }\n (common.getMainWorkspace() as WorkspaceSvg).markFocused();\n}\n\n/**\n * Is the container visible?\n *\n * @returns True if visible.\n * @alias Blockly.WidgetDiv.isVisible\n */\nexport function isVisible(): boolean {\n return !!owner;\n}\n\n/**\n * Destroy the widget and hide the div if it is being used by the specified\n * object.\n *\n * @param oldOwner The object that was using this container.\n * @alias Blockly.WidgetDiv.hideIfOwner\n */\nexport function hideIfOwner(oldOwner: unknown) {\n if (owner === oldOwner) {\n hide();\n }\n}\n/**\n * Set the widget div's position and height. This function does nothing clever:\n * it will not ensure that your widget div ends up in the visible window.\n *\n * @param x Horizontal location (window coordinates, not body).\n * @param y Vertical location (window coordinates, not body).\n * @param height The height of the widget div (pixels).\n */\nfunction positionInternal(x: number, y: number, height: number) {\n containerDiv!.style.left = x + 'px';\n containerDiv!.style.top = y + 'px';\n containerDiv!.style.height = height + 'px';\n}\n\n/**\n * Position the widget div based on an anchor rectangle.\n * The widget should be placed adjacent to but not overlapping the anchor\n * rectangle. The preferred position is directly below and aligned to the left\n * (LTR) or right (RTL) side of the anchor.\n *\n * @param viewportBBox The bounding rectangle of the current viewport, in window\n * coordinates.\n * @param anchorBBox The bounding rectangle of the anchor, in window\n * coordinates.\n * @param widgetSize The size of the widget that is inside the widget div, in\n * window coordinates.\n * @param rtl Whether the workspace is in RTL mode. This determines horizontal\n * alignment.\n * @alias Blockly.WidgetDiv.positionWithAnchor\n * @internal\n */\nexport function positionWithAnchor(\n viewportBBox: Rect, anchorBBox: Rect, widgetSize: Size, rtl: boolean) {\n const y = calculateY(viewportBBox, anchorBBox, widgetSize);\n const x = calculateX(viewportBBox, anchorBBox, widgetSize, rtl);\n\n if (y < 0) {\n positionInternal(x, 0, widgetSize.height + y);\n } else {\n positionInternal(x, y, widgetSize.height);\n }\n}\n\n/**\n * Calculate an x position (in window coordinates) such that the widget will not\n * be offscreen on the right or left.\n *\n * @param viewportBBox The bounding rectangle of the current viewport, in window\n * coordinates.\n * @param anchorBBox The bounding rectangle of the anchor, in window\n * coordinates.\n * @param widgetSize The dimensions of the widget inside the widget div.\n * @param rtl Whether the Blockly workspace is in RTL mode.\n * @returns A valid x-coordinate for the top left corner of the widget div, in\n * window coordinates.\n */\nfunction calculateX(\n viewportBBox: Rect, anchorBBox: Rect, widgetSize: Size,\n rtl: boolean): number {\n if (rtl) {\n // Try to align the right side of the field and the right side of widget.\n const widgetLeft = anchorBBox.right - widgetSize.width;\n // Don't go offscreen left.\n const x = Math.max(widgetLeft, viewportBBox.left);\n // But really don't go offscreen right:\n return Math.min(x, viewportBBox.right - widgetSize.width);\n } else {\n // Try to align the left side of the field and the left side of widget.\n // Don't go offscreen right.\n const x = Math.min(anchorBBox.left, viewportBBox.right - widgetSize.width);\n // But left is more important, because that's where the text is.\n return Math.max(x, viewportBBox.left);\n }\n}\n\n/**\n * Calculate a y position (in window coordinates) such that the widget will not\n * be offscreen on the top or bottom.\n *\n * @param viewportBBox The bounding rectangle of the current viewport, in window\n * coordinates.\n * @param anchorBBox The bounding rectangle of the anchor, in window\n * coordinates.\n * @param widgetSize The dimensions of the widget inside the widget div.\n * @returns A valid y-coordinate for the top left corner of the widget div, in\n * window coordinates.\n */\nfunction calculateY(\n viewportBBox: Rect, anchorBBox: Rect, widgetSize: Size): number {\n // Flip the widget vertically if off the bottom.\n // The widget could go off the top of the window, but it would also go off\n // the bottom. The window is just too small.\n if (anchorBBox.bottom + widgetSize.height >= viewportBBox.bottom) {\n // The bottom of the widget is at the top of the field.\n return anchorBBox.top - widgetSize.height;\n } else {\n // The top of the widget is at the bottom of the field.\n return anchorBBox.bottom;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Fields can be created based on a JSON definition. This file\n * contains methods for registering those JSON definitions, and building the\n * fields based on JSON.\n *\n * @namespace Blockly.fieldRegistry\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.fieldRegistry');\n\nimport type {Field} from './field.js';\nimport type {IRegistrableField} from './interfaces/i_registrable_field.js';\nimport * as registry from './registry.js';\n\n\n/**\n * Registers a field type.\n * fieldRegistry.fromJson uses this registry to\n * find the appropriate field type.\n *\n * @param type The field type name as used in the JSON definition.\n * @param fieldClass The field class containing a fromJson function that can\n * construct an instance of the field.\n * @throws {Error} if the type name is empty, the field is already registered,\n * or the fieldClass is not an object containing a fromJson function.\n * @alias Blockly.fieldRegistry.register\n */\nexport function register(type: string, fieldClass: IRegistrableField) {\n registry.register(registry.Type.FIELD, type, fieldClass);\n}\n\n/**\n * Unregisters the field registered with the given type.\n *\n * @param type The field type name as used in the JSON definition.\n * @alias Blockly.fieldRegistry.unregister\n */\nexport function unregister(type: string) {\n registry.unregister(registry.Type.FIELD, type);\n}\n\n/**\n * Construct a Field from a JSON arg object.\n * Finds the appropriate registered field by the type name as registered using\n * fieldRegistry.register.\n *\n * @param options A JSON object with a type and options specific to the field\n * type.\n * @returns The new field instance or null if a field wasn't found with the\n * given type name\n * @alias Blockly.fieldRegistry.fromJson\n * @internal\n */\nexport function fromJson(options: AnyDuringMigration): Field|null {\n return TEST_ONLY.fromJsonInternal(options);\n}\n\n/**\n * Private version of fromJson for stubbing in tests.\n *\n * @param options\n */\nfunction fromJsonInternal(options: AnyDuringMigration): Field|null {\n const fieldObject = registry.getObject(registry.Type.FIELD, options['type']);\n if (!fieldObject) {\n console.warn(\n 'Blockly could not create a field of type ' + options['type'] +\n '. The field is probably not being registered. This could be because' +\n ' the file is not loaded, the field does not register itself (Issue' +\n ' #1584), or the registration is not being reached.');\n return null;\n } else if (typeof (fieldObject as any)['fromJson'] !== 'function') {\n throw new TypeError('returned Field was not a IRegistrableField');\n } else {\n return (fieldObject as unknown as IRegistrableField).fromJson(options);\n }\n}\n\nexport const TEST_ONLY = {\n fromJsonInternal,\n};\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * ARIA-related constants and utilities.\n * These methods are not specific to Blockly, and could be factored out into\n * a JavaScript framework such as Closure.\n *\n * @namespace Blockly.utils.aria\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.aria');\n\n\n/** ARIA states/properties prefix. */\nconst ARIA_PREFIX = 'aria-';\n\n/** ARIA role attribute. */\nconst ROLE_ATTRIBUTE = 'role';\n\n/**\n * ARIA role values.\n * Copied from Closure's goog.a11y.aria.Role\n *\n * @alias Blockly.utils.aria.Role\n */\nexport enum Role {\n // ARIA role for an interactive control of tabular data.\n GRID = 'grid',\n\n // ARIA role for a cell in a grid.\n GRIDCELL = 'gridcell',\n // ARIA role for a group of related elements like tree item siblings.\n GROUP = 'group',\n\n // ARIA role for a listbox.\n LISTBOX = 'listbox',\n\n // ARIA role for a popup menu.\n MENU = 'menu',\n\n // ARIA role for menu item elements.\n MENUITEM = 'menuitem',\n // ARIA role for a checkbox box element inside a menu.\n MENUITEMCHECKBOX = 'menuitemcheckbox',\n // ARIA role for option items that are children of combobox, listbox, menu,\n // radiogroup, or tree elements.\n OPTION = 'option',\n // ARIA role for ignorable cosmetic elements with no semantic significance.\n PRESENTATION = 'presentation',\n\n // ARIA role for a row of cells in a grid.\n ROW = 'row',\n // ARIA role for a tree.\n TREE = 'tree',\n\n // ARIA role for a tree item that sometimes may be expanded or collapsed.\n TREEITEM = 'treeitem'\n}\n\n/**\n * ARIA states and properties.\n * Copied from Closure's goog.a11y.aria.State\n *\n * @alias Blockly.utils.aria.State\n */\nexport enum State {\n // ARIA property for setting the currently active descendant of an element,\n // for example the selected item in a list box. Value: ID of an element.\n ACTIVEDESCENDANT = 'activedescendant',\n // ARIA property defines the total number of columns in a table, grid, or\n // treegrid.\n // Value: integer.\n COLCOUNT = 'colcount',\n // ARIA state for a disabled item. Value: one of {true, false}.\n DISABLED = 'disabled',\n\n // ARIA state for setting whether the element like a tree node is expanded.\n // Value: one of {true, false, undefined}.\n EXPANDED = 'expanded',\n\n // ARIA state indicating that the entered value does not conform. Value:\n // one of {false, true, 'grammar', 'spelling'}\n INVALID = 'invalid',\n\n // ARIA property that provides a label to override any other text, value, or\n // contents used to describe this element. Value: string.\n LABEL = 'label',\n // ARIA property for setting the element which labels another element.\n // Value: space-separated IDs of elements.\n LABELLEDBY = 'labelledby',\n\n // ARIA property for setting the level of an element in the hierarchy.\n // Value: integer.\n LEVEL = 'level',\n // ARIA property indicating if the element is horizontal or vertical.\n // Value: one of {'vertical', 'horizontal'}.\n ORIENTATION = 'orientation',\n\n // ARIA property that defines an element's number of position in a list.\n // Value: integer.\n POSINSET = 'posinset',\n\n // ARIA property defines the total number of rows in a table, grid, or\n // treegrid.\n // Value: integer.\n ROWCOUNT = 'rowcount',\n\n // ARIA state for setting the currently selected item in the list.\n // Value: one of {true, false, undefined}.\n SELECTED = 'selected',\n // ARIA property defining the number of items in a list. Value: integer.\n SETSIZE = 'setsize',\n\n // ARIA property for slider maximum value. Value: number.\n VALUEMAX = 'valuemax',\n\n // ARIA property for slider minimum value. Value: number.\n VALUEMIN = 'valuemin'\n}\n\n/**\n * Sets the role of an element.\n *\n * Similar to Closure's goog.a11y.aria\n *\n * @param element DOM node to set role of.\n * @param roleName Role name.\n * @alias Blockly.utils.aria.setRole\n */\nexport function setRole(element: Element, roleName: Role) {\n element.setAttribute(ROLE_ATTRIBUTE, roleName);\n}\n\n/**\n * Sets the state or property of an element.\n * Copied from Closure's goog.a11y.aria\n *\n * @param element DOM node where we set state.\n * @param stateName State attribute being set.\n * Automatically adds prefix 'aria-' to the state name if the attribute is\n * not an extra attribute.\n * @param value Value for the state attribute.\n * @alias Blockly.utils.aria.setState\n */\nexport function setState(\n element: Element, stateName: State, value: string|boolean|number|string[]) {\n if (Array.isArray(value)) {\n value = value.join(' ');\n }\n const attrStateName = ARIA_PREFIX + stateName;\n element.setAttribute(attrStateName, `${value}`);\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Dropdown input field. Used for editable titles and variables.\n * In the interests of a consistent UI, the toolbox shares some functions and\n * properties with the context menu.\n *\n * @class\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.FieldDropdown');\n\nimport type {BlockSvg} from './block_svg.js';\nimport * as dropDownDiv from './dropdowndiv.js';\nimport {FieldConfig, Field} from './field.js';\nimport * as fieldRegistry from './field_registry.js';\nimport {Menu} from './menu.js';\nimport {MenuItem} from './menuitem.js';\nimport * as aria from './utils/aria.js';\nimport {Coordinate} from './utils/coordinate.js';\nimport * as dom from './utils/dom.js';\nimport * as parsing from './utils/parsing.js';\nimport type {Sentinel} from './utils/sentinel.js';\nimport * as utilsString from './utils/string.js';\nimport {Svg} from './utils/svg.js';\nimport * as userAgent from './utils/useragent.js';\n\n\n/**\n * Class for an editable dropdown field.\n *\n * @alias Blockly.FieldDropdown\n */\nexport class FieldDropdown extends Field {\n /** Horizontal distance that a checkmark overhangs the dropdown. */\n static CHECKMARK_OVERHANG = 25;\n\n /**\n * Maximum height of the dropdown menu, as a percentage of the viewport\n * height.\n */\n static MAX_MENU_HEIGHT_VH = 0.45;\n static ARROW_CHAR: AnyDuringMigration;\n\n /** A reference to the currently selected menu item. */\n private selectedMenuItem_: MenuItem|null = null;\n\n /** The dropdown menu. */\n protected menu_: Menu|null = null;\n\n /**\n * SVG image element if currently selected option is an image, or null.\n */\n private imageElement_: SVGImageElement|null = null;\n\n /** Tspan based arrow element. */\n private arrow_: SVGTSpanElement|null = null;\n\n /** SVG based arrow element. */\n private svgArrow_: SVGElement|null = null;\n\n /**\n * Serializable fields are saved by the serializer, non-serializable fields\n * are not. Editable fields should also be serializable.\n */\n override SERIALIZABLE = true;\n\n /** Mouse cursor style when over the hotspot that initiates the editor. */\n override CURSOR = 'default';\n // TODO(b/109816955): remove '!', see go/strict-prop-init-fix.\n protected menuGenerator_!: AnyDuringMigration[][]|\n ((this: FieldDropdown) => AnyDuringMigration[][]);\n\n /** A cache of the most recently generated options. */\n // AnyDuringMigration because: Type 'null' is not assignable to type\n // 'string[][]'.\n private generatedOptions_: string[][] = null as AnyDuringMigration;\n\n /**\n * The prefix field label, of common words set after options are trimmed.\n *\n * @internal\n */\n override prefixField: string|null = null;\n\n /**\n * The suffix field label, of common words set after options are trimmed.\n *\n * @internal\n */\n override suffixField: string|null = null;\n // TODO(b/109816955): remove '!', see go/strict-prop-init-fix.\n private selectedOption_!: Array;\n override clickTarget_: AnyDuringMigration;\n\n /**\n * @param menuGenerator A non-empty array of options for a dropdown list, or a\n * function which generates these options. Also accepts Field.SKIP_SETUP\n * if you wish to skip setup (only used by subclasses that want to handle\n * configuration and setting the field value after their own constructors\n * have run).\n * @param opt_validator A function that is called to validate changes to the\n * field's value. Takes in a language-neutral dropdown option & returns a\n * validated language-neutral dropdown option, or null to abort the\n * change.\n * @param opt_config A map of options used to configure the field.\n * See the [field creation documentation]{@link\n * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/dropdown#creation}\n * for a list of properties this parameter supports.\n * @throws {TypeError} If `menuGenerator` options are incorrectly structured.\n */\n constructor(\n menuGenerator: AnyDuringMigration[][]|Function|Sentinel,\n opt_validator?: Function, opt_config?: FieldConfig) {\n super(Field.SKIP_SETUP);\n\n // If we pass SKIP_SETUP, don't do *anything* with the menu generator.\n if (menuGenerator === Field.SKIP_SETUP) {\n return;\n }\n\n if (Array.isArray(menuGenerator)) {\n validateOptions(menuGenerator);\n // Deep copy the option structure so it doesn't change.\n menuGenerator = JSON.parse(JSON.stringify(menuGenerator));\n }\n\n /**\n * An array of options for a dropdown list,\n * or a function which generates these options.\n */\n this.menuGenerator_ = menuGenerator as AnyDuringMigration[][] |\n ((this: FieldDropdown) => AnyDuringMigration[][]);\n\n this.trimOptions_();\n\n /**\n * The currently selected option. The field is initialized with the\n * first option selected.\n */\n this.selectedOption_ = this.getOptions(false)[0];\n\n if (opt_config) {\n this.configure_(opt_config);\n }\n this.setValue(this.selectedOption_[1]);\n if (opt_validator) {\n this.setValidator(opt_validator);\n }\n }\n\n /**\n * Sets the field's value based on the given XML element. Should only be\n * called by Blockly.Xml.\n *\n * @param fieldElement The element containing info about the field's state.\n * @internal\n */\n override fromXml(fieldElement: Element) {\n if (this.isOptionListDynamic()) {\n this.getOptions(false);\n }\n this.setValue(fieldElement.textContent);\n }\n\n /**\n * Sets the field's value based on the given state.\n *\n * @param state The state to apply to the dropdown field.\n * @internal\n */\n override loadState(state: AnyDuringMigration) {\n if (this.loadLegacyState(FieldDropdown, state)) {\n return;\n }\n if (this.isOptionListDynamic()) {\n this.getOptions(false);\n }\n this.setValue(state);\n }\n\n /**\n * Create the block UI for this dropdown.\n *\n * @internal\n */\n override initView() {\n if (this.shouldAddBorderRect_()) {\n this.createBorderRect_();\n } else {\n this.clickTarget_ = (this.sourceBlock_ as BlockSvg).getSvgRoot();\n }\n this.createTextElement_();\n\n this.imageElement_ = dom.createSvgElement(Svg.IMAGE, {}, this.fieldGroup_);\n\n if (this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW) {\n this.createSVGArrow_();\n } else {\n this.createTextArrow_();\n }\n\n if (this.borderRect_) {\n dom.addClass(this.borderRect_, 'blocklyDropdownRect');\n }\n }\n\n /**\n * Whether or not the dropdown should add a border rect.\n *\n * @returns True if the dropdown field should add a border rect.\n */\n protected shouldAddBorderRect_(): boolean {\n return !this.getConstants()!.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW ||\n this.getConstants()!.FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW &&\n !this.getSourceBlock().isShadow();\n }\n\n /** Create a tspan based arrow. */\n protected createTextArrow_() {\n this.arrow_ = dom.createSvgElement(Svg.TSPAN, {}, this.textElement_);\n this.arrow_!.appendChild(document.createTextNode(\n this.getSourceBlock().RTL ? FieldDropdown.ARROW_CHAR + ' ' :\n ' ' + FieldDropdown.ARROW_CHAR));\n if (this.getSourceBlock().RTL) {\n // AnyDuringMigration because: Argument of type 'SVGTSpanElement | null'\n // is not assignable to parameter of type 'Node'.\n this.getTextElement().insertBefore(\n this.arrow_ as AnyDuringMigration, this.textContent_);\n } else {\n // AnyDuringMigration because: Argument of type 'SVGTSpanElement | null'\n // is not assignable to parameter of type 'Node'.\n this.getTextElement().appendChild(this.arrow_ as AnyDuringMigration);\n }\n }\n\n /** Create an SVG based arrow. */\n protected createSVGArrow_() {\n this.svgArrow_ = dom.createSvgElement(\n Svg.IMAGE, {\n 'height': this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE + 'px',\n 'width': this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE + 'px',\n },\n this.fieldGroup_);\n this.svgArrow_!.setAttributeNS(\n dom.XLINK_NS, 'xlink:href',\n this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_DATAURI);\n }\n\n /**\n * Create a dropdown menu under the text.\n *\n * @param opt_e Optional mouse event that triggered the field to open, or\n * undefined if triggered programmatically.\n */\n protected override showEditor_(opt_e?: Event) {\n this.dropdownCreate_();\n // AnyDuringMigration because: Property 'clientX' does not exist on type\n // 'Event'.\n if (opt_e && typeof (opt_e as AnyDuringMigration).clientX === 'number') {\n // AnyDuringMigration because: Property 'clientY' does not exist on type\n // 'Event'. AnyDuringMigration because: Property 'clientX' does not exist\n // on type 'Event'.\n this.menu_!.openingCoords = new Coordinate(\n (opt_e as AnyDuringMigration).clientX,\n (opt_e as AnyDuringMigration).clientY);\n } else {\n this.menu_!.openingCoords = null;\n }\n\n // Remove any pre-existing elements in the dropdown.\n dropDownDiv.clearContent();\n // Element gets created in render.\n const menuElement = this.menu_!.render(dropDownDiv.getContentDiv());\n dom.addClass(menuElement, 'blocklyDropdownMenu');\n\n if (this.getConstants()!.FIELD_DROPDOWN_COLOURED_DIV) {\n const primaryColour = this.getSourceBlock().isShadow() ?\n this.getSourceBlock().getParent()!.getColour() :\n this.getSourceBlock().getColour();\n const borderColour = this.getSourceBlock().isShadow() ?\n (this.getSourceBlock().getParent() as BlockSvg).style.colourTertiary :\n (this.sourceBlock_ as BlockSvg).style.colourTertiary;\n if (!borderColour) {\n throw new Error(\n 'The renderer did not properly initialize the block style');\n }\n dropDownDiv.setColour(primaryColour, borderColour);\n }\n\n dropDownDiv.showPositionedByField(this, this.dropdownDispose_.bind(this));\n\n // Focusing needs to be handled after the menu is rendered and positioned.\n // Otherwise it will cause a page scroll to get the misplaced menu in\n // view. See issue #1329.\n this.menu_!.focus();\n\n if (this.selectedMenuItem_) {\n this.menu_!.setHighlighted(this.selectedMenuItem_);\n }\n\n this.applyColour();\n }\n\n /** Create the dropdown editor. */\n private dropdownCreate_() {\n const menu = new Menu();\n menu.setRole(aria.Role.LISTBOX);\n this.menu_ = menu;\n\n const options = this.getOptions(false);\n this.selectedMenuItem_ = null;\n for (let i = 0; i < options.length; i++) {\n let content = options[i][0]; // Human-readable text or image.\n const value = options[i][1]; // Language-neutral value.\n if (typeof content === 'object') {\n // An image, not text.\n const image = new Image(content['width'], content['height']);\n image.src = content['src'];\n image.alt = content['alt'] || '';\n content = image;\n }\n const menuItem = new MenuItem(content, value);\n menuItem.setRole(aria.Role.OPTION);\n menuItem.setRightToLeft(this.getSourceBlock().RTL);\n menuItem.setCheckable(true);\n menu.addChild(menuItem);\n menuItem.setChecked(value === this.value_);\n if (value === this.value_) {\n this.selectedMenuItem_ = menuItem;\n }\n menuItem.onAction(this.handleMenuActionEvent_, this);\n }\n }\n\n /**\n * Disposes of events and DOM-references belonging to the dropdown editor.\n */\n private dropdownDispose_() {\n if (this.menu_) {\n this.menu_.dispose();\n }\n this.menu_ = null;\n this.selectedMenuItem_ = null;\n this.applyColour();\n }\n\n /**\n * Handle an action in the dropdown menu.\n *\n * @param menuItem The MenuItem selected within menu.\n */\n private handleMenuActionEvent_(menuItem: MenuItem) {\n dropDownDiv.hideIfOwner(this, true);\n this.onItemSelected_(this.menu_ as Menu, menuItem);\n }\n\n /**\n * Handle the selection of an item in the dropdown menu.\n *\n * @param menu The Menu component clicked.\n * @param menuItem The MenuItem selected within menu.\n */\n protected onItemSelected_(menu: Menu, menuItem: MenuItem) {\n this.setValue(menuItem.getValue());\n }\n\n /**\n * Factor out common words in statically defined options.\n * Create prefix and/or suffix labels.\n */\n private trimOptions_() {\n const options = this.menuGenerator_;\n if (!Array.isArray(options)) {\n return;\n }\n let hasImages = false;\n\n // Localize label text and image alt text.\n for (let i = 0; i < options.length; i++) {\n const label = options[i][0];\n if (typeof label === 'string') {\n options[i][0] = parsing.replaceMessageReferences(label);\n } else {\n if (label.alt !== null) {\n options[i][0].alt = parsing.replaceMessageReferences(label.alt);\n }\n hasImages = true;\n }\n }\n if (hasImages || options.length < 2) {\n return; // Do nothing if too few items or at least one label is an image.\n }\n const strings = [];\n for (let i = 0; i < options.length; i++) {\n strings.push(options[i][0]);\n }\n const shortest = utilsString.shortestStringLength(strings);\n const prefixLength = utilsString.commonWordPrefix(strings, shortest);\n const suffixLength = utilsString.commonWordSuffix(strings, shortest);\n if (!prefixLength && !suffixLength) {\n return;\n }\n if (shortest <= prefixLength + suffixLength) {\n // One or more strings will entirely vanish if we proceed. Abort.\n return;\n }\n if (prefixLength) {\n this.prefixField = strings[0].substring(0, prefixLength - 1);\n }\n if (suffixLength) {\n this.suffixField = strings[0].substr(1 - suffixLength);\n }\n\n this.menuGenerator_ =\n FieldDropdown.applyTrim_(options, prefixLength, suffixLength);\n }\n\n /**\n * @returns True if the option list is generated by a function.\n * Otherwise false.\n */\n isOptionListDynamic(): boolean {\n return typeof this.menuGenerator_ === 'function';\n }\n\n /**\n * Return a list of the options for this dropdown.\n *\n * @param opt_useCache For dynamic options, whether or not to use the cached\n * options or to re-generate them.\n * @returns A non-empty array of option tuples:\n * (human-readable text or image, language-neutral name).\n * @throws {TypeError} If generated options are incorrectly structured.\n */\n getOptions(opt_useCache?: boolean): AnyDuringMigration[][] {\n if (this.isOptionListDynamic()) {\n if (!this.generatedOptions_ || !opt_useCache) {\n // AnyDuringMigration because: Property 'call' does not exist on type\n // 'any[][] | ((this: FieldDropdown) => any[][])'.\n this.generatedOptions_ =\n (this.menuGenerator_ as AnyDuringMigration).call(this);\n validateOptions(this.generatedOptions_);\n }\n return this.generatedOptions_;\n }\n return this.menuGenerator_ as string[][];\n }\n\n /**\n * Ensure that the input value is a valid language-neutral option.\n *\n * @param opt_newValue The input value.\n * @returns A valid language-neutral option, or null if invalid.\n */\n protected override doClassValidation_(opt_newValue?: AnyDuringMigration):\n string|null {\n let isValueValid = false;\n const options = this.getOptions(true);\n for (let i = 0, option; option = options[i]; i++) {\n // Options are tuples of human-readable text and language-neutral values.\n if (option[1] === opt_newValue) {\n isValueValid = true;\n break;\n }\n }\n if (!isValueValid) {\n if (this.sourceBlock_) {\n console.warn(\n 'Cannot set the dropdown\\'s value to an unavailable option.' +\n ' Block type: ' + this.sourceBlock_.type +\n ', Field name: ' + this.name + ', Value: ' + opt_newValue);\n }\n return null;\n }\n return opt_newValue as string;\n }\n\n /**\n * Update the value of this dropdown field.\n *\n * @param newValue The value to be saved. The default validator guarantees\n * that this is one of the valid dropdown options.\n */\n protected override doValueUpdate_(newValue: AnyDuringMigration) {\n super.doValueUpdate_(newValue);\n const options = this.getOptions(true);\n for (let i = 0, option; option = options[i]; i++) {\n if (option[1] === this.value_) {\n this.selectedOption_ = option;\n }\n }\n }\n\n /**\n * Updates the dropdown arrow to match the colour/style of the block.\n *\n * @internal\n */\n override applyColour() {\n const style = (this.sourceBlock_ as BlockSvg).style;\n if (!style.colourSecondary) {\n throw new Error(\n 'The renderer did not properly initialize the block style');\n }\n if (!style.colourTertiary) {\n throw new Error(\n 'The renderer did not properly initialize the block style');\n }\n if (this.borderRect_) {\n this.borderRect_.setAttribute('stroke', style.colourTertiary);\n if (this.menu_) {\n this.borderRect_.setAttribute('fill', style.colourTertiary);\n } else {\n this.borderRect_.setAttribute('fill', 'transparent');\n }\n }\n // Update arrow's colour.\n if (this.sourceBlock_ && this.arrow_) {\n if (this.sourceBlock_.isShadow()) {\n this.arrow_.style.fill = style.colourSecondary;\n } else {\n this.arrow_.style.fill = style.colourPrimary;\n }\n }\n }\n\n /** Draws the border with the correct width. */\n protected override render_() {\n // Hide both elements.\n this.getTextContent().nodeValue = '';\n this.imageElement_!.style.display = 'none';\n\n // Show correct element.\n const option = this.selectedOption_ && this.selectedOption_[0];\n if (option && typeof option === 'object') {\n this.renderSelectedImage_((option));\n } else {\n this.renderSelectedText_();\n }\n\n this.positionBorderRect_();\n }\n\n /**\n * Renders the selected option, which must be an image.\n *\n * @param imageJson Selected option that must be an image.\n */\n private renderSelectedImage_(imageJson: ImageProperties) {\n this.imageElement_!.style.display = '';\n this.imageElement_!.setAttributeNS(\n dom.XLINK_NS, 'xlink:href', imageJson.src);\n // AnyDuringMigration because: Argument of type 'number' is not assignable\n // to parameter of type 'string'.\n this.imageElement_!.setAttribute(\n 'height', imageJson.height as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type 'number' is not assignable\n // to parameter of type 'string'.\n this.imageElement_!.setAttribute(\n 'width', imageJson.width as AnyDuringMigration);\n\n const imageHeight = Number(imageJson.height);\n const imageWidth = Number(imageJson.width);\n\n // Height and width include the border rect.\n const hasBorder = !!this.borderRect_;\n const height = Math.max(\n hasBorder ? this.getConstants()!.FIELD_DROPDOWN_BORDER_RECT_HEIGHT : 0,\n imageHeight + IMAGE_Y_PADDING);\n const xPadding =\n hasBorder ? this.getConstants()!.FIELD_BORDER_RECT_X_PADDING : 0;\n let arrowWidth = 0;\n if (this.svgArrow_) {\n arrowWidth = this.positionSVGArrow_(\n imageWidth + xPadding,\n height / 2 - this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE / 2);\n } else {\n arrowWidth = dom.getFastTextWidth(\n this.arrow_ as SVGTSpanElement,\n this.getConstants()!.FIELD_TEXT_FONTSIZE,\n this.getConstants()!.FIELD_TEXT_FONTWEIGHT,\n this.getConstants()!.FIELD_TEXT_FONTFAMILY);\n }\n this.size_.width = imageWidth + arrowWidth + xPadding * 2;\n this.size_.height = height;\n\n let arrowX = 0;\n if (this.getSourceBlock().RTL) {\n const imageX = xPadding + arrowWidth;\n this.imageElement_!.setAttribute('x', imageX.toString());\n } else {\n arrowX = imageWidth + arrowWidth;\n this.getTextElement().setAttribute('text-anchor', 'end');\n this.imageElement_!.setAttribute('x', xPadding.toString());\n }\n this.imageElement_!.setAttribute(\n 'y', (height / 2 - imageHeight / 2).toString());\n\n this.positionTextElement_(arrowX + xPadding, imageWidth + arrowWidth);\n }\n\n /** Renders the selected option, which must be text. */\n private renderSelectedText_() {\n // Retrieves the selected option to display through getText_.\n this.getTextContent().nodeValue = this.getDisplayText_();\n const textElement = this.getTextElement();\n dom.addClass(textElement, 'blocklyDropdownText');\n textElement.setAttribute('text-anchor', 'start');\n\n // Height and width include the border rect.\n const hasBorder = !!this.borderRect_;\n const height = Math.max(\n hasBorder ? this.getConstants()!.FIELD_DROPDOWN_BORDER_RECT_HEIGHT : 0,\n this.getConstants()!.FIELD_TEXT_HEIGHT);\n const textWidth = dom.getFastTextWidth(\n this.getTextElement(), this.getConstants()!.FIELD_TEXT_FONTSIZE,\n this.getConstants()!.FIELD_TEXT_FONTWEIGHT,\n this.getConstants()!.FIELD_TEXT_FONTFAMILY);\n const xPadding =\n hasBorder ? this.getConstants()!.FIELD_BORDER_RECT_X_PADDING : 0;\n let arrowWidth = 0;\n if (this.svgArrow_) {\n arrowWidth = this.positionSVGArrow_(\n textWidth + xPadding,\n height / 2 - this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE / 2);\n }\n this.size_.width = textWidth + arrowWidth + xPadding * 2;\n this.size_.height = height;\n\n this.positionTextElement_(xPadding, textWidth);\n }\n\n /**\n * Position a drop-down arrow at the appropriate location at render-time.\n *\n * @param x X position the arrow is being rendered at, in px.\n * @param y Y position the arrow is being rendered at, in px.\n * @returns Amount of space the arrow is taking up, in px.\n */\n private positionSVGArrow_(x: number, y: number): number {\n if (!this.svgArrow_) {\n return 0;\n }\n const hasBorder = !!this.borderRect_;\n const xPadding =\n hasBorder ? this.getConstants()!.FIELD_BORDER_RECT_X_PADDING : 0;\n const textPadding = this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_PADDING;\n const svgArrowSize = this.getConstants()!.FIELD_DROPDOWN_SVG_ARROW_SIZE;\n const arrowX = this.getSourceBlock().RTL ? xPadding : x + textPadding;\n this.svgArrow_.setAttribute(\n 'transform', 'translate(' + arrowX + ',' + y + ')');\n return svgArrowSize + textPadding;\n }\n\n /**\n * Use the `getText_` developer hook to override the field's text\n * representation. Get the selected option text. If the selected option is an\n * image we return the image alt text.\n *\n * @returns Selected option text.\n */\n protected override getText_(): string|null {\n if (!this.selectedOption_) {\n return null;\n }\n const option = this.selectedOption_[0];\n if (typeof option === 'object') {\n return option['alt'];\n }\n return option;\n }\n\n /**\n * Construct a FieldDropdown from a JSON arg object.\n *\n * @param options A JSON object with options (options).\n * @returns The new field instance.\n * @nocollapse\n * @internal\n */\n static fromJson(options: FieldDropdownFromJsonConfig): FieldDropdown {\n if (!options.options) {\n throw new Error(\n 'options are required for the dropdown field. The ' +\n 'options property must be assigned an array of ' +\n '[humanReadableValue, languageNeutralValue] tuples.');\n }\n // `this` might be a subclass of FieldDropdown if that class doesn't\n // override the static fromJson method.\n return new this(options.options, undefined, options);\n }\n\n /**\n * Use the calculated prefix and suffix lengths to trim all of the options in\n * the given array.\n *\n * @param options Array of option tuples:\n * (human-readable text or image, language-neutral name).\n * @param prefixLength The length of the common prefix.\n * @param suffixLength The length of the common suffix\n * @returns A new array with all of the option text trimmed.\n */\n static applyTrim_(\n options: AnyDuringMigration[][], prefixLength: number,\n suffixLength: number): AnyDuringMigration[][] {\n const newOptions = [];\n // Remove the prefix and suffix from the options.\n for (let i = 0; i < options.length; i++) {\n let text = options[i][0];\n const value = options[i][1];\n text = text.substring(prefixLength, text.length - suffixLength);\n newOptions[i] = [text, value];\n }\n return newOptions;\n }\n}\n\n/**\n * Definition of a human-readable image dropdown option.\n */\nexport interface ImageProperties {\n src: string;\n alt: string;\n width: number;\n height: number;\n}\n\n/**\n * An individual option in the dropdown menu. The first element is the human-\n * readable value (text or image), and the second element is the language-\n * neutral value.\n */\nexport type MenuOption = [string | ImageProperties, string];\n\n/**\n * fromJson config for the dropdown field.\n */\nexport interface FieldDropdownFromJsonConfig extends FieldConfig {\n options?: MenuOption[];\n}\n\n/**\n * The y offset from the top of the field to the top of the image, if an image\n * is selected.\n */\nconst IMAGE_Y_OFFSET = 5;\n\n/** The total vertical padding above and below an image. */\nconst IMAGE_Y_PADDING: number = IMAGE_Y_OFFSET * 2;\n\n/** Android can't (in 2014) display \"▾\", so use \"▼\" instead. */\nFieldDropdown.ARROW_CHAR = userAgent.ANDROID ? '▼' : '▾';\n\n/**\n * Validates the data structure to be processed as an options list.\n *\n * @param options The proposed dropdown options.\n * @throws {TypeError} If proposed options are incorrectly structured.\n */\nfunction validateOptions(options: AnyDuringMigration) {\n if (!Array.isArray(options)) {\n throw TypeError('FieldDropdown options must be an array.');\n }\n if (!options.length) {\n throw TypeError('FieldDropdown options must not be an empty array.');\n }\n let foundError = false;\n for (let i = 0; i < options.length; i++) {\n const tuple = options[i];\n if (!Array.isArray(tuple)) {\n foundError = true;\n console.error(\n 'Invalid option[' + i + ']: Each FieldDropdown option must be an ' +\n 'array. Found: ',\n tuple);\n } else if (typeof tuple[1] !== 'string') {\n foundError = true;\n console.error(\n 'Invalid option[' + i + ']: Each FieldDropdown option id must be ' +\n 'a string. Found ' + tuple[1] + ' in: ',\n tuple);\n } else if (\n tuple[0] && typeof tuple[0] !== 'string' &&\n typeof tuple[0].src !== 'string') {\n foundError = true;\n console.error(\n 'Invalid option[' + i + ']: Each FieldDropdown option must have a ' +\n 'string label or image description. Found' + tuple[0] + ' in: ',\n tuple);\n }\n }\n if (foundError) {\n throw TypeError('Found invalid FieldDropdown options.');\n }\n}\n\nfieldRegistry.register('field_dropdown', FieldDropdown);\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods for objects.\n *\n * @namespace Blockly.utils.object\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.object');\n\nimport * as deprecation from './deprecation.js';\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * @param childCtor Child class.\n * @param parentCtor Parent class.\n * @suppress {strictMissingProperties} superClass_ is not defined on Function.\n * @deprecated No longer provided by Blockly.\n * @alias Blockly.utils.object.inherits\n */\nexport function inherits(childCtor: Function, parentCtor: Function) {\n deprecation.warn('Blockly.utils.object.inherits', 'version 9', 'version 10');\n // Set a .superClass_ property so that methods can call parent methods\n // without hard-coding the parent class name.\n // Could be replaced by ES6's super().\n // AnyDuringMigration because: Property 'superClass_' does not exist on type\n // 'Function'.\n (childCtor as AnyDuringMigration).superClass_ = parentCtor.prototype;\n\n // Link the child class to the parent class so that static methods inherit.\n Object.setPrototypeOf(childCtor, parentCtor);\n\n // Replace the child constructor's prototype object with an instance\n // of the parent class.\n childCtor.prototype = Object.create(parentCtor.prototype);\n childCtor.prototype.constructor = childCtor;\n}\n// Alternatively, one could use this instead:\n// Object.setPrototypeOf(childCtor.prototype, parentCtor.prototype);\n\n/**\n * Copies all the members of a source object to a target object.\n *\n * @param target Target.\n * @param source Source.\n * @deprecated Use the built-in **Object.assign** instead.\n * @alias Blockly.utils.object.mixin\n */\nexport function mixin(target: AnyDuringMigration, source: AnyDuringMigration) {\n deprecation.warn(\n 'Blockly.utils.object.mixin', 'May 2022', 'May 2023', 'Object.assign');\n for (const x in source) {\n target[x] = source[x];\n }\n}\n\n/**\n * Complete a deep merge of all members of a source object with a target object.\n *\n * @param target Target.\n * @param source Source.\n * @returns The resulting object.\n * @alias Blockly.utils.object.deepMerge\n */\nexport function deepMerge(\n target: AnyDuringMigration,\n source: AnyDuringMigration): AnyDuringMigration {\n for (const x in source) {\n if (source[x] !== null && typeof source[x] === 'object') {\n target[x] = deepMerge(target[x] || Object.create(null), source[x]);\n } else {\n target[x] = source[x];\n }\n }\n return target;\n}\n\n/**\n * Returns an array of a given object's own enumerable property values.\n *\n * @param obj Object containing values.\n * @returns Array of values.\n * @deprecated Use the built-in **Object.values** instead.\n * @alias Blockly.utils.object.values\n */\nexport function values(obj: AnyDuringMigration): AnyDuringMigration[] {\n deprecation.warn(\n 'Blockly.utils.object.values', 'version 9', 'version 10',\n 'Object.values');\n return Object.values(obj);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility functions for the toolbox and flyout.\n *\n * @namespace Blockly.utils.toolbox\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.toolbox');\n\nimport type {ConnectionState} from '../serialization/blocks.js';\nimport type {CssConfig as CategoryCssConfig} from '../toolbox/category.js';\nimport type {CssConfig as SeparatorCssConfig} from '../toolbox/separator.js';\nimport * as Xml from '../xml.js';\n\n\n/**\n * The information needed to create a block in the toolbox.\n * Note that disabled has a different type for backwards compatibility.\n *\n * @alias Blockly.utils.toolbox.BlockInfo\n */\nexport interface BlockInfo {\n kind: string;\n blockxml?: string|Node;\n type?: string;\n gap?: string|number;\n disabled?: string|boolean;\n enabled?: boolean;\n id?: string;\n x?: number;\n y?: number;\n collapsed?: boolean;\n inline?: boolean;\n data?: string;\n extraState?: AnyDuringMigration;\n icons?: {[key: string]: AnyDuringMigration};\n fields?: {[key: string]: AnyDuringMigration};\n inputs?: {[key: string]: ConnectionState};\n next?: ConnectionState;\n}\n\n/**\n * The information needed to create a separator in the toolbox.\n *\n * @alias Blockly.utils.toolbox.SeparatorInfo\n */\nexport interface SeparatorInfo {\n kind: string;\n id: string|undefined;\n gap: number|undefined;\n cssconfig: SeparatorCssConfig|undefined;\n}\n\n/**\n * The information needed to create a button in the toolbox.\n *\n * @alias Blockly.utils.toolbox.ButtonInfo\n */\nexport interface ButtonInfo {\n kind: string;\n text: string;\n callbackkey: string;\n}\n\n/**\n * The information needed to create a label in the toolbox.\n *\n * @alias Blockly.utils.toolbox.LabelInfo\n */\nexport interface LabelInfo {\n kind: string;\n text: string;\n id: string|undefined;\n}\n\n/**\n * The information needed to create either a button or a label in the flyout.\n *\n * @alias Blockly.utils.toolbox.ButtonOrLabelInfo\n */\nexport type ButtonOrLabelInfo = ButtonInfo|LabelInfo;\n\n/**\n * The information needed to create a category in the toolbox.\n *\n * @alias Blockly.utils.toolbox.StaticCategoryInfo\n */\nexport interface StaticCategoryInfo {\n kind: string;\n name: string;\n contents: ToolboxItemInfo[];\n id: string|undefined;\n categorystyle: string|undefined;\n colour: string|undefined;\n cssconfig: CategoryCssConfig|undefined;\n hidden: string|undefined;\n}\n\n/**\n * The information needed to create a custom category.\n *\n * @alias Blockly.utils.toolbox.DynamicCategoryInfo\n */\nexport interface DynamicCategoryInfo {\n kind: string;\n custom: string;\n id: string|undefined;\n categorystyle: string|undefined;\n colour: string|undefined;\n cssconfig: CategoryCssConfig|undefined;\n hidden: string|undefined;\n}\n\n/**\n * The information needed to create either a dynamic or static category.\n *\n * @alias Blockly.utils.toolbox.CategoryInfo\n */\nexport type CategoryInfo = StaticCategoryInfo|DynamicCategoryInfo;\n\n/**\n * Any information that can be used to create an item in the toolbox.\n *\n * @alias Blockly.utils.toolbox.ToolboxItemInfo\n */\nexport type ToolboxItemInfo = FlyoutItemInfo|StaticCategoryInfo;\n\n/**\n * All the different types that can be displayed in a flyout.\n *\n * @alias Blockly.utils.toolbox.FlyoutItemInfo\n */\nexport type FlyoutItemInfo =\n BlockInfo|SeparatorInfo|ButtonInfo|LabelInfo|DynamicCategoryInfo;\n\n/**\n * The JSON definition of a toolbox.\n *\n * @alias Blockly.utils.toolbox.ToolboxInfo\n */\nexport interface ToolboxInfo {\n kind?: string;\n contents: ToolboxItemInfo[];\n}\n\n/**\n * An array holding flyout items.\n *\n * @alias Blockly.utils.toolbox.FlyoutItemInfoArray\n */\nexport type FlyoutItemInfoArray = FlyoutItemInfo[];\n\n/**\n * All of the different types that can create a toolbox.\n *\n * @alias Blockly.utils.toolbox.ToolboxDefinition\n */\nexport type ToolboxDefinition = Node|ToolboxInfo|string;\n\n/**\n * All of the different types that can be used to show items in a flyout.\n *\n * @alias Blockly.utils.toolbox.FlyoutDefinition\n */\nexport type FlyoutDefinition = FlyoutItemInfoArray|NodeList|ToolboxInfo|Node[];\n\n/**\n * The name used to identify a toolbox that has category like items.\n * This only needs to be used if a toolbox wants to be treated like a category\n * toolbox but does not actually contain any toolbox items with the kind\n * 'category'.\n */\nconst CATEGORY_TOOLBOX_KIND = 'categoryToolbox';\n\n/**\n * The name used to identify a toolbox that has no categories and is displayed\n * as a simple flyout displaying blocks, buttons, or labels.\n */\nconst FLYOUT_TOOLBOX_KIND = 'flyoutToolbox';\n\n/**\n * Position of the toolbox and/or flyout relative to the workspace.\n *\n * @alias Blockly.utils.toolbox.Position\n */\nexport enum Position {\n TOP,\n BOTTOM,\n LEFT,\n RIGHT\n}\n\n/**\n * Converts the toolbox definition into toolbox JSON.\n *\n * @param toolboxDef The definition of the toolbox in one of its many forms.\n * @returns Object holding information for creating a toolbox.\n * @alias Blockly.utils.toolbox.convertToolboxDefToJson\n * @internal\n */\nexport function convertToolboxDefToJson(toolboxDef: ToolboxDefinition|\n null): ToolboxInfo|null {\n if (!toolboxDef) {\n return null;\n }\n\n if (toolboxDef instanceof Element || typeof toolboxDef === 'string') {\n toolboxDef = parseToolboxTree(toolboxDef);\n // AnyDuringMigration because: Argument of type 'Node | null' is not\n // assignable to parameter of type 'Node'.\n toolboxDef = convertToToolboxJson(toolboxDef as AnyDuringMigration);\n }\n\n const toolboxJson = toolboxDef as ToolboxInfo;\n validateToolbox(toolboxJson);\n return toolboxJson;\n}\n\n/**\n * Validates the toolbox JSON fields have been set correctly.\n *\n * @param toolboxJson Object holding information for creating a toolbox.\n * @throws {Error} if the toolbox is not the correct format.\n */\nfunction validateToolbox(toolboxJson: ToolboxInfo) {\n const toolboxKind = toolboxJson['kind'];\n const toolboxContents = toolboxJson['contents'];\n\n if (toolboxKind) {\n if (toolboxKind !== FLYOUT_TOOLBOX_KIND &&\n toolboxKind !== CATEGORY_TOOLBOX_KIND) {\n throw Error(\n 'Invalid toolbox kind ' + toolboxKind + '.' +\n ' Please supply either ' + FLYOUT_TOOLBOX_KIND + ' or ' +\n CATEGORY_TOOLBOX_KIND);\n }\n }\n if (!toolboxContents) {\n throw Error('Toolbox must have a contents attribute.');\n }\n}\n\n/**\n * Converts the flyout definition into a list of flyout items.\n *\n * @param flyoutDef The definition of the flyout in one of its many forms.\n * @returns A list of flyout items.\n * @alias Blockly.utils.toolbox.convertFlyoutDefToJsonArray\n * @internal\n */\nexport function convertFlyoutDefToJsonArray(flyoutDef: FlyoutDefinition|\n null): FlyoutItemInfoArray {\n if (!flyoutDef) {\n return [];\n }\n\n if ((flyoutDef as AnyDuringMigration)['contents']) {\n return (flyoutDef as AnyDuringMigration)['contents'];\n }\n // If it is already in the correct format return the flyoutDef.\n // AnyDuringMigration because: Property 'nodeType' does not exist on type\n // 'Node | FlyoutItemInfo'.\n if (Array.isArray(flyoutDef) && flyoutDef.length > 0 &&\n !((flyoutDef[0]) as AnyDuringMigration).nodeType) {\n // AnyDuringMigration because: Type 'FlyoutItemInfoArray | Node[]' is not\n // assignable to type 'FlyoutItemInfoArray'.\n return flyoutDef as AnyDuringMigration;\n }\n\n // AnyDuringMigration because: Type 'ToolboxItemInfo[] | FlyoutItemInfoArray'\n // is not assignable to type 'FlyoutItemInfoArray'.\n return xmlToJsonArray(flyoutDef as Node[] | NodeList) as AnyDuringMigration;\n}\n\n/**\n * Whether or not the toolbox definition has categories.\n *\n * @param toolboxJson Object holding information for creating a toolbox.\n * @returns True if the toolbox has categories.\n * @alias Blockly.utils.toolbox.hasCategories\n * @internal\n */\nexport function hasCategories(toolboxJson: ToolboxInfo|null): boolean {\n return TEST_ONLY.hasCategoriesInternal(toolboxJson);\n}\n\n/**\n * Private version of hasCategories for stubbing in tests.\n */\nfunction hasCategoriesInternal(toolboxJson: ToolboxInfo|null): boolean {\n if (!toolboxJson) {\n return false;\n }\n\n const toolboxKind = toolboxJson['kind'];\n if (toolboxKind) {\n return toolboxKind === CATEGORY_TOOLBOX_KIND;\n }\n\n const categories = toolboxJson['contents'].filter(function(item) {\n return item['kind'].toUpperCase() === 'CATEGORY';\n });\n return !!categories.length;\n}\n\n/**\n * Whether or not the category is collapsible.\n *\n * @param categoryInfo Object holing information for creating a category.\n * @returns True if the category has subcategories.\n * @alias Blockly.utils.toolbox.isCategoryCollapsible\n * @internal\n */\nexport function isCategoryCollapsible(categoryInfo: CategoryInfo): boolean {\n if (!categoryInfo || !(categoryInfo as AnyDuringMigration)['contents']) {\n return false;\n }\n\n const categories =\n (categoryInfo as AnyDuringMigration)['contents'].filter(function(\n item: AnyDuringMigration) {\n return item['kind'].toUpperCase() === 'CATEGORY';\n });\n return !!categories.length;\n}\n\n/**\n * Parses the provided toolbox definition into a consistent format.\n *\n * @param toolboxDef The definition of the toolbox in one of its many forms.\n * @returns Object holding information for creating a toolbox.\n */\nfunction convertToToolboxJson(toolboxDef: Node): ToolboxInfo {\n const contents = xmlToJsonArray(toolboxDef as Node | Node[]);\n const toolboxJson = {'contents': contents};\n if (toolboxDef instanceof Node) {\n addAttributes(toolboxDef, toolboxJson);\n }\n return toolboxJson;\n}\n\n/**\n * Converts the xml for a toolbox to JSON.\n *\n * @param toolboxDef The definition of the toolbox in one of its many forms.\n * @returns A list of objects in the toolbox.\n */\nfunction xmlToJsonArray(toolboxDef: Node|Node[]|NodeList): FlyoutItemInfoArray|\n ToolboxItemInfo[] {\n const arr = [];\n // If it is a node it will have children.\n // AnyDuringMigration because: Property 'childNodes' does not exist on type\n // 'Node | NodeList | Node[]'.\n let childNodes = (toolboxDef as AnyDuringMigration).childNodes;\n if (!childNodes) {\n // Otherwise the toolboxDef is an array or collection.\n childNodes = toolboxDef;\n }\n for (let i = 0, child; child = childNodes[i]; i++) {\n if (!child.tagName) {\n continue;\n }\n const obj = {};\n const tagName = child.tagName.toUpperCase();\n (obj as AnyDuringMigration)['kind'] = tagName;\n\n // Store the XML for a block.\n if (tagName === 'BLOCK') {\n (obj as AnyDuringMigration)['blockxml'] = child;\n } else if (child.childNodes && child.childNodes.length > 0) {\n // Get the contents of a category\n (obj as AnyDuringMigration)['contents'] = xmlToJsonArray(child);\n }\n\n // Add XML attributes to object\n addAttributes(child, obj);\n arr.push(obj);\n }\n // AnyDuringMigration because: Type '{}[]' is not assignable to type\n // 'ToolboxItemInfo[] | FlyoutItemInfoArray'.\n return arr as AnyDuringMigration;\n}\n\n/**\n * Adds the attributes on the node to the given object.\n *\n * @param node The node to copy the attributes from.\n * @param obj The object to copy the attributes to.\n */\nfunction addAttributes(node: Node, obj: AnyDuringMigration) {\n // AnyDuringMigration because: Property 'attributes' does not exist on type\n // 'Node'.\n for (let j = 0; j < (node as AnyDuringMigration).attributes.length; j++) {\n // AnyDuringMigration because: Property 'attributes' does not exist on type\n // 'Node'.\n const attr = (node as AnyDuringMigration).attributes[j];\n if (attr.nodeName.indexOf('css-') > -1) {\n obj['cssconfig'] = obj['cssconfig'] || {};\n obj['cssconfig'][attr.nodeName.replace('css-', '')] = attr.value;\n } else {\n obj[attr.nodeName] = attr.value;\n }\n }\n}\n\n/**\n * Parse the provided toolbox tree into a consistent DOM format.\n *\n * @param toolboxDef DOM tree of blocks, or text representation of same.\n * @returns DOM tree of blocks, or null.\n * @alias Blockly.utils.toolbox.parseToolboxTree\n */\nexport function parseToolboxTree(toolboxDef: Element|null|string): Element|\n null {\n let parsedToolboxDef: Element|null = null;\n if (toolboxDef) {\n if (typeof toolboxDef === 'string') {\n parsedToolboxDef = Xml.textToDom(toolboxDef);\n if (parsedToolboxDef.nodeName.toLowerCase() !== 'xml') {\n throw TypeError('Toolbox should be an document.');\n }\n } else if (toolboxDef instanceof Element) {\n parsedToolboxDef = toolboxDef;\n }\n }\n return parsedToolboxDef;\n}\n\nexport const TEST_ONLY = {\n hasCategoriesInternal,\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Extensions are functions that help initialize blocks, usually\n * adding dynamic behavior such as onchange handlers and mutators. These\n * are applied using Block.applyExtension(), or the JSON \"extensions\"\n * array attribute.\n *\n * @namespace Blockly.Extensions\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Extensions');\n\nimport type {Block} from './block.js';\nimport type {BlockSvg} from './block_svg.js';\nimport {FieldDropdown} from './field_dropdown.js';\nimport {Mutator} from './mutator.js';\nimport * as parsing from './utils/parsing.js';\n\n\n/** The set of all registered extensions, keyed by extension name/id. */\nconst allExtensions = Object.create(null);\nexport const TEST_ONLY = {allExtensions};\n\n/**\n * Registers a new extension function. Extensions are functions that help\n * initialize blocks, usually adding dynamic behavior such as onchange\n * handlers and mutators. These are applied using Block.applyExtension(), or\n * the JSON \"extensions\" array attribute.\n *\n * @param name The name of this extension.\n * @param initFn The function to initialize an extended block.\n * @throws {Error} if the extension name is empty, the extension is already\n * registered, or extensionFn is not a function.\n * @alias Blockly.Extensions.register\n */\nexport function register(name: string, initFn: Function) {\n if (typeof name !== 'string' || name.trim() === '') {\n throw Error('Error: Invalid extension name \"' + name + '\"');\n }\n if (allExtensions[name]) {\n throw Error('Error: Extension \"' + name + '\" is already registered.');\n }\n if (typeof initFn !== 'function') {\n throw Error('Error: Extension \"' + name + '\" must be a function');\n }\n allExtensions[name] = initFn;\n}\n\n/**\n * Registers a new extension function that adds all key/value of mixinObj.\n *\n * @param name The name of this extension.\n * @param mixinObj The values to mix in.\n * @throws {Error} if the extension name is empty or the extension is already\n * registered.\n * @alias Blockly.Extensions.registerMixin\n */\nexport function registerMixin(name: string, mixinObj: AnyDuringMigration) {\n if (!mixinObj || typeof mixinObj !== 'object') {\n throw Error('Error: Mixin \"' + name + '\" must be a object');\n }\n register(name, function(this: Block) {\n this.mixin(mixinObj);\n });\n}\n\n/**\n * Registers a new extension function that adds a mutator to the block.\n * At register time this performs some basic sanity checks on the mutator.\n * The wrapper may also add a mutator dialog to the block, if both compose and\n * decompose are defined on the mixin.\n *\n * @param name The name of this mutator extension.\n * @param mixinObj The values to mix in.\n * @param opt_helperFn An optional function to apply after mixing in the object.\n * @param opt_blockList A list of blocks to appear in the flyout of the mutator\n * dialog.\n * @throws {Error} if the mutation is invalid or can't be applied to the block.\n * @alias Blockly.Extensions.registerMutator\n */\nexport function registerMutator(\n name: string, mixinObj: AnyDuringMigration,\n opt_helperFn?: () => AnyDuringMigration, opt_blockList?: string[]) {\n const errorPrefix = 'Error when registering mutator \"' + name + '\": ';\n\n checkHasMutatorProperties(errorPrefix, mixinObj);\n const hasMutatorDialog = checkMutatorDialog(mixinObj, errorPrefix);\n\n if (opt_helperFn && typeof opt_helperFn !== 'function') {\n throw Error(errorPrefix + 'Extension \"' + name + '\" is not a function');\n }\n\n // Sanity checks passed.\n register(name, function(this: Block) {\n if (hasMutatorDialog) {\n this.setMutator(new Mutator(opt_blockList || [], this as BlockSvg));\n }\n // Mixin the object.\n this.mixin(mixinObj);\n\n if (opt_helperFn) {\n opt_helperFn.apply(this);\n }\n });\n}\n\n/**\n * Unregisters the extension registered with the given name.\n *\n * @param name The name of the extension to unregister.\n * @alias Blockly.Extensions.unregister\n */\nexport function unregister(name: string) {\n if (isRegistered(name)) {\n delete allExtensions[name];\n } else {\n console.warn(\n 'No extension mapping for name \"' + name + '\" found to unregister');\n }\n}\n\n/**\n * Returns whether an extension is registered with the given name.\n *\n * @param name The name of the extension to check for.\n * @returns True if the extension is registered. False if it is not registered.\n * @alias Blockly.Extensions.isRegistered\n */\nexport function isRegistered(name: string): boolean {\n return !!allExtensions[name];\n}\n\n/**\n * Applies an extension method to a block. This should only be called during\n * block construction.\n *\n * @param name The name of the extension.\n * @param block The block to apply the named extension to.\n * @param isMutator True if this extension defines a mutator.\n * @throws {Error} if the extension is not found.\n * @alias Blockly.Extensions.apply\n */\nexport function apply(name: string, block: Block, isMutator: boolean) {\n const extensionFn = allExtensions[name];\n if (typeof extensionFn !== 'function') {\n throw Error('Error: Extension \"' + name + '\" not found.');\n }\n let mutatorProperties;\n if (isMutator) {\n // Fail early if the block already has mutation properties.\n checkNoMutatorProperties(name, block);\n } else {\n // Record the old properties so we can make sure they don't change after\n // applying the extension.\n mutatorProperties = getMutatorProperties(block);\n }\n extensionFn.apply(block);\n\n if (isMutator) {\n const errorPrefix = 'Error after applying mutator \"' + name + '\": ';\n checkHasMutatorProperties(errorPrefix, block);\n } else {\n if (!mutatorPropertiesMatch(\n mutatorProperties as AnyDuringMigration[], block)) {\n throw Error(\n 'Error when applying extension \"' + name + '\": ' +\n 'mutation properties changed when applying a non-mutator extension.');\n }\n }\n}\n\n/**\n * Check that the given block does not have any of the four mutator properties\n * defined on it. This function should be called before applying a mutator\n * extension to a block, to make sure we are not overwriting properties.\n *\n * @param mutationName The name of the mutation to reference in error messages.\n * @param block The block to check.\n * @throws {Error} if any of the properties already exist on the block.\n */\nfunction checkNoMutatorProperties(mutationName: string, block: Block) {\n const properties = getMutatorProperties(block);\n if (properties.length) {\n throw Error(\n 'Error: tried to apply mutation \"' + mutationName +\n '\" to a block that already has mutator functions.' +\n ' Block id: ' + block.id);\n }\n}\n\n/**\n * Checks if the given object has both the 'mutationToDom' and 'domToMutation'\n * functions.\n *\n * @param object The object to check.\n * @param errorPrefix The string to prepend to any error message.\n * @returns True if the object has both functions. False if it has neither\n * function.\n * @throws {Error} if the object has only one of the functions, or either is not\n * actually a function.\n */\nfunction checkXmlHooks(\n object: AnyDuringMigration, errorPrefix: string): boolean {\n return checkHasFunctionPair(\n object.mutationToDom, object.domToMutation,\n errorPrefix + ' mutationToDom/domToMutation');\n}\n/**\n * Checks if the given object has both the 'saveExtraState' and 'loadExtraState'\n * functions.\n *\n * @param object The object to check.\n * @param errorPrefix The string to prepend to any error message.\n * @returns True if the object has both functions. False if it has neither\n * function.\n * @throws {Error} if the object has only one of the functions, or either is not\n * actually a function.\n */\nfunction checkJsonHooks(\n object: AnyDuringMigration, errorPrefix: string): boolean {\n return checkHasFunctionPair(\n object.saveExtraState, object.loadExtraState,\n errorPrefix + ' saveExtraState/loadExtraState');\n}\n\n/**\n * Checks if the given object has both the 'compose' and 'decompose' functions.\n *\n * @param object The object to check.\n * @param errorPrefix The string to prepend to any error message.\n * @returns True if the object has both functions. False if it has neither\n * function.\n * @throws {Error} if the object has only one of the functions, or either is not\n * actually a function.\n */\nfunction checkMutatorDialog(\n object: AnyDuringMigration, errorPrefix: string): boolean {\n return checkHasFunctionPair(\n object.compose, object.decompose, errorPrefix + ' compose/decompose');\n}\n\n/**\n * Checks that both or neither of the given functions exist and that they are\n * indeed functions.\n *\n * @param func1 The first function in the pair.\n * @param func2 The second function in the pair.\n * @param errorPrefix The string to prepend to any error message.\n * @returns True if the object has both functions. False if it has neither\n * function.\n * @throws {Error} If the object has only one of the functions, or either is not\n * actually a function.\n */\nfunction checkHasFunctionPair(\n func1: AnyDuringMigration, func2: AnyDuringMigration,\n errorPrefix: string): boolean {\n if (func1 && func2) {\n if (typeof func1 !== 'function' || typeof func2 !== 'function') {\n throw Error(errorPrefix + ' must be a function');\n }\n return true;\n } else if (!func1 && !func2) {\n return false;\n }\n throw Error(errorPrefix + 'Must have both or neither functions');\n}\n\n/**\n * Checks that the given object required mutator properties.\n *\n * @param errorPrefix The string to prepend to any error message.\n * @param object The object to inspect.\n */\nfunction checkHasMutatorProperties(\n errorPrefix: string, object: AnyDuringMigration) {\n const hasXmlHooks = checkXmlHooks(object, errorPrefix);\n const hasJsonHooks = checkJsonHooks(object, errorPrefix);\n if (!hasXmlHooks && !hasJsonHooks) {\n throw Error(\n errorPrefix +\n 'Mutations must contain either XML hooks, or JSON hooks, or both');\n }\n // A block with a mutator isn't required to have a mutation dialog, but\n // it should still have both or neither of compose and decompose.\n checkMutatorDialog(object, errorPrefix);\n}\n\n/**\n * Get a list of values of mutator properties on the given block.\n *\n * @param block The block to inspect.\n * @returns A list with all of the defined properties, which should be\n * functions, but may be anything other than undefined.\n */\nfunction getMutatorProperties(block: Block): AnyDuringMigration[] {\n const result = [];\n // List each function explicitly by reference to allow for renaming\n // during compilation.\n if (block.domToMutation !== undefined) {\n result.push(block.domToMutation);\n }\n if (block.mutationToDom !== undefined) {\n result.push(block.mutationToDom);\n }\n if (block.saveExtraState !== undefined) {\n result.push(block.saveExtraState);\n }\n if (block.loadExtraState !== undefined) {\n result.push(block.loadExtraState);\n }\n if (block.compose !== undefined) {\n result.push(block.compose);\n }\n if (block.decompose !== undefined) {\n result.push(block.decompose);\n }\n return result;\n}\n\n/**\n * Check that the current mutator properties match a list of old mutator\n * properties. This should be called after applying a non-mutator extension,\n * to verify that the extension didn't change properties it shouldn't.\n *\n * @param oldProperties The old values to compare to.\n * @param block The block to inspect for new values.\n * @returns True if the property lists match.\n */\nfunction mutatorPropertiesMatch(\n oldProperties: AnyDuringMigration[], block: Block): boolean {\n const newProperties = getMutatorProperties(block);\n if (newProperties.length !== oldProperties.length) {\n return false;\n }\n for (let i = 0; i < newProperties.length; i++) {\n if (oldProperties[i] !== newProperties[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Calls a function after the page has loaded, possibly immediately.\n *\n * @param fn Function to run.\n * @throws Error Will throw if no global document can be found (e.g., Node.js).\n * @internal\n */\nexport function runAfterPageLoad(fn: () => void) {\n if (typeof document !== 'object') {\n throw Error('runAfterPageLoad() requires browser document.');\n }\n if (document.readyState === 'complete') {\n fn(); // Page has already loaded. Call immediately.\n } else {\n // Poll readyState.\n const readyStateCheckInterval = setInterval(function() {\n if (document.readyState === 'complete') {\n clearInterval(readyStateCheckInterval);\n fn();\n }\n }, 10);\n }\n}\n\n/**\n * Builds an extension function that will map a dropdown value to a tooltip\n * string.\n *\n * This method includes multiple checks to ensure tooltips, dropdown options,\n * and message references are aligned. This aims to catch errors as early as\n * possible, without requiring developers to manually test tooltips under each\n * option. After the page is loaded, each tooltip text string will be checked\n * for matching message keys in the internationalized string table. Deferring\n * this until the page is loaded decouples loading dependencies. Later, upon\n * loading the first block of any given type, the extension will validate every\n * dropdown option has a matching tooltip in the lookupTable. Errors are\n * reported as warnings in the console, and are never fatal.\n *\n * @param dropdownName The name of the field whose value is the key to the\n * lookup table.\n * @param lookupTable The table of field values to tooltip text.\n * @returns The extension function.\n * @alias Blockly.Extensions.buildTooltipForDropdown\n */\nexport function buildTooltipForDropdown(\n dropdownName: string, lookupTable: {[key: string]: string}): Function {\n // List of block types already validated, to minimize duplicate warnings.\n const blockTypesChecked: AnyDuringMigration[] = [];\n\n // Check the tooltip string messages for invalid references.\n // Wait for load, in case Blockly.Msg is not yet populated.\n // runAfterPageLoad() does not run in a Node.js environment due to lack\n // of document object, in which case skip the validation.\n if (typeof document === 'object') { // Relies on document.readyState\n runAfterPageLoad(function() {\n for (const key in lookupTable) {\n // Will print warnings if reference is missing.\n parsing.checkMessageReferences(lookupTable[key]);\n }\n });\n }\n\n /** The actual extension. */\n function extensionFn(this: Block) {\n if (this.type && blockTypesChecked.indexOf(this.type) === -1) {\n checkDropdownOptionsInTable(this, dropdownName, lookupTable);\n blockTypesChecked.push(this.type);\n }\n\n this.setTooltip(function(this: Block) {\n const value = String(this.getFieldValue(dropdownName));\n let tooltip = lookupTable[value];\n if (tooltip === null) {\n if (blockTypesChecked.indexOf(this.type) === -1) {\n // Warn for missing values on generated tooltips.\n let warning = 'No tooltip mapping for value ' + value + ' of field ' +\n dropdownName;\n if (this.type !== null) {\n warning += ' of block type ' + this.type;\n }\n console.warn(warning + '.');\n }\n } else {\n tooltip = parsing.replaceMessageReferences(tooltip);\n }\n return tooltip;\n }.bind(this));\n }\n return extensionFn;\n}\n\n/**\n * Checks all options keys are present in the provided string lookup table.\n * Emits console warnings when they are not.\n *\n * @param block The block containing the dropdown\n * @param dropdownName The name of the dropdown\n * @param lookupTable The string lookup table\n */\nfunction checkDropdownOptionsInTable(\n block: Block, dropdownName: string, lookupTable: {[key: string]: string}) {\n // Validate all dropdown options have values.\n const dropdown = block.getField(dropdownName);\n if (dropdown instanceof FieldDropdown && !dropdown.isOptionListDynamic()) {\n const options = dropdown.getOptions();\n for (let i = 0; i < options.length; i++) {\n const optionKey = options[i][1]; // label, then value\n if (lookupTable[optionKey] === null) {\n console.warn(\n 'No tooltip mapping for value ' + optionKey + ' of field ' +\n dropdownName + ' of block type ' + block.type);\n }\n }\n }\n}\n\n/**\n * Builds an extension function that will install a dynamic tooltip. The\n * tooltip message should include the string '%1' and that string will be\n * replaced with the text of the named field.\n *\n * @param msgTemplate The template form to of the message text, with %1\n * placeholder.\n * @param fieldName The field with the replacement text.\n * @returns The extension function.\n * @alias Blockly.Extensions.buildTooltipWithFieldText\n */\nexport function buildTooltipWithFieldText(\n msgTemplate: string, fieldName: string): Function {\n // Check the tooltip string messages for invalid references.\n // Wait for load, in case Blockly.Msg is not yet populated.\n // runAfterPageLoad() does not run in a Node.js environment due to lack\n // of document object, in which case skip the validation.\n if (typeof document === 'object') { // Relies on document.readyState\n runAfterPageLoad(function() {\n // Will print warnings if reference is missing.\n parsing.checkMessageReferences(msgTemplate);\n });\n }\n\n /** The actual extension. */\n function extensionFn(this: Block) {\n this.setTooltip(function(this: Block) {\n const field = this.getField(fieldName);\n return parsing.replaceMessageReferences(msgTemplate)\n .replace('%1', field ? field.getText() : '');\n }.bind(this));\n }\n return extensionFn;\n}\n\n/**\n * Configures the tooltip to mimic the parent block when connected. Otherwise,\n * uses the tooltip text at the time this extension is initialized. This takes\n * advantage of the fact that all other values from JSON are initialized before\n * extensions.\n */\nfunction extensionParentTooltip(this: Block) {\n const tooltipWhenNotConnected = this.tooltip;\n this.setTooltip(function(this: Block) {\n const parent = this.getParent();\n return parent && parent.getInputsInline() && parent.tooltip ||\n tooltipWhenNotConnected;\n }.bind(this));\n}\nregister('parent_tooltip_when_inline', extensionParentTooltip);\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/** @namespace Blockly.utils.array */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.array');\n\n\n/**\n * Removes the first occurrence of a particular value from an array.\n *\n * @param arr Array from which to remove value.\n * @param value Value to remove.\n * @returns True if an element was removed.\n * @alias Blockly.array.removeElem\n * @internal\n */\nexport function removeElem(arr: Array, value: T): boolean {\n const i = arr.indexOf(value);\n if (i === -1) {\n return false;\n }\n arr.splice(i, 1);\n return true;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Methods for creating parts of SVG path strings. See\n *\n * @namespace Blockly.utils.svgPaths\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils.svgPaths');\n\n\n/**\n * Create a string representing the given x, y pair. It does not matter whether\n * the coordinate is relative or absolute. The result has leading\n * and trailing spaces, and separates the x and y coordinates with a comma but\n * no space.\n *\n * @param x The x coordinate.\n * @param y The y coordinate.\n * @returns A string of the format ' x,y '\n * @alias Blockly.utils.svgPaths.point\n */\nexport function point(x: number, y: number): string {\n return ' ' + x + ',' + y + ' ';\n}\n\n/**\n * Draw a cubic or quadratic curve. See\n * developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Cubic_B%C3%A9zier_Curve\n * These coordinates are unitless and hence in the user coordinate system.\n *\n * @param command The command to use.\n * Should be one of: c, C, s, S, q, Q.\n * @param points An array containing all of the points to pass to the curve\n * command, in order. The points are represented as strings of the format '\n * x, y '.\n * @returns A string defining one or more Bezier curves. See the MDN\n * documentation for exact format.\n * @alias Blockly.utils.svgPaths.curve\n */\nexport function curve(command: string, points: string[]): string {\n return ' ' + command + points.join('');\n}\n\n/**\n * Move the cursor to the given position without drawing a line.\n * The coordinates are absolute.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands\n *\n * @param x The absolute x coordinate.\n * @param y The absolute y coordinate.\n * @returns A string of the format ' M x,y '\n * @alias Blockly.utils.svgPaths.moveTo\n */\nexport function moveTo(x: number, y: number): string {\n return ' M ' + x + ',' + y + ' ';\n}\n\n/**\n * Move the cursor to the given position without drawing a line.\n * Coordinates are relative.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands\n *\n * @param dx The relative x coordinate.\n * @param dy The relative y coordinate.\n * @returns A string of the format ' m dx,dy '\n * @alias Blockly.utils.svgPaths.moveBy\n */\nexport function moveBy(dx: number, dy: number): string {\n return ' m ' + dx + ',' + dy + ' ';\n}\n\n/**\n * Draw a line from the current point to the end point, which is the current\n * point shifted by dx along the x-axis and dy along the y-axis.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands\n *\n * @param dx The relative x coordinate.\n * @param dy The relative y coordinate.\n * @returns A string of the format ' l dx,dy '\n * @alias Blockly.utils.svgPaths.lineTo\n */\nexport function lineTo(dx: number, dy: number): string {\n return ' l ' + dx + ',' + dy + ' ';\n}\n\n/**\n * Draw multiple lines connecting all of the given points in order. This is\n * equivalent to a series of 'l' commands.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands\n *\n * @param points An array containing all of the points to draw lines to, in\n * order. The points are represented as strings of the format ' dx,dy '.\n * @returns A string of the format ' l (dx,dy)+ '\n * @alias Blockly.utils.svgPaths.line\n */\nexport function line(points: string[]): string {\n return ' l' + points.join('');\n}\n\n/**\n * Draw a horizontal or vertical line.\n * The first argument specifies the direction and whether the given position is\n * relative or absolute.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#LineTo_path_commands\n *\n * @param command The command to prepend to the coordinate. This should be one\n * of: V, v, H, h.\n * @param val The coordinate to pass to the command. It may be absolute or\n * relative.\n * @returns A string of the format ' command val '\n * @alias Blockly.utils.svgPaths.lineOnAxis\n */\nexport function lineOnAxis(command: string, val: number): string {\n return ' ' + command + ' ' + val + ' ';\n}\n\n/**\n * Draw an elliptical arc curve.\n * These coordinates are unitless and hence in the user coordinate system.\n * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Elliptical_Arc_Curve\n *\n * @param command The command string. Either 'a' or 'A'.\n * @param flags The flag string. See the MDN documentation for a description\n * and examples.\n * @param radius The radius of the arc to draw.\n * @param point The point to move the cursor to after drawing the arc, specified\n * either in absolute or relative coordinates depending on the command.\n * @returns A string of the format 'command radius radius flags point'\n * @alias Blockly.utils.svgPaths.arc\n */\nexport function arc(\n command: string, flags: string, radius: number, point: string): string {\n return command + ' ' + radius + ' ' + radius + ' ' + flags + point;\n}\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility methods.\n *\n * @namespace Blockly.utils\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.utils');\n\nimport type {Block} from './block.js';\nimport * as browserEvents from './browser_events.js';\nimport * as common from './common.js';\nimport * as extensions from './extensions.js';\nimport * as aria from './utils/aria.js';\nimport * as arrayUtils from './utils/array.js';\nimport * as colour from './utils/colour.js';\nimport {Coordinate} from './utils/coordinate.js';\nimport * as deprecation from './utils/deprecation.js';\nimport * as dom from './utils/dom.js';\nimport * as idGenerator from './utils/idgenerator.js';\nimport {KeyCodes} from './utils/keycodes.js';\nimport * as math from './utils/math.js';\nimport type {Metrics} from './utils/metrics.js';\nimport * as object from './utils/object.js';\nimport * as parsing from './utils/parsing.js';\nimport {Rect} from './utils/rect.js';\nimport {Size} from './utils/size.js';\nimport * as stringUtils from './utils/string.js';\nimport * as style from './utils/style.js';\nimport {Svg} from './utils/svg.js';\nimport * as svgMath from './utils/svg_math.js';\nimport * as svgPaths from './utils/svg_paths.js';\nimport * as toolbox from './utils/toolbox.js';\nimport * as userAgent from './utils/useragent.js';\nimport * as xml from './utils/xml.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\nexport {\n aria,\n arrayUtils as array,\n browserEvents,\n colour,\n Coordinate,\n deprecation,\n dom,\n extensions,\n idGenerator,\n KeyCodes,\n math,\n Metrics,\n object,\n parsing,\n Rect,\n Size,\n stringUtils as string,\n style,\n Svg,\n svgMath,\n svgPaths,\n toolbox,\n userAgent,\n xml,\n};\n\n/**\n * Return the coordinates of the top-left corner of this element relative to\n * its parent. Only for SVG elements and children (e.g. rect, g, path).\n *\n * @param element SVG element to find the coordinates of.\n * @returns Object with .x and .y properties.\n * @deprecated Use **Blockly.utils.svgMath.getRelativeXY** instead.\n * @alias Blockly.utils.getRelativeXY\n */\nexport function getRelativeXY(element: Element): Coordinate {\n deprecation.warn(\n 'Blockly.utils.getRelativeXY', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.getRelativeXY');\n return svgMath.getRelativeXY(element);\n}\n\n/**\n * Return the coordinates of the top-left corner of this element relative to\n * the div Blockly was injected into.\n *\n * @param element SVG element to find the coordinates of. If this is not a child\n * of the div Blockly was injected into, the behaviour is undefined.\n * @returns Object with .x and .y properties.\n * @deprecated Use **Blockly.utils.svgMath.getInjectionDivXY** instead.\n * @alias Blockly.utils.getInjectionDivXY_\n */\nfunction getInjectionDivXY(element: Element): Coordinate {\n deprecation.warn(\n 'Blockly.utils.getInjectionDivXY_', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.getInjectionDivXY');\n return svgMath.getInjectionDivXY(element);\n}\nexport const getInjectionDivXY_ = getInjectionDivXY;\n\n/**\n * Parse a string with any number of interpolation tokens (%1, %2, ...).\n * It will also replace string table references (e.g., %{bky_my_msg} and\n * %{BKY_MY_MSG} will both be replaced with the value in\n * Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped\n * (e.g., '%%').\n *\n * @param message Text which might contain string table references and\n * interpolation tokens.\n * @returns Array of strings and numbers.\n * @deprecated Use **Blockly.utils.parsing.tokenizeInterpolation** instead.\n * @alias Blockly.utils.tokenizeInterpolation\n */\nexport function tokenizeInterpolation(message: string): Array {\n deprecation.warn(\n 'Blockly.utils.tokenizeInterpolation', 'December 2021', 'December 2022',\n 'Blockly.utils.parsing.tokenizeInterpolation');\n return parsing.tokenizeInterpolation(message);\n}\n\n/**\n * Replaces string table references in a message, if the message is a string.\n * For example, \"%{bky_my_msg}\" and \"%{BKY_MY_MSG}\" will both be replaced with\n * the value in Msg['MY_MSG'].\n *\n * @param message Message, which may be a string that contains string table\n * references.\n * @returns String with message references replaced.\n * @deprecated Use **Blockly.utils.parsing.replaceMessageReferences** instead.\n * @alias Blockly.utils.replaceMessageReferences\n */\nexport function replaceMessageReferences(message: string|any): string {\n deprecation.warn(\n 'Blockly.utils.replaceMessageReferences', 'December 2021',\n 'December 2022', 'Blockly.utils.parsing.replaceMessageReferences');\n return parsing.replaceMessageReferences(message);\n}\n\n/**\n * Validates that any %{MSG_KEY} references in the message refer to keys of\n * the Msg string table.\n *\n * @param message Text which might contain string table references.\n * @returns True if all message references have matching values.\n * Otherwise, false.\n * @deprecated Use **Blockly.utils.parsing.checkMessageReferences** instead.\n * @alias Blockly.utils.checkMessageReferences\n */\nexport function checkMessageReferences(message: string): boolean {\n deprecation.warn(\n 'Blockly.utils.checkMessageReferences', 'December 2021', 'December 2022',\n 'Blockly.utils.parsing.checkMessageReferences');\n return parsing.checkMessageReferences(message);\n}\n\n/**\n * Check if 3D transforms are supported by adding an element\n * and attempting to set the property.\n *\n * @returns True if 3D transforms are supported.\n * @deprecated Use **Blockly.utils.svgMath.is3dSupported** instead.\n * @alias Blockly.utils.is3dSupported\n */\nexport function is3dSupported(): boolean {\n deprecation.warn(\n 'Blockly.utils.is3dSupported', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.is3dSupported');\n return svgMath.is3dSupported();\n}\n\n/**\n * Get the position of the current viewport in window coordinates. This takes\n * scroll into account.\n *\n * @returns An object containing window width, height, and scroll position in\n * window coordinates.\n * @alias Blockly.utils.getViewportBBox\n * @deprecated Use **Blockly.utils.svgMath.getViewportBBox** instead.\n * @internal\n */\nexport function getViewportBBox(): Rect {\n deprecation.warn(\n 'Blockly.utils.getViewportBBox', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.getViewportBBox');\n return svgMath.getViewportBBox();\n}\n\n/**\n * Removes the first occurrence of a particular value from an array.\n *\n * @param arr Array from which to remove value.\n * @param value Value to remove.\n * @returns True if an element was removed.\n * @alias Blockly.utils.arrayRemove\n * @deprecated Use **Blockly.array.removeElem** instead.\n * @internal\n */\nexport function arrayRemove(arr: Array, value: T): boolean {\n deprecation.warn(\n 'Blockly.utils.arrayRemove', 'December 2021', 'December 2022',\n 'Blockly.array.removeElem');\n return arrayUtils.removeElem(arr, value);\n}\n\n/**\n * Gets the document scroll distance as a coordinate object.\n * Copied from Closure's goog.dom.getDocumentScroll.\n *\n * @returns Object with values 'x' and 'y'.\n * @deprecated Use **Blockly.utils.svgMath.getDocumentScroll** instead.\n * @alias Blockly.utils.getDocumentScroll\n */\nexport function getDocumentScroll(): Coordinate {\n deprecation.warn(\n 'Blockly.utils.getDocumentScroll', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.getDocumentScroll');\n return svgMath.getDocumentScroll();\n}\n\n/**\n * Get a map of all the block's descendants mapping their type to the number of\n * children with that type.\n *\n * @param block The block to map.\n * @param opt_stripFollowing Optionally ignore all following statements (blocks\n * that are not inside a value or statement input of the block).\n * @returns Map of types to type counts for descendants of the bock.\n * @deprecated Use **Blockly.common.getBlockTypeCounts** instead.\n * @alias Blockly.utils.getBlockTypeCounts\n */\nexport function getBlockTypeCounts(\n block: Block, opt_stripFollowing?: boolean): {[key: string]: number} {\n deprecation.warn(\n 'Blockly.utils.getBlockTypeCounts', 'December 2021', 'December 2022',\n 'Blockly.common.getBlockTypeCounts');\n return common.getBlockTypeCounts(block, opt_stripFollowing);\n}\n\n/**\n * Converts screen coordinates to workspace coordinates.\n *\n * @param ws The workspace to find the coordinates on.\n * @param screenCoordinates The screen coordinates to be converted to workspace\n * coordinates\n * @deprecated Use **Blockly.utils.svgMath.screenToWsCoordinates** instead.\n * @returns The workspace coordinates.\n */\nexport function screenToWsCoordinates(\n ws: WorkspaceSvg, screenCoordinates: Coordinate): Coordinate {\n deprecation.warn(\n 'Blockly.utils.screenToWsCoordinates', 'December 2021', 'December 2022',\n 'Blockly.utils.svgMath.screenToWsCoordinates');\n return svgMath.screenToWsCoordinates(ws, screenCoordinates);\n}\n\n/**\n * Parse a block colour from a number or string, as provided in a block\n * definition.\n *\n * @param colour HSV hue value (0 to 360), #RRGGBB string, or a message\n * reference string pointing to one of those two values.\n * @returns An object containing the colour as a #RRGGBB string, and the hue if\n * the input was an HSV hue value.\n * @throws {Error} If the colour cannot be parsed.\n * @deprecated Use **Blockly.utils.parsing.parseBlockColour** instead.\n * @alias Blockly.utils.parseBlockColour\n */\nexport function parseBlockColour(colour: number|\n string): {hue: number|null, hex: string} {\n deprecation.warn(\n 'Blockly.utils.parseBlockColour', 'December 2021', 'December 2022',\n 'Blockly.utils.parsing.parseBlockColour');\n return parsing.parseBlockColour(colour);\n}\n\n/**\n * Calls a function after the page has loaded, possibly immediately.\n *\n * @param fn Function to run.\n * @throws Error Will throw if no global document can be found (e.g., Node.js).\n * @deprecated No longer provided by Blockly.\n * @alias Blockly.utils.runAfterPageLoad\n */\nexport function runAfterPageLoad(fn: () => void) {\n deprecation.warn(\n 'Blockly.utils.runAfterPageLoad', 'December 2021', 'December 2022');\n extensions.runAfterPageLoad(fn);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Contains functions registering serializers (eg blocks, variables, plugins,\n * etc).\n *\n * @namespace Blockly.serialization.registry\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.serialization.registry');\n\n// eslint-disable-next-line no-unused-vars\nimport type {ISerializer} from '../interfaces/i_serializer.js';\nimport * as registry from '../registry.js';\n\n\n/**\n * Registers the given serializer so that it can be used for serialization and\n * deserialization.\n *\n * @param name The name of the serializer to register.\n * @param serializer The serializer to register.\n * @alias Blockly.serialization.registry.register\n */\nexport function register(name: string, serializer: ISerializer) {\n registry.register(registry.Type.SERIALIZER, name, serializer);\n}\n\n/**\n * Unregisters the serializer associated with the given name.\n *\n * @param name The name of the serializer to unregister.\n * @alias Blockly.serialization.registry.unregister\n */\nexport function unregister(name: string) {\n registry.unregister(registry.Type.SERIALIZER, name);\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Handles serializing blocks to plain JavaScript objects only containing state.\n *\n * @namespace Blockly.serialization.blocks\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.serialization.blocks');\n\nimport type {Block} from '../block.js';\nimport type {BlockSvg} from '../block_svg.js';\nimport type {Connection} from '../connection.js';\nimport * as eventUtils from '../events/utils.js';\nimport {inputTypes} from '../input_types.js';\nimport type {ISerializer} from '../interfaces/i_serializer.js';\nimport {Size} from '../utils/size.js';\nimport type {Workspace} from '../workspace.js';\nimport * as Xml from '../xml.js';\n\nimport {BadConnectionCheck, MissingBlockType, MissingConnection, RealChildOfShadow} from './exceptions.js';\nimport * as priorities from './priorities.js';\nimport * as serializationRegistry from './registry.js';\n\n\n// TODO(#5160): Remove this once lint is fixed.\n/* eslint-disable no-use-before-define */\n\n/**\n * Represents the state of a connection.\n *\n * @alias Blockly.serialization.blocks.ConnectionState\n */\nexport interface ConnectionState {\n shadow: State|undefined;\n block: State|undefined;\n}\n\n/**\n * Represents the state of a given block.\n *\n * @alias Blockly.serialization.blocks.State\n */\nexport interface State {\n type: string;\n id?: string;\n x?: number;\n y?: number;\n collapsed?: boolean;\n enabled?: boolean;\n inline?: boolean;\n data?: string;\n extraState?: AnyDuringMigration;\n icons?: {[key: string]: AnyDuringMigration};\n fields?: {[key: string]: AnyDuringMigration};\n inputs?: {[key: string]: ConnectionState};\n next?: ConnectionState;\n}\n\n/**\n * Returns the state of the given block as a plain JavaScript object.\n *\n * @param block The block to serialize.\n * @param param1 addCoordinates: If true, the coordinates of the block are added\n * to the serialized state. False by default. addinputBlocks: If true,\n * children of the block which are connected to inputs will be serialized.\n * True by default. addNextBlocks: If true, children of the block which are\n * connected to the block's next connection (if it exists) will be\n * serialized. True by default. doFullSerialization: If true, fields that\n * normally just save a reference to some external state (eg variables) will\n * instead serialize all of the info about that state. This supports\n * deserializing the block into a workspace where that state doesn't yet\n * exist. True by default.\n * @returns The serialized state of the block, or null if the block could not be\n * serialied (eg it was an insertion marker).\n * @alias Blockly.serialization.blocks.save\n */\nexport function save(block: Block, {\n addCoordinates = false,\n addInputBlocks = true,\n addNextBlocks = true,\n doFullSerialization = true,\n}: {\n addCoordinates?: boolean,\n addInputBlocks?: boolean,\n addNextBlocks?: boolean,\n doFullSerialization?: boolean\n} = {}): State|null {\n if (block.isInsertionMarker()) {\n return null;\n }\n\n const state = {\n 'type': block.type,\n 'id': block.id,\n };\n\n if (addCoordinates) {\n // AnyDuringMigration because: Argument of type '{ type: string; id:\n // string; }' is not assignable to parameter of type 'State'.\n saveCoords(block, state as AnyDuringMigration);\n }\n // AnyDuringMigration because: Argument of type '{ type: string; id: string;\n // }' is not assignable to parameter of type 'State'.\n saveAttributes(block, state as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type '{ type: string; id: string;\n // }' is not assignable to parameter of type 'State'.\n saveExtraState(block, state as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type '{ type: string; id: string;\n // }' is not assignable to parameter of type 'State'.\n saveIcons(block, state as AnyDuringMigration);\n // AnyDuringMigration because: Argument of type '{ type: string; id: string;\n // }' is not assignable to parameter of type 'State'.\n saveFields(block, state as AnyDuringMigration, doFullSerialization);\n if (addInputBlocks) {\n // AnyDuringMigration because: Argument of type '{ type: string; id:\n // string; }' is not assignable to parameter of type 'State'.\n saveInputBlocks(block, state as AnyDuringMigration, doFullSerialization);\n }\n if (addNextBlocks) {\n // AnyDuringMigration because: Argument of type '{ type: string; id:\n // string; }' is not assignable to parameter of type 'State'.\n saveNextBlocks(block, state as AnyDuringMigration, doFullSerialization);\n }\n\n // AnyDuringMigration because: Type '{ type: string; id: string; }' is not\n // assignable to type 'State'.\n return state as AnyDuringMigration;\n}\n\n/**\n * Adds attributes to the given state object based on the state of the block.\n * Eg collapsed, disabled, inline, etc.\n *\n * @param block The block to base the attributes on.\n * @param state The state object to append to.\n */\nfunction saveAttributes(block: Block, state: State) {\n if (block.isCollapsed()) {\n state['collapsed'] = true;\n }\n if (!block.isEnabled()) {\n state['enabled'] = false;\n }\n if (block.inputsInline !== undefined &&\n block.inputsInline !== block.inputsInlineDefault) {\n state['inline'] = block.inputsInline;\n }\n // Data is a nullable string, so we don't need to worry about falsy values.\n if (block.data) {\n state['data'] = block.data;\n }\n}\n\n/**\n * Adds the coordinates of the given block to the given state object.\n *\n * @param block The block to base the coordinates on.\n * @param state The state object to append to.\n */\nfunction saveCoords(block: Block, state: State) {\n const workspace = block.workspace;\n const xy = block.getRelativeToSurfaceXY();\n state['x'] = Math.round(workspace.RTL ? workspace.getWidth() - xy.x : xy.x);\n state['y'] = Math.round(xy.y);\n}\n/**\n * Adds any extra state the block may provide to the given state object.\n *\n * @param block The block to serialize the extra state of.\n * @param state The state object to append to.\n */\nfunction saveExtraState(block: Block, state: State) {\n if (block.saveExtraState) {\n const extraState = block.saveExtraState();\n if (extraState !== null) {\n state['extraState'] = extraState;\n }\n } else if (block.mutationToDom) {\n const extraState = block.mutationToDom();\n if (extraState !== null) {\n state['extraState'] =\n Xml.domToText(extraState)\n .replace(\n ' xmlns=\"https://developers.google.com/blockly/xml\"', '');\n }\n }\n}\n\n/**\n * Adds the state of all of the icons on the block to the given state object.\n *\n * @param block The block to serialize the icon state of.\n * @param state The state object to append to.\n */\nfunction saveIcons(block: Block, state: State) {\n // TODO(#2105): Remove this logic and put it in the icon.\n if (block.getCommentText()) {\n state['icons'] = {\n 'comment': {\n 'text': block.getCommentText(),\n 'pinned': block.commentModel.pinned,\n 'height': Math.round(block.commentModel.size.height),\n 'width': Math.round(block.commentModel.size.width),\n },\n };\n }\n}\n\n/**\n * Adds the state of all of the fields on the block to the given state object.\n *\n * @param block The block to serialize the field state of.\n * @param state The state object to append to.\n * @param doFullSerialization Whether or not to serialize the full state of the\n * field (rather than possibly saving a reference to some state).\n */\nfunction saveFields(block: Block, state: State, doFullSerialization: boolean) {\n const fields = Object.create(null);\n for (let i = 0; i < block.inputList.length; i++) {\n const input = block.inputList[i];\n for (let j = 0; j < input.fieldRow.length; j++) {\n const field = input.fieldRow[j];\n if (field.isSerializable()) {\n fields[field.name!] = field.saveState(doFullSerialization);\n }\n }\n }\n if (Object.keys(fields).length) {\n state['fields'] = fields;\n }\n}\n\n/**\n * Adds the state of all of the child blocks of the given block (which are\n * connected to inputs) to the given state object.\n *\n * @param block The block to serialize the input blocks of.\n * @param state The state object to append to.\n * @param doFullSerialization Whether or not to do full serialization.\n */\nfunction saveInputBlocks(\n block: Block, state: State, doFullSerialization: boolean) {\n const inputs = Object.create(null);\n for (let i = 0; i < block.inputList.length; i++) {\n const input = block.inputList[i];\n if (input.type === inputTypes.DUMMY) {\n continue;\n }\n const connectionState =\n saveConnection(input.connection as Connection, doFullSerialization);\n if (connectionState) {\n inputs[input.name] = connectionState;\n }\n }\n\n if (Object.keys(inputs).length) {\n state['inputs'] = inputs;\n }\n}\n\n/**\n * Adds the state of all of the next blocks of the given block to the given\n * state object.\n *\n * @param block The block to serialize the next blocks of.\n * @param state The state object to append to.\n * @param doFullSerialization Whether or not to do full serialization.\n */\nfunction saveNextBlocks(\n block: Block, state: State, doFullSerialization: boolean) {\n if (!block.nextConnection) {\n return;\n }\n const connectionState =\n saveConnection(block.nextConnection, doFullSerialization);\n if (connectionState) {\n state['next'] = connectionState;\n }\n}\n\n/**\n * Returns the state of the given connection (ie the state of any connected\n * shadow or real blocks).\n *\n * @param connection The connection to serialize the connected blocks of.\n * @returns An object containing the state of any connected shadow block, or any\n * connected real block.\n * @param doFullSerialization Whether or not to do full serialization.\n */\nfunction saveConnection(connection: Connection, doFullSerialization: boolean):\n ConnectionState|null {\n const shadow = connection.getShadowState(true);\n const child = connection.targetBlock();\n if (!shadow && !child) {\n return null;\n }\n const state = Object.create(null);\n if (shadow) {\n state['shadow'] = shadow;\n }\n if (child && !child.isShadow()) {\n state['block'] = save(child, {doFullSerialization});\n }\n return state;\n}\n\n/**\n * Loads the block represented by the given state into the given workspace.\n *\n * @param state The state of a block to deserialize into the workspace.\n * @param workspace The workspace to add the block to.\n * @param param1 recordUndo: If true, events triggered by this function will be\n * undo-able by the user. False by default.\n * @returns The block that was just loaded.\n * @alias Blockly.serialization.blocks.append\n */\nexport function append(\n state: State, workspace: Workspace,\n {recordUndo = false}: {recordUndo?: boolean} = {}): Block {\n return appendInternal(state, workspace, {recordUndo});\n}\n\n/**\n * Loads the block represented by the given state into the given workspace.\n * This is defined internally so that the extra parameters don't clutter our\n * external API.\n * But it is exported so that other places within Blockly can call it directly\n * with the extra parameters.\n *\n * @param state The state of a block to deserialize into the workspace.\n * @param workspace The workspace to add the block to.\n * @param param1 parentConnection: If provided, the system will attempt to\n * connect the block to this connection after it is created. Undefined by\n * default. isShadow: If true, the block will be set to a shadow block after\n * it is created. False by default. recordUndo: If true, events triggered by\n * this function will be undo-able by the user. False by default.\n * @returns The block that was just appended.\n * @alias Blockly.serialization.blocks.appendInternal\n * @internal\n */\nexport function appendInternal(\n state: State, workspace: Workspace,\n {parentConnection = undefined, isShadow = false, recordUndo = false}: {\n parentConnection?: Connection,\n isShadow?: boolean,\n recordUndo?: boolean\n } = {}): Block {\n const prevRecordUndo = eventUtils.getRecordUndo();\n eventUtils.setRecordUndo(recordUndo);\n const existingGroup = eventUtils.getGroup();\n if (!existingGroup) {\n eventUtils.setGroup(true);\n }\n eventUtils.disable();\n\n const block = appendPrivate(state, workspace, {parentConnection, isShadow});\n\n eventUtils.enable();\n eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))(block));\n eventUtils.setGroup(existingGroup);\n eventUtils.setRecordUndo(prevRecordUndo);\n\n // Adding connections to the connection db is expensive. This defers that\n // operation to decrease load time.\n if (workspace.rendered) {\n const blockSvg = block as BlockSvg;\n setTimeout(() => {\n if (!blockSvg.disposed) {\n blockSvg.setConnectionTracking(true);\n }\n }, 1);\n }\n\n return block;\n}\n\n/**\n * Loads the block represented by the given state into the given workspace.\n * This is defined privately so that it can be called recursively without firing\n * eroneous events. Events (and other things we only want to occur on the top\n * block) are handled by appendInternal.\n *\n * @param state The state of a block to deserialize into the workspace.\n * @param workspace The workspace to add the block to.\n * @param param1 parentConnection: If provided, the system will attempt to\n * connect the block to this connection after it is created. Undefined by\n * default. isShadow: The block will be set to a shadow block after it is\n * created. False by default.\n * @returns The block that was just appended.\n */\nfunction appendPrivate(\n state: State, workspace: Workspace,\n {parentConnection = undefined, isShadow = false}:\n {parentConnection?: Connection, isShadow?: boolean} = {}): Block {\n if (!state['type']) {\n throw new MissingBlockType(state);\n }\n\n const block = workspace.newBlock(state['type'], state['id']);\n block.setShadow(isShadow);\n loadCoords(block, state);\n loadAttributes(block, state);\n loadExtraState(block, state);\n tryToConnectParent(parentConnection, block, state);\n loadIcons(block, state);\n loadFields(block, state);\n loadInputBlocks(block, state);\n loadNextBlocks(block, state);\n initBlock(block, workspace.rendered);\n\n return block;\n}\n\n/**\n * Applies any coordinate information available on the state object to the\n * block.\n *\n * @param block The block to set the position of.\n * @param state The state object to reference.\n */\nfunction loadCoords(block: Block, state: State) {\n let x = state['x'] === undefined ? 0 : state['x'];\n const y = state['y'] === undefined ? 0 : state['y'];\n\n const workspace = block.workspace;\n x = workspace.RTL ? workspace.getWidth() - x : x;\n\n block.moveBy(x, y);\n}\n\n/**\n * Applies any attribute information available on the state object to the block.\n *\n * @param block The block to set the attributes of.\n * @param state The state object to reference.\n */\nfunction loadAttributes(block: Block, state: State) {\n if (state['collapsed']) {\n block.setCollapsed(true);\n }\n if (state['enabled'] === false) {\n block.setEnabled(false);\n }\n if (state['inline'] !== undefined) {\n block.setInputsInline(state['inline']);\n }\n if (state['data'] !== undefined) {\n block.data = state['data'];\n }\n}\n\n/**\n * Applies any extra state information available on the state object to the\n * block.\n *\n * @param block The block to set the extra state of.\n * @param state The state object to reference.\n */\nfunction loadExtraState(block: Block, state: State) {\n if (!state['extraState']) {\n return;\n }\n if (block.loadExtraState) {\n block.loadExtraState(state['extraState']);\n } else if (block.domToMutation) {\n block.domToMutation(Xml.textToDom(state['extraState']));\n }\n}\n\n/**\n * Attempts to connect the block to the parent connection, if it exists.\n *\n * @param parentConnection The parent connection to try to connect the block to.\n * @param child The block to try to connect to the parent.\n * @param state The state which defines the given block\n */\nfunction tryToConnectParent(\n parentConnection: Connection|undefined, child: Block, state: State) {\n if (!parentConnection) {\n return;\n }\n\n if (parentConnection.getSourceBlock().isShadow() && !child.isShadow()) {\n throw new RealChildOfShadow(state);\n }\n\n let connected = false;\n let childConnection;\n if (parentConnection.type === inputTypes.VALUE) {\n childConnection = child.outputConnection;\n if (!childConnection) {\n throw new MissingConnection('output', child, state);\n }\n connected = parentConnection.connect(childConnection);\n } else { // Statement type.\n childConnection = child.previousConnection;\n if (!childConnection) {\n throw new MissingConnection('previous', child, state);\n }\n connected = parentConnection.connect(childConnection);\n }\n\n if (!connected) {\n const checker = child.workspace.connectionChecker;\n throw new BadConnectionCheck(\n checker.getErrorMessage(\n checker.canConnectWithReason(\n childConnection, parentConnection, false),\n childConnection, parentConnection),\n parentConnection.type === inputTypes.VALUE ? 'output connection' :\n 'previous connection',\n child, state);\n }\n}\n\n/**\n * Applies icon state to the icons on the block, based on the given state\n * object.\n *\n * @param block The block to set the icon state of.\n * @param state The state object to reference.\n */\nfunction loadIcons(block: Block, state: State) {\n if (!state['icons']) {\n return;\n }\n // TODO(#2105): Remove this logic and put it in the icon.\n const comment = state['icons']['comment'];\n if (comment) {\n block.setCommentText(comment['text']);\n // Load if saved. (Cleaned unnecessary attributes when in the trashcan.)\n if ('pinned' in comment) {\n block.commentModel.pinned = comment['pinned'];\n }\n if ('width' in comment && 'height' in comment) {\n block.commentModel.size = new Size(comment['width'], comment['height']);\n }\n if (comment['pinned'] && block.rendered && !block.isInFlyout) {\n // Give the block a chance to be positioned and rendered before showing.\n const blockSvg = block as BlockSvg;\n setTimeout(() => blockSvg.getCommentIcon()!.setVisible(true), 1);\n }\n }\n}\n\n/**\n * Applies any field information available on the state object to the block.\n *\n * @param block The block to set the field state of.\n * @param state The state object to reference.\n */\nfunction loadFields(block: Block, state: State) {\n if (!state['fields']) {\n return;\n }\n const keys = Object.keys(state['fields']);\n for (let i = 0; i < keys.length; i++) {\n const fieldName = keys[i];\n const fieldState = state['fields'][fieldName];\n const field = block.getField(fieldName);\n if (!field) {\n console.warn(\n `Ignoring non-existant field ${fieldName} in block ${block.type}`);\n continue;\n }\n field.loadState(fieldState);\n }\n}\n\n/**\n * Creates any child blocks (attached to inputs) defined by the given state\n * and attaches them to the given block.\n *\n * @param block The block to attach input blocks to.\n * @param state The state object to reference.\n */\nfunction loadInputBlocks(block: Block, state: State) {\n if (!state['inputs']) {\n return;\n }\n const keys = Object.keys(state['inputs']);\n for (let i = 0; i < keys.length; i++) {\n const inputName = keys[i];\n const input = block.getInput(inputName);\n if (!input || !input.connection) {\n throw new MissingConnection(inputName, block, state);\n }\n loadConnection(input.connection, state['inputs'][inputName]);\n }\n}\n\n/**\n * Creates any next blocks defined by the given state and attaches them to the\n * given block.\n *\n * @param block The block to attach next blocks to.\n * @param state The state object to reference.\n */\nfunction loadNextBlocks(block: Block, state: State) {\n if (!state['next']) {\n return;\n }\n if (!block.nextConnection) {\n throw new MissingConnection('next', block, state);\n }\n loadConnection(block.nextConnection, state['next']);\n}\n/**\n * Applies the state defined by connectionState to the given connection, ie\n * assigns shadows and attaches child blocks.\n *\n * @param connection The connection to deserialize the connected blocks of.\n * @param connectionState The object containing the state of any connected\n * shadow block, or any connected real block.\n */\nfunction loadConnection(\n connection: Connection, connectionState: ConnectionState) {\n if (connectionState['shadow']) {\n connection.setShadowState(connectionState['shadow']);\n }\n if (connectionState['block']) {\n appendPrivate(\n connectionState['block'], connection.getSourceBlock().workspace,\n {parentConnection: connection});\n }\n}\n\n// TODO(#5146): Remove this from the serialization system.\n/**\n * Initializes the give block, eg init the model, inits the svg, renders, etc.\n *\n * @param block The block to initialize.\n * @param rendered Whether the block is a rendered or headless block.\n */\nfunction initBlock(block: Block, rendered: boolean) {\n if (rendered) {\n const blockSvg = block as BlockSvg;\n // Adding connections to the connection db is expensive. This defers that\n // operation to decrease load time.\n blockSvg.setConnectionTracking(false);\n\n blockSvg.initSvg();\n blockSvg.render(false);\n // fixes #6076 JSO deserialization doesn't\n // set .iconXY_ property so here it will be set\n const icons = blockSvg.getIcons();\n for (let i = 0; i < icons.length; i++) {\n icons[i].computeIconLocation();\n }\n } else {\n block.initModel();\n }\n}\n\n// Alias to disambiguate saving within the serializer.\nconst saveBlock = save;\n\n/**\n * Serializer for saving and loading block state.\n *\n * @alias Blockly.serialization.blocks.BlockSerializer\n */\nclass BlockSerializer implements ISerializer {\n priority: number;\n\n /* eslint-disable-next-line require-jsdoc */\n constructor() {\n /** The priority for deserializing blocks. */\n this.priority = priorities.BLOCKS;\n }\n\n /**\n * Serializes the blocks of the given workspace.\n *\n * @param workspace The workspace to save the blocks of.\n * @returns The state of the workspace's blocks, or null if there are no\n * blocks.\n */\n save(workspace: Workspace): {languageVersion: number, blocks: State[]}|null {\n const blockStates = [];\n for (const block of workspace.getTopBlocks(false)) {\n const state =\n saveBlock(block, {addCoordinates: true, doFullSerialization: false});\n if (state) {\n blockStates.push(state);\n }\n }\n if (blockStates.length) {\n return {\n 'languageVersion': 0, // Currently unused.\n 'blocks': blockStates,\n };\n }\n return null;\n }\n\n /**\n * Deserializes the blocks defined by the given state into the given\n * workspace.\n *\n * @param state The state of the blocks to deserialize.\n * @param workspace The workspace to deserialize into.\n */\n load(\n state: {languageVersion: number, blocks: State[]}, workspace: Workspace) {\n const blockStates = state['blocks'];\n for (const state of blockStates) {\n append(state, workspace, {recordUndo: eventUtils.getRecordUndo()});\n }\n }\n\n /**\n * Disposes of any blocks that exist on the workspace.\n *\n * @param workspace The workspace to clear the blocks of.\n */\n clear(workspace: Workspace) {\n // Cannot use workspace.clear() because that also removes variables.\n for (const block of workspace.getTopBlocks(false)) {\n block.dispose(false);\n }\n }\n}\n\nserializationRegistry.register('blocks', new BlockSerializer());\n","/**\n * @license\n * Copyright 2011 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Components for creating connections between blocks.\n *\n * @class\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Connection');\n\nimport type {Block} from './block.js';\nimport {ConnectionType} from './connection_type.js';\nimport type {BlockMove} from './events/events_block_move.js';\nimport * as eventUtils from './events/utils.js';\nimport type {Input} from './input.js';\nimport type {IASTNodeLocationWithBlock} from './interfaces/i_ast_node_location_with_block.js';\nimport type {IConnectionChecker} from './interfaces/i_connection_checker.js';\nimport * as blocks from './serialization/blocks.js';\nimport * as Xml from './xml.js';\n\n\n/**\n * Class for a connection between blocks.\n *\n * @alias Blockly.Connection\n */\nexport class Connection implements IASTNodeLocationWithBlock {\n /** Constants for checking whether two connections are compatible. */\n static CAN_CONNECT = 0;\n static REASON_SELF_CONNECTION = 1;\n static REASON_WRONG_TYPE = 2;\n static REASON_TARGET_NULL = 3;\n static REASON_CHECKS_FAILED = 4;\n static REASON_DIFFERENT_WORKSPACES = 5;\n static REASON_SHADOW_PARENT = 6;\n static REASON_DRAG_CHECKS_FAILED = 7;\n static REASON_PREVIOUS_AND_OUTPUT = 8;\n\n protected sourceBlock_: Block;\n\n /** Connection this connection connects to. Null if not connected. */\n targetConnection: Connection|null = null;\n\n /**\n * Has this connection been disposed of?\n *\n * @internal\n */\n disposed = false;\n\n /** List of compatible value types. Null if all types are compatible. */\n private check_: string[]|null = null;\n\n /** DOM representation of a shadow block, or null if none. */\n private shadowDom_: Element|null = null;\n\n /**\n * Horizontal location of this connection.\n *\n * @internal\n */\n x = 0;\n\n /**\n * Vertical location of this connection.\n *\n * @internal\n */\n y = 0;\n\n private shadowState_: blocks.State|null = null;\n\n /**\n * @param source The block establishing this connection.\n * @param type The type of the connection.\n */\n constructor(source: Block, public type: number) {\n this.sourceBlock_ = source;\n }\n\n /**\n * Connect two connections together. This is the connection on the superior\n * block.\n *\n * @param childConnection Connection on inferior block.\n */\n protected connect_(childConnection: Connection) {\n const INPUT = ConnectionType.INPUT_VALUE;\n const parentBlock = this.getSourceBlock();\n const childBlock = childConnection.getSourceBlock();\n\n // Make sure the childConnection is available.\n if (childConnection.isConnected()) {\n childConnection.disconnect();\n }\n\n // Make sure the parentConnection is available.\n let orphan;\n if (this.isConnected()) {\n const shadowState = this.stashShadowState_();\n const target = this.targetBlock();\n if (target!.isShadow()) {\n target!.dispose(false);\n } else {\n this.disconnect();\n orphan = target;\n }\n this.applyShadowState_(shadowState);\n }\n\n // Connect the new connection to the parent.\n let event;\n if (eventUtils.isEnabled()) {\n event =\n new (eventUtils.get(eventUtils.BLOCK_MOVE))(childBlock) as BlockMove;\n }\n connectReciprocally(this, childConnection);\n childBlock.setParent(parentBlock);\n if (event) {\n event.recordNew();\n eventUtils.fire(event);\n }\n\n // Deal with the orphan if it exists.\n if (orphan) {\n const orphanConnection = this.type === INPUT ? orphan.outputConnection :\n orphan.previousConnection;\n const connection = Connection.getConnectionForOrphanedConnection(\n childBlock, (orphanConnection));\n if (connection) {\n orphanConnection.connect(connection);\n } else {\n orphanConnection.onFailedConnect(this);\n }\n }\n }\n\n /**\n * Dispose of this connection and deal with connected blocks.\n *\n * @internal\n */\n dispose() {\n // isConnected returns true for shadows and non-shadows.\n if (this.isConnected()) {\n // Destroy the attached shadow block & its children (if it exists).\n this.setShadowStateInternal_();\n\n const targetBlock = this.targetBlock();\n if (targetBlock) {\n // Disconnect the attached normal block.\n targetBlock.unplug();\n }\n }\n\n this.disposed = true;\n }\n\n /**\n * Get the source block for this connection.\n *\n * @returns The source block.\n */\n getSourceBlock(): Block {\n return this.sourceBlock_;\n }\n\n /**\n * Does the connection belong to a superior block (higher in the source\n * stack)?\n *\n * @returns True if connection faces down or right.\n */\n isSuperior(): boolean {\n return this.type === ConnectionType.INPUT_VALUE ||\n this.type === ConnectionType.NEXT_STATEMENT;\n }\n\n /**\n * Is the connection connected?\n *\n * @returns True if connection is connected to another connection.\n */\n isConnected(): boolean {\n return !!this.targetConnection;\n }\n\n /**\n * Get the workspace's connection type checker object.\n *\n * @returns The connection type checker for the source block's workspace.\n * @internal\n */\n getConnectionChecker(): IConnectionChecker {\n return this.sourceBlock_.workspace.connectionChecker;\n }\n\n /**\n * Called when an attempted connection fails. NOP by default (i.e. for\n * headless workspaces).\n *\n * @param _otherConnection Connection that this connection failed to connect\n * to.\n * @internal\n */\n onFailedConnect(_otherConnection: Connection) {}\n // NOP\n\n /**\n * Connect this connection to another connection.\n *\n * @param otherConnection Connection to connect to.\n * @returns Whether the the blocks are now connected or not.\n */\n connect(otherConnection: Connection): boolean {\n if (this.targetConnection === otherConnection) {\n // Already connected together. NOP.\n return true;\n }\n\n const checker = this.getConnectionChecker();\n if (checker.canConnect(this, otherConnection, false)) {\n const eventGroup = eventUtils.getGroup();\n if (!eventGroup) {\n eventUtils.setGroup(true);\n }\n // Determine which block is superior (higher in the source stack).\n if (this.isSuperior()) {\n // Superior block.\n this.connect_(otherConnection);\n } else {\n // Inferior block.\n otherConnection.connect_(this);\n }\n if (!eventGroup) {\n eventUtils.setGroup(false);\n }\n }\n\n return this.isConnected();\n }\n\n /** Disconnect this connection. */\n disconnect() {\n const otherConnection = this.targetConnection;\n if (!otherConnection) {\n throw Error('Source connection not connected.');\n }\n if (otherConnection.targetConnection !== this) {\n throw Error('Target connection not connected to source connection.');\n }\n let parentBlock;\n let childBlock;\n let parentConnection;\n if (this.isSuperior()) {\n // Superior block.\n parentBlock = this.sourceBlock_;\n childBlock = otherConnection.getSourceBlock();\n /* eslint-disable-next-line @typescript-eslint/no-this-alias */\n parentConnection = this;\n } else {\n // Inferior block.\n parentBlock = otherConnection.getSourceBlock();\n childBlock = this.sourceBlock_;\n parentConnection = otherConnection;\n }\n\n const eventGroup = eventUtils.getGroup();\n if (!eventGroup) {\n eventUtils.setGroup(true);\n }\n this.disconnectInternal_(parentBlock, childBlock);\n if (!childBlock.isShadow()) {\n // If we were disconnecting a shadow, no need to spawn a new one.\n parentConnection.respawnShadow_();\n }\n if (!eventGroup) {\n eventUtils.setGroup(false);\n }\n }\n\n /**\n * Disconnect two blocks that are connected by this connection.\n *\n * @param parentBlock The superior block.\n * @param childBlock The inferior block.\n */\n protected disconnectInternal_(parentBlock: Block, childBlock: Block) {\n let event;\n if (eventUtils.isEnabled()) {\n event =\n new (eventUtils.get(eventUtils.BLOCK_MOVE))(childBlock) as BlockMove;\n }\n const otherConnection = this.targetConnection;\n if (otherConnection) {\n otherConnection.targetConnection = null;\n }\n this.targetConnection = null;\n childBlock.setParent(null);\n if (event) {\n event.recordNew();\n eventUtils.fire(event);\n }\n }\n\n /**\n * Respawn the shadow block if there was one connected to the this connection.\n */\n protected respawnShadow_() {\n // Have to keep respawnShadow_ for backwards compatibility.\n this.createShadowBlock_(true);\n }\n\n /**\n * Returns the block that this connection connects to.\n *\n * @returns The connected block or null if none is connected.\n */\n targetBlock(): Block|null {\n if (this.isConnected()) {\n return this.targetConnection?.getSourceBlock() ?? null;\n }\n return null;\n }\n\n /**\n * Function to be called when this connection's compatible types have changed.\n */\n protected onCheckChanged_() {\n // The new value type may not be compatible with the existing connection.\n if (this.isConnected() &&\n (!this.targetConnection ||\n !this.getConnectionChecker().canConnect(\n this, this.targetConnection, false))) {\n const child = this.isSuperior() ? this.targetBlock() : this.sourceBlock_;\n child!.unplug();\n }\n }\n\n /**\n * Change a connection's compatibility.\n *\n * @param check Compatible value type or list of value types. Null if all\n * types are compatible.\n * @returns The connection being modified (to allow chaining).\n */\n setCheck(check: string|string[]|null): Connection {\n if (check) {\n if (!Array.isArray(check)) {\n check = [check];\n }\n this.check_ = check;\n this.onCheckChanged_();\n } else {\n this.check_ = null;\n }\n return this;\n }\n\n /**\n * Get a connection's compatibility.\n *\n * @returns List of compatible value types.\n * Null if all types are compatible.\n */\n getCheck(): string[]|null {\n return this.check_;\n }\n\n /**\n * Changes the connection's shadow block.\n *\n * @param shadowDom DOM representation of a block or null.\n */\n setShadowDom(shadowDom: Element|null) {\n this.setShadowStateInternal_({shadowDom});\n }\n\n /**\n * Returns the xml representation of the connection's shadow block.\n *\n * @param returnCurrent If true, and the shadow block is currently attached to\n * this connection, this serializes the state of that block and returns it\n * (so that field values are correct). Otherwise the saved shadowDom is\n * just returned.\n * @returns Shadow DOM representation of a block or null.\n */\n getShadowDom(returnCurrent?: boolean): Element|null {\n return returnCurrent && this.targetBlock()!.isShadow() ?\n Xml.blockToDom((this.targetBlock() as Block)) as Element :\n this.shadowDom_;\n }\n\n /**\n * Changes the connection's shadow block.\n *\n * @param shadowState An state represetation of the block or null.\n */\n setShadowState(shadowState: blocks.State|null) {\n this.setShadowStateInternal_({shadowState});\n }\n\n /**\n * Returns the serialized object representation of the connection's shadow\n * block.\n *\n * @param returnCurrent If true, and the shadow block is currently attached to\n * this connection, this serializes the state of that block and returns it\n * (so that field values are correct). Otherwise the saved state is just\n * returned.\n * @returns Serialized object representation of the block, or null.\n */\n getShadowState(returnCurrent?: boolean): blocks.State|null {\n if (returnCurrent && this.targetBlock() && this.targetBlock()!.isShadow()) {\n return blocks.save(this.targetBlock() as Block);\n }\n return this.shadowState_;\n }\n\n /**\n * Find all nearby compatible connections to this connection.\n * Type checking does not apply, since this function is used for bumping.\n *\n * Headless configurations (the default) do not have neighboring connection,\n * and always return an empty list (the default).\n * {@link RenderedConnection#neighbours} overrides this behavior with a list\n * computed from the rendered positioning.\n *\n * @param _maxLimit The maximum radius to another connection.\n * @returns List of connections.\n * @internal\n */\n neighbours(_maxLimit: number): Connection[] {\n return [];\n }\n\n /**\n * Get the parent input of a connection.\n *\n * @returns The input that the connection belongs to or null if no parent\n * exists.\n * @internal\n */\n getParentInput(): Input|null {\n let parentInput = null;\n const inputs = this.sourceBlock_.inputList;\n for (let i = 0; i < inputs.length; i++) {\n if (inputs[i].connection === this) {\n parentInput = inputs[i];\n break;\n }\n }\n return parentInput;\n }\n\n /**\n * This method returns a string describing this Connection in developer terms\n * (English only). Intended to on be used in console logs and errors.\n *\n * @returns The description.\n */\n toString(): string {\n const block = this.sourceBlock_;\n if (!block) {\n return 'Orphan Connection';\n }\n let msg;\n if (block.outputConnection === this) {\n msg = 'Output Connection of ';\n } else if (block.previousConnection === this) {\n msg = 'Previous Connection of ';\n } else if (block.nextConnection === this) {\n msg = 'Next Connection of ';\n } else {\n let parentInput = null;\n for (let i = 0, input; input = block.inputList[i]; i++) {\n if (input.connection === this) {\n parentInput = input;\n break;\n }\n }\n if (parentInput) {\n msg = 'Input \"' + parentInput.name + '\" connection on ';\n } else {\n console.warn('Connection not actually connected to sourceBlock_');\n return 'Orphan Connection';\n }\n }\n return msg + block.toDevString();\n }\n\n /**\n * Returns the state of the shadowDom_ and shadowState_ properties, then\n * temporarily sets those properties to null so no shadow respawns.\n *\n * @returns The state of both the shadowDom_ and shadowState_ properties.\n */\n private stashShadowState_():\n {shadowDom: Element|null, shadowState: blocks.State|null} {\n const shadowDom = this.getShadowDom(true);\n const shadowState = this.getShadowState(true);\n // Set to null so it doesn't respawn.\n this.shadowDom_ = null;\n this.shadowState_ = null;\n return {shadowDom, shadowState};\n }\n\n /**\n * Reapplies the stashed state of the shadowDom_ and shadowState_ properties.\n *\n * @param param0 The state to reapply to the shadowDom_ and shadowState_\n * properties.\n */\n private applyShadowState_({shadowDom, shadowState}: {\n shadowDom: Element|null,\n shadowState: blocks.State|null\n }) {\n this.shadowDom_ = shadowDom;\n this.shadowState_ = shadowState;\n }\n\n /**\n * Sets the state of the shadow of this connection.\n *\n * @param param0 The state to set the shadow of this connection to.\n */\n private setShadowStateInternal_({shadowDom = null, shadowState = null}: {\n shadowDom?: Element|null,\n shadowState?: blocks.State|null\n } = {}) {\n // One or both of these should always be null.\n // If neither is null, the shadowState will get priority.\n this.shadowDom_ = shadowDom;\n this.shadowState_ = shadowState;\n\n const target = this.targetBlock();\n if (!target) {\n this.respawnShadow_();\n if (this.targetBlock() && this.targetBlock()!.isShadow()) {\n this.serializeShadow_(this.targetBlock());\n }\n } else if (target.isShadow()) {\n target.dispose(false);\n this.respawnShadow_();\n if (this.targetBlock() && this.targetBlock()!.isShadow()) {\n this.serializeShadow_(this.targetBlock());\n }\n } else {\n const shadow = this.createShadowBlock_(false);\n this.serializeShadow_(shadow);\n if (shadow) {\n shadow.dispose(false);\n }\n }\n }\n\n /**\n * Creates a shadow block based on the current shadowState_ or shadowDom_.\n * shadowState_ gets priority.\n *\n * @param attemptToConnect Whether to try to connect the shadow block to this\n * connection or not.\n * @returns The shadow block that was created, or null if both the\n * shadowState_ and shadowDom_ are null.\n */\n private createShadowBlock_(attemptToConnect: boolean): Block|null {\n const parentBlock = this.getSourceBlock();\n const shadowState = this.getShadowState();\n const shadowDom = this.getShadowDom();\n if (parentBlock.isDeadOrDying() || !shadowState && !shadowDom) {\n return null;\n }\n\n let blockShadow;\n if (shadowState) {\n blockShadow = blocks.appendInternal(shadowState, parentBlock.workspace, {\n parentConnection: attemptToConnect ? this : undefined,\n isShadow: true,\n recordUndo: false,\n });\n return blockShadow;\n }\n\n if (shadowDom) {\n blockShadow = Xml.domToBlock(shadowDom, parentBlock.workspace);\n if (attemptToConnect) {\n if (this.type === ConnectionType.INPUT_VALUE) {\n if (!blockShadow.outputConnection) {\n throw new Error('Shadow block is missing an output connection');\n }\n if (!this.connect(blockShadow.outputConnection)) {\n throw new Error('Could not connect shadow block to connection');\n }\n } else if (this.type === ConnectionType.NEXT_STATEMENT) {\n if (!blockShadow.previousConnection) {\n throw new Error('Shadow block is missing previous connection');\n }\n if (!this.connect(blockShadow.previousConnection)) {\n throw new Error('Could not connect shadow block to connection');\n }\n } else {\n throw new Error(\n 'Cannot connect a shadow block to a previous/output connection');\n }\n }\n return blockShadow;\n }\n return null;\n }\n\n /**\n * Saves the given shadow block to both the shadowDom_ and shadowState_\n * properties, in their respective serialized forms.\n *\n * @param shadow The shadow to serialize, or null.\n */\n private serializeShadow_(shadow: Block|null) {\n if (!shadow) {\n return;\n }\n this.shadowDom_ = Xml.blockToDom(shadow) as Element;\n this.shadowState_ = blocks.save(shadow);\n }\n\n /**\n * Returns the connection (starting at the startBlock) which will accept\n * the given connection. This includes compatible connection types and\n * connection checks.\n *\n * @param startBlock The block on which to start the search.\n * @param orphanConnection The connection that is looking for a home.\n * @returns The suitable connection point on the chain of blocks, or null.\n */\n static getConnectionForOrphanedConnection(\n startBlock: Block, orphanConnection: Connection): Connection|null {\n if (orphanConnection.type === ConnectionType.OUTPUT_VALUE) {\n return getConnectionForOrphanedOutput(\n startBlock, orphanConnection.getSourceBlock());\n }\n // Otherwise we're dealing with a stack.\n const connection = startBlock.lastConnectionInStack(true);\n const checker = orphanConnection.getConnectionChecker();\n if (connection && checker.canConnect(orphanConnection, connection, false)) {\n return connection;\n }\n return null;\n }\n}\n\n/**\n * Update two connections to target each other.\n *\n * @param first The first connection to update.\n * @param second The second connection to update.\n */\nfunction connectReciprocally(first: Connection, second: Connection) {\n if (!first || !second) {\n throw Error('Cannot connect null connections.');\n }\n first.targetConnection = second;\n second.targetConnection = first;\n}\n/**\n * Returns the single connection on the block that will accept the orphaned\n * block, if one can be found. If the block has multiple compatible connections\n * (even if they are filled) this returns null. If the block has no compatible\n * connections, this returns null.\n *\n * @param block The superior block.\n * @param orphanBlock The inferior block.\n * @returns The suitable connection point on 'block', or null.\n */\nfunction getSingleConnection(block: Block, orphanBlock: Block): Connection|\n null {\n let foundConnection = null;\n const output = orphanBlock.outputConnection;\n const typeChecker = output.getConnectionChecker();\n\n for (let i = 0, input; input = block.inputList[i]; i++) {\n const connection = input.connection;\n if (connection && typeChecker.canConnect(output, connection, false)) {\n if (foundConnection) {\n return null; // More than one connection.\n }\n foundConnection = connection;\n }\n }\n return foundConnection;\n}\n\n/**\n * Walks down a row a blocks, at each stage checking if there are any\n * connections that will accept the orphaned block. If at any point there\n * are zero or multiple eligible connections, returns null. Otherwise\n * returns the only input on the last block in the chain.\n * Terminates early for shadow blocks.\n *\n * @param startBlock The block on which to start the search.\n * @param orphanBlock The block that is looking for a home.\n * @returns The suitable connection point on the chain of blocks, or null.\n */\nfunction getConnectionForOrphanedOutput(\n startBlock: Block, orphanBlock: Block): Connection|null {\n let newBlock: Block|null = startBlock;\n let connection;\n while (connection = getSingleConnection(newBlock, orphanBlock)) {\n newBlock = connection.targetBlock();\n if (!newBlock || newBlock.isShadow()) {\n return connection;\n }\n }\n return null;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * The class representing an AST node.\n * Used to traverse the Blockly AST.\n *\n * @class\n */\nimport * as goog from '../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.ASTNode');\n\nimport type {Block} from '../block.js';\nimport type {Connection} from '../connection.js';\nimport {ConnectionType} from '../connection_type.js';\nimport type {Field} from '../field.js';\nimport type {Input} from '../input.js';\nimport type {IASTNodeLocation} from '../interfaces/i_ast_node_location.js';\nimport type {IASTNodeLocationWithBlock} from '../interfaces/i_ast_node_location_with_block.js';\nimport {Coordinate} from '../utils/coordinate.js';\nimport type {Workspace} from '../workspace.js';\n\n\n/**\n * Class for an AST node.\n * It is recommended that you use one of the createNode methods instead of\n * creating a node directly.\n *\n * @alias Blockly.ASTNode\n */\nexport class ASTNode {\n /**\n * True to navigate to all fields. False to only navigate to clickable fields.\n */\n static NAVIGATE_ALL_FIELDS = false;\n\n /**\n * The default y offset to use when moving the cursor from a stack to the\n * workspace.\n */\n private static readonly DEFAULT_OFFSET_Y: number = -20;\n private readonly type_: string;\n private readonly isConnection_: boolean;\n private readonly location_: IASTNodeLocation;\n\n /** The coordinate on the workspace. */\n // AnyDuringMigration because: Type 'null' is not assignable to type\n // 'Coordinate'.\n private wsCoordinate_: Coordinate = null as AnyDuringMigration;\n\n /**\n * @param type The type of the location.\n * Must be in ASTNode.types.\n * @param location The position in the AST.\n * @param opt_params Optional dictionary of options.\n * @alias Blockly.ASTNode\n */\n constructor(type: string, location: IASTNodeLocation, opt_params?: Params) {\n if (!location) {\n throw Error('Cannot create a node without a location.');\n }\n\n /**\n * The type of the location.\n * One of ASTNode.types\n */\n this.type_ = type;\n\n /** Whether the location points to a connection. */\n this.isConnection_ = ASTNode.isConnectionType_(type);\n\n /** The location of the AST node. */\n this.location_ = location;\n\n this.processParams_(opt_params || null);\n }\n\n /**\n * Parse the optional parameters.\n *\n * @param params The user specified parameters.\n */\n private processParams_(params: Params|null) {\n if (!params) {\n return;\n }\n if (params.wsCoordinate) {\n this.wsCoordinate_ = params.wsCoordinate;\n }\n }\n\n /**\n * Gets the value pointed to by this node.\n * It is the callers responsibility to check the node type to figure out what\n * type of object they get back from this.\n *\n * @returns The current field, connection, workspace, or block the cursor is\n * on.\n */\n getLocation(): IASTNodeLocation {\n return this.location_;\n }\n\n /**\n * The type of the current location.\n * One of ASTNode.types\n *\n * @returns The type of the location.\n */\n getType(): string {\n return this.type_;\n }\n\n /**\n * The coordinate on the workspace.\n *\n * @returns The workspace coordinate or null if the location is not a\n * workspace.\n */\n getWsCoordinate(): Coordinate {\n return this.wsCoordinate_;\n }\n\n /**\n * Whether the node points to a connection.\n *\n * @returns [description]\n * @internal\n */\n isConnection(): boolean {\n return this.isConnection_;\n }\n\n /**\n * Given an input find the next editable field or an input with a non null\n * connection in the same block. The current location must be an input\n * connection.\n *\n * @returns The AST node holding the next field or connection or null if there\n * is no editable field or input connection after the given input.\n */\n private findNextForInput_(): ASTNode|null {\n const location = this.location_ as Connection;\n const parentInput = location.getParentInput();\n const block = parentInput!.getSourceBlock();\n // AnyDuringMigration because: Argument of type 'Input | null' is not\n // assignable to parameter of type 'Input'.\n const curIdx = block!.inputList.indexOf(parentInput as AnyDuringMigration);\n for (let i = curIdx + 1; i < block!.inputList.length; i++) {\n const input = block!.inputList[i];\n const fieldRow = input.fieldRow;\n for (let j = 0; j < fieldRow.length; j++) {\n const field = fieldRow[j];\n if (field.isClickable() || ASTNode.NAVIGATE_ALL_FIELDS) {\n return ASTNode.createFieldNode(field);\n }\n }\n if (input.connection) {\n return ASTNode.createInputNode(input);\n }\n }\n return null;\n }\n\n /**\n * Given a field find the next editable field or an input with a non null\n * connection in the same block. The current location must be a field.\n *\n * @returns The AST node pointing to the next field or connection or null if\n * there is no editable field or input connection after the given input.\n */\n private findNextForField_(): ASTNode|null {\n const location = this.location_ as Field;\n const input = location.getParentInput();\n const block = location.getSourceBlock();\n const curIdx = block.inputList.indexOf((input));\n let fieldIdx = input.fieldRow.indexOf(location) + 1;\n for (let i = curIdx; i < block.inputList.length; i++) {\n const newInput = block.inputList[i];\n const fieldRow = newInput.fieldRow;\n while (fieldIdx < fieldRow.length) {\n if (fieldRow[fieldIdx].isClickable() || ASTNode.NAVIGATE_ALL_FIELDS) {\n return ASTNode.createFieldNode(fieldRow[fieldIdx]);\n }\n fieldIdx++;\n }\n fieldIdx = 0;\n if (newInput.connection) {\n return ASTNode.createInputNode(newInput);\n }\n }\n return null;\n }\n\n /**\n * Given an input find the previous editable field or an input with a non null\n * connection in the same block. The current location must be an input\n * connection.\n *\n * @returns The AST node holding the previous field or connection.\n */\n private findPrevForInput_(): ASTNode|null {\n const location = this.location_ as Connection;\n const parentInput = location.getParentInput();\n const block = parentInput!.getSourceBlock();\n // AnyDuringMigration because: Argument of type 'Input | null' is not\n // assignable to parameter of type 'Input'.\n const curIdx = block!.inputList.indexOf(parentInput as AnyDuringMigration);\n for (let i = curIdx; i >= 0; i--) {\n const input = block!.inputList[i];\n if (input.connection && input !== parentInput) {\n return ASTNode.createInputNode(input);\n }\n const fieldRow = input.fieldRow;\n for (let j = fieldRow.length - 1; j >= 0; j--) {\n const field = fieldRow[j];\n if (field.isClickable() || ASTNode.NAVIGATE_ALL_FIELDS) {\n return ASTNode.createFieldNode(field);\n }\n }\n }\n return null;\n }\n\n /**\n * Given a field find the previous editable field or an input with a non null\n * connection in the same block. The current location must be a field.\n *\n * @returns The AST node holding the previous input or field.\n */\n private findPrevForField_(): ASTNode|null {\n const location = this.location_ as Field;\n const parentInput = location.getParentInput();\n const block = location.getSourceBlock();\n const curIdx = block.inputList.indexOf((parentInput));\n let fieldIdx = parentInput.fieldRow.indexOf(location) - 1;\n for (let i = curIdx; i >= 0; i--) {\n const input = block.inputList[i];\n if (input.connection && input !== parentInput) {\n return ASTNode.createInputNode(input);\n }\n const fieldRow = input.fieldRow;\n while (fieldIdx > -1) {\n if (fieldRow[fieldIdx].isClickable() || ASTNode.NAVIGATE_ALL_FIELDS) {\n return ASTNode.createFieldNode(fieldRow[fieldIdx]);\n }\n fieldIdx--;\n }\n // Reset the fieldIdx to the length of the field row of the previous\n // input.\n if (i - 1 >= 0) {\n fieldIdx = block.inputList[i - 1].fieldRow.length - 1;\n }\n }\n return null;\n }\n\n /**\n * Navigate between stacks of blocks on the workspace.\n *\n * @param forward True to go forward. False to go backwards.\n * @returns The first block of the next stack or null if there are no blocks\n * on the workspace.\n */\n private navigateBetweenStacks_(forward: boolean): ASTNode|null {\n let curLocation = this.getLocation();\n // TODO(#6097): Use instanceof checks to exit early for values of\n // curLocation that don't make sense.\n if ((curLocation as IASTNodeLocationWithBlock).getSourceBlock) {\n curLocation = (curLocation as IASTNodeLocationWithBlock).getSourceBlock();\n }\n // TODO(#6097): Use instanceof checks to exit early for values of\n // curLocation that don't make sense.\n const curLocationAsBlock = curLocation as Block;\n if (!curLocationAsBlock || curLocationAsBlock.isDeadOrDying()) {\n return null;\n }\n const curRoot = curLocationAsBlock.getRootBlock();\n const topBlocks = curRoot.workspace.getTopBlocks(true);\n for (let i = 0; i < topBlocks.length; i++) {\n const topBlock = topBlocks[i];\n if (curRoot.id === topBlock.id) {\n const offset = forward ? 1 : -1;\n const resultIndex = i + offset;\n if (resultIndex === -1 || resultIndex === topBlocks.length) {\n return null;\n }\n return ASTNode.createStackNode(topBlocks[resultIndex]);\n }\n }\n throw Error(\n 'Couldn\\'t find ' + (forward ? 'next' : 'previous') + ' stack?!');\n }\n\n /**\n * Finds the top most AST node for a given block.\n * This is either the previous connection, output connection or block\n * depending on what kind of connections the block has.\n *\n * @param block The block that we want to find the top connection on.\n * @returns The AST node containing the top connection.\n */\n private findTopASTNodeForBlock_(block: Block): ASTNode|null {\n const topConnection = getParentConnection(block);\n if (topConnection) {\n return ASTNode.createConnectionNode(topConnection);\n } else {\n return ASTNode.createBlockNode(block);\n }\n }\n\n /**\n * Get the AST node pointing to the input that the block is nested under or if\n * the block is not nested then get the stack AST node.\n *\n * @param block The source block of the current location.\n * @returns The AST node pointing to the input connection or the top block of\n * the stack this block is in.\n */\n private getOutAstNodeForBlock_(block: Block): ASTNode|null {\n if (!block) {\n return null;\n }\n // If the block doesn't have a previous connection then it is the top of the\n // substack.\n const topBlock = block.getTopStackBlock();\n const topConnection = getParentConnection(topBlock);\n // If the top connection has a parentInput, create an AST node pointing to\n // that input.\n if (topConnection && topConnection.targetConnection &&\n topConnection.targetConnection.getParentInput()) {\n // AnyDuringMigration because: Argument of type 'Input | null' is not\n // assignable to parameter of type 'Input'.\n return ASTNode.createInputNode(\n topConnection.targetConnection.getParentInput() as\n AnyDuringMigration);\n } else {\n // Go to stack level if you are not underneath an input.\n return ASTNode.createStackNode(topBlock);\n }\n }\n\n /**\n * Find the first editable field or input with a connection on a given block.\n *\n * @param block The source block of the current location.\n * @returns An AST node pointing to the first field or input.\n * Null if there are no editable fields or inputs with connections on the\n * block.\n */\n private findFirstFieldOrInput_(block: Block): ASTNode|null {\n const inputs = block.inputList;\n for (let i = 0; i < inputs.length; i++) {\n const input = inputs[i];\n const fieldRow = input.fieldRow;\n for (let j = 0; j < fieldRow.length; j++) {\n const field = fieldRow[j];\n if (field.isClickable() || ASTNode.NAVIGATE_ALL_FIELDS) {\n return ASTNode.createFieldNode(field);\n }\n }\n if (input.connection) {\n return ASTNode.createInputNode(input);\n }\n }\n return null;\n }\n\n /**\n * Finds the source block of the location of this node.\n *\n * @returns The source block of the location, or null if the node is of type\n * workspace.\n */\n getSourceBlock(): Block|null {\n if (this.getType() === ASTNode.types.BLOCK) {\n return this.getLocation() as Block;\n } else if (this.getType() === ASTNode.types.STACK) {\n return this.getLocation() as Block;\n } else if (this.getType() === ASTNode.types.WORKSPACE) {\n return null;\n } else {\n return (this.getLocation() as IASTNodeLocationWithBlock).getSourceBlock();\n }\n }\n\n /**\n * Find the element to the right of the current element in the AST.\n *\n * @returns An AST node that wraps the next field, connection, block, or\n * workspace. Or null if there is no node to the right.\n */\n next(): ASTNode|null {\n switch (this.type_) {\n case ASTNode.types.STACK:\n return this.navigateBetweenStacks_(true);\n\n case ASTNode.types.OUTPUT: {\n const connection = this.location_ as Connection;\n return ASTNode.createBlockNode(connection.getSourceBlock());\n }\n case ASTNode.types.FIELD:\n return this.findNextForField_();\n\n case ASTNode.types.INPUT:\n return this.findNextForInput_();\n\n case ASTNode.types.BLOCK: {\n const block = this.location_ as Block;\n const nextConnection = block.nextConnection;\n return ASTNode.createConnectionNode(nextConnection);\n }\n case ASTNode.types.PREVIOUS: {\n const connection = this.location_ as Connection;\n return ASTNode.createBlockNode(connection.getSourceBlock());\n }\n case ASTNode.types.NEXT: {\n const connection = this.location_ as Connection;\n const targetConnection = connection.targetConnection;\n return ASTNode.createConnectionNode(targetConnection!);\n }\n }\n\n return null;\n }\n\n /**\n * Find the element one level below and all the way to the left of the current\n * location.\n *\n * @returns An AST node that wraps the next field, connection, workspace, or\n * block. Or null if there is nothing below this node.\n */\n in(): ASTNode|null {\n switch (this.type_) {\n case ASTNode.types.WORKSPACE: {\n const workspace = this.location_ as Workspace;\n const topBlocks = workspace.getTopBlocks(true);\n if (topBlocks.length > 0) {\n return ASTNode.createStackNode(topBlocks[0]);\n }\n break;\n }\n case ASTNode.types.STACK: {\n const block = this.location_ as Block;\n return this.findTopASTNodeForBlock_(block);\n }\n case ASTNode.types.BLOCK: {\n const block = this.location_ as Block;\n return this.findFirstFieldOrInput_(block);\n }\n case ASTNode.types.INPUT: {\n const connection = this.location_ as Connection;\n const targetConnection = connection.targetConnection;\n return ASTNode.createConnectionNode(targetConnection!);\n }\n }\n\n return null;\n }\n\n /**\n * Find the element to the left of the current element in the AST.\n *\n * @returns An AST node that wraps the previous field, connection, workspace\n * or block. Or null if no node exists to the left. null.\n */\n prev(): ASTNode|null {\n switch (this.type_) {\n case ASTNode.types.STACK:\n return this.navigateBetweenStacks_(false);\n\n case ASTNode.types.OUTPUT:\n return null;\n\n case ASTNode.types.FIELD:\n return this.findPrevForField_();\n\n case ASTNode.types.INPUT:\n return this.findPrevForInput_();\n\n case ASTNode.types.BLOCK: {\n const block = this.location_ as Block;\n const topConnection = getParentConnection(block);\n return ASTNode.createConnectionNode(topConnection);\n }\n case ASTNode.types.PREVIOUS: {\n const connection = this.location_ as Connection;\n const targetConnection = connection.targetConnection;\n if (targetConnection && !targetConnection.getParentInput()) {\n return ASTNode.createConnectionNode(targetConnection);\n }\n break;\n }\n case ASTNode.types.NEXT: {\n const connection = this.location_ as Connection;\n return ASTNode.createBlockNode(connection.getSourceBlock());\n }\n }\n\n return null;\n }\n\n /**\n * Find the next element that is one position above and all the way to the\n * left of the current location.\n *\n * @returns An AST node that wraps the next field, connection, workspace or\n * block. Or null if we are at the workspace level.\n */\n out(): ASTNode|null {\n switch (this.type_) {\n case ASTNode.types.STACK: {\n const block = this.location_ as Block;\n const blockPos = block.getRelativeToSurfaceXY();\n // TODO: Make sure this is in the bounds of the workspace.\n const wsCoordinate =\n new Coordinate(blockPos.x, blockPos.y + ASTNode.DEFAULT_OFFSET_Y);\n return ASTNode.createWorkspaceNode(block.workspace, wsCoordinate);\n }\n case ASTNode.types.OUTPUT: {\n const connection = this.location_ as Connection;\n const target = connection.targetConnection;\n if (target) {\n return ASTNode.createConnectionNode(target);\n }\n return ASTNode.createStackNode(connection.getSourceBlock());\n }\n case ASTNode.types.FIELD: {\n const field = this.location_ as Field;\n return ASTNode.createBlockNode(field.getSourceBlock());\n }\n case ASTNode.types.INPUT: {\n const connection = this.location_ as Connection;\n return ASTNode.createBlockNode(connection.getSourceBlock());\n }\n case ASTNode.types.BLOCK: {\n const block = this.location_ as Block;\n return this.getOutAstNodeForBlock_(block);\n }\n case ASTNode.types.PREVIOUS: {\n const connection = this.location_ as Connection;\n return this.getOutAstNodeForBlock_(connection.getSourceBlock());\n }\n case ASTNode.types.NEXT: {\n const connection = this.location_ as Connection;\n return this.getOutAstNodeForBlock_(connection.getSourceBlock());\n }\n }\n\n return null;\n }\n\n /**\n * Whether an AST node of the given type points to a connection.\n *\n * @param type The type to check. One of ASTNode.types.\n * @returns True if a node of the given type points to a connection.\n */\n private static isConnectionType_(type: string): boolean {\n switch (type) {\n case ASTNode.types.PREVIOUS:\n case ASTNode.types.NEXT:\n case ASTNode.types.INPUT:\n case ASTNode.types.OUTPUT:\n return true;\n }\n return false;\n }\n\n /**\n * Create an AST node pointing to a field.\n *\n * @param field The location of the AST node.\n * @returns An AST node pointing to a field.\n */\n static createFieldNode(field: Field): ASTNode|null {\n if (!field) {\n return null;\n }\n return new ASTNode(ASTNode.types.FIELD, field);\n }\n\n /**\n * Creates an AST node pointing to a connection. If the connection has a\n * parent input then create an AST node of type input that will hold the\n * connection.\n *\n * @param connection This is the connection the node will point to.\n * @returns An AST node pointing to a connection.\n */\n static createConnectionNode(connection: Connection): ASTNode|null {\n if (!connection) {\n return null;\n }\n const type = connection.type;\n if (type === ConnectionType.INPUT_VALUE) {\n // AnyDuringMigration because: Argument of type 'Input | null' is not\n // assignable to parameter of type 'Input'.\n return ASTNode.createInputNode(\n connection.getParentInput() as AnyDuringMigration);\n } else if (\n type === ConnectionType.NEXT_STATEMENT && connection.getParentInput()) {\n // AnyDuringMigration because: Argument of type 'Input | null' is not\n // assignable to parameter of type 'Input'.\n return ASTNode.createInputNode(\n connection.getParentInput() as AnyDuringMigration);\n } else if (type === ConnectionType.NEXT_STATEMENT) {\n return new ASTNode(ASTNode.types.NEXT, connection);\n } else if (type === ConnectionType.OUTPUT_VALUE) {\n return new ASTNode(ASTNode.types.OUTPUT, connection);\n } else if (type === ConnectionType.PREVIOUS_STATEMENT) {\n return new ASTNode(ASTNode.types.PREVIOUS, connection);\n }\n return null;\n }\n\n /**\n * Creates an AST node pointing to an input. Stores the input connection as\n * the location.\n *\n * @param input The input used to create an AST node.\n * @returns An AST node pointing to a input.\n */\n static createInputNode(input: Input): ASTNode|null {\n if (!input || !input.connection) {\n return null;\n }\n return new ASTNode(ASTNode.types.INPUT, input.connection);\n }\n\n /**\n * Creates an AST node pointing to a block.\n *\n * @param block The block used to create an AST node.\n * @returns An AST node pointing to a block.\n */\n static createBlockNode(block: Block): ASTNode|null {\n if (!block) {\n return null;\n }\n return new ASTNode(ASTNode.types.BLOCK, block);\n }\n\n /**\n * Create an AST node of type stack. A stack, represented by its top block, is\n * the set of all blocks connected to a top block, including the top\n * block.\n *\n * @param topBlock A top block has no parent and can be found in the list\n * returned by workspace.getTopBlocks().\n * @returns An AST node of type stack that points to the top block on the\n * stack.\n */\n static createStackNode(topBlock: Block): ASTNode|null {\n if (!topBlock) {\n return null;\n }\n return new ASTNode(ASTNode.types.STACK, topBlock);\n }\n\n /**\n * Creates an AST node pointing to a workspace.\n *\n * @param workspace The workspace that we are on.\n * @param wsCoordinate The position on the workspace for this node.\n * @returns An AST node pointing to a workspace and a position on the\n * workspace.\n */\n static createWorkspaceNode(\n workspace: Workspace|null, wsCoordinate: Coordinate|null): ASTNode|null {\n if (!wsCoordinate || !workspace) {\n return null;\n }\n const params = {wsCoordinate};\n return new ASTNode(ASTNode.types.WORKSPACE, workspace, params);\n }\n\n /**\n * Creates an AST node for the top position on a block.\n * This is either an output connection, previous connection, or block.\n *\n * @param block The block to find the top most AST node on.\n * @returns The AST node holding the top most position on the block.\n */\n static createTopNode(block: Block): ASTNode|null {\n let astNode;\n const topConnection = getParentConnection(block);\n if (topConnection) {\n astNode = ASTNode.createConnectionNode(topConnection);\n } else {\n astNode = ASTNode.createBlockNode(block);\n }\n return astNode;\n }\n}\n\nexport namespace ASTNode {\n export interface Params {\n wsCoordinate: Coordinate;\n }\n\n export enum types {\n FIELD = 'field',\n BLOCK = 'block',\n INPUT = 'input',\n OUTPUT = 'output',\n NEXT = 'next',\n PREVIOUS = 'previous',\n STACK = 'stack',\n WORKSPACE = 'workspace',\n }\n}\n\nexport type Params = ASTNode.Params;\n// No need to export ASTNode.types from the module at this time because (1) it\n// wasn't automatically converted by the automatic migration script, (2) the\n// name doesn't follow the styleguide.\n\n\n/**\n * Gets the parent connection on a block.\n * This is either an output connection, previous connection or undefined.\n * If both connections exist return the one that is actually connected\n * to another block.\n *\n * @param block The block to find the parent connection on.\n * @returns The connection connecting to the parent of the block.\n */\nfunction getParentConnection(block: Block): Connection {\n let topConnection = block.outputConnection;\n if (!topConnection ||\n block.previousConnection && block.previousConnection.isConnected()) {\n topConnection = block.previousConnection;\n }\n return topConnection;\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Methods animating a block on connection and disconnection.\n *\n * @namespace Blockly.blockAnimations\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.blockAnimations');\n\nimport type {BlockSvg} from './block_svg.js';\nimport * as dom from './utils/dom.js';\nimport {Svg} from './utils/svg.js';\n\n\n/** A bounding box for a cloned block. */\ninterface CloneRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** PID of disconnect UI animation. There can only be one at a time. */\nlet disconnectPid: ReturnType|null = null;\n\n/** SVG group of wobbling block. There can only be one at a time. */\nlet disconnectGroup: SVGElement|null = null;\n\n\n/**\n * Play some UI effects (sound, animation) when disposing of a block.\n *\n * @param block The block being disposed of.\n * @alias Blockly.blockAnimations.disposeUiEffect\n * @internal\n */\nexport function disposeUiEffect(block: BlockSvg) {\n const workspace = block.workspace;\n const svgGroup = block.getSvgRoot();\n workspace.getAudioManager().play('delete');\n\n const xy = workspace.getSvgXY(svgGroup);\n // Deeply clone the current block.\n const clone: SVGGElement = svgGroup.cloneNode(true) as SVGGElement;\n clone.setAttribute('transform', 'translate(' + xy.x + ',' + xy.y + ')');\n workspace.getParentSvg().appendChild(clone);\n const cloneRect =\n {'x': xy.x, 'y': xy.y, 'width': block.width, 'height': block.height};\n disposeUiStep(clone, cloneRect, workspace.RTL, new Date(), workspace.scale);\n}\n/**\n * Animate a cloned block and eventually dispose of it.\n * This is a class method, not an instance method since the original block has\n * been destroyed and is no longer accessible.\n *\n * @param clone SVG element to animate and dispose of.\n * @param rect Starting rect of the clone.\n * @param rtl True if RTL, false if LTR.\n * @param start Date of animation's start.\n * @param workspaceScale Scale of workspace.\n */\nfunction disposeUiStep(\n clone: Element, rect: CloneRect, rtl: boolean, start: Date,\n workspaceScale: number) {\n const ms = new Date().getTime() - start.getTime();\n const percent = ms / 150;\n if (percent > 1) {\n dom.removeNode(clone);\n } else {\n const x =\n rect.x + (rtl ? -1 : 1) * rect.width * workspaceScale / 2 * percent;\n const y = rect.y + rect.height * workspaceScale * percent;\n const scale = (1 - percent) * workspaceScale;\n clone.setAttribute(\n 'transform',\n 'translate(' + x + ',' + y + ')' +\n ' scale(' + scale + ')');\n setTimeout(disposeUiStep, 10, clone, rect, rtl, start, workspaceScale);\n }\n}\n\n/**\n * Play some UI effects (sound, ripple) after a connection has been established.\n *\n * @param block The block being connected.\n * @alias Blockly.blockAnimations.connectionUiEffect\n * @internal\n */\nexport function connectionUiEffect(block: BlockSvg) {\n const workspace = block.workspace;\n const scale = workspace.scale;\n workspace.getAudioManager().play('click');\n if (scale < 1) {\n return; // Too small to care about visual effects.\n }\n // Determine the absolute coordinates of the inferior block.\n const xy = workspace.getSvgXY(block.getSvgRoot());\n // Offset the coordinates based on the two connection types, fix scale.\n if (block.outputConnection) {\n xy.x += (block.RTL ? 3 : -3) * scale;\n xy.y += 13 * scale;\n } else if (block.previousConnection) {\n xy.x += (block.RTL ? -23 : 23) * scale;\n xy.y += 3 * scale;\n }\n const ripple = dom.createSvgElement(\n Svg.CIRCLE, {\n 'cx': xy.x,\n 'cy': xy.y,\n 'r': 0,\n 'fill': 'none',\n 'stroke': '#888',\n 'stroke-width': 10,\n },\n workspace.getParentSvg());\n // Start the animation.\n connectionUiStep(ripple, new Date(), scale);\n}\n\n/**\n * Expand a ripple around a connection.\n *\n * @param ripple Element to animate.\n * @param start Date of animation's start.\n * @param scale Scale of workspace.\n */\nfunction connectionUiStep(ripple: SVGElement, start: Date, scale: number) {\n const ms = new Date().getTime() - start.getTime();\n const percent = ms / 150;\n if (percent > 1) {\n dom.removeNode(ripple);\n } else {\n ripple.setAttribute('r', (percent * 25 * scale).toString());\n ripple.style.opacity = (1 - percent).toString();\n disconnectPid = setTimeout(connectionUiStep, 10, ripple, start, scale);\n }\n}\n\n/**\n * Play some UI effects (sound, animation) when disconnecting a block.\n *\n * @param block The block being disconnected.\n * @alias Blockly.blockAnimations.disconnectUiEffect\n * @internal\n */\nexport function disconnectUiEffect(block: BlockSvg) {\n disconnectUiStop();\n block.workspace.getAudioManager().play('disconnect');\n if (block.workspace.scale < 1) {\n return; // Too small to care about visual effects.\n }\n // Horizontal distance for bottom of block to wiggle.\n const DISPLACEMENT = 10;\n // Scale magnitude of skew to height of block.\n const height = block.getHeightWidth().height;\n let magnitude = Math.atan(DISPLACEMENT / height) / Math.PI * 180;\n if (!block.RTL) {\n magnitude *= -1;\n }\n // Start the animation.\n disconnectGroup = block.getSvgRoot();\n disconnectUiStep(disconnectGroup, magnitude, new Date());\n}\n\n/**\n * Animate a brief wiggle of a disconnected block.\n *\n * @param group SVG element to animate.\n * @param magnitude Maximum degrees skew (reversed for RTL).\n * @param start Date of animation's start.\n */\nfunction disconnectUiStep(group: SVGElement, magnitude: number, start: Date) {\n const DURATION = 200; // Milliseconds.\n const WIGGLES = 3; // Half oscillations.\n\n const ms = new Date().getTime() - start.getTime();\n const percent = ms / DURATION;\n\n let skew = '';\n if (percent <= 1) {\n const val = Math.round(\n Math.sin(percent * Math.PI * WIGGLES) * (1 - percent) * magnitude);\n skew = `skewX(${val})`;\n disconnectPid = setTimeout(disconnectUiStep, 10, group, magnitude, start);\n }\n group.setAttribute('transform', skew);\n}\n\n/**\n * Stop the disconnect UI animation immediately.\n *\n * @alias Blockly.blockAnimations.disconnectUiStop\n * @internal\n */\nexport function disconnectUiStop() {\n if (disconnectGroup) {\n if (disconnectPid) {\n clearTimeout(disconnectPid);\n }\n disconnectGroup.setAttribute('transform', '');\n disconnectGroup = null;\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Blockly's internal clipboard for managing copy-paste.\n *\n * @namespace Blockly.clipboard\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.clipboard');\n\nimport type {CopyData, ICopyable} from './interfaces/i_copyable.js';\n\n\n/** Metadata about the object that is currently on the clipboard. */\nlet copyData: CopyData|null = null;\n\n/**\n * Copy a block or workspace comment onto the local clipboard.\n *\n * @param toCopy Block or Workspace Comment to be copied.\n * @alias Blockly.clipboard.copy\n * @internal\n */\nexport function copy(toCopy: ICopyable) {\n TEST_ONLY.copyInternal(toCopy);\n}\n\n/**\n * Private version of copy for stubbing in tests.\n */\nfunction copyInternal(toCopy: ICopyable) {\n copyData = toCopy.toCopyData();\n}\n\n/**\n * Paste a block or workspace comment on to the main workspace.\n *\n * @returns The pasted thing if the paste was successful, null otherwise.\n * @alias Blockly.clipboard.paste\n * @internal\n */\nexport function paste(): ICopyable|null {\n if (!copyData) {\n return null;\n }\n // Pasting always pastes to the main workspace, even if the copy\n // started in a flyout workspace.\n let workspace = copyData.source;\n if (workspace.isFlyout) {\n workspace = workspace.targetWorkspace!;\n }\n if (copyData.typeCounts &&\n workspace.isCapacityAvailable(copyData.typeCounts)) {\n return workspace.paste(copyData.saveInfo);\n }\n return null;\n}\n\n/**\n * Duplicate this block and its children, or a workspace comment.\n *\n * @param toDuplicate Block or Workspace Comment to be duplicated.\n * @returns The block or workspace comment that was duplicated, or null if the\n * duplication failed.\n * @alias Blockly.clipboard.duplicate\n * @internal\n */\nexport function duplicate(toDuplicate: ICopyable): ICopyable|null {\n return TEST_ONLY.duplicateInternal(toDuplicate);\n}\n\n/**\n * Private version of duplicate for stubbing in tests.\n */\nfunction duplicateInternal(toDuplicate: ICopyable): ICopyable|null {\n const oldCopyData = copyData;\n copy(toDuplicate);\n const pastedThing =\n toDuplicate.toCopyData()?.source?.paste(copyData!.saveInfo) ?? null;\n copyData = oldCopyData;\n return pastedThing;\n}\n\nexport const TEST_ONLY = {\n duplicateInternal,\n copyInternal,\n};\n","/**\n * @license\n * Copyright 2011 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Functionality for the right-click context menus.\n *\n * @namespace Blockly.ContextMenu\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.ContextMenu');\n\nimport type {Block} from './block.js';\nimport type {BlockSvg} from './block_svg.js';\nimport * as browserEvents from './browser_events.js';\nimport * as clipboard from './clipboard.js';\nimport {config} from './config.js';\nimport * as dom from './utils/dom.js';\nimport type {ContextMenuOption, LegacyContextMenuOption} from './contextmenu_registry.js';\nimport * as eventUtils from './events/utils.js';\nimport {Menu} from './menu.js';\nimport {MenuItem} from './menuitem.js';\nimport {Msg} from './msg.js';\nimport * as aria from './utils/aria.js';\nimport {Coordinate} from './utils/coordinate.js';\nimport {Rect} from './utils/rect.js';\nimport * as svgMath from './utils/svg_math.js';\nimport * as WidgetDiv from './widgetdiv.js';\nimport {WorkspaceCommentSvg} from './workspace_comment_svg.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\nimport * as Xml from './xml.js';\n\n\n/**\n * Which block is the context menu attached to?\n */\nlet currentBlock: Block|null = null;\n\nconst dummyOwner = {};\n\n/**\n * Gets the block the context menu is currently attached to.\n *\n * @returns The block the context menu is attached to.\n * @alias Blockly.ContextMenu.getCurrentBlock\n */\nexport function getCurrentBlock(): Block|null {\n return currentBlock;\n}\n\n/**\n * Sets the block the context menu is currently attached to.\n *\n * @param block The block the context menu is attached to.\n * @alias Blockly.ContextMenu.setCurrentBlock\n */\nexport function setCurrentBlock(block: Block|null) {\n currentBlock = block;\n}\n\n/**\n * Menu object.\n */\nlet menu_: Menu|null = null;\n\n/**\n * Construct the menu based on the list of options and show the menu.\n *\n * @param e Mouse event.\n * @param options Array of menu options.\n * @param rtl True if RTL, false if LTR.\n * @alias Blockly.ContextMenu.show\n */\nexport function show(\n e: Event, options: (ContextMenuOption|LegacyContextMenuOption)[],\n rtl: boolean) {\n WidgetDiv.show(dummyOwner, rtl, dispose);\n if (!options.length) {\n hide();\n return;\n }\n const menu = populate_(options, rtl);\n menu_ = menu;\n\n position_(menu, e, rtl);\n // 1ms delay is required for focusing on context menus because some other\n // mouse event is still waiting in the queue and clears focus.\n setTimeout(function() {\n menu.focus();\n }, 1);\n currentBlock = null; // May be set by Blockly.Block.\n}\n\n/**\n * Create the context menu object and populate it with the given options.\n *\n * @param options Array of menu options.\n * @param rtl True if RTL, false if LTR.\n * @returns The menu that will be shown on right click.\n */\nfunction populate_(\n options: (ContextMenuOption|LegacyContextMenuOption)[],\n rtl: boolean): Menu {\n /* Here's what one option object looks like:\n {text: 'Make It So',\n enabled: true,\n callback: Blockly.MakeItSo}\n */\n const menu = new Menu();\n menu.setRole(aria.Role.MENU);\n for (let i = 0; i < options.length; i++) {\n const option = options[i];\n const menuItem = new MenuItem(option.text);\n menuItem.setRightToLeft(rtl);\n menuItem.setRole(aria.Role.MENUITEM);\n menu.addChild(menuItem);\n menuItem.setEnabled(option.enabled);\n if (option.enabled) {\n const actionHandler = function() {\n hide();\n // If .scope does not exist on the option, then the callback will not\n // be expecting a scope parameter, so there should be no problems. Just\n // assume it is a ContextMenuOption and we'll pass undefined if it's\n // not.\n option.callback((option as ContextMenuOption).scope);\n };\n menuItem.onAction(actionHandler, {});\n }\n }\n return menu;\n}\n\n/**\n * Add the menu to the page and position it correctly.\n *\n * @param menu The menu to add and position.\n * @param e Mouse event for the right click that is making the context\n * menu appear.\n * @param rtl True if RTL, false if LTR.\n */\nfunction position_(menu: Menu, e: Event, rtl: boolean) {\n // Record windowSize and scrollOffset before adding menu.\n const viewportBBox = svgMath.getViewportBBox();\n const mouseEvent = e as MouseEvent;\n // This one is just a point, but we'll pretend that it's a rect so we can use\n // some helper functions.\n const anchorBBox = new Rect(\n mouseEvent.clientY + viewportBBox.top,\n mouseEvent.clientY + viewportBBox.top,\n mouseEvent.clientX + viewportBBox.left,\n mouseEvent.clientX + viewportBBox.left);\n\n createWidget_(menu);\n const menuSize = menu.getSize();\n\n if (rtl) {\n anchorBBox.left += menuSize.width;\n anchorBBox.right += menuSize.width;\n viewportBBox.left += menuSize.width;\n viewportBBox.right += menuSize.width;\n }\n\n WidgetDiv.positionWithAnchor(viewportBBox, anchorBBox, menuSize, rtl);\n // Calling menuDom.focus() has to wait until after the menu has been placed\n // correctly. Otherwise it will cause a page scroll to get the misplaced menu\n // in view. See issue #1329.\n menu.focus();\n}\n\n/**\n * Create and render the menu widget inside Blockly's widget div.\n *\n * @param menu The menu to add to the widget div.\n */\nfunction createWidget_(menu: Menu) {\n const div = WidgetDiv.getDiv();\n if (!div) {\n throw Error('Attempting to create a context menu when widget div is null');\n }\n const menuDom = menu.render(div);\n dom.addClass(menuDom, 'blocklyContextMenu');\n // Prevent system context menu when right-clicking a Blockly context menu.\n browserEvents.conditionalBind(\n (menuDom as EventTarget), 'contextmenu', null, haltPropagation);\n // Focus only after the initial render to avoid issue #1329.\n menu.focus();\n}\n/**\n * Halts the propagation of the event without doing anything else.\n *\n * @param e An event.\n */\nfunction haltPropagation(e: Event) {\n // This event has been handled. No need to bubble up to the document.\n e.preventDefault();\n e.stopPropagation();\n}\n\n/**\n * Hide the context menu.\n *\n * @alias Blockly.ContextMenu.hide\n */\nexport function hide() {\n WidgetDiv.hideIfOwner(dummyOwner);\n currentBlock = null;\n}\n\n/**\n * Dispose of the menu.\n *\n * @alias Blockly.ContextMenu.dispose\n */\nexport function dispose() {\n if (menu_) {\n menu_.dispose();\n menu_ = null;\n }\n}\n\n/**\n * Create a callback function that creates and configures a block,\n * then places the new block next to the original.\n *\n * @param block Original block.\n * @param xml XML representation of new block.\n * @returns Function that creates a block.\n * @alias Blockly.ContextMenu.callbackFactory\n */\nexport function callbackFactory(block: Block, xml: Element): Function {\n return () => {\n eventUtils.disable();\n let newBlock;\n try {\n newBlock = Xml.domToBlock(xml, block.workspace!) as BlockSvg;\n // Move the new block next to the old block.\n const xy = block.getRelativeToSurfaceXY();\n if (block.RTL) {\n xy.x -= config.snapRadius;\n } else {\n xy.x += config.snapRadius;\n }\n xy.y += config.snapRadius * 2;\n newBlock.moveBy(xy.x, xy.y);\n } finally {\n eventUtils.enable();\n }\n if (eventUtils.isEnabled() && !newBlock.isShadow()) {\n eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))(newBlock));\n }\n newBlock.select();\n };\n}\n\n// Helper functions for creating context menu options.\n\n/**\n * Make a context menu option for deleting the current workspace comment.\n *\n * @param comment The workspace comment where the\n * right-click originated.\n * @returns A menu option,\n * containing text, enabled, and a callback.\n * @alias Blockly.ContextMenu.commentDeleteOption\n * @internal\n */\nexport function commentDeleteOption(comment: WorkspaceCommentSvg):\n LegacyContextMenuOption {\n const deleteOption = {\n text: Msg['REMOVE_COMMENT'],\n enabled: true,\n callback: function() {\n eventUtils.setGroup(true);\n comment.dispose();\n eventUtils.setGroup(false);\n },\n };\n return deleteOption;\n}\n\n/**\n * Make a context menu option for duplicating the current workspace comment.\n *\n * @param comment The workspace comment where the\n * right-click originated.\n * @returns A menu option,\n * containing text, enabled, and a callback.\n * @alias Blockly.ContextMenu.commentDuplicateOption\n * @internal\n */\nexport function commentDuplicateOption(comment: WorkspaceCommentSvg):\n LegacyContextMenuOption {\n const duplicateOption = {\n text: Msg['DUPLICATE_COMMENT'],\n enabled: true,\n callback: function() {\n clipboard.duplicate(comment);\n },\n };\n return duplicateOption;\n}\n\n/**\n * Make a context menu option for adding a comment on the workspace.\n *\n * @param ws The workspace where the right-click\n * originated.\n * @param e The right-click mouse event.\n * @returns A menu option, containing text, enabled, and a callback.\n * @suppress {strictModuleDepCheck,checkTypes} Suppress checks while workspace\n * comments are not bundled in.\n * @alias Blockly.ContextMenu.workspaceCommentOption\n * @internal\n */\nexport function workspaceCommentOption(\n ws: WorkspaceSvg, e: Event): ContextMenuOption {\n /**\n * Helper function to create and position a comment correctly based on the\n * location of the mouse event.\n */\n function addWsComment() {\n const comment = new WorkspaceCommentSvg(\n ws, Msg['WORKSPACE_COMMENT_DEFAULT_TEXT'],\n WorkspaceCommentSvg.DEFAULT_SIZE, WorkspaceCommentSvg.DEFAULT_SIZE);\n\n const injectionDiv = ws.getInjectionDiv();\n // Bounding rect coordinates are in client coordinates, meaning that they\n // are in pixels relative to the upper left corner of the visible browser\n // window. These coordinates change when you scroll the browser window.\n const boundingRect = injectionDiv.getBoundingClientRect();\n\n // The client coordinates offset by the injection div's upper left corner.\n const mouseEvent = e as MouseEvent;\n const clientOffsetPixels = new Coordinate(\n mouseEvent.clientX - boundingRect.left,\n mouseEvent.clientY - boundingRect.top);\n\n // The offset in pixels between the main workspace's origin and the upper\n // left corner of the injection div.\n const mainOffsetPixels = ws.getOriginOffsetInPixels();\n\n // The position of the new comment in pixels relative to the origin of the\n // main workspace.\n const finalOffset =\n Coordinate.difference(clientOffsetPixels, mainOffsetPixels);\n // The position of the new comment in main workspace coordinates.\n finalOffset.scale(1 / ws.scale);\n\n const commentX = finalOffset.x;\n const commentY = finalOffset.y;\n comment.moveBy(commentX, commentY);\n if (ws.rendered) {\n comment.initSvg();\n comment.render();\n comment.select();\n }\n }\n\n const wsCommentOption = {\n enabled: true,\n } as ContextMenuOption;\n wsCommentOption.text = Msg['ADD_COMMENT'];\n wsCommentOption.callback = function() {\n addWsComment();\n };\n return wsCommentOption;\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility functions for positioning UI elements.\n *\n * @namespace Blockly.uiPosition\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.uiPosition');\n\nimport type {UiMetrics} from './metrics_manager.js';\nimport {Scrollbar} from './scrollbar.js';\nimport {Rect} from './utils/rect.js';\nimport type {Size} from './utils/size.js';\nimport * as toolbox from './utils/toolbox.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/**\n * Enum for vertical positioning.\n *\n * @alias Blockly.uiPosition.verticalPosition\n * @internal\n */\nexport enum verticalPosition {\n TOP,\n BOTTOM\n}\n\n/**\n * Enum for horizontal positioning.\n *\n * @alias Blockly.uiPosition.horizontalPosition\n * @internal\n */\nexport enum horizontalPosition {\n LEFT,\n RIGHT\n}\n\n/**\n * An object defining a horizontal and vertical positioning.\n *\n * @alias Blockly.uiPosition.Position\n * @internal\n */\nexport interface Position {\n horizontal: horizontalPosition;\n vertical: verticalPosition;\n}\n\n/**\n * Enum for bump rules to use for dealing with collisions.\n *\n * @alias Blockly.uiPosition.bumpDirection\n * @internal\n */\nexport enum bumpDirection {\n UP,\n DOWN\n}\n\n/**\n * Returns a rectangle representing reasonable position for where to place a UI\n * element of the specified size given the restraints and locations of the\n * scrollbars. This method does not take into account any already placed UI\n * elements.\n *\n * @param position The starting horizontal and vertical position.\n * @param size the size of the UI element to get a start position for.\n * @param horizontalPadding The horizontal padding to use.\n * @param verticalPadding The vertical padding to use.\n * @param metrics The workspace UI metrics.\n * @param workspace The workspace.\n * @returns The suggested start position.\n * @alias Blockly.uiPosition.getStartPositionRect\n * @internal\n */\nexport function getStartPositionRect(\n position: Position, size: Size, horizontalPadding: number,\n verticalPadding: number, metrics: UiMetrics,\n workspace: WorkspaceSvg): Rect {\n // Horizontal positioning.\n let left = 0;\n const hasVerticalScrollbar =\n workspace.scrollbar && workspace.scrollbar.canScrollVertically();\n if (position.horizontal === horizontalPosition.LEFT) {\n left = metrics.absoluteMetrics.left + horizontalPadding;\n if (hasVerticalScrollbar && workspace.RTL) {\n left += Scrollbar.scrollbarThickness;\n }\n } else { // position.horizontal === horizontalPosition.RIGHT\n left = metrics.absoluteMetrics.left + metrics.viewMetrics.width -\n size.width - horizontalPadding;\n if (hasVerticalScrollbar && !workspace.RTL) {\n left -= Scrollbar.scrollbarThickness;\n }\n }\n // Vertical positioning.\n let top = 0;\n if (position.vertical === verticalPosition.TOP) {\n top = metrics.absoluteMetrics.top + verticalPadding;\n } else { // position.vertical === verticalPosition.BOTTOM\n top = metrics.absoluteMetrics.top + metrics.viewMetrics.height -\n size.height - verticalPadding;\n if (workspace.scrollbar && workspace.scrollbar.canScrollHorizontally()) {\n // The scrollbars are always positioned on the bottom if they exist.\n top -= Scrollbar.scrollbarThickness;\n }\n }\n return new Rect(top, top + size.height, left, left + size.width);\n}\n\n/**\n * Returns a corner position that is on the opposite side of the workspace from\n * the toolbox.\n * If in horizontal orientation, defaults to the bottom corner. If in vertical\n * orientation, defaults to the right corner.\n *\n * @param workspace The workspace.\n * @param metrics The workspace metrics.\n * @returns The suggested corner position.\n * @alias Blockly.uiPosition.getCornerOppositeToolbox\n * @internal\n */\nexport function getCornerOppositeToolbox(\n workspace: WorkspaceSvg, metrics: UiMetrics): Position {\n const leftCorner =\n metrics.toolboxMetrics.position !== toolbox.Position.LEFT &&\n (!workspace.horizontalLayout || workspace.RTL);\n const topCorner = metrics.toolboxMetrics.position === toolbox.Position.BOTTOM;\n const hPosition =\n leftCorner ? horizontalPosition.LEFT : horizontalPosition.RIGHT;\n const vPosition = topCorner ? verticalPosition.TOP : verticalPosition.BOTTOM;\n return {horizontal: hPosition, vertical: vPosition};\n}\n\n/**\n * Returns a position Rect based on a starting position that is bumped\n * so that it doesn't intersect with any of the provided savedPositions. This\n * method does not check that the bumped position is still within bounds.\n *\n * @param startRect The starting position to use.\n * @param margin The margin to use between elements when bumping.\n * @param bumpDir The direction to bump if there is a collision with an existing\n * UI element.\n * @param savedPositions List of rectangles that represent the positions of UI\n * elements already placed.\n * @returns The suggested position rectangle.\n * @alias Blockly.uiPosition.bumpPositionRect\n * @internal\n */\nexport function bumpPositionRect(\n startRect: Rect, margin: number, bumpDir: bumpDirection,\n savedPositions: Rect[]): Rect {\n let top = startRect.top;\n const left = startRect.left;\n const width = startRect.right - startRect.left;\n const height = startRect.bottom - startRect.top;\n\n // Check for collision and bump if needed.\n let boundingRect = startRect;\n for (let i = 0; i < savedPositions.length; i++) {\n const otherEl = savedPositions[i];\n if (boundingRect.intersects(otherEl)) {\n if (bumpDir === bumpDirection.UP) {\n top = otherEl.top - height - margin;\n } else { // bumpDir === bumpDirection.DOWN\n top = otherEl.bottom + margin;\n }\n // Recheck other savedPositions\n boundingRect = new Rect(top, top + height, left, left + width);\n i = -1;\n }\n }\n return boundingRect;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Registers default keyboard shortcuts.\n *\n * @namespace Blockly.ShortcutItems\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.ShortcutItems');\n\nimport {BlockSvg} from './block_svg.js';\nimport * as clipboard from './clipboard.js';\nimport * as common from './common.js';\nimport {Gesture} from './gesture.js';\nimport type {ICopyable} from './interfaces/i_copyable.js';\nimport {KeyboardShortcut, ShortcutRegistry} from './shortcut_registry.js';\nimport {KeyCodes} from './utils/keycodes.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\n\n\n/**\n * Object holding the names of the default shortcut items.\n *\n * @alias Blockly.ShortcutItems.names\n */\nexport enum names {\n ESCAPE = 'escape',\n DELETE = 'delete',\n COPY = 'copy',\n CUT = 'cut',\n PASTE = 'paste',\n UNDO = 'undo',\n REDO = 'redo'\n}\n\n/**\n * Keyboard shortcut to hide chaff on escape.\n *\n * @alias Blockly.ShortcutItems.registerEscape\n */\nexport function registerEscape() {\n const escapeAction: KeyboardShortcut = {\n name: names.ESCAPE,\n preconditionFn(workspace) {\n return !workspace.options.readOnly;\n },\n callback(workspace) {\n // AnyDuringMigration because: Property 'hideChaff' does not exist on\n // type 'Workspace'.\n (workspace as AnyDuringMigration).hideChaff();\n return true;\n },\n keyCodes: [KeyCodes.ESC],\n };\n ShortcutRegistry.registry.register(escapeAction);\n}\n\n/**\n * Keyboard shortcut to delete a block on delete or backspace\n *\n * @alias Blockly.ShortcutItems.registerDelete\n */\nexport function registerDelete() {\n const deleteShortcut: KeyboardShortcut = {\n name: names.DELETE,\n preconditionFn(workspace) {\n const selected = common.getSelected();\n return !workspace.options.readOnly && selected != null &&\n selected.isDeletable();\n },\n callback(workspace, e) {\n // Delete or backspace.\n // Stop the browser from going back to the previous page.\n // Do this first to prevent an error in the delete code from resulting in\n // data loss.\n e.preventDefault();\n // Don't delete while dragging. Jeez.\n if (Gesture.inProgress()) {\n return false;\n }\n (common.getSelected() as BlockSvg).checkAndDelete();\n return true;\n },\n keyCodes: [KeyCodes.DELETE, KeyCodes.BACKSPACE],\n };\n ShortcutRegistry.registry.register(deleteShortcut);\n}\n\n/**\n * Keyboard shortcut to copy a block on ctrl+c, cmd+c, or alt+c.\n *\n * @alias Blockly.ShortcutItems.registerCopy\n */\nexport function registerCopy() {\n const ctrlC = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.C, [KeyCodes.CTRL]);\n const altC =\n ShortcutRegistry.registry.createSerializedKey(KeyCodes.C, [KeyCodes.ALT]);\n const metaC = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.C, [KeyCodes.META]);\n\n const copyShortcut: KeyboardShortcut = {\n name: names.COPY,\n preconditionFn(workspace) {\n const selected = common.getSelected();\n return !workspace.options.readOnly && !Gesture.inProgress() &&\n selected != null && selected.isDeletable() && selected.isMovable();\n },\n callback(workspace, e) {\n // Prevent the default copy behavior, which may beep or otherwise indicate\n // an error due to the lack of a selection.\n e.preventDefault();\n // AnyDuringMigration because: Property 'hideChaff' does not exist on\n // type 'Workspace'.\n (workspace as AnyDuringMigration).hideChaff();\n clipboard.copy(common.getSelected() as ICopyable);\n return true;\n },\n keyCodes: [ctrlC, altC, metaC],\n };\n ShortcutRegistry.registry.register(copyShortcut);\n}\n\n/**\n * Keyboard shortcut to copy and delete a block on ctrl+x, cmd+x, or alt+x.\n *\n * @alias Blockly.ShortcutItems.registerCut\n */\nexport function registerCut() {\n const ctrlX = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.X, [KeyCodes.CTRL]);\n const altX =\n ShortcutRegistry.registry.createSerializedKey(KeyCodes.X, [KeyCodes.ALT]);\n const metaX = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.X, [KeyCodes.META]);\n\n const cutShortcut: KeyboardShortcut = {\n name: names.CUT,\n preconditionFn(workspace) {\n const selected = common.getSelected();\n return !workspace.options.readOnly && !Gesture.inProgress() &&\n selected != null && selected instanceof BlockSvg &&\n selected.isDeletable() && selected.isMovable() &&\n !selected.workspace!.isFlyout;\n },\n callback() {\n const selected = common.getSelected();\n if (!selected) {\n // Shouldn't happen but appeases the type system\n return false;\n }\n clipboard.copy(selected);\n (selected as BlockSvg).checkAndDelete();\n return true;\n },\n keyCodes: [ctrlX, altX, metaX],\n };\n\n ShortcutRegistry.registry.register(cutShortcut);\n}\n\n/**\n * Keyboard shortcut to paste a block on ctrl+v, cmd+v, or alt+v.\n *\n * @alias Blockly.ShortcutItems.registerPaste\n */\nexport function registerPaste() {\n const ctrlV = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.V, [KeyCodes.CTRL]);\n const altV =\n ShortcutRegistry.registry.createSerializedKey(KeyCodes.V, [KeyCodes.ALT]);\n const metaV = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.V, [KeyCodes.META]);\n\n const pasteShortcut: KeyboardShortcut = {\n name: names.PASTE,\n preconditionFn(workspace) {\n return !workspace.options.readOnly && !Gesture.inProgress();\n },\n callback() {\n return !!(clipboard.paste());\n },\n keyCodes: [ctrlV, altV, metaV],\n };\n\n ShortcutRegistry.registry.register(pasteShortcut);\n}\n\n/**\n * Keyboard shortcut to undo the previous action on ctrl+z, cmd+z, or alt+z.\n *\n * @alias Blockly.ShortcutItems.registerUndo\n */\nexport function registerUndo() {\n const ctrlZ = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Z, [KeyCodes.CTRL]);\n const altZ =\n ShortcutRegistry.registry.createSerializedKey(KeyCodes.Z, [KeyCodes.ALT]);\n const metaZ = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Z, [KeyCodes.META]);\n\n const undoShortcut: KeyboardShortcut = {\n name: names.UNDO,\n preconditionFn(workspace) {\n return !workspace.options.readOnly && !Gesture.inProgress();\n },\n callback(workspace) {\n // 'z' for undo 'Z' is for redo.\n (workspace as WorkspaceSvg).hideChaff();\n workspace.undo(false);\n return true;\n },\n keyCodes: [ctrlZ, altZ, metaZ],\n };\n ShortcutRegistry.registry.register(undoShortcut);\n}\n\n/**\n * Keyboard shortcut to redo the previous action on ctrl+shift+z, cmd+shift+z,\n * or alt+shift+z.\n *\n * @alias Blockly.ShortcutItems.registerRedo\n */\nexport function registerRedo() {\n const ctrlShiftZ = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Z, [KeyCodes.SHIFT, KeyCodes.CTRL]);\n const altShiftZ = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Z, [KeyCodes.SHIFT, KeyCodes.ALT]);\n const metaShiftZ = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Z, [KeyCodes.SHIFT, KeyCodes.META]);\n // Ctrl-y is redo in Windows. Command-y is never valid on Macs.\n const ctrlY = ShortcutRegistry.registry.createSerializedKey(\n KeyCodes.Y, [KeyCodes.CTRL]);\n\n const redoShortcut: KeyboardShortcut = {\n name: names.REDO,\n preconditionFn(workspace) {\n return !Gesture.inProgress() && !workspace.options.readOnly;\n },\n callback(workspace) {\n // 'z' for undo 'Z' is for redo.\n (workspace as WorkspaceSvg).hideChaff();\n workspace.undo(true);\n return true;\n },\n keyCodes: [ctrlShiftZ, altShiftZ, metaShiftZ, ctrlY],\n };\n ShortcutRegistry.registry.register(redoShortcut);\n}\n\n/**\n * Registers all default keyboard shortcut item. This should be called once per\n * instance of KeyboardShortcutRegistry.\n *\n * @alias Blockly.ShortcutItems.registerDefaultShortcuts\n * @internal\n */\nexport function registerDefaultShortcuts() {\n registerEscape();\n registerDelete();\n registerCopy();\n registerCut();\n registerPaste();\n registerUndo();\n registerRedo();\n}\n\nregisterDefaultShortcuts();\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Utility functions for handling procedures.\n *\n * @namespace Blockly.Procedures\n */\nimport * as goog from '../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.Procedures');\n\n// Unused import preserved for side-effects. Remove if unneeded.\nimport './events/events_block_change.js';\n\nimport type {Block} from './block.js';\nimport type {BlockSvg} from './block_svg.js';\nimport {Blocks} from './blocks.js';\nimport * as common from './common.js';\nimport type {Abstract} from './events/events_abstract.js';\nimport type {BubbleOpen} from './events/events_bubble_open.js';\nimport * as eventUtils from './events/utils.js';\nimport type {Field} from './field.js';\nimport {Msg} from './msg.js';\nimport {Names} from './names.js';\nimport * as utilsXml from './utils/xml.js';\nimport * as Variables from './variables.js';\nimport type {Workspace} from './workspace.js';\nimport type {WorkspaceSvg} from './workspace_svg.js';\nimport * as Xml from './xml.js';\n\n\n/**\n * String for use in the \"custom\" attribute of a category in toolbox XML.\n * This string indicates that the category should be dynamically populated with\n * procedure blocks.\n * See also Blockly.Variables.CATEGORY_NAME and\n * Blockly.VariablesDynamic.CATEGORY_NAME.\n *\n * @alias Blockly.Procedures.CATEGORY_NAME\n */\nexport const CATEGORY_NAME = 'PROCEDURE';\n\n/**\n * The default argument for a procedures_mutatorarg block.\n *\n * @alias Blockly.Procedures.DEFAULT_ARG\n */\nexport const DEFAULT_ARG = 'x';\n\nexport type ProcedureTuple = [string, string[], boolean];\n\n/**\n * Procedure block type.\n *\n * @alias Blockly.Procedures.ProcedureBlock\n */\nexport interface ProcedureBlock {\n getProcedureCall: () => string;\n renameProcedure: (p1: string, p2: string) => void;\n getProcedureDef: () => ProcedureTuple;\n}\n\n/**\n * Find all user-created procedure definitions in a workspace.\n *\n * @param root Root workspace.\n * @returns Pair of arrays, the first contains procedures without return\n * variables, the second with. Each procedure is defined by a three-element\n * list of name, parameter list, and return value boolean.\n * @alias Blockly.Procedures.allProcedures\n */\nexport function allProcedures(root: Workspace):\n [ProcedureTuple[], ProcedureTuple[]] {\n const proceduresNoReturn =\n root.getBlocksByType('procedures_defnoreturn', false)\n .map(function(block) {\n return (block as unknown as ProcedureBlock).getProcedureDef();\n });\n const proceduresReturn =\n root.getBlocksByType('procedures_defreturn', false).map(function(block) {\n return (block as unknown as ProcedureBlock).getProcedureDef();\n });\n proceduresNoReturn.sort(procTupleComparator);\n proceduresReturn.sort(procTupleComparator);\n return [proceduresNoReturn, proceduresReturn];\n}\n\n/**\n * Comparison function for case-insensitive sorting of the first element of\n * a tuple.\n *\n * @param ta First tuple.\n * @param tb Second tuple.\n * @returns -1, 0, or 1 to signify greater than, equality, or less than.\n */\nfunction procTupleComparator(ta: ProcedureTuple, tb: ProcedureTuple): number {\n return ta[0].localeCompare(tb[0], undefined, {sensitivity: 'base'});\n}\n\n/**\n * Ensure two identically-named procedures don't exist.\n * Take the proposed procedure name, and return a legal name i.e. one that\n * is not empty and doesn't collide with other procedures.\n *\n * @param name Proposed procedure name.\n * @param block Block to disambiguate.\n * @returns Non-colliding name.\n * @alias Blockly.Procedures.findLegalName\n */\nexport function findLegalName(name: string, block: Block): string {\n if (block.isInFlyout) {\n // Flyouts can have multiple procedures called 'do something'.\n return name;\n }\n name = name || Msg['UNNAMED_KEY'] || 'unnamed';\n while (!isLegalName(name, block.workspace, block)) {\n // Collision with another procedure.\n const r = name.match(/^(.*?)(\\d+)$/);\n if (!r) {\n name += '2';\n } else {\n name = r[1] + (parseInt(r[2]) + 1);\n }\n }\n return name;\n}\n/**\n * Does this procedure have a legal name? Illegal names include names of\n * procedures already defined.\n *\n * @param name The questionable name.\n * @param workspace The workspace to scan for collisions.\n * @param opt_exclude Optional block to exclude from comparisons (one doesn't\n * want to collide with oneself).\n * @returns True if the name is legal.\n */\nfunction isLegalName(\n name: string, workspace: Workspace, opt_exclude?: Block): boolean {\n return !isNameUsed(name, workspace, opt_exclude);\n}\n\n/**\n * Return if the given name is already a procedure name.\n *\n * @param name The questionable name.\n * @param workspace The workspace to scan for collisions.\n * @param opt_exclude Optional block to exclude from comparisons (one doesn't\n * want to collide with oneself).\n * @returns True if the name is used, otherwise return false.\n * @alias Blockly.Procedures.isNameUsed\n */\nexport function isNameUsed(\n name: string, workspace: Workspace, opt_exclude?: Block): boolean {\n const blocks = workspace.getAllBlocks(false);\n // Iterate through every block and check the name.\n for (let i = 0; i < blocks.length; i++) {\n if (blocks[i] === opt_exclude) {\n continue;\n }\n // Assume it is a procedure block so we can check.\n const procedureBlock = blocks[i] as unknown as ProcedureBlock;\n if (procedureBlock.getProcedureDef) {\n const procName = procedureBlock.getProcedureDef();\n if (Names.equals(procName[0], name)) {\n return true;\n }\n }\n }\n return false;\n}\n\n/**\n * Rename a procedure. Called by the editable field.\n *\n * @param name The proposed new name.\n * @returns The accepted name.\n * @alias Blockly.Procedures.rename\n */\nexport function rename(this: Field, name: string): string {\n // Strip leading and trailing whitespace. Beyond this, all names are legal.\n name = name.trim();\n\n const legalName = findLegalName(name, (this.getSourceBlock()));\n const oldName = this.getValue();\n if (oldName !== name && oldName !== legalName) {\n // Rename any callers.\n const blocks = this.getSourceBlock().workspace.getAllBlocks(false);\n for (let i = 0; i < blocks.length; i++) {\n // Assume it is a procedure so we can check.\n const procedureBlock = blocks[i] as unknown as ProcedureBlock;\n if (procedureBlock.renameProcedure) {\n procedureBlock.renameProcedure(oldName as string, legalName);\n }\n }\n }\n return legalName;\n}\n\n/**\n * Construct the blocks required by the flyout for the procedure category.\n *\n * @param workspace The workspace containing procedures.\n * @returns Array of XML block elements.\n * @alias Blockly.Procedures.flyoutCategory\n */\nexport function flyoutCategory(workspace: WorkspaceSvg): Element[] {\n const xmlList = [];\n if (Blocks['procedures_defnoreturn']) {\n // \n // do something\n // \n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'procedures_defnoreturn');\n block.setAttribute('gap', '16');\n const nameField = utilsXml.createElement('field');\n nameField.setAttribute('name', 'NAME');\n nameField.appendChild(\n utilsXml.createTextNode(Msg['PROCEDURES_DEFNORETURN_PROCEDURE']));\n block.appendChild(nameField);\n xmlList.push(block);\n }\n if (Blocks['procedures_defreturn']) {\n // \n // do something\n // \n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'procedures_defreturn');\n block.setAttribute('gap', '16');\n const nameField = utilsXml.createElement('field');\n nameField.setAttribute('name', 'NAME');\n nameField.appendChild(\n utilsXml.createTextNode(Msg['PROCEDURES_DEFRETURN_PROCEDURE']));\n block.appendChild(nameField);\n xmlList.push(block);\n }\n if (Blocks['procedures_ifreturn']) {\n // \n const block = utilsXml.createElement('block');\n block.setAttribute('type', 'procedures_ifreturn');\n block.setAttribute('gap', '16');\n xmlList.push(block);\n }\n if (xmlList.length) {\n // Add slightly larger gap between system blocks and user calls.\n xmlList[xmlList.length - 1].setAttribute('gap', '24');\n }\n\n /**\n * Add items to xmlList for each listed procedure.\n *\n * @param procedureList A list of procedures, each of which is defined by a\n * three-element list of name, parameter list, and return value boolean.\n * @param templateName The type of the block to generate.\n */\n function populateProcedures(\n procedureList: ProcedureTuple[], templateName: string) {\n for (let i = 0; i < procedureList.length; i++) {\n const name = procedureList[i][0];\n const args = procedureList[i][1];\n // \n // \n // \n // \n // \n const block = utilsXml.createElement('block');\n block.setAttribute('type', templateName);\n block.setAttribute('gap', '16');\n const mutation = utilsXml.createElement('mutation');\n mutation.setAttribute('name', name);\n block.appendChild(mutation);\n for (let j = 0; j < args.length; j++) {\n const arg = utilsXml.createElement('arg');\n arg.setAttribute('name', args[j]);\n mutation.appendChild(arg);\n }\n xmlList.push(block);\n }\n }\n\n const tuple = allProcedures(workspace);\n populateProcedures(tuple[0], 'procedures_callnoreturn');\n populateProcedures(tuple[1], 'procedures_callreturn');\n return xmlList;\n}\n\n/**\n * Updates the procedure mutator's flyout so that the arg block is not a\n * duplicate of another arg.\n *\n * @param workspace The procedure mutator's workspace. This workspace's flyout\n * is what is being updated.\n */\nfunction updateMutatorFlyout(workspace: WorkspaceSvg) {\n const usedNames = [];\n const blocks = workspace.getBlocksByType('procedures_mutatorarg', false);\n for (let i = 0, block; block = blocks[i]; i++) {\n usedNames.push(block.getFieldValue('NAME'));\n }\n\n const xmlElement = utilsXml.createElement('xml');\n const argBlock = utilsXml.createElement('block');\n argBlock.setAttribute('type', 'procedures_mutatorarg');\n const nameField = utilsXml.createElement('field');\n nameField.setAttribute('name', 'NAME');\n const argValue =\n Variables.generateUniqueNameFromOptions(DEFAULT_ARG, usedNames);\n const fieldContent = utilsXml.createTextNode(argValue);\n\n nameField.appendChild(fieldContent);\n argBlock.appendChild(nameField);\n xmlElement.appendChild(argBlock);\n\n workspace.updateToolbox(xmlElement);\n}\n\n/**\n * Listens for when a procedure mutator is opened. Then it triggers a flyout\n * update and adds a mutator change listener to the mutator workspace.\n *\n * @param e The event that triggered this listener.\n * @alias Blockly.Procedures.mutatorOpenListener\n * @internal\n */\nexport function mutatorOpenListener(e: Abstract) {\n if (e.type !== eventUtils.BUBBLE_OPEN) {\n return;\n }\n const bubbleEvent = e as BubbleOpen;\n if (!(bubbleEvent.bubbleType === 'mutator' && bubbleEvent.isOpen) ||\n !bubbleEvent.blockId) {\n return;\n }\n const workspaceId = (bubbleEvent.workspaceId);\n const block = common.getWorkspaceById(workspaceId)!.getBlockById(\n bubbleEvent.blockId) as BlockSvg;\n const type = block.type;\n if (type !== 'procedures_defnoreturn' && type !== 'procedures_defreturn') {\n return;\n }\n const workspace = block.mutator!.getWorkspace() as WorkspaceSvg;\n updateMutatorFlyout(workspace);\n workspace.addChangeListener(mutatorChangeListener);\n}\n/**\n * Listens for changes in a procedure mutator and triggers flyout updates when\n * necessary.\n *\n * @param e The event that triggered this listener.\n */\nfunction mutatorChangeListener(e: Abstract) {\n if (e.type !== eventUtils.BLOCK_CREATE &&\n e.type !== eventUtils.BLOCK_DELETE &&\n e.type !== eventUtils.BLOCK_CHANGE) {\n return;\n }\n const workspaceId = e.workspaceId as string;\n const workspace = common.getWorkspaceById(workspaceId) as WorkspaceSvg;\n updateMutatorFlyout(workspace);\n}\n\n/**\n * Find all the callers of a named procedure.\n *\n * @param name Name of procedure.\n * @param workspace The workspace to find callers in.\n * @returns Array of caller blocks.\n * @alias Blockly.Procedures.getCallers\n */\nexport function getCallers(name: string, workspace: Workspace): Block[] {\n const callers = [];\n const blocks = workspace.getAllBlocks(false);\n // Iterate through every block and check the name.\n for (let i = 0; i < blocks.length; i++) {\n // Assume it is a procedure block so we can check.\n const procedureBlock = blocks[i] as unknown as ProcedureBlock;\n if (procedureBlock.getProcedureCall) {\n const procName = procedureBlock.getProcedureCall();\n // Procedure name may be null if the block is only half-built.\n if (procName && Names.equals(procName, name)) {\n callers.push(blocks[i]);\n }\n }\n }\n return callers;\n}\n\n/**\n * When a procedure definition changes its parameters, find and edit all its\n * callers.\n *\n * @param defBlock Procedure definition block.\n * @alias Blockly.Procedures.mutateCallers\n */\nexport function mutateCallers(defBlock: Block) {\n const oldRecordUndo = eventUtils.getRecordUndo();\n const procedureBlock = defBlock as unknown as ProcedureBlock;\n const name = procedureBlock.getProcedureDef()[0];\n const xmlElement = defBlock.mutationToDom!(true);\n const callers = getCallers(name, defBlock.workspace);\n for (let i = 0, caller; caller = callers[i]; i++) {\n const oldMutationDom = caller.mutationToDom!();\n const oldMutation = oldMutationDom && Xml.domToText(oldMutationDom);\n if (caller.domToMutation) {\n caller.domToMutation(xmlElement);\n }\n const newMutationDom = caller.mutationToDom!();\n const newMutation = newMutationDom && Xml.domToText(newMutationDom);\n if (oldMutation !== newMutation) {\n // Fire a mutation on every caller block. But don't record this as an\n // undo action since it is deterministically tied to the procedure's\n // definition mutation.\n eventUtils.setRecordUndo(false);\n eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))(\n caller, 'mutation', null, oldMutation, newMutation));\n eventUtils.setRecordUndo(oldRecordUndo);\n }\n }\n}\n\n/**\n * Find the definition block for the named procedure.\n *\n * @param name Name of procedure.\n * @param workspace The workspace to search.\n * @returns The procedure definition block, or null not found.\n * @alias Blockly.Procedures.getDefinition\n */\nexport function getDefinition(name: string, workspace: Workspace): Block|null {\n // Do not assume procedure is a top block. Some languages allow nested\n // procedures. Also do not assume it is one of the built-in blocks. Only\n // rely on getProcedureDef.\n const blocks = workspace.getAllBlocks(false);\n for (let i = 0; i < blocks.length; i++) {\n // Assume it is a procedure block so we can check.\n const procedureBlock = blocks[i] as unknown as ProcedureBlock;\n if (procedureBlock.getProcedureDef) {\n const tuple = procedureBlock.getProcedureDef();\n if (tuple && Names.equals(tuple[0], name)) {\n return blocks[i]; // Can't use procedureBlock var due to type check.\n }\n }\n }\n return null;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * An object that provides constants for rendering blocks.\n *\n * @class\n */\nimport * as goog from '../../../closure/goog/goog.js';\ngoog.declareModuleId('Blockly.blockRendering.ConstantProvider');\n\nimport {ConnectionType} from '../../connection_type.js';\nimport type {RenderedConnection} from '../../rendered_connection.js';\nimport type {BlockStyle, Theme} from '../../theme.js';\nimport * as colour from '../../utils/colour.js';\nimport * as dom from '../../utils/dom.js';\nimport * as parsing from '../../utils/parsing.js';\nimport {Svg} from '../../utils/svg.js';\nimport * as svgPaths from '../../utils/svg_paths.js';\n\n\n/** An object containing sizing and path information about outside corners. */\nexport interface OutsideCorners {\n topLeft: string;\n topRight: string;\n bottomRight: string;\n bottomLeft: string;\n rightHeight: number;\n}\n\n/** An object containing sizing and path information about inside corners. */\nexport interface InsideCorners {\n width: number;\n height: number;\n pathTop: string;\n pathBottom: string;\n}\n\n/** An object containing sizing and path information about a start hat. */\nexport interface StartHat {\n height: number;\n width: number;\n path: string;\n}\n\n/** An object containing sizing and path information about a notch. */\nexport interface Notch {\n type: number;\n width: number;\n height: number;\n pathLeft: string;\n pathRight: string;\n}\n\n/** An object containing sizing and path information about a puzzle tab. */\nexport interface PuzzleTab {\n type: number;\n width: number;\n height: number;\n pathDown: string|((p1: number) => string);\n pathUp: string|((p1: number) => string);\n}\n\n/**\n * An object containing sizing and path information about collapsed block\n * indicators.\n */\nexport interface JaggedTeeth {\n height: number;\n width: number;\n path: string;\n}\n\nexport type BaseShape = {\n type: number; width: number; height: number;\n};\n\n/** An object containing sizing and type information about a dynamic shape. */\nexport type DynamicShape = {\n type: number; width: (p1: number) => number; height: (p1: number) => number;\n isDynamic: true;\n connectionOffsetY: (p1: number) => number;\n connectionOffsetX: (p1: number) => number;\n pathDown: (p1: number) => string;\n pathUp: (p1: number) => string;\n pathRightDown: (p1: number) => string;\n pathRightUp: (p1: number) => string;\n};\n\n/** An object containing sizing and type information about a shape. */\nexport type Shape = BaseShape|DynamicShape;\n\n/**\n * Returns whether the shape is dynamic or not.\n *\n * @param shape The shape to check for dynamic-ness.\n * @returns Whether the shape is a dynamic shape or not.\n */\nexport function isDynamicShape(shape: Shape): shape is DynamicShape {\n return (shape as DynamicShape).isDynamic;\n}\n\n/**\n * An object that provides constants for rendering blocks.\n *\n * @alias Blockly.blockRendering.ConstantProvider\n */\nexport class ConstantProvider {\n /** The size of an empty spacer. */\n NO_PADDING = 0;\n\n /** The size of small padding. */\n SMALL_PADDING = 3;\n\n /** The size of medium padding. */\n MEDIUM_PADDING = 5;\n\n /** The size of medium-large padding. */\n MEDIUM_LARGE_PADDING = 8;\n\n /** The size of large padding. */\n LARGE_PADDING = 10;\n TALL_INPUT_FIELD_OFFSET_Y: number;\n\n /** The height of the puzzle tab used for input and output connections. */\n TAB_HEIGHT = 15;\n\n /**\n * The offset from the top of the block at which a puzzle tab is positioned.\n */\n TAB_OFFSET_FROM_TOP = 5;\n\n /**\n * Vertical overlap of the puzzle tab, used to make it look more like a\n * puzzle piece.\n */\n TAB_VERTICAL_OVERLAP = 2.5;\n\n /** The width of the puzzle tab used for input and output connections. */\n TAB_WIDTH = 8;\n\n /** The width of the notch used for previous and next connections. */\n NOTCH_WIDTH = 15;\n\n /** The height of the notch used for previous and next connections. */\n NOTCH_HEIGHT = 4;\n\n /** The minimum width of the block. */\n MIN_BLOCK_WIDTH = 12;\n EMPTY_BLOCK_SPACER_HEIGHT = 16;\n DUMMY_INPUT_MIN_HEIGHT: number;\n DUMMY_INPUT_SHADOW_MIN_HEIGHT: number;\n\n /** Rounded corner radius. */\n CORNER_RADIUS = 8;\n\n /**\n * Offset from the left side of a block or the inside of a statement input\n * to the left side of the notch.\n */\n NOTCH_OFFSET_LEFT = 15;\n STATEMENT_INPUT_NOTCH_OFFSET: number;\n\n STATEMENT_BOTTOM_SPACER = 0;\n STATEMENT_INPUT_PADDING_LEFT = 20;\n\n /** Vertical padding between consecutive statement inputs. */\n BETWEEN_STATEMENT_PADDING_Y = 4;\n TOP_ROW_MIN_HEIGHT: number;\n TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT: number;\n BOTTOM_ROW_MIN_HEIGHT: number;\n BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT: number;\n\n /**\n * Whether to add a 'hat' on top of all blocks with no previous or output\n * connections. Can be overridden by 'hat' property on Theme.BlockStyle.\n */\n ADD_START_HATS = false;\n\n /** Height of the top hat. */\n START_HAT_HEIGHT = 15;\n\n /** Width of the top hat. */\n START_HAT_WIDTH = 100;\n\n SPACER_DEFAULT_HEIGHT = 15;\n\n MIN_BLOCK_HEIGHT = 24;\n\n EMPTY_INLINE_INPUT_PADDING = 14.5;\n EMPTY_INLINE_INPUT_HEIGHT: number;\n\n EXTERNAL_VALUE_INPUT_PADDING = 2;\n EMPTY_STATEMENT_INPUT_HEIGHT: number;\n START_POINT: string;\n\n /** Height of SVG path for jagged teeth at the end of collapsed blocks. */\n JAGGED_TEETH_HEIGHT = 12;\n\n /** Width of SVG path for jagged teeth at the end of collapsed blocks. */\n JAGGED_TEETH_WIDTH = 6;\n\n /** Point size of text. */\n FIELD_TEXT_FONTSIZE = 11;\n\n /** Text font weight. */\n FIELD_TEXT_FONTWEIGHT = 'normal';\n\n /** Text font family. */\n FIELD_TEXT_FONTFAMILY = 'sans-serif';\n\n /**\n * Height of text. This constant is dynamically set in\n * `setFontConstants_` to be the height of the text based on the font\n * used.\n */\n FIELD_TEXT_HEIGHT = -1; // Dynamically set.\n\n /**\n * Text baseline. This constant is dynamically set in `setFontConstants_`\n * to be the baseline of the text based on the font used.\n */\n FIELD_TEXT_BASELINE = -1; // Dynamically set.\n\n /** A field's border rect corner radius. */\n FIELD_BORDER_RECT_RADIUS = 4;\n\n /** A field's border rect default height. */\n FIELD_BORDER_RECT_HEIGHT = 16;\n\n /** A field's border rect X padding. */\n FIELD_BORDER_RECT_X_PADDING = 5;\n\n /** A field's border rect Y padding. */\n FIELD_BORDER_RECT_Y_PADDING = 3;\n\n /**\n * The backing colour of a field's border rect.\n *\n * @internal\n */\n FIELD_BORDER_RECT_COLOUR = '#fff';\n FIELD_TEXT_BASELINE_CENTER: boolean;\n FIELD_DROPDOWN_BORDER_RECT_HEIGHT: number;\n\n /**\n * Whether or not a dropdown field should add a border rect when in a shadow\n * block.\n */\n FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW = false;\n\n /**\n * Whether or not a dropdown field's div should be coloured to match the\n * block colours.\n */\n FIELD_DROPDOWN_COLOURED_DIV = false;\n\n /** Whether or not a dropdown field uses a text or SVG arrow. */\n FIELD_DROPDOWN_SVG_ARROW = false;\n FIELD_DROPDOWN_SVG_ARROW_PADDING: number;\n\n /** A dropdown field's SVG arrow size. */\n FIELD_DROPDOWN_SVG_ARROW_SIZE = 12;\n FIELD_DROPDOWN_SVG_ARROW_DATAURI: string;\n\n /**\n * Whether or not to show a box shadow around the widget div. This is only a\n * feature of full block fields.\n */\n FIELD_TEXTINPUT_BOX_SHADOW = false;\n\n /**\n * Whether or not the colour field should display its colour value on the\n * entire block.\n */\n FIELD_COLOUR_FULL_BLOCK = false;\n\n /** A colour field's default width. */\n FIELD_COLOUR_DEFAULT_WIDTH = 26;\n FIELD_COLOUR_DEFAULT_HEIGHT: number;\n FIELD_CHECKBOX_X_OFFSET: number;\n /** @internal */\n randomIdentifier: string;\n\n /**\n * The defs tag that contains all filters and patterns for this Blockly\n * instance.\n */\n private defs_: SVGElement|null = null;\n\n /**\n * The ID of the emboss filter, or the empty string if no filter is set.\n *\n * @internal\n */\n embossFilterId = '';\n\n /** The element to use for highlighting, or null if not set. */\n private embossFilter_: SVGElement|null = null;\n\n /**\n * The ID of the disabled pattern, or the empty string if no pattern is set.\n *\n * @internal\n */\n disabledPatternId = '';\n\n /**\n * The element to use for disabled blocks, or null if not set.\n */\n private disabledPattern_: SVGElement|null = null;\n\n /**\n * The ID of the debug filter, or the empty string if no pattern is set.\n */\n debugFilterId = '';\n\n /**\n * The element to use for a debug highlight, or null if not set.\n */\n private debugFilter_: SVGElement|null = null;\n\n /** The - + diff --git a/demos/code/code.js b/demos/code/code.js index fc9e8304dea..e976903eed4 100644 --- a/demos/code/code.js +++ b/demos/code/code.js @@ -201,7 +201,7 @@ Code.bindClick = function(el, func) { */ Code.importPrettify = function() { var script = document.createElement('script'); - script.setAttribute('src', 'https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js'); + script.setAttribute('src', 'https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js'); document.head.appendChild(script); }; diff --git a/demos/codelab/README.md b/demos/codelab/README.md deleted file mode 100644 index 2a5e9131529..00000000000 --- a/demos/codelab/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Blockly for the Web codelab - -Code for the [Blockly for the Web codelab](https://developers.google.com/TODO). - -In this codelab, you'll learn how to use Blockly JavaScript library -to add a block code editor to a web application. - -## What you'll learn - -* How to add Blockly to a sample web app. -* How to set up a Blockly workspace. -* How to create a new block in Blockly. -* How to generate and run JavaScript code from blocks. - -Example code for each step of the codelab is available from -the [completed](completed/) directory. diff --git a/demos/codelab/app-complete/index.html b/demos/codelab/app-complete/index.html deleted file mode 100644 index d5780e19d03..00000000000 --- a/demos/codelab/app-complete/index.html +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -
-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

Tap any button to edit its code.
When complete, press Done.

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
- -
-
- - - - - - - - - - - - diff --git a/demos/codelab/app-complete/scripts/main.js b/demos/codelab/app-complete/scripts/main.js deleted file mode 100644 index d5ebe0b3cbc..00000000000 --- a/demos/codelab/app-complete/scripts/main.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - (function() { - - let currentButton; - - function handlePlay(event) { - loadWorkspace(event.target); - Blockly.JavaScript.addReservedWords('code'); - var code = Blockly.JavaScript.workspaceToCode(Blockly.getMainWorkspace()); - code += 'MusicMaker.play();'; - // Eval can be dangerous. For more controlled execution, check - // https://github.com/NeilFraser/JS-Interpreter. - try { - eval(code); - } catch (error) { - console.log(error); - } - } - - function loadWorkspace(button) { - let workspace = Blockly.getMainWorkspace(); - workspace.clear(); - if (button.blocklyXml) { - Blockly.Xml.domToWorkspace(button.blocklyXml, workspace); - } - } - - function save(button) { - let xml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()); - button.blocklyXml = xml; - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach(btn => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach(btn => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - loadWorkspace(currentButton); - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - - Blockly.inject('blockly-div', { - media: '../../../media/', - toolbox: document.getElementById('toolbox'), - toolboxPosition: 'end', - horizontalLayout: true, - scrollbars: false - }); -})(); diff --git a/demos/codelab/app-complete/scripts/music_maker.js b/demos/codelab/app-complete/scripts/music_maker.js deleted file mode 100644 index adfefeddcea..00000000000 --- a/demos/codelab/app-complete/scripts/music_maker.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function(soundUrl) { - this.queue_.push(soundUrl); - }, - play: function() { - let next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener( - 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/app-complete/scripts/sound_blocks.js b/demos/codelab/app-complete/scripts/sound_blocks.js deleted file mode 100644 index b8b851819d4..00000000000 --- a/demos/codelab/app-complete/scripts/sound_blocks.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -Blockly.defineBlocksWithJsonArray([ - // Block for colour picker. - { - "type": "play_sound", - "message0": "Play %1", - "args0": [ - { - "type": "field_dropdown", - "name": "VALUE", - "options": [ - ["C4", "sounds/c4.m4a"], - ["D4", "sounds/d4.m4a"], - ["E4", "sounds/e4.m4a"], - ["F4", "sounds/f4.m4a"], - ["G4", "sounds/g4.m4a"], - ["A5", "sounds/a5.m4a"], - ["B5", "sounds/b5.m4a"], - ["C5", "sounds/c5.m4a"] - ] - } - ], - "previousStatement": null, - "nextStatement": null, - "colour": 355, - "tooltip": "", - "helpUrl": "" - } -]); - -Blockly.JavaScript['play_sound'] = function(block) { - var value = '\'' + block.getFieldValue('VALUE') + '\''; - return 'MusicMaker.queueSound(' + value + ');\n'; -}; diff --git a/demos/codelab/app-complete/sounds/c4.m4a b/demos/codelab/app-complete/sounds/c4.m4a deleted file mode 100644 index 33941cfae15..00000000000 Binary files a/demos/codelab/app-complete/sounds/c4.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/sounds/c5.m4a b/demos/codelab/app-complete/sounds/c5.m4a deleted file mode 100644 index 49721cd31df..00000000000 Binary files a/demos/codelab/app-complete/sounds/c5.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/sounds/d4.m4a b/demos/codelab/app-complete/sounds/d4.m4a deleted file mode 100644 index 51bcad6c2f1..00000000000 Binary files a/demos/codelab/app-complete/sounds/d4.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/sounds/e4.m4a b/demos/codelab/app-complete/sounds/e4.m4a deleted file mode 100644 index d910052ef9f..00000000000 Binary files a/demos/codelab/app-complete/sounds/e4.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/sounds/f4.m4a b/demos/codelab/app-complete/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b2..00000000000 Binary files a/demos/codelab/app-complete/sounds/f4.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/sounds/g4.m4a b/demos/codelab/app-complete/sounds/g4.m4a deleted file mode 100644 index 45ea4483021..00000000000 Binary files a/demos/codelab/app-complete/sounds/g4.m4a and /dev/null differ diff --git a/demos/codelab/app-complete/styles/index.css b/demos/codelab/app-complete/styles/index.css deleted file mode 100644 index 0ef8f3bfc90..00000000000 --- a/demos/codelab/app-complete/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow:hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode="maker"] .mode-maker, -[mode="edit"] .mode-edit, -[mode="blockly"] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left .4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode="blockly"] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/demos/codelab/app/index.html b/demos/codelab/app/index.html deleted file mode 100644 index 31eeff776d5..00000000000 --- a/demos/codelab/app/index.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - Blockly for the Web Codelab - - - - - - -
-

Music Maker

-

Music Maker Configuration

-
- -
- - - -

Tap any button to edit its code.
When complete, press Done.

- -
-
-
1
-
2
-
3
-
-
-
4
-
5
-
6
-
-
-
7
-
8
-
9
-
-
- -
-
-
-
- - - - - - diff --git a/demos/codelab/app/scripts/main.js b/demos/codelab/app/scripts/main.js deleted file mode 100644 index 9eef2f96a52..00000000000 --- a/demos/codelab/app/scripts/main.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - (function() { - - let currentButton; - - function handlePlay(event) { - // Add code for playing sound. - } - - function save(button) { - // Add code for saving the behavior of a button. - } - - function handleSave() { - document.body.setAttribute('mode', 'edit'); - save(currentButton); - } - - function enableEditMode() { - document.body.setAttribute('mode', 'edit'); - document.querySelectorAll('.button').forEach(btn => { - btn.removeEventListener('click', handlePlay); - btn.addEventListener('click', enableBlocklyMode); - }); - } - - function enableMakerMode() { - document.body.setAttribute('mode', 'maker'); - document.querySelectorAll('.button').forEach(btn => { - btn.addEventListener('click', handlePlay); - btn.removeEventListener('click', enableBlocklyMode); - }); - } - - function enableBlocklyMode(e) { - document.body.setAttribute('mode', 'blockly'); - currentButton = e.target; - } - - document.querySelector('#edit').addEventListener('click', enableEditMode); - document.querySelector('#done').addEventListener('click', enableMakerMode); - document.querySelector('#save').addEventListener('click', handleSave); - - enableMakerMode(); - -})(); diff --git a/demos/codelab/app/scripts/music_maker.js b/demos/codelab/app/scripts/music_maker.js deleted file mode 100644 index adfefeddcea..00000000000 --- a/demos/codelab/app/scripts/music_maker.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - const MusicMaker = { - queue_: [], - player_: new Audio(), - queueSound: function(soundUrl) { - this.queue_.push(soundUrl); - }, - play: function() { - let next = this.queue_.shift(); - if (next) { - this.player_.src = next; - this.player_.play(); - } - }, -}; - -MusicMaker.player_.addEventListener( - 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/app/sounds/c4.m4a b/demos/codelab/app/sounds/c4.m4a deleted file mode 100644 index 33941cfae15..00000000000 Binary files a/demos/codelab/app/sounds/c4.m4a and /dev/null differ diff --git a/demos/codelab/app/sounds/c5.m4a b/demos/codelab/app/sounds/c5.m4a deleted file mode 100644 index 49721cd31df..00000000000 Binary files a/demos/codelab/app/sounds/c5.m4a and /dev/null differ diff --git a/demos/codelab/app/sounds/d4.m4a b/demos/codelab/app/sounds/d4.m4a deleted file mode 100644 index 51bcad6c2f1..00000000000 Binary files a/demos/codelab/app/sounds/d4.m4a and /dev/null differ diff --git a/demos/codelab/app/sounds/e4.m4a b/demos/codelab/app/sounds/e4.m4a deleted file mode 100644 index d910052ef9f..00000000000 Binary files a/demos/codelab/app/sounds/e4.m4a and /dev/null differ diff --git a/demos/codelab/app/sounds/f4.m4a b/demos/codelab/app/sounds/f4.m4a deleted file mode 100644 index c80a0bfd3b2..00000000000 Binary files a/demos/codelab/app/sounds/f4.m4a and /dev/null differ diff --git a/demos/codelab/app/sounds/g4.m4a b/demos/codelab/app/sounds/g4.m4a deleted file mode 100644 index 45ea4483021..00000000000 Binary files a/demos/codelab/app/sounds/g4.m4a and /dev/null differ diff --git a/demos/codelab/app/styles/index.css b/demos/codelab/app/styles/index.css deleted file mode 100644 index 0ef8f3bfc90..00000000000 --- a/demos/codelab/app/styles/index.css +++ /dev/null @@ -1,75 +0,0 @@ -main { - width: 400px; - position: relative; - margin: 0 auto; - overflow:hidden; - height: 600px; -} - -header { - background-color: green; - width: 100%; -} - -h1 { - width: 400px; - position: relative; - margin: 0 auto; - color: #fff; - font-size: 1.8em; - line-height: 2.4em; -} - -.mode-edit, -.mode-maker, -.mode-blockly { - display: none; -} - -[mode="maker"] .mode-maker, -[mode="edit"] .mode-edit, -[mode="blockly"] .mode-blockly { - display: block; -} - -.blockly-editor { - position: absolute; - top: 64px; - left: -400px; - transition: left .4s; - height: 460px; - width: 400px; - background-color: #eee; -} - -[mode="blockly"] .blockly-editor { - left: 0; -} - -.maker { - display: flex; - flex-flow: column; - justify-content: space-between; - height: 460px; - width: 400px; -} - -.maker > div { - display: flex; - justify-content: space-between; -} - -.button { - width: 120px; - height: 140px; - color: #fff; - font-size: 3em; - text-align: center; - vertical-align: middle; - line-height: 140px; -} - -.mdl-button { - margin: 1em 0; - float: right; -} diff --git a/demos/custom-dialogs/custom-dialog.js b/demos/custom-dialogs/custom-dialog.js deleted file mode 100644 index 04793e3da61..00000000000 --- a/demos/custom-dialogs/custom-dialog.js +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @license - * Copyright 2016 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * An example implementation of how one might replace Blockly's browser - * dialogs. This is just an example, and applications are not encouraged to use - * it verbatim. - * - * @namespace - */ -CustomDialog = {}; - -/** Override Blockly.dialog.alert() with custom implementation. */ -Blockly.dialog.setAlert(function(message, callback) { - console.log('Alert: ' + message); - CustomDialog.show('Alert', message, { - onCancel: callback - }); -}); - -/** Override Blockly.dialog.confirm() with custom implementation. */ -Blockly.dialog.setConfirm(function(message, callback) { - console.log('Confirm: ' + message); - CustomDialog.show('Confirm', message, { - showOkay: true, - onOkay: function() { - callback(true); - }, - showCancel: true, - onCancel: function() { - callback(false); - } - }); -}); - -/** Override Blockly.dialog.prompt() with custom implementation. */ -Blockly.dialog.setPrompt(function(message, defaultValue, callback) { - console.log('Prompt: ' + message); - CustomDialog.show('Prompt', message, { - showInput: true, - showOkay: true, - onOkay: function() { - callback(CustomDialog.inputField.value); - }, - showCancel: true, - onCancel: function() { - callback(null); - } - }); - CustomDialog.inputField.value = defaultValue; -}); - -/** Hides any currently visible dialog. */ -CustomDialog.hide = function() { - if (CustomDialog.backdropDiv_) { - CustomDialog.backdropDiv_.style.display = 'none'; - CustomDialog.dialogDiv_.style.display = 'none'; - } -}; - -/** - * Shows the dialog. - * Allowed options: - * - showOkay: Whether to show the OK button. - * - showCancel: Whether to show the Cancel button. - * - showInput: Whether to show the text input field. - * - onOkay: Callback to handle the okay button. - * - onCancel: Callback to handle the cancel button and backdrop clicks. - */ -CustomDialog.show = function(title, message, options) { - var backdropDiv = CustomDialog.backdropDiv_; - var dialogDiv = CustomDialog.dialogDiv_; - if (!dialogDiv) { - // Generate HTML - backdropDiv = document.createElement('div'); - backdropDiv.id = 'customDialogBackdrop'; - backdropDiv.style.cssText = - 'position: absolute;' + - 'top: 0; left: 0; right: 0; bottom: 0;' + - 'background-color: rgba(0, 0, 0, .7);' + - 'z-index: 100;'; - document.body.appendChild(backdropDiv); - - dialogDiv = document.createElement('div'); - dialogDiv.id = 'customDialog'; - dialogDiv.style.cssText = - 'background-color: #fff;' + - 'width: 400px;' + - 'margin: 20px auto 0;' + - 'padding: 10px;'; - backdropDiv.appendChild(dialogDiv); - - dialogDiv.onclick = function(event) { - event.stopPropagation(); - }; - - CustomDialog.backdropDiv_ = backdropDiv; - CustomDialog.dialogDiv_ = dialogDiv; - } - backdropDiv.style.display = 'block'; - dialogDiv.style.display = 'block'; - - dialogDiv.innerHTML = - '
' + - '

' + - (options.showInput ? '
' : '') + - '
' + - (options.showCancel ? '': '') + - (options.showOkay ? '': '') + - '
'; - dialogDiv.getElementsByClassName('customDialogTitle')[0] - .appendChild(document.createTextNode(title)); - dialogDiv.getElementsByClassName('customDialogMessage')[0] - .appendChild(document.createTextNode(message)); - - var onOkay = function(event) { - CustomDialog.hide(); - options.onOkay && options.onOkay(); - event && event.stopPropagation(); - }; - var onCancel = function(event) { - CustomDialog.hide(); - options.onCancel && options.onCancel(); - event && event.stopPropagation(); - }; - - var dialogInput = document.getElementById('customDialogInput'); - CustomDialog.inputField = dialogInput; - if (dialogInput) { - dialogInput.focus(); - - dialogInput.onkeyup = function(event) { - if (event.keyCode === 13) { - // Process as OK when user hits enter. - onOkay(); - return false; - } else if (event.keyCode === 27) { - // Process as cancel when user hits esc. - onCancel(); - return false; - } - }; - } else { - var okay = document.getElementById('customDialogOkay'); - okay && okay.focus(); - } - - if (options.showOkay) { - document.getElementById('customDialogOkay') - .addEventListener('click', onOkay); - } - if (options.showCancel) { - document.getElementById('customDialogCancel') - .addEventListener('click', onCancel); - } - - backdropDiv.onclick = onCancel; -}; diff --git a/demos/custom-dialogs/icon.png b/demos/custom-dialogs/icon.png deleted file mode 100644 index ba49746e43f..00000000000 Binary files a/demos/custom-dialogs/icon.png and /dev/null differ diff --git a/demos/custom-dialogs/index.html b/demos/custom-dialogs/index.html deleted file mode 100644 index 9c171802efc..00000000000 --- a/demos/custom-dialogs/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Blockly Demo: Custom Dialog - - - - - - -

Blockly > - Demos > Custom Dialog

- -

This is a simple demo of replacing modal browser dialogs with HTML. - To see how it works, see the source code in - custom-dialog.js -

- -

Try creating new variables, creating variables with names already in - use, or deleting multiple blocks on the workspace. -

- -
- - - - - - - - diff --git a/demos/custom-fields/icon.png b/demos/custom-fields/icon.png deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/demos/custom-fields/index.html b/demos/custom-fields/index.html deleted file mode 100644 index 9e681a8b605..00000000000 --- a/demos/custom-fields/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - Blockly Demo: Custom Fields - - - -

Blockly > - Demos > Custom Fields

- -

These demos are intended for developers who want creating custom block fields.

- -
- - - - - - - - - -
- - - - - -
- - - - - -
- - diff --git a/demos/custom-fields/pitch/blocks.js b/demos/custom-fields/pitch/blocks.js deleted file mode 100644 index 75fbae2a74d..00000000000 --- a/demos/custom-fields/pitch/blocks.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Pitch field demo blocks. - */ - -Blockly.Blocks['test_pitch_field'] = { - init: function() { - this.appendDummyInput() - .appendField('pitch') - .appendField(new CustomFields.FieldPitch('7'), 'PITCH'); - this.setStyle('loop_blocks'); - } -}; diff --git a/demos/custom-fields/pitch/field_pitch.js b/demos/custom-fields/pitch/field_pitch.js deleted file mode 100644 index d049be2de63..00000000000 --- a/demos/custom-fields/pitch/field_pitch.js +++ /dev/null @@ -1,235 +0,0 @@ -/** - * @license - * Copyright 2016 Google LLC - * https://github.com/google/blockly-games - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Music pitch input field. Borrowed from Blockly Games. - */ -'use strict'; - -goog.provide('CustomFields.FieldPitch'); - -goog.require('Blockly.FieldTextInput'); -goog.require('Blockly.utils.math'); -goog.require('Blockly.utils.object'); - -var CustomFields = CustomFields || {}; - -/** - * Class for an editable pitch field. - * @param {string} text The initial content of the field. - * @extends {Blockly.FieldTextInput} - * @constructor - */ -CustomFields.FieldPitch = function(text) { - CustomFields.FieldPitch.superClass_.constructor.call(this, text); - - /** - * Click event data. - * @type {?Blockly.browserEvents.Data} - * @private - */ - this.clickWrapper_ = null; - - /** - * Move event data. - * @type {?Blockly.browserEvents.Data} - * @private - */ - this.moveWrapper_ = null; -}; -Blockly.utils.object.inherits(CustomFields.FieldPitch, Blockly.FieldTextInput); - -/** - * Construct a FieldPitch from a JSON arg object. - * @param {!Object} options A JSON object with options (pitch). - * @return {!CustomFields.FieldPitch} The new field instance. - * @package - * @nocollapse - */ -CustomFields.FieldPitch.fromJson = function(options) { - return new CustomFields.FieldPitch(options['pitch']); -}; - -/** - * All notes available for the picker. - */ -CustomFields.FieldPitch.NOTES = 'C3 D3 E3 F3 G3 A3 B3 C4 D4 E4 F4 G4 A4'.split(/ /); - -/** - * Show the inline free-text editor on top of the text and the note picker. - * @protected - */ -CustomFields.FieldPitch.prototype.showEditor_ = function() { - CustomFields.FieldPitch.superClass_.showEditor_.call(this); - - var div = Blockly.WidgetDiv.getDiv(); - if (!div.firstChild) { - // Mobile interface uses Blockly.dialog.prompt. - return; - } - // Build the DOM. - var editor = this.dropdownCreate_(); - Blockly.DropDownDiv.getContentDiv().appendChild(editor); - - Blockly.DropDownDiv.setColour(this.sourceBlock_.style.colourPrimary, - this.sourceBlock_.style.colourTertiary); - - Blockly.DropDownDiv.showPositionedByField( - this, this.dropdownDispose_.bind(this)); - - // The note picker is different from other fields in that it updates on - // mousemove even if it's not in the middle of a drag. In future we may - // change this behaviour. For now, using bindEvent_ instead of - // bindEventWithChecks_ allows it to work without a mousedown/touchstart. - this.clickWrapper_ = - Blockly.browserEvents.bind(this.imageElement_, 'click', this, this.hide_); - this.moveWrapper_ = Blockly.browserEvents.bind( - this.imageElement_, 'mousemove', this, this.onMouseMove); - - this.updateGraph_(); -}; - -/** - * Create the pitch editor. - * @return {!Element} The newly created pitch picker. - * @private - */ -CustomFields.FieldPitch.prototype.dropdownCreate_ = function() { - this.imageElement_ = document.createElement('div'); - this.imageElement_.id = 'notePicker'; - - return this.imageElement_; -}; - -/** - * Dispose of events belonging to the pitch editor. - * @private - */ -CustomFields.FieldPitch.prototype.dropdownDispose_ = function() { - if (this.clickWrapper_) { - Blockly.browserEvents.unbind(this.clickWrapper_); - this.clickWrapper_ = null; - } - if (this.moveWrapper_) { - Blockly.browserEvents.unbind(this.moveWrapper_); - this.moveWrapper_ = null; - } - this.imageElement_ = null; -}; - -/** - * Hide the editor. - * @private - */ -CustomFields.FieldPitch.prototype.hide_ = function() { - Blockly.WidgetDiv.hide(); - Blockly.DropDownDiv.hideWithoutAnimation(); -}; - -/** - * Set the note to match the mouse's position. - * @param {!Event} e Mouse move event. - */ -CustomFields.FieldPitch.prototype.onMouseMove = function(e) { - var bBox = this.imageElement_.getBoundingClientRect(); - var dy = e.clientY - bBox.top; - var note = Blockly.utils.math.clamp(Math.round(13.5 - dy / 7.5), 0, 12); - this.imageElement_.style.backgroundPosition = (-note * 37) + 'px 0'; - this.setEditorValue_(note); -}; - -/** - * Convert the machine-readable value (0-12) to human-readable text (C3-A4). - * @param {number|string} value The provided value. - * @return {string|undefined} The respective note, or undefined if invalid. - */ -CustomFields.FieldPitch.prototype.valueToNote = function(value) { - return CustomFields.FieldPitch.NOTES[Number(value)]; -}; - -/** - * Convert the human-readable text (C3-A4) to machine-readable value (0-12). - * @param {string} text The provided note. - * @return {number|undefined} The respective value, or undefined if invalid. - */ -CustomFields.FieldPitch.prototype.noteToValue = function(text) { - var normalizedText = text.trim().toUpperCase(); - var i = CustomFields.FieldPitch.NOTES.indexOf(normalizedText); - return i > -1 ? i : undefined; -}; - -/** - * Get the text to be displayed on the field node. - * @return {?string} The HTML value if we're editing, otherwise null. Null means - * the super class will handle it, likely a string cast of value. - * @protected - */ -CustomFields.FieldPitch.prototype.getText_ = function() { - if (this.isBeingEdited_) { - return CustomFields.FieldPitch.superClass_.getText_.call(this); - } - return this.valueToNote(this.getValue()) || null; -}; - -/** - * Transform the provided value into a text to show in the HTML input. - * @param {*} value The value stored in this field. - * @return {string} The text to show on the HTML input. - */ -CustomFields.FieldPitch.prototype.getEditorText_ = function(value) { - return this.valueToNote(value); -}; - -/** - * Transform the text received from the HTML input (note) into a value - * to store in this field. - * @param {string} text Text received from the HTML input. - * @return {*} The value to store. - */ -CustomFields.FieldPitch.prototype.getValueFromEditorText_ = function(text) { - return this.noteToValue(text); -}; - -/** - * Updates the graph when the field rerenders. - * @private - * @override - */ -CustomFields.FieldPitch.prototype.render_ = function() { - CustomFields.FieldPitch.superClass_.render_.call(this); - this.updateGraph_(); -}; - -/** - * Redraw the note picker with the current note. - * @private - */ -CustomFields.FieldPitch.prototype.updateGraph_ = function() { - if (!this.imageElement_) { - return; - } - var i = this.getValue(); - this.imageElement_.style.backgroundPosition = (-i * 37) + 'px 0'; -}; - -/** - * Ensure that only a valid value may be entered. - * @param {*} opt_newValue The input value. - * @return {*} A valid value, or null if invalid. - */ -CustomFields.FieldPitch.prototype.doClassValidation_ = function(opt_newValue) { - if (opt_newValue === null || opt_newValue === undefined) { - return null; - } - var note = this.valueToNote(opt_newValue); - if (note) { - return opt_newValue; - } - return null; -}; - -Blockly.fieldRegistry.register('field_pitch', CustomFields.FieldPitch); diff --git a/demos/custom-fields/pitch/index.html b/demos/custom-fields/pitch/index.html deleted file mode 100644 index 2d614f6b095..00000000000 --- a/demos/custom-fields/pitch/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - Blockly Demo: Custom Pitch Field - - - - - - - - -

- Blockly > - Demos > - Custom Fields > Pitch Field

- - -

This is a demo of creating custom block fields. In this case the field - is used to select a note pitch. -

- -

All of the custom field implementation is in - demos/custom-fields/pitch/field_pitch.js, including comments on each required - function. -

- -

- - -

- - - - - - -
- - -
-
- - - - - - diff --git a/demos/custom-fields/pitch/media/notes.png b/demos/custom-fields/pitch/media/notes.png deleted file mode 100644 index b9a57b59eca..00000000000 Binary files a/demos/custom-fields/pitch/media/notes.png and /dev/null differ diff --git a/demos/custom-fields/pitch/pitch.css b/demos/custom-fields/pitch/pitch.css deleted file mode 100644 index 75d17a35d5f..00000000000 --- a/demos/custom-fields/pitch/pitch.css +++ /dev/null @@ -1,13 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - - -#notePicker { - background-image: url(media/notes.png); - border: 1px solid #ccc; - height: 109px; - width: 46px; -} \ No newline at end of file diff --git a/demos/custom-fields/turtle/blocks.js b/demos/custom-fields/turtle/blocks.js deleted file mode 100644 index 494b10038fa..00000000000 --- a/demos/custom-fields/turtle/blocks.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Turtle field demo blocks. - */ - -Blockly.Blocks['turtle_basic'] = { - init: function() { - this.appendDummyInput() - .appendField('simple turtle'); - this.appendDummyInput() - .setAlign(Blockly.ALIGN_CENTRE) - .appendField(new CustomFields.FieldTurtle(), 'TURTLE'); - this.setStyle('loop_blocks'); - this.setCommentText('Demonstrates a turtle field with no validator.'); - } -}; - -Blockly.Blocks['turtle_nullifier'] = { - init: function() { - this.appendDummyInput() - .appendField('no trademarks'); - this.appendDummyInput() - .setAlign(Blockly.ALIGN_CENTRE) - .appendField(new CustomFields.FieldTurtle(null, null, null, this.validate) - , 'TURTLE'); - this.setStyle('loop_blocks'); - this.setCommentText('Validates combinations of names and hats to null' + - ' (invalid) if they could be considered infringe-y. This turns the' + - ' turtle field red. Infringe-y combinations are: (Leonardo, Mask),' + - ' (Yertle, Crown), and (Franklin, Propeller).'); - }, - - validate: function(newValue) { - this.cachedValidatedValue_ = { - turtleName: newValue.turtleName, - pattern: newValue.pattern, - hat: newValue.hat, - }; - if ((newValue.turtleName === 'Leonardo' && newValue.hat === 'Mask') || - (newValue.turtleName === 'Yertle' && newValue.hat === 'Crown') || - (newValue.turtleName === 'Franklin') && newValue.hat === 'Propeller') { - - var currentValue = this.getValue(); - if (newValue.turtleName !== currentValue.turtleName) { - // Turtle name changed. - this.cachedValidatedValue_.turtleName = null; - } else { - // Hat must have changed. - this.cachedValidatedValue_.hat = null; - } - - return null; - } - return newValue; - } -}; - -Blockly.Blocks['turtle_changer'] = { - init: function() { - this.appendDummyInput() - .setAlign(Blockly.ALIGN_CENTRE) - .appendField('force hats'); - this.appendDummyInput() - .appendField(new CustomFields.FieldTurtle( - 'Dots', 'Crown', 'Yertle', this.validate), 'TURTLE'); - this.setStyle('loop_blocks'); - this.setCommentText('Validates the input so that certain names always' + - ' have specific hats. The name-hat combinations are: (Leonardo, Mask),' + - ' (Yertle, Crown), (Franklin, Propeller).'); - }, - - validate: function(newValue) { - switch(newValue.turtleName) { - case 'Leonardo': - newValue.hat = 'Mask'; - break; - case 'Yertle': - newValue.hat = 'Crown'; - break; - case 'Franklin': - newValue.hat = 'Propeller'; - break; - } - return newValue; - } -}; diff --git a/demos/custom-fields/turtle/field_turtle.js b/demos/custom-fields/turtle/field_turtle.js deleted file mode 100644 index a24bfb7d6b1..00000000000 --- a/demos/custom-fields/turtle/field_turtle.js +++ /dev/null @@ -1,747 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview A field used to customize a turtle. - */ -'use strict'; - -// You must provide the constructor for your custom field. -goog.provide('CustomFields.FieldTurtle'); - -// You must require the abstract field class to inherit from. -goog.require('Blockly.Field'); -goog.require('Blockly.fieldRegistry'); -goog.require('Blockly.utils'); -goog.require('Blockly.utils.dom'); -goog.require('Blockly.utils.object'); -goog.require('Blockly.utils.Size'); - -var CustomFields = CustomFields || {}; - -// Generally field's values should be optional, and have logical defaults. -// If this is not possible (for example image fields can't have logical -// defaults) the field should throw a clear error when a value is not provided. -// Editable fields also generally accept validators, so we will accept a -// validator. -CustomFields.FieldTurtle = function( - opt_pattern, opt_hat, opt_turtleName, opt_validator) { - - // The turtle field contains an object as its value, so we need to compile - // the parameters into an object. - var value = {}; - value.pattern = opt_pattern || CustomFields.FieldTurtle.PATTERNS[0]; - value.hat = opt_hat || CustomFields.FieldTurtle.HATS[0]; - value.turtleName = opt_turtleName || CustomFields.FieldTurtle.NAMES[0]; - - // A field constructor should always call its parent constructor, because - // that helps keep the code organized and DRY. - CustomFields.FieldTurtle.superClass_.constructor.call( - this, value, opt_validator); - - /** - * The size of the area rendered by the field. - * @type {Blockly.utils.Size} - * @protected - * @override - */ - this.size_ = new Blockly.utils.Size(0, 0); -}; -Blockly.utils.object.inherits(CustomFields.FieldTurtle, Blockly.Field); - -// This allows the field to be constructed using a JSON block definition. -CustomFields.FieldTurtle.fromJson = function(options) { - // In this case we simply pass the JSON options along to the constructor, - // but you can also use this to get message references, and other such things. - return new CustomFields.FieldTurtle( - options['pattern'], - options['hat'], - options['turtleName']); -}; - -// Since this field is editable we must also define serializable as true -// (for backwards compatibility reasons serializable is false by default). -CustomFields.FieldTurtle.prototype.SERIALIZABLE = true; - -// The cursor property defines what the mouse will look like when the user -// hovers over the field. By default the cursor will be whatever -// .blocklyDraggable's cursor is defined as (vis. grab). Most fields define -// this property as 'default'. -CustomFields.FieldTurtle.prototype.CURSOR = 'pointer'; - -// How far to move the text to keep it to the right of the turtle. -// May change if the turtle gets fancy enough. -CustomFields.FieldTurtle.prototype.TEXT_OFFSET_X = 80; - -// These are the different options for our turtle. Being declared this way -// means they are static, and not translatable. If you want to do something -// similar, but make it translatable you should set up your options like a -// dropdown field, with language-neutral keys and human-readable values. -CustomFields.FieldTurtle.PATTERNS = - ['Dots', 'Stripes', 'Hexagons']; -CustomFields.FieldTurtle.HATS = - ['Stovepipe', 'Crown', 'Propeller', 'Mask', 'Fedora']; -CustomFields.FieldTurtle.NAMES = - ['Yertle', 'Franklin', 'Crush', 'Leonardo', 'Bowser', 'Squirtle', 'Oogway']; - -// Used to keep track of our editor event listeners, so they can be -// properly disposed of when the field closes. You can keep track of your -// listeners however you want, just be sure to dispose of them! -CustomFields.FieldTurtle.prototype.editorListeners_ = []; - -// Used to create the DOM of our field. -CustomFields.FieldTurtle.prototype.initView = function() { - // Because we want to have both a borderRect_ (background) and a - // textElement_ (text) we can call the super-function. If we only wanted - // one or the other, we could call their individual createX functions. - CustomFields.FieldTurtle.superClass_.initView.call(this); - - // Note that the field group is created by the abstract field's init_ - // function. This means that *all elements* should be children of the - // fieldGroup_. - this.createView_(); -}; - -// Updates how the field looks depending on if it is editable or not. -CustomFields.FieldTurtle.prototype.updateEditable = function() { - if (!this.fieldGroup_) { - // Not initialized yet. - return; - } - // The default functionality just makes it so the borderRect_ does not - // highlight when hovered. - Blockly.FieldColour.superClass_.updateEditable.call(this); - // Things like this are best applied to the clickTarget_. By default the - // click target is the same as getSvgRoot, which by default is the - // fieldGroup_. - var group = this.getClickTarget_(); - if (!this.isCurrentlyEditable()) { - group.style.cursor = 'not-allowed'; - } else { - group.style.cursor = this.CURSOR; - } -}; - -// Gets the text to display when the block is collapsed -CustomFields.FieldTurtle.prototype.getText = function() { - var text = this.value_.turtleName + ' wearing a ' + this.value_.hat; - if (this.value_.hat === 'Stovepipe' || this.value_.hat === 'Propeller') { - text += ' hat'; - } - return text; -}; - -// Makes sure new field values (given to setValue) are valid, meaning -// something this field can legally "hold". Class validators can either change -// the input value, or return null if the input value is invalid. Called by -// the setValue() function. -CustomFields.FieldTurtle.prototype.doClassValidation_ = function(newValue) { - // Undefined signals that we want the value to remain unchanged. This is a - // special feature of turtle fields, but could be useful for other - // multi-part fields. - if (newValue.pattern === undefined) { - newValue.pattern = this.displayValue_ && this.displayValue_.pattern; - // We only want to allow patterns that are part of our pattern list. - // Anything else is invalid, so we return null. - } else if (CustomFields.FieldTurtle.PATTERNS.indexOf(newValue.pattern) === -1) { - newValue.pattern = null; - } - - if (newValue.hat === undefined) { - newValue.hat = this.displayValue_ && this.displayValue_.hat; - } else if (CustomFields.FieldTurtle.HATS.indexOf(newValue.hat) === -1) { - newValue.hat = null; - } - - if (newValue.turtleName === undefined) { - newValue.turtleName = this.displayValue_ && this.displayValue_.turtleName; - } else if (CustomFields.FieldTurtle.NAMES.indexOf(newValue.turtleName) === -1) { - newValue.turtleName = null; - } - - // This is a strategy for dealing with defaults on multi-part values. - // The class validator sets individual properties of the object to null - // to indicate that they are invalid, and then caches that object to the - // cachedValidatedValue_ property. This way the field can, for - // example, properly handle an invalid pattern, combined with a valid hat. - // This can also be done with local validators. - this.cachedValidatedValue_ = newValue; - - // Always be sure to return! - if (!newValue.pattern || !newValue.hat || !newValue.turtleName) { - return null; - } - return newValue; -}; - -// Saves the new field value. Called by the setValue function. -CustomFields.FieldTurtle.prototype.doValueUpdate_ = function(newValue) { - // The default function sets this field's this.value_ property to the - // newValue, and its this.isDirty_ property to true. The isDirty_ property - // tells the setValue function whether the field needs to be re-rendered. - CustomFields.FieldTurtle.superClass_.doValueUpdate_.call(this, newValue); - this.displayValue_ = newValue; - // Since this field has custom UI for invalid values, we also want to make - // sure it knows it is now valid. - this.isValueInvalid_ = false; -}; - -// Notifies that the field that the new value was invalid. Called by -// setValue function. Can either be triggered by the class validator, or the -// local validator. -CustomFields.FieldTurtle.prototype.doValueInvalid_ = function(invalidValue) { - // By default this function is no-op, meaning if the new value is invalid - // the field simply won't be updated. This field has custom UI for invalid - // values, so we override this function. - - // We want the value to be displayed like normal. - // But we want to flag it as invalid, so the render_ function knows to - // make the borderRect_ red. - this.displayValue_ = invalidValue; - this.isDirty_ = true; - this.isValueInvalid_ = true; -}; - -// Updates the field's on-block display based on the current display value. -CustomFields.FieldTurtle.prototype.render_ = function() { - var value = this.displayValue_; - - // Always do editor updates inside render. This makes sure the editor - // always displays the correct value, even if a validator changes it. - if (this.editor_) { - this.renderEditor_(); - } - - this.stovepipe_.style.display = 'none'; - this.crown_.style.display = 'none'; - this.mask_.style.display = 'none'; - this.propeller_.style.display = 'none'; - this.fedora_.style.display = 'none'; - switch(value.hat) { - case 'Stovepipe': - this.stovepipe_.style.display = ''; - this.turtleGroup_.setAttribute('transform', 'translate(0,12)'); - this.textElement_.setAttribute( - 'transform', 'translate(' + this.TEXT_OFFSET_X + ',20)'); - break; - case 'Crown': - this.crown_.style.display = ''; - this.turtleGroup_.setAttribute('transform', 'translate(0,9)'); - this.textElement_.setAttribute( - 'transform', 'translate(' + this.TEXT_OFFSET_X + ',16)'); - break; - case 'Mask': - this.mask_.style.display = ''; - this.turtleGroup_.setAttribute('transform', 'translate(0,6)'); - this.textElement_.setAttribute('transform', - 'translate(' + this.TEXT_OFFSET_X + ',12)'); - break; - case 'Propeller': - this.propeller_.style.display = ''; - this.turtleGroup_.setAttribute('transform', 'translate(0,6)'); - this.textElement_.setAttribute('transform', - 'translate(' + this.TEXT_OFFSET_X + ',12)'); - break; - case 'Fedora': - this.fedora_.style.display = ''; - this.turtleGroup_.setAttribute('transform', 'translate(0,6)'); - this.textElement_.setAttribute('transform', - 'translate(' + this.TEXT_OFFSET_X + ',12)'); - break; - } - - switch(value.pattern) { - case 'Dots': - this.shellPattern_.setAttribute('fill', 'url(#polkadots)'); - break; - case 'Stripes': - this.shellPattern_.setAttribute('fill', 'url(#stripes)'); - break; - case 'Hexagons': - this.shellPattern_.setAttribute('fill', 'url(#hexagons)'); - break; - } - - // Always modify the textContent_ rather than the textElement_. This - // allows fields to append DOM to the textElement (e.g. the angle field). - this.textContent_.nodeValue = value.turtleName; - - if (this.isValueInvalid_) { - this.borderRect_.style.fill = '#f99'; - this.borderRect_.style.fillOpacity = 1; - } else { - this.borderRect_.style.fill = '#fff'; - this.borderRect_.style.fillOpacity = 0.6; - } - - this.updateSize_(); -}; - -CustomFields.FieldTurtle.prototype.renderEditor_ = function() { - var value = this.displayValue_; - - // .textElement is a property assigned to the element. - // It allows the text to be edited without destroying the warning icon. - this.editor_.patternText.textElement.nodeValue = value.pattern; - this.editor_.hatText.textElement.nodeValue = value.hat; - this.editor_.turtleNameText.textElement.nodeValue = value.turtleName; - - this.editor_.patternText.warningIcon.style.display = - this.cachedValidatedValue_.pattern ? 'none' : ''; - this.editor_.hatText.warningIcon.style.display = - this.cachedValidatedValue_.hat ? 'none' : ''; - this.editor_.turtleNameText.warningIcon.style.display = - this.cachedValidatedValue_.turtleName ? 'none' : ''; -}; - -// Used to update the size of the field. This function's logic could be simply -// included inside render_ (it is not called anywhere else), but it is -// usually separated to keep code more organized. -CustomFields.FieldTurtle.prototype.updateSize_ = function() { - var bbox = this.movableGroup_.getBBox(); - var width = bbox.width; - var height = bbox.height; - if (this.borderRect_) { - width += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2; - height += this.constants_.FIELD_BORDER_RECT_X_PADDING * 2; - this.borderRect_.setAttribute('width', width); - this.borderRect_.setAttribute('height', height); - } - // Note how both the width and the height can be dynamic. - this.size_.width = width; - this.size_.height = height; -}; - -// Called when the field is clicked. It is usually used to show an editor, -// but it can also be used for other things e.g. the checkbox field uses -// this function to check/uncheck itself. -CustomFields.FieldTurtle.prototype.showEditor_ = function() { - this.editor_ = this.dropdownCreate_(); - this.renderEditor_(); - Blockly.DropDownDiv.getContentDiv().appendChild(this.editor_); - - // These allow us to have the editor match the block's colour. - var fillColour = this.sourceBlock_.getColour(); - Blockly.DropDownDiv.setColour(fillColour, - this.sourceBlock_.style.colourTertiary); - - // Always pass the dropdown div a dispose function so that you can clean - // up event listeners when the editor closes. - Blockly.DropDownDiv.showPositionedByField( - this, this.dropdownDispose_.bind(this)); -}; - -// Creates the UI of the editor, and adds event listeners to it. -CustomFields.FieldTurtle.prototype.dropdownCreate_ = function() { - var createRow = function(table) { - var row = table.appendChild(document.createElement('tr')); - row.className = 'row'; - return row; - }; - var createLeftArrow = function(row) { - var cell = document.createElement('div'); - cell.className = 'arrow'; - var leftArrow = document.createElement('button'); - leftArrow.setAttribute('type', 'button'); - leftArrow.textContent = '<'; - cell.appendChild(leftArrow); - row.appendChild(cell); - return cell; - }; - var createTextNode = function(row, text) { - var cell = document.createElement('div'); - cell.className = 'text'; - var text = document.createTextNode(text); - cell.appendChild(text); - cell.textElement = text; - var warning = document.createElement('img'); - warning.setAttribute('src', 'media/warning.svg'); - warning.setAttribute('height', '16px'); - warning.setAttribute('width', '16px'); - warning.style.marginLeft = '4px'; - cell.appendChild(warning); - cell.warningIcon = warning; - row.appendChild(cell); - return cell; - }; - var createRightArrow = function(row) { - var cell = document.createElement('div'); - cell.className = 'arrow'; - var rightArrow = document.createElement('button'); - rightArrow.setAttribute('type', 'button'); - rightArrow.textContent = '>'; - cell.appendChild(rightArrow); - row.appendChild(cell); - return cell; - }; - var createArrowListener = function(variable, array, direction) { - return function() { - var currentIndex = array.indexOf(this.displayValue_[variable]); - currentIndex += direction; - if (currentIndex <= -1) { - currentIndex = array.length - 1; - } else if (currentIndex >= array.length) { - currentIndex = 0; - } - var value = {}; - value[variable] = array[currentIndex]; - this.setValue(value); - }; - }; - - var widget = document.createElement('div'); - widget.className = 'customFieldsTurtleWidget blocklyNonSelectable'; - - var table = document.createElement('div'); - table.className = 'table'; - widget.appendChild(table); - - var row = createRow(table); - var leftArrow = createLeftArrow(row); - widget.patternText = createTextNode(row, this.displayValue_.pattern); - var rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('pattern', CustomFields.FieldTurtle.PATTERNS, 1))); - - row = createRow(table); - leftArrow = createLeftArrow(row); - widget.hatText = createTextNode(row, this.displayValue_.hat); - rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('hat', CustomFields.FieldTurtle.HATS, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('hat', CustomFields.FieldTurtle.HATS, 1))); - - row = createRow(table); - leftArrow = createLeftArrow(row); - widget.turtleNameText = createTextNode(row, this.displayValue_.turtleName); - rightArrow = createRightArrow(row); - this.editorListeners_.push(Blockly.browserEvents.bind( - leftArrow, 'mouseup', this, - createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, -1))); - this.editorListeners_.push(Blockly.browserEvents.bind( - rightArrow, 'mouseup', this, - createArrowListener('turtleName', CustomFields.FieldTurtle.NAMES, 1))); - - var randomizeButton = document.createElement('button'); - randomizeButton.className = 'randomize'; - randomizeButton.setAttribute('type', 'button'); - randomizeButton.textContent = 'randomize turtle'; - this.editorListeners_.push( - Blockly.browserEvents.bind(randomizeButton, 'mouseup', this, function() { - var value = {}; - value.pattern = CustomFields.FieldTurtle.PATTERNS[Math.floor( - Math.random() * CustomFields.FieldTurtle.PATTERNS.length)]; - - value.hat = CustomFields.FieldTurtle.HATS[Math.floor( - Math.random() * CustomFields.FieldTurtle.HATS.length)]; - - value.turtleName = CustomFields.FieldTurtle.NAMES[Math.floor( - Math.random() * CustomFields.FieldTurtle.NAMES.length)]; - - this.setValue(value); - })); - widget.appendChild(randomizeButton); - - return widget; -}; - -// Cleans up any event listeners that were attached to the now hidden editor. -CustomFields.FieldTurtle.prototype.dropdownDispose_ = function() { - for (var i = this.editorListeners_.length, listener; - listener = this.editorListeners_[i]; i--) { - Blockly.browserEvents.unbind(listener); - this.editorListeners_.pop(); - } -}; - -// Updates the field's colour based on the colour of the block. Called by -// block.applyColour. -CustomFields.FieldTurtle.prototype.applyColour = function() { - if (!this.sourceBlock_) { - return; - } - // The getColourX functions are the best way to access the colours of a block. - var isShadow = this.sourceBlock_.isShadow(); - var fillColour = isShadow ? - this.sourceBlock_.getColourShadow() : this.sourceBlock_.getColour(); - // This is technically a package function, meaning it could change. - var borderColour = isShadow ? fillColour : - this.sourceBlock_.style.colourTertiary; - - if (this.turtleGroup_) { - var child = this.turtleGroup_.firstChild; - while(child) { - // If it is a text node, continue. - if (child.nodeType === 3) { - child = child.nextSibling; - continue; - } - // Or if it is a non-turtle node, continue. - var className = child.getAttribute('class'); - if (!className || className.indexOf('turtleBody') === -1) { - child = child.nextSibling; - continue; - } - - child.style.fill = fillColour; - child.style.stroke = borderColour; - child = child.nextSibling; - } - } -}; - -// Saves the field's value to an XML node. Allows for custom serialization. -CustomFields.FieldTurtle.prototype.toXml = function(fieldElement) { - // The default implementation of this function creates a node that looks - // like this: (where value is returned by getValue()) - // value - // But this doesn't work for our field because it stores an /object/. - - fieldElement.setAttribute('pattern', this.value_.pattern); - fieldElement.setAttribute('hat', this.value_.hat); - // The textContent usually contains whatever is closest to the field's - // 'value'. The textContent doesn't need to contain anything, but saving - // something to it does aid in readability. - fieldElement.textContent = this.value_.turtleName; - - // Always return the element! - return fieldElement; -}; - -// Sets the field's value based on an XML node. Allows for custom -// de-serialization. -CustomFields.FieldTurtle.prototype.fromXml = function(fieldElement) { - // Because we had to do custom serialization for this field, we also need - // to do custom de-serialization. - - var value = {}; - value.pattern = fieldElement.getAttribute('pattern'); - value.hat = fieldElement.getAttribute('hat'); - value.turtleName = fieldElement.textContent; - // The end goal is to call this.setValue() - this.setValue(value); -}; - -// Blockly needs to know the JSON name of this field. Usually this is -// registered at the bottom of the field class. -Blockly.fieldRegistry.register('field_turtle', CustomFields.FieldTurtle); - -// Called by initView to create all of the SVGs. This is just used to keep -// the code more organized. -CustomFields.FieldTurtle.prototype.createView_ = function() { - this.movableGroup_ = Blockly.utils.dom.createSvgElement('g', - { - 'transform': 'translate(0,5)' - }, this.fieldGroup_); - var scaleGroup = Blockly.utils.dom.createSvgElement('g', - { - 'transform': 'scale(1.5)' - }, this.movableGroup_); - this.turtleGroup_ = Blockly.utils.dom.createSvgElement('g', - { - // Makes the smaller turtle graphic align with the hats. - 'class': 'turtleBody' - }, scaleGroup); - var tail = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M7,27.5H0.188c3.959-2,6.547-2.708,8.776-5.237', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var legLeft = Blockly.utils.dom.createSvgElement('rect', - { - 'class': 'turtleBody', - 'x': 8.812, - 'y': 12.506, - 'width': 4, - 'height': 10 - }, this.turtleGroup_); - var legRight = Blockly.utils.dom.createSvgElement('rect', - { - 'class': 'turtleBody', - 'x': 28.812, - 'y': 12.506, - 'width': 4, - 'height': 10 - }, this.turtleGroup_); - var head = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M47.991,17.884c0,1.92-2.144,3.477-4.788,3.477a6.262,6.262,0,0,1-2.212-.392c-0.2-.077-1.995,2.343-4.866,3.112a17.019,17.019,0,0,1-6.01.588c-4.413-.053-2.5-3.412-2.745-3.819-0.147-.242,2.232.144,6.126-0.376a7.392,7.392,0,0,0,4.919-2.588c0-1.92,2.144-3.477,4.788-3.477S47.991,15.964,47.991,17.884Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var smile = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M42.223,18.668a3.614,3.614,0,0,0,2.728,2.38', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - var sclera = Blockly.utils.dom.createSvgElement('ellipse', - { - 'cx': 43.435, - 'cy': 2.61, - 'rx': 2.247, - 'ry': 2.61, - 'fill': '#fff' - }, this.turtleGroup_); - var pupil = Blockly.utils.dom.createSvgElement('ellipse', - { - 'cx': 44.166, - 'cy': 3.403, - 'rx': 1.318, - 'ry': 1.62 - }, this.turtleGroup_); - var shell = Blockly.utils.dom.createSvgElement('path', - { - 'class': 'turtleBody', - 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - this.shellPattern_ = Blockly.utils.dom.createSvgElement('path', - { - 'd': 'M33.4,27.5H7.193c0-6,5.866-13.021,13.1-13.021S33.4,21.5,33.4,27.5Z', - 'transform': 'translate(0.312 -12.994)' - }, this.turtleGroup_); - - this.stovepipe_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '18' - }, scaleGroup); - this.stovepipe_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/stovepipe.svg'); - this.crown_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '15' - }, scaleGroup); - this.crown_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/crown.svg'); - this.mask_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '24' - }, scaleGroup); - this.mask_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/mask.svg'); - this.propeller_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '11' - }, scaleGroup); - this.propeller_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/propeller.svg'); - this.fedora_ = Blockly.utils.dom.createSvgElement('image', - { - 'width': '50', - 'height': '12' - }, scaleGroup); - this.fedora_.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', - 'media/fedora.svg'); - - // Even if we're not going to display it right away, we want to create all - // of our DOM elements inside this function. - this.crown_.style.display = 'none'; - this.mask_.style.display = 'none'; - this.propeller_.style.display = 'none'; - this.fedora_.style.display = 'none'; - - this.movableGroup_.appendChild(this.textElement_); - this.textElement_.setAttribute( - 'transform', 'translate(' + this.TEXT_OFFSET_X + ',20)'); - - this.defs_ = Blockly.utils.dom.createSvgElement('defs', {}, this.fieldGroup_); - this.polkadotPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'polkadots', - 'patternUnits': 'userSpaceOnUse', - 'width': 10, - 'height': 10 - }, this.defs_); - this.polkadotGroup_ = Blockly.utils.dom.createSvgElement( - 'g', {}, this.polkadotPattern_); - Blockly.utils.dom.createSvgElement('circle', - { - 'cx': 2.5, - 'cy': 2.5, - 'r': 2.5, - 'fill': '#000', - 'fill-opacity': .3 - }, this.polkadotGroup_); - Blockly.utils.dom.createSvgElement('circle', - { - 'cx': 7.5, - 'cy': 7.5, - 'r': 2.5, - 'fill': '#000', - 'fill-opacity': .3 - }, this.polkadotGroup_); - - this.hexagonPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'hexagons', - 'patternUnits': 'userSpaceOnUse', - 'width': 10, - 'height': 8.68, - 'patternTransform': 'translate(2) rotate(45)' - }, this.defs_); - Blockly.utils.dom.createSvgElement('polygon', - { - 'id': 'hex', - 'points': '4.96,4.4 7.46,5.84 7.46,8.74 4.96,10.18 2.46,8.74 2.46,5.84', - 'stroke': '#000', - 'stroke-opacity': .3, - 'fill-opacity': 0 - }, this.hexagonPattern_); - var use = Blockly.utils.dom.createSvgElement('use', - { - 'x': 5, - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': -5, - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': 2.5, - 'y': -4.34 - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - use = Blockly.utils.dom.createSvgElement('use', - { - 'x': -2.5, - 'y': -4.34 - }, this.hexagonPattern_); - use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#hex'); - - this.stripesPattern_ = Blockly.utils.dom.createSvgElement('pattern', - { - 'id': 'stripes', - 'patternUnits': 'userSpaceOnUse', - 'width': 5, - 'height': 10, - 'patternTransform': 'rotate(45)' - }, this.defs_); - Blockly.utils.dom.createSvgElement('line', - { - 'x1': 0, - 'y1': 0, - 'x2': 0, - 'y2': 10, - 'stroke-width': 4, - 'stroke': '#000', - 'stroke-opacity': .3 - }, this.stripesPattern_); -}; diff --git a/demos/custom-fields/turtle/icon.png b/demos/custom-fields/turtle/icon.png deleted file mode 100644 index 3a7314ac970..00000000000 Binary files a/demos/custom-fields/turtle/icon.png and /dev/null differ diff --git a/demos/custom-fields/turtle/index.html b/demos/custom-fields/turtle/index.html deleted file mode 100644 index dd8cb40afed..00000000000 --- a/demos/custom-fields/turtle/index.html +++ /dev/null @@ -1,173 +0,0 @@ - - - - - Blockly Demo: Custom Turtle Field - - - - - - - - -

- Blockly > - Demos > - Custom Fields > Turtle Field

- - -

This is a demo of creating custom block fields. In this case the field - is used to define a turtle. -

- -

All of the custom field implementation is in - demos/custom-fields/turtle/field_turtle.js, including comments on each required - function. -

- -

Click on the blocks' comment icons to learn what they are demonstrating. - Use the buttons below to see how the fields react to changes. -

- -

- - - - - -

- -

- - -

- - - - - - -
- - -
-
- - - - - - diff --git a/demos/custom-fields/turtle/media/crown.svg b/demos/custom-fields/turtle/media/crown.svg deleted file mode 100644 index 3eebccb9228..00000000000 --- a/demos/custom-fields/turtle/media/crown.svg +++ /dev/null @@ -1 +0,0 @@ -crown \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/fedora.svg b/demos/custom-fields/turtle/media/fedora.svg deleted file mode 100644 index 4a354491bd8..00000000000 --- a/demos/custom-fields/turtle/media/fedora.svg +++ /dev/null @@ -1 +0,0 @@ -fedora \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/mask.svg b/demos/custom-fields/turtle/media/mask.svg deleted file mode 100644 index eb4fded1c7a..00000000000 --- a/demos/custom-fields/turtle/media/mask.svg +++ /dev/null @@ -1 +0,0 @@ -mask \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/propeller.svg b/demos/custom-fields/turtle/media/propeller.svg deleted file mode 100644 index bf0a433fd2b..00000000000 --- a/demos/custom-fields/turtle/media/propeller.svg +++ /dev/null @@ -1 +0,0 @@ -propeller \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/stovepipe.svg b/demos/custom-fields/turtle/media/stovepipe.svg deleted file mode 100644 index 6971ff7fdb6..00000000000 --- a/demos/custom-fields/turtle/media/stovepipe.svg +++ /dev/null @@ -1 +0,0 @@ -stovepipe \ No newline at end of file diff --git a/demos/custom-fields/turtle/media/warning.svg b/demos/custom-fields/turtle/media/warning.svg deleted file mode 100644 index 11136c1ef33..00000000000 --- a/demos/custom-fields/turtle/media/warning.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/demos/custom-fields/turtle/turtle.css b/demos/custom-fields/turtle/turtle.css deleted file mode 100644 index ed5e9b3078c..00000000000 --- a/demos/custom-fields/turtle/turtle.css +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @license - * Copyright 2019 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -.customFieldsTurtleWidget { - width: 150px; -} - -.customFieldsTurtleWidget button { - border-radius: 4px; - border: none; - background-color: #fff; - opacity: .6; - color: #000; -} - -.customFieldsTurtleWidget .table { - width: 100%; -} - -.customFieldsTurtleWidget .row { - width: 100%; - display: flex; -} - -.customFieldsTurtleWidget .arrow { - text-align: center; - padding: 0; - flex-grow: 0; -} - -.customFieldsTurtleWidget .text { - height: 20px; - color: #fff; - flex-grow: 1; - text-align: center; -} - -.customFieldsTurtleWidget .randomize { - width: 100%; -} - -.blocklySvg .blocklyNonEditableText text, -.blocklySvg .blocklyEditableText text { - fill: #000; -} diff --git a/demos/fixed/icon.png b/demos/fixed/icon.png deleted file mode 100644 index 0a80ef9a3b8..00000000000 Binary files a/demos/fixed/icon.png and /dev/null differ diff --git a/demos/fixed/index.html b/demos/fixed/index.html deleted file mode 100644 index 85d634608f4..00000000000 --- a/demos/fixed/index.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - Blockly Demo: Fixed Blockly - - - - - - -

Blockly > - Demos > Fixed Blockly

- -

This is a simple demo of injecting Blockly into a fixed-sized 'div' element.

- -

→ More info on injecting fixed-sized Blockly

- -
- - - - - - - diff --git a/demos/generator/icon.png b/demos/generator/icon.png deleted file mode 100644 index c1a84f03427..00000000000 Binary files a/demos/generator/icon.png and /dev/null differ diff --git a/demos/generator/index.html b/demos/generator/index.html deleted file mode 100644 index 127a128d8df..00000000000 --- a/demos/generator/index.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - Blockly Demo: Generating JavaScript - - - - - - - -

Blockly > - Demos > Generating JavaScript

- -

This is a simple demo of generating code from blocks and running - the code in a sandboxed JavaScript interpreter.

- -

→ More info on Code Generators and Running JavaScript.

- -

- - -

- -
- - - - - - - - - diff --git a/demos/graph/icon.png b/demos/graph/icon.png deleted file mode 100644 index 7828463dee6..00000000000 Binary files a/demos/graph/icon.png and /dev/null differ diff --git a/demos/graph/index.html b/demos/graph/index.html deleted file mode 100644 index 766665233cc..00000000000 --- a/demos/graph/index.html +++ /dev/null @@ -1,364 +0,0 @@ - - - - - Blockly Demo: Graph - - - - - - - - -

Blockly > - Demos > Graph

- -

This is a demo of giving instant feedback as blocks are changed.

- -

→ More info on Realtime generation

- - - - - - -
-
-
-
-
- -
- - ... -
- - - - - - - - - diff --git a/demos/headless/icon.png b/demos/headless/icon.png deleted file mode 100644 index f431dc40c13..00000000000 Binary files a/demos/headless/icon.png and /dev/null differ diff --git a/demos/headless/index.html b/demos/headless/index.html deleted file mode 100644 index 61934c0591d..00000000000 --- a/demos/headless/index.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - Blockly Demo: Headless - - - - - - - -

Blockly > - Demos > Headless

- -

This is a simple demo of generating Python code from XML with no graphics. - This might be useful for server-side code generation.

- - - - - - - -
- - - - -
- -
- -
- - - - - diff --git a/demos/index.html b/demos/index.html index d97b89c5120..b180d53d8bf 100644 --- a/demos/index.html +++ b/demos/index.html @@ -24,143 +24,10 @@

Blockly > Demos

-

These demos are intended for developers who want to integrate Blockly with - their own applications.

+

Check out the Blockly samples page for a comprehensive list of demos for developers who want to integrate Blockly into their own applications.

+

The demos on this page combine Blockly features and AppEngine storage.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Inject Blockly into a page as a fixed element.
-
- - - - - -
Inject Blockly into a page as a resizable element.
-
- - - - - -
Organize blocks into categories for the user.
-
- - - - - -
Limit the total number of blocks allowed (for academic exercises).
-
- - - - - -
Turn blocks into code and execute it.
-
- - - - - -
Generate code from XML without graphics.
-
- - - - -
JS Interpreter
- - -
- - - - - -
Instant updates when blocks are changed.
-
- - - - - -
See what Blockly looks like in right-to-left mode (for Arabic and Hebrew).
-
- - - - - -
Override Blockly browser dialogs with custom implementations.
-
- - - - - -
Implement a custom field.
-
@@ -173,42 +40,6 @@

Blockly > Demos

- - - - - -
Two Blockly instances connected as leader-follower.
-
- - - - - -
Version of Blockly accessible to screen readers.
-
- - - - - -
Using Closure Templates to support 35 languages.
-
@@ -232,17 +63,6 @@

Blockly > Demos

Build custom blocks and setup a toolbox using Blockly.
- - - - - -
Demos keyboard navigation.
-
diff --git a/demos/interpreter/acorn_interpreter.js b/demos/interpreter/acorn_interpreter.js deleted file mode 100644 index 19db1c3ef58..00000000000 --- a/demos/interpreter/acorn_interpreter.js +++ /dev/null @@ -1,143 +0,0 @@ -// Acorn: Copyright 2012 Marijn Haverbeke, MIT License -var mod$$inline_58=function(a){function b(a){n=a||{};for(var b in Ua)Object.prototype.hasOwnProperty.call(n,b)||(n[b]=Ua[b]);wa=n.sourceFile||null}function c(a,b){var c=Ab(k,a);b+=" ("+c.line+":"+c.column+")";var d=new SyntaxError(b);d.pos=a;d.loc=c;d.raisedAt=f;throw d;}function d(a){function b(a){if(1==a.length)return c+="return str === "+JSON.stringify(a[0])+";";c+="switch(str){";for(var va=0;vaa)++f;else if(47===a)if(a=k.charCodeAt(f+1),42===a){var a=n.onComment&&n.locations&&new e,b=f,d=k.indexOf("*/",f+=2);-1===d&&c(f-2,"Unterminated comment"); -f=d+2;if(n.locations){Y.lastIndex=b;for(var g=void 0;(g=Y.exec(k))&&g.index=a?a=P(!0):(++f,a=g(xa)),a;case 40:return++f,g(I);case 41:return++f,g(E);case 59:return++f,g(J);case 44:return++f,g(L);case 91:return++f,g(ja); -case 93:return++f,g(ka);case 123:return++f,g(Z);case 125:return++f,g(T);case 58:return++f,g(aa);case 63:return++f,g(ya);case 48:if(a=k.charCodeAt(f+1),120===a||88===a)return f+=2,a=B(16),null==a&&c(x+2,"Expected hexadecimal number"),la(k.charCodeAt(f))&&c(f,"Identifier directly after number"),a=g(ba,a);case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return P(!1);case 34:case 39:a:{f++;for(var b="";;){f>=S&&c(x,"Unterminated string constant");var d=k.charCodeAt(f);if(d===a){++f; -a=g(da,b);break a}if(92===d){var d=k.charCodeAt(++f),e=/^[0-7]+/.exec(k.slice(f,f+3));for(e&&(e=e[0]);e&&255=S)return g(pa);var b=k.charCodeAt(f);if(la(b)||92===b)return Ya();a=m(b);if(!1===a){b=String.fromCharCode(b);if("\\"===b||Za.test(b))return Ya();c(f,"Unexpected character '"+b+"'")}return a}function t(a,b){var c=k.slice(f,f+b);f+=b;g(a,c)}function K(){for(var a,b,d=f;;){f>=S&&c(d, -"Unterminated regular expression");var e=k.charAt(f);na.test(e)&&c(d,"Unterminated regular expression");if(a)a=!1;else{if("["===e)b=!0;else if("]"===e&&b)b=!1;else if("/"===e&&!b)break;a="\\"===e}++f}a=k.slice(d,f);++f;(b=$a())&&!/^[gmsiy]*$/.test(b)&&c(d,"Invalid regexp flag");return g(Ba,new RegExp(a,b))}function B(a,b){for(var c=f,d=0,e=0,g=null==b?Infinity:b;e=h?h-48:Infinity;if(h>=a)break;++f;d=d*a+h}return f===c||null!=b&& -f-c!==b?null:d}function P(a){var b=f,d=!1,e=48===k.charCodeAt(f);a||null!==B(10)||c(b,"Invalid number");46===k.charCodeAt(f)&&(++f,B(10),d=!0);a=k.charCodeAt(f);if(69===a||101===a)a=k.charCodeAt(++f),43!==a&&45!==a||++f,null===B(10)&&c(b,"Invalid number"),d=!0;la(k.charCodeAt(f))&&c(f,"Identifier directly after number");a=k.slice(b,f);var h;d?h=parseFloat(a):e&&1!==a.length?/[89]/.test(a)||C?c(b,"Invalid number"):h=parseInt(a,8):h=parseInt(a,10);return g(ba,h)}function ma(a){a=B(16,a);null===a&&c(x, -"Bad character escape sequence");return a}function $a(){ca=!1;for(var a,b=!0,d=f;;){var e=k.charCodeAt(f);if(ab(e))ca&&(a+=k.charAt(f)),++f;else if(92===e){ca||(a=k.slice(d,f));ca=!0;117!=k.charCodeAt(++f)&&c(f,"Expecting Unicode escape sequence \\uXXXX");++f;var e=ma(4),g=String.fromCharCode(e);g||c(f-1,"Invalid Unicode escape");(b?la(e):ab(e))||c(f-4,"Invalid Unicode escape");a+=g}else break;b=!1}return ca?a:k.slice(d,f)}function Ya(){var a=$a(),b=V;ca||(Lb(a)?b=Ca[a]:(n.forbidReserved&&(3===n.ecmaVersion? -Mb:Nb)(a)||C&&bb(a))&&c(x,"The keyword '"+a+"' is reserved"));return g(b,a)}function r(){Da=x;M=X;Ea=ia;z()}function Fa(a){C=a;f=M;if(n.locations)for(;fb){var e=Q(a);e.left=a;e.operator=H;a=p;r();e.right=Ra(Sa(),d,c);d=q(e,a===Va||a===Wa?"LogicalExpression":"BinaryExpression");return Ra(d,b,c)}return a}function Sa(){if(p.prefix){var a=y(),b=p.isUpdate;a.operator=H;R=a.prefix=!0;r();a.argument= -Sa();b?ra(a.argument):C&&"delete"===a.operator&&"Identifier"===a.argument.type&&c(a.start,"Deleting local variable in strict mode");return q(a,b?"UpdateExpression":"UnaryExpression")}for(b=ha(ua());p.postfix&&!qa();)a=Q(b),a.operator=H,a.prefix=!1,a.argument=b,ra(b),r(),b=q(a,"UpdateExpression");return b}function ha(a,b){if(u(xa)){var c=Q(a);c.object=a;c.property=O(!0);c.computed=!1;return ha(q(c,"MemberExpression"),b)}return u(ja)?(c=Q(a),c.object=a,c.property=A(),c.computed=!0,v(ka),ha(q(c,"MemberExpression"), -b)):!b&&u(I)?(c=Q(a),c.callee=a,c.arguments=Ta(E,!1),ha(q(c,"CallExpression"),b)):a}function ua(){switch(p){case ub:var a=y();r();return q(a,"ThisExpression");case V:return O();case ba:case da:case Ba:return a=y(),a.value=H,a.raw=k.slice(x,X),r(),q(a,"Literal");case vb:case wb:case xb:return a=y(),a.value=p.atomValue,a.raw=p.keyword,r(),q(a,"Literal");case I:var a=oa,b=x;r();var d=A();d.start=b;d.end=X;n.locations&&(d.loc.start=a,d.loc.end=ia);n.ranges&&(d.range=[b,X]);v(E);return d;case ja:return a= -y(),r(),a.elements=Ta(ka,!0,!0),q(a,"ArrayExpression");case Z:a=y();b=!0;d=!1;a.properties=[];for(r();!u(T);){if(b)b=!1;else if(v(L),n.allowTrailingCommas&&u(T))break;var e={key:p===ba||p===da?ua():O(!0)},g=!1,h;u(aa)?(e.value=A(!0),h=e.kind="init"):5<=n.ecmaVersion&&"Identifier"===e.key.type&&("get"===e.key.name||"set"===e.key.name)?(g=d=!0,h=e.kind=e.key.name,e.key=p===ba||p===da?ua():O(!0),p!==I&&N(),e.value=Na(y(),!1)):N();if("Identifier"===e.key.type&&(C||d))for(var f=0;fd?a.id:a.params[d],(bb(e.name)||sa(e.name))&&c(e.start,"Defining '"+e.name+"' in strict mode"),0<=d)for(var g=0;ga?36===a:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Za.test(String.fromCharCode(a))},ab=a.isIdentifierChar=function(a){return 48>a?36===a:58>a?!0:65>a?!1:91>a?!0:97>a?95===a:123>a?!0:170<=a&&Pb.test(String.fromCharCode(a))},ca,Ia={kind:"loop"},Ob={kind:"switch"}}; -"object"==typeof exports&&"object"==typeof module?mod$$inline_58(exports):"function"==typeof define&&define.amd?define(["exports"],mod$$inline_58):mod$$inline_58(this.acorn||(this.acorn={})); -// JS-Interpreter: Copyright 2013 Google LLC, Apache 2.0 -function u(a,b){"string"===typeof a&&(a=acorn.parse(a,ha));this.Ha=a.constructor;var c=new this.Ha({options:{}});for(d in a)c[d]="body"===d?a[d].slice():a[d];this.fa=c;this.kb=b;this.wa=!1;this.U=[];this.Sa=0;this.pb=Object.create(null);var d=/^step([A-Z]\w*)$/;var e,g;for(g in this)"function"===typeof this[g]&&(e=g.match(d))&&(this.pb[e[1]]=this[g].bind(this));this.M=ia(this,this.fa,null);this.Da=this.M.object;this.fa=acorn.parse(this.U.join("\n"),ha);this.U=void 0;ra(this.fa,void 0,void 0);e=new v(this.fa, -this.M);e.done=!1;this.j=[e];this.nb();this.value=void 0;this.fa=c;e=new v(this.fa,this.M);e.done=!1;this.j.length=0;this.j[0]=e;this.stateStack=this.j} -var ha={Ca:5},ya={configurable:!0,enumerable:!0,writable:!1},B={configurable:!0,enumerable:!1,writable:!0},E={configurable:!0,enumerable:!1,writable:!1},za={configurable:!1,enumerable:!0,writable:!0},Aa={STEP_ERROR:!0},Ba={SCOPE_REFERENCE:!0},Ia={VALUE_IN_DESCRIPTOR:!0},Ja={REGEXP_TIMEOUT:!0},Ka=[],La=null,Ma=["onmessage = function(e) {","var result;","var data = e.data;","switch (data[0]) {","case 'split':","result = data[1].split(data[2], data[3]);","break;","case 'match':","result = data[1].match(data[2]);", -"break;","case 'search':","result = data[1].search(data[2]);","break;","case 'replace':","result = data[1].replace(data[2], data[3]);","break;","case 'exec':","var regexp = data[1];","regexp.lastIndex = data[2];","result = [regexp.exec(data[3]), data[1].lastIndex];","break;","default:","throw 'Unknown RegExp operation: ' + data[0];","}","postMessage(result);","};"];function Na(a){var b=a>>>0;return b===Number(a)?b:NaN}function Oa(a){var b=a>>>0;return String(b)===String(a)&&4294967295!==b?b:NaN} -function ra(a,b,c){b?a.start=b:delete a.start;c?a.end=c:delete a.end;for(var d in a)if(a.hasOwnProperty(d)){var e=a[d];e&&"object"===typeof e&&ra(e,b,c)}}u.prototype.REGEXP_MODE=2;u.prototype.REGEXP_THREAD_TIMEOUT=1E3;q=u.prototype;q.I=!1;q.ya=!1; -q.ub=function(a){var b=this.j[0];if(!b||"Program"!==b.node.type)throw Error("Expecting original AST to start with a Program node.");"string"===typeof a&&(a=acorn.parse(a,ha));if(!a||"Program"!==a.type)throw Error("Expecting new AST to start with a Program node.");Pa(this,a,b.scope);Array.prototype.push.apply(b.node.body,a.body);b.done=!1}; -q.step=function(){var a=this.j;do{var b=a[a.length-1];if(!b)return!1;var c=b.node,d=c.type;if("Program"===d&&b.done)return!1;if(this.wa)break;try{var e=this.pb[d](a,b,c)}catch(g){if(g!==Aa)throw g;}e&&a.push(e);if(this.I)throw Error("Getter not supported in this context");if(this.ya)throw Error("Setter not supported in this context");}while(!c.end);return!0};q.nb=function(){for(;!this.wa&&this.step(););return this.wa}; -function Qa(a,b){a.setProperty(b,"NaN",NaN,ya);a.setProperty(b,"Infinity",Infinity,ya);a.setProperty(b,"undefined",void 0,ya);a.setProperty(b,"window",b,ya);a.setProperty(b,"this",b,ya);a.setProperty(b,"self",b);a.B=new F(null);a.W=new F(a.B);db(a,b);eb(a,b);b.la=a.B;a.setProperty(b,"constructor",a.m,B);Fb(a,b);Gb(a,b);Hb(a,b);Ib(a,b);Jb(a,b);Kb(a,b);Lb(a,b);Mb(a,b);Nb(a,b);var c=a.b(function(){throw EvalError("Can't happen");},!1);c.eval=!0;a.setProperty(b,"eval",c);a.setProperty(b,"parseInt",a.b(parseInt, -!1));a.setProperty(b,"parseFloat",a.b(parseFloat,!1));a.setProperty(b,"isNaN",a.b(isNaN,!1));a.setProperty(b,"isFinite",a.b(isFinite,!1));c=[[escape,"escape"],[unescape,"unescape"],[decodeURI,"decodeURI"],[decodeURIComponent,"decodeURIComponent"],[encodeURI,"encodeURI"],[encodeURIComponent,"encodeURIComponent"]];for(var d=0;d>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;", -"while (k < len) {","if (k in O && !callbackfn.call(T, O[k], k, O)) return false;","k++;","}","return true;","}","});","Object.defineProperty(Array.prototype, 'filter',","{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (this === void 0 || this === null || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var res = [];","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t) {", -"var val = t[i];","if (fun.call(thisArg, val, i, t)) res.push(val);","}","}","return res;","}","});","Object.defineProperty(Array.prototype, 'forEach',","{configurable: true, writable: true, value:","function(callback, thisArg) {","if (!this || typeof callback !== 'function') throw TypeError();","var T, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","k = 0;","while (k < len) {","if (k in O) callback.call(T, O[k], k, O);","k++;","}","}","});","Object.defineProperty(Array.prototype, 'map',", -"{configurable: true, writable: true, value:","function(callback, thisArg) {","if (!this || typeof callback !== 'function') new TypeError;","var T, A, k;","var O = Object(this);","var len = O.length >>> 0;","if (arguments.length > 1) T = thisArg;","A = new Array(len);","k = 0;","while (k < len) {","if (k in O) A[k] = callback.call(T, O[k], k, O);","k++;","}","return A;","}","});","Object.defineProperty(Array.prototype, 'reduce',","{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {", -"if (!this || typeof callback !== 'function') throw TypeError();","var t = Object(this), len = t.length >>> 0, k = 0, value;","if (arguments.length === 2) {","value = arguments[1];","} else {","while (k < len && !(k in t)) k++;","if (k >= len) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k++];","}","for (; k < len; k++) {","if (k in t) value = callback(value, t[k], k, t);","}","return value;","}","});","Object.defineProperty(Array.prototype, 'reduceRight',", -"{configurable: true, writable: true, value:","function(callback /*, initialValue*/) {","if (null === this || 'undefined' === typeof this || 'function' !== typeof callback) throw TypeError();","var t = Object(this), len = t.length >>> 0, k = len - 1, value;","if (arguments.length >= 2) {","value = arguments[1];","} else {","while (k >= 0 && !(k in t)) k--;","if (k < 0) {","throw TypeError('Reduce of empty array with no initial value');","}","value = t[k--];","}","for (; k >= 0; k--) {","if (k in t) value = callback(value, t[k], k, t);", -"}","return value;","}","});","Object.defineProperty(Array.prototype, 'some',","{configurable: true, writable: true, value:","function(fun/*, thisArg*/) {","if (!this || typeof fun !== 'function') throw TypeError();","var t = Object(this);","var len = t.length >>> 0;","var thisArg = arguments.length >= 2 ? arguments[1] : void 0;","for (var i = 0; i < len; i++) {","if (i in t && fun.call(thisArg, t[i], i, t)) {","return true;","}","}","return false;","}","});","(function() {","var sort_ = Array.prototype.sort;", -"Array.prototype.sort = function(opt_comp) {","if (typeof opt_comp !== 'function') {","return sort_.call(this);","}","for (var i = 0; i < this.length; i++) {","var changes = 0;","for (var j = 0; j < this.length - i - 1; j++) {","if (opt_comp(this[j], this[j + 1]) > 0) {","var swap = this[j];","this[j] = this[j + 1];","this[j + 1] = swap;","changes++;","}","}","if (!changes) break;","}","return this;","};","})();","Object.defineProperty(Array.prototype, 'toLocaleString',","{configurable: true, writable: true, value:", -"function() {","var out = [];","for (var i = 0; i < this.length; i++) {","out[i] = (this[i] === null || this[i] === undefined) ? '' : this[i].toLocaleString();","}","return out.join(',');","}","});","")} -function Gb(a,b){var c=function(e){e=arguments.length?String(e):"";return zc(a)?(this.data=e,this):e};a.w=a.b(c,!0);a.setProperty(b,"String",a.w);a.setProperty(a.w,"fromCharCode",a.b(String.fromCharCode,!1),B);c="charAt charCodeAt concat indexOf lastIndexOf slice substr substring toLocaleLowerCase toLocaleUpperCase toLowerCase toUpperCase trim".split(" ");for(var d=0;d= 0; i--) {","str = str.substring(0, subs[i][0]) + subs[i][2] + str.substring(subs[i][0] + subs[i][1]);", -"}","} else {","var i = str.indexOf(substr);","if (i !== -1) {","var inject = newSubstr(str.substr(i, substr.length), i, str);","str = str.substring(0, i) + inject + str.substring(i + substr.length);","}","}","return str;","};","})();","")}function Hb(a,b){a.Ya=a.b(function(c){c=!!c;return zc(a)?(this.data=c,this):c},!0);a.setProperty(b,"Boolean",a.Ya)} -function Ib(a,b){var c=function(e){e=arguments.length?Number(e):0;return zc(a)?(this.data=e,this):e};a.S=a.b(c,!0);a.setProperty(b,"Number",a.S);c=["MAX_VALUE","MIN_VALUE","NaN","NEGATIVE_INFINITY","POSITIVE_INFINITY"];for(var d=0;db.charCodeAt(0)&&U(this,a,this.w)){var c=Oa(b);if(!isNaN(c)&&c>=":d>>=e;break;case ">>>=":d>>>=e;break;case "&=":d&=e;break;case "^=":d^=e;break;case "|=":d|=e;break;default:throw SyntaxError("Unknown assignment expression: "+c.operator);}if(c=cd(this,b.ra,d))return b.ia=!0,b.Wa=d,fd(this,c,b.ra,d);a.pop();a[a.length-1].value=d}}; -u.prototype.stepBinaryExpression=function(a,b,c){if(!b.Y)return b.Y=!0,new v(c.left,b.scope);if(!b.pa)return b.pa=!0,b.$=b.value,new v(c.right,b.scope);a.pop();var d=b.$;b=b.value;switch(c.operator){case "==":c=d==b;break;case "!=":c=d!=b;break;case "===":c=d===b;break;case "!==":c=d!==b;break;case ">":c=d>b;break;case ">=":c=d>=b;break;case "<":c=d>":c=d>>b;break;case ">>>":c=d>>>b;break;case "in":b instanceof F||I(this,this.g,"'in' expects an object, not '"+b+"'");c=Bc(this,b,d);break;case "instanceof":U(this,b,this.H)||I(this,this.g,"Right-hand side of instanceof is not an object");c=d instanceof F?U(this,d,b):!1;break;default:throw SyntaxError("Unknown binary operator: "+c.operator);}a[a.length-1].value=c}; -u.prototype.stepBlockStatement=function(a,b,c){var d=b.o||0;if(c=c.body[d])return b.o=d+1,new v(c,b.scope);a.pop()};u.prototype.stepBreakStatement=function(a,b,c){dd(this,1,void 0,c.label&&c.label.name)}; -u.prototype.stepCallExpression=function(a,b,c){if(!b.ha){b.ha=1;var d=new v(c.callee,b.scope);d.ga=!0;return d}if(1===b.ha){b.ha=2;d=b.value;if(Array.isArray(d)){if(b.Z=bd(this,d),d[0]===Ba?b.yb="eval"===d[1]:b.G=d[0],d=b.Z,this.I)return b.ha=1,ed(this,d,b.value)}else b.Z=d;b.A=[];b.o=0}d=b.Z;if(!b.Qa){0!==b.o&&b.A.push(b.value);if(c.arguments[b.o])return new v(c.arguments[b.o++],b.scope);if("NewExpression"===c.type){d.Hb&&I(this,this.g,d+" is not a constructor");if(d===this.l)b.G=Ac(this);else{var e= -d.a.prototype;if("object"!==typeof e||null===e)e=this.B;b.G=this.h(e)}b.isConstructor=!0}else void 0===b.G&&(b.G=b.scope.P?void 0:this.Da);b.Qa=!0}if(b.Ra)a.pop(),a[a.length-1].value=b.isConstructor&&"object"!==typeof b.value?b.G:b.value;else{b.Ra=!0;d instanceof F||I(this,this.g,d+" is not a function");if(a=d.node){c=ia(this,a.body,d.va);for(var g=0;gg?b.A[g]:void 0);e=Ac(this);for(g=0;g - - - - Blockly Demo: Asynchronous Execution with JS Interpreter - - - - - - - - - -

Blockly > - Demos > Asynchronous Execution with JS Interpreter

- -

This is a demo of executing code asynchronously (e.g., waiting for delays or user input) using the JavaScript interpreter.

- -

More info on running code with JS Interpreter

- -

- -

- -
-
- -
- - - - - - - - diff --git a/demos/interpreter/icon.png b/demos/interpreter/icon.png deleted file mode 100644 index b70d1b03595..00000000000 Binary files a/demos/interpreter/icon.png and /dev/null differ diff --git a/demos/interpreter/index.html b/demos/interpreter/index.html deleted file mode 100644 index 52e49eee4f2..00000000000 --- a/demos/interpreter/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Redirecting... - - - -Redirecting to step execution JS-Interpreter demo. - - diff --git a/demos/interpreter/step-execution.html b/demos/interpreter/step-execution.html deleted file mode 100644 index 03e62aed67e..00000000000 --- a/demos/interpreter/step-execution.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - Blockly Demo: Step Execution with JS Interpreter - - - - - - - - -

Blockly > - Demos > Step Execution with JS Interpreter

- -

This is a demo of executing code step-by-step with a sandboxed JavaScript interpreter.

- -

The generator's Blockly.JavaScript.STATEMENT_PREFIX is assigned 'highlightBlock(%1);\n', - where %1 is the block id. The call to highlightBlock() will highlight the identified block - and set the variable highlightPause to true.

- -

"Parse JavaScript" will generate the code and load it into the interpreter. Then, each press of the - "Step JavaScript" button will run the interpreter one step until the highlightPause is true. - That is, until highlightBlock() has highlighted the block that will be executed on the next step.

- -

More info on running code with JS Interpreter

- -

- -

- -
-
- -
- - - - - - - - diff --git a/demos/interpreter/wait_block.js b/demos/interpreter/wait_block.js deleted file mode 100644 index 10a57b482eb..00000000000 --- a/demos/interpreter/wait_block.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Example "wait" block that will pause the interpreter for a - * number of seconds. Because wait is a blocking behavior, such blocks will - * only work in interpreted environments. - * - * See https://neil.fraser.name/software/JS-Interpreter/docs.html - */ -Blockly.defineBlocksWithJsonArray([{ - "type": "wait_seconds", - "message0": " wait %1 seconds", - "args0": [{ - "type": "field_number", - "name": "SECONDS", - "min": 0, - "max": 600, - "value": 1 - }], - "previousStatement": null, - "nextStatement": null, - "colour": "%{BKY_LOOPS_HUE}" -}]); - -/** - * Generator for wait block creates call to new method - * waitForSeconds(). - */ -Blockly.JavaScript['wait_seconds'] = function(block) { - var seconds = Number(block.getFieldValue('SECONDS')); - var code = 'waitForSeconds(' + seconds + ');\n'; - return code; -}; - -/** - * Register the interpreter asynchronous function - * waitForSeconds(). - */ -function initInterpreterWaitForSeconds(interpreter, globalObject) { - // Ensure function name does not conflict with variable names. - Blockly.JavaScript.addReservedWords('waitForSeconds'); - - var wrapper = interpreter.createAsyncFunction( - function(timeInSeconds, callback) { - // Delay the call to the callback. - setTimeout(callback, timeInSeconds * 1000); - }); - interpreter.setProperty(globalObject, 'waitForSeconds', wrapper); -} diff --git a/demos/keyboard_nav/icon.png b/demos/keyboard_nav/icon.png deleted file mode 100644 index ff96ab5ca95..00000000000 Binary files a/demos/keyboard_nav/icon.png and /dev/null differ diff --git a/demos/keyboard_nav/index.html b/demos/keyboard_nav/index.html deleted file mode 100644 index de00e50cbbc..00000000000 --- a/demos/keyboard_nav/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Redirecting... - - - diff --git a/demos/maxBlocks/icon.png b/demos/maxBlocks/icon.png deleted file mode 100644 index b90c7961501..00000000000 Binary files a/demos/maxBlocks/icon.png and /dev/null differ diff --git a/demos/maxBlocks/index.html b/demos/maxBlocks/index.html deleted file mode 100644 index dc94f2f4528..00000000000 --- a/demos/maxBlocks/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - Blockly Demo: Maximum Block Limit - - - - - - -

Blockly > - Demos > Maximum Block Limit

- -

This is a demo of Blockly which has been restricted to a maximum of - five blocks.

- -

You have block(s) left.

- -
- - - - - - - diff --git a/demos/mirror/icon.png b/demos/mirror/icon.png deleted file mode 100644 index 45e2a9a290c..00000000000 Binary files a/demos/mirror/icon.png and /dev/null differ diff --git a/demos/mirror/index.html b/demos/mirror/index.html deleted file mode 100644 index 84762f31df5..00000000000 --- a/demos/mirror/index.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - Blockly Demo: Mirrored Blockly - - - - - - -

Blockly > - Demos > Mirrored Blockly

- -

This is a simple demo of a primary Blockly instance that controls a secondary Blockly instance with events. - Open the JavaScript console to see the event passing.

- -

→ More info on events

- - - - - - -
-
-
-
-
- - - - - - - diff --git a/demos/plane/README.txt b/demos/plane/README.txt deleted file mode 100644 index 944448fd6da..00000000000 --- a/demos/plane/README.txt +++ /dev/null @@ -1,26 +0,0 @@ -This Blockly demo uses Closure Templates to create a multilingual application. -Any changes to the template.soy file require a recompile. Here is the command -to generate a quick English version for debugging: - -java -jar soy/SoyToJsSrcCompiler.jar --outputPathFormat generated/en.js --srcs template.soy - -To generate a full set of language translations, first extract all the strings -from template.soy using this command: - -java -jar soy/SoyMsgExtractor.jar --outputFile xlf/extracted_msgs.xlf template.soy - -This generates xlf/extracted_msgs.xlf, which may then be used by any -XLIFF-compatible translation console to generate a set of files with the -translated strings. These should be placed in the xlf directory. - -Finally, generate all the language versions with this command: - -java -jar soy/SoyToJsSrcCompiler.jar --locales ar,be-tarask,br,ca,da,de,el,en,es,fa,fr,he,hrx,hu,ia,is,it,ja,ko,ms,nb,nl,pl,pms,pt-br,ro,ru,sc,sv,th,tr,uk,vi,zh-hans,zh-hant --messageFilePathFormat xlf/translated_msgs_{LOCALE}.xlf --outputPathFormat "generated/{LOCALE}.js" template.soy - -This is the process that Google uses for maintaining Blockly Games in 50+ -languages. The XLIFF format is simple enough that it is trivial to write a -Python script to reformat it into some other format (such as JSON) for -compatibility with other translation consoles. - -For more information, see message translation for Closure Templates: -https://developers.google.com/closure/templates/docs/translation diff --git a/demos/plane/blocks.js b/demos/plane/blocks.js deleted file mode 100644 index c3c094a8731..00000000000 --- a/demos/plane/blocks.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @license - * Copyright 2013 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Blocks for Blockly's Plane Seat Calculator application. - */ -'use strict'; - -Blockly.Blocks['plane_set_seats'] = { - // Block seat variable setter. - init: function() { - this.setHelpUrl(Blockly.Msg['VARIABLES_SET_HELPURL']); - this.setColour(330); - this.appendValueInput('VALUE') - .appendField(Plane.getMsg('Plane_setSeats')); - this.setTooltip(Blockly.Msg['VARIABLES_SET_TOOLTIP']); - this.setDeletable(false); - } -}; - -Blockly.JavaScript['plane_set_seats'] = function(block) { - // Generate JavaScript for seat variable setter. - var argument0 = Blockly.JavaScript.valueToCode(block, 'VALUE', - Blockly.JavaScript.ORDER_ASSIGNMENT) || 'NaN'; - return argument0 + ';'; -}; - -Blockly.Blocks['plane_get_rows'] = { - // Block for row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows') - .replace('%1', Plane.rows1st), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows') - .replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows'] = function(block) { - // Generate JavaScript for row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows1st'] = { - // Block for first class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows1') - .replace('%1', Plane.rows1st), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows1') - .replace('%1', Plane.rows1st), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows1st'] = function(block) { - // Generate JavaScript for first class row variable getter. - return ['Plane.rows1st', Blockly.JavaScript.ORDER_MEMBER]; -}; - -Blockly.Blocks['plane_get_rows2nd'] = { - // Block for second class row variable getter. - init: function() { - this.setHelpUrl(Blockly.Msg['VARIABLES_GET_HELPURL']); - this.setColour(330); - this.appendDummyInput() - .appendField(Plane.getMsg('Plane_getRows2') - .replace('%1', Plane.rows2nd), 'title'); - this.setOutput(true, 'Number'); - }, - customUpdate: function() { - this.setFieldValue( - Plane.getMsg('Plane_getRows2') - .replace('%1', Plane.rows2nd), 'title'); - } -}; - -Blockly.JavaScript['plane_get_rows2nd'] = function(block) { - // Generate JavaScript for second class row variable getter. - return ['Plane.rows2nd', Blockly.JavaScript.ORDER_MEMBER]; -}; diff --git a/demos/plane/generated/ar.js b/demos/plane/generated/ar.js deleted file mode 100644 index ac760fb11d8..00000000000 --- a/demos/plane/generated/ar.js +++ /dev/null @@ -1,50 +0,0 @@ -// This file was automatically generated from template.soy. -// Please don't edit this file by hand. - -/** - * @fileoverview Templates in namespace planepage. - */ - -if (typeof planepage == 'undefined') { var planepage = {}; } - - -planepage.messages = function(opt_data, opt_ignored, opt_ijData) { - return '
\u0627\u0644\u0635\u0641\u0648\u0641: %1\u0627\u0644\u0635\u0641\u0648\u0641 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649 (%1)\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: %1\u0635\u0641\u0648\u0641 \u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u062B\u0627\u0646\u064A\u0629: (%1)\u0627\u0644\u0645\u0642\u0627\u0639\u062F: %1\u061F\u0627\u0644\u0645\u0642\u0627\u0639\u062F =
'; -}; -if (goog.DEBUG) { - planepage.messages.soyTemplateName = 'planepage.messages'; -} - - -planepage.start = function(opt_data, opt_ignored, opt_ijData) { - var output = planepage.messages(null, null, opt_ijData) + '

Blockly‏ > Demos‏ > \u0622\u0644\u0629 \u062D\u0627\u0633\u0628\u0629 \u0644\u0645\u0642\u0639\u062F \u0627\u0644\u0637\u0627\u0626\u0631\u0629   '; - var iLimit47 = opt_ijData.maxLevel + 1; - for (var i47 = 1; i47 < iLimit47; i47++) { - output += ' ' + ((i47 == opt_ijData.level) ? '' + soy.$$escapeHtml(i47) + '' : (i47 < opt_ijData.level) ? '' : '' + soy.$$escapeHtml(i47) + ''); - } - output += '

- - - - - - diff --git a/demos/plane/plane.js b/demos/plane/plane.js deleted file mode 100644 index a62d061b207..00000000000 --- a/demos/plane/plane.js +++ /dev/null @@ -1,429 +0,0 @@ -/** - * @license - * Copyright 2012 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview JavaScript for Blockly's Plane Seat Calculator demo. - */ -'use strict'; - -/** - * Create a namespace for the application. - */ -var Plane = {}; - -/** - * Lookup for names of supported languages. Keys should be in ISO 639 format. - */ -Plane.LANGUAGE_NAME = { - 'ar': 'العربية', - 'be-tarask': 'Taraškievica', - 'br': 'Brezhoneg', - 'ca': 'Català', - 'da': 'Dansk', - 'de': 'Deutsch', - 'el': 'Ελληνικά', - 'en': 'English', - 'es': 'Español', - 'fa': 'فارسی', - 'fr': 'Français', - 'he': 'עברית', - 'hrx': 'Hunsrik', - 'hu': 'Magyar', - 'ia': 'Interlingua', - 'is': 'Íslenska', - 'it': 'Italiano', - 'ja': '日本語', - 'ko': '한국어', - 'ms': 'Bahasa Melayu', - 'nb': 'Norsk Bokmål', - 'nl': 'Nederlands, Vlaams', - 'pl': 'Polski', - 'pms': 'Piemontèis', - 'pt-br': 'Português Brasileiro', - 'ro': 'Română', - 'ru': 'Русский', - 'sc': 'Sardu', - 'sv': 'Svenska', - 'th': 'ภาษาไทย', - 'tr': 'Türkçe', - 'uk': 'Українська', - 'vi': 'Tiếng Việt', - 'zh-hans': '简体中文', - 'zh-hant': '正體中文' -}; - -/** - * List of RTL languages. - */ -Plane.LANGUAGE_RTL = ['ar', 'fa', 'he']; - -/** - * Main Blockly workspace. - * @type {Blockly.WorkspaceSvg} - */ -Plane.workspace = null; - -/** - * Extracts a parameter from the URL. - * If the parameter is absent default_value is returned. - * @param {string} name The name of the parameter. - * @param {string} defaultValue Value to return if paramater not found. - * @return {string} The parameter value or the default value if not found. - */ -Plane.getStringParamFromUrl = function(name, defaultValue) { - var val = location.search.match(new RegExp('[?&]' + name + '=([^&]+)')); - return val ? decodeURIComponent(val[1].replace(/\+/g, '%20')) : defaultValue; -}; - -/** - * Extracts a numeric parameter from the URL. - * If the parameter is absent or less than min_value, min_value is - * returned. If it is greater than max_value, max_value is returned. - * @param {string} name The name of the parameter. - * @param {number} minValue The minimum legal value. - * @param {number} maxValue The maximum legal value. - * @return {number} A number in the range [min_value, max_value]. - */ -Plane.getNumberParamFromUrl = function(name, minValue, maxValue) { - var val = Number(Plane.getStringParamFromUrl(name, 'NaN')); - return isNaN(val) ? minValue : Math.min(Math.max(minValue, val), maxValue); -}; - -/** - * Get the language of this user from the URL. - * @return {string} User's language. - */ -Plane.getLang = function() { - var lang = Plane.getStringParamFromUrl('lang', ''); - if (Plane.LANGUAGE_NAME[lang] === undefined) { - // Default to English. - lang = 'en'; - } - return lang; -}; - -/** - * Is the current language (Plane.LANG) an RTL language? - * @return {boolean} True if RTL, false if LTR. - */ -Plane.isRtl = function() { - return Plane.LANGUAGE_RTL.indexOf(Plane.LANG) !== -1; -}; - -/** - * Load blocks saved in session/local storage. - * @param {string} defaultXml Text representation of default blocks. - */ -Plane.loadBlocks = function(defaultXml) { - try { - var loadOnce = window.sessionStorage.loadOnceBlocks; - } catch(e) { - // Firefox sometimes throws a SecurityError when accessing sessionStorage. - // Restarting Firefox fixes this, so it looks like a bug. - var loadOnce = null; - } - if (loadOnce) { - // Language switching stores the blocks during the reload. - delete window.sessionStorage.loadOnceBlocks; - var xml = Blockly.Xml.textToDom(loadOnce); - Blockly.Xml.domToWorkspace(xml, Plane.workspace); - } else if (defaultXml) { - // Load the editor with default starting blocks. - var xml = Blockly.Xml.textToDom(defaultXml); - Blockly.Xml.domToWorkspace(xml, Plane.workspace); - } - Plane.workspace.clearUndo(); -}; - -/** - * Save the blocks and reload with a different language. - */ -Plane.changeLanguage = function() { - // Store the blocks for the duration of the reload. - // This should be skipped for the index page, which has no blocks and does - // not load Blockly. - // MSIE 11 does not support sessionStorage on file:// URLs. - if (typeof Blockly !== 'undefined' && window.sessionStorage) { - var xml = Blockly.Xml.workspaceToDom(Plane.workspace); - var text = Blockly.Xml.domToText(xml); - window.sessionStorage.loadOnceBlocks = text; - } - - var languageMenu = document.getElementById('languageMenu'); - var newLang = encodeURIComponent( - languageMenu.options[languageMenu.selectedIndex].value); - var search = window.location.search; - if (search.length <= 1) { - search = '?lang=' + newLang; - } else if (search.match(/[?&]lang=[^&]*/)) { - search = search.replace(/([?&]lang=)[^&]*/, '$1' + newLang); - } else { - search = search.replace(/\?/, '?lang=' + newLang + '&'); - } - - window.location = window.location.protocol + '//' + - window.location.host + window.location.pathname + search; -}; - -/** - * Gets the message with the given key from the document. - * @param {string} key The key of the document element. - * @return {string} The textContent of the specified element, - * or an error message if the element was not found. - */ -Plane.getMsg = function(key) { - var element = document.getElementById(key); - if (element) { - var text = element.textContent; - // Convert newline sequences. - text = text.replace(/\\n/g, '\n'); - return text; - } else { - return '[Unknown message: ' + key + ']'; - } -}; - -/** - * User's language (e.g. "en"). - * @type {string} - */ -Plane.LANG = Plane.getLang(); - -Plane.MAX_LEVEL = 3; -Plane.LEVEL = Plane.getNumberParamFromUrl('level', 1, Plane.MAX_LEVEL); - -Plane.rows1st = 0; -Plane.rows2nd = 0; - -/** - * Redraw the rows and update blocks when the slider has moved. - * @param {number} value New slider position. - */ -Plane.sliderChange = function(value) { - var newRows = Math.round(value * 410 / 20); - Plane.redraw(newRows); - - function updateBlocks(blocks) { - for (var i = 0, block; block = blocks[i]; i++) { - block.customUpdate && block.customUpdate(); - } - } - updateBlocks(Plane.workspace.getAllBlocks(false), true); - updateBlocks(Plane.workspace.flyout_.workspace_.getAllBlocks(false)); -}; - -/** - * Change the text of a label. - * @param {string} id ID of element to change. - * @param {string} text New text. - */ -Plane.setText = function(id, text) { - var el = document.getElementById(id); - while (el.firstChild) { - el.removeChild(el.firstChild); - } - el.appendChild(document.createTextNode(text)); -}; - -/** - * Display a checkmark or cross next to the answer. - * @param {?boolean} ok True for checkmark, false for cross, null for nothing. - */ -Plane.setCorrect = function(ok) { - var yes = document.getElementById('seatYes'); - var no = document.getElementById('seatNo'); - yes.style.display = 'none'; - no.style.display = 'none'; - if (ok === true) { - yes.style.display = 'block'; - } else if (ok === false) { - no.style.display = 'block'; - } -}; - -/** - * Initialize Blockly and the SVG plane. - */ -Plane.init = function() { - Plane.initLanguage(); - - // Fixes viewport for small screens. - var viewport = document.querySelector('meta[name="viewport"]'); - if (viewport && screen.availWidth < 725) { - viewport.setAttribute('content', - 'width=725, initial-scale=.35, user-scalable=no'); - } - - Plane.workspace = Blockly.inject('blockly', - {media: '../../media/', - rtl: Plane.isRtl(), - toolbox: document.getElementById('toolbox')}); - - var defaultXml = - '' + - ' ' + - ' ' + - ''; - Plane.loadBlocks(defaultXml); - - Plane.workspace.addChangeListener(Plane.recalculate); - Plane.workspace.addChangeListener(Blockly.Events.disableOrphans); - - // Initialize the slider. - var svg = document.getElementById('plane'); - Plane.rowSlider = new Slider(60, 330, 425, svg, Plane.sliderChange); - Plane.rowSlider.setValue(0.225); - - // Draw five 1st class rows. - Plane.redraw(5); -}; - -/** - * Initialize the page language. - */ -Plane.initLanguage = function() { - // Set the page title with the content of the H1 title. - document.title += ' ' + document.getElementById('title').textContent; - - // Set the HTML's language and direction. - // document.dir fails in Mozilla, use document.body.parentNode.dir instead. - // https://bugzilla.mozilla.org/show_bug.cgi?id=151407 - var rtl = Plane.isRtl(); - document.head.parentElement.setAttribute('dir', rtl ? 'rtl' : 'ltr'); - document.head.parentElement.setAttribute('lang', Plane.LANG); - - // Sort languages alphabetically. - var languages = []; - for (var lang in Plane.LANGUAGE_NAME) { - languages.push([Plane.LANGUAGE_NAME[lang], lang]); - } - var comp = function(a, b) { - // Sort based on first argument ('English', 'Русский', '简体字', etc). - if (a[0] > b[0]) return 1; - if (a[0] < b[0]) return -1; - return 0; - }; - languages.sort(comp); - // Populate the language selection menu. - var languageMenu = document.getElementById('languageMenu'); - languageMenu.options.length = 0; - for (var i = 0; i < languages.length; i++) { - var tuple = languages[i]; - var lang = tuple[tuple.length - 1]; - var option = new Option(tuple[0], lang); - if (lang === Plane.LANG) { - option.selected = true; - } - languageMenu.options.add(option); - } - languageMenu.addEventListener('change', Plane.changeLanguage, true); -}; - -/** - * Use the blocks to calculate the number of seats. - * Display the calculated number. - */ -Plane.recalculate = function() { - // Find the 'set' block and use it as the formula root. - var rootBlock = null; - var blocks = Plane.workspace.getTopBlocks(false); - for (var i = 0, block; block = blocks[i]; i++) { - if (block.type === 'plane_set_seats') { - rootBlock = block; - } - } - var seats = NaN; - Blockly.JavaScript.init(Plane.workspace); - var code = Blockly.JavaScript.blockToCode(rootBlock); - try { - seats = eval(code); - } catch (e) { - // Allow seats to remain NaN. - } - Plane.setText('seatText', - Plane.getMsg('Plane_seats').replace( - '%1', isNaN(seats) ? '?' : seats)); - Plane.setCorrect(isNaN(seats) ? null : (Plane.answer() === seats)); -}; - -/** - * Calculate the correct answer. - * @return {number} Number of seats. - */ -Plane.answer = function() { - if (Plane.LEVEL === 1) { - return Plane.rows1st * 4; - } else if (Plane.LEVEL === 2) { - return 2 + (Plane.rows1st * 4); - } else if (Plane.LEVEL === 3) { - return 2 + (Plane.rows1st * 4) + (Plane.rows2nd * 5); - } - throw 'Unknown level.'; -}; - -/** - * Redraw the SVG to show a new number of rows. - * @param {number} newRows - */ -Plane.redraw = function(newRows) { - var rows1st = Plane.rows1st; - var rows2nd = Plane.rows2nd; - var svg = document.getElementById('plane'); - if (newRows !== rows1st) { - while (newRows < rows1st) { - var row = document.getElementById('row1st' + rows1st); - row.parentNode.removeChild(row); - rows1st--; - } - while (newRows > rows1st) { - rows1st++; - var row = document.createElementNS('http://www.w3.org/2000/svg', 'use'); - row.id = 'row1st' + rows1st; - // Row of 4 seats. - row.setAttribute('x', (rows1st - 1) * 20); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row1st'); - svg.appendChild(row); - } - - if (Plane.LEVEL === 3) { - newRows = Math.floor((21 - newRows) * 1.11); - while (newRows < rows2nd) { - var row = document.getElementById('row2nd' + rows2nd); - row.parentNode.removeChild(row); - rows2nd--; - } - while (newRows > rows2nd) { - rows2nd++; - var row = document.createElementNS('http://www.w3.org/2000/svg', 'use'); - row.id = 'row2nd' + rows2nd; - row.setAttribute('x', 400 - (rows2nd - 1) * 18); - row.setAttributeNS('http://www.w3.org/1999/xlink', - 'xlink:href', '#row2nd'); - svg.appendChild(row); - } - } - - if (Plane.LEVEL < 3) { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows').replace('%1', rows1st)); - } else { - Plane.setText('row1stText', - Plane.getMsg('Plane_rows1').replace('%1', rows1st)); - Plane.setText('row2ndText', - Plane.getMsg('Plane_rows2').replace('%1', rows2nd)); - } - - Plane.rows1st = rows1st; - Plane.rows2nd = rows2nd; - Plane.recalculate(); - } -}; - -window.addEventListener('load', Plane.init); - -// Load the user's language pack. -document.write('\n'); diff --git a/demos/plane/slider.js b/demos/plane/slider.js deleted file mode 100644 index 8c0a1e8fc9c..00000000000 --- a/demos/plane/slider.js +++ /dev/null @@ -1,273 +0,0 @@ -/** - * @license - * Copyright 2012 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview A slider control in SVG. - */ -'use strict'; - - -/** - * Object representing a horizontal slider widget. - * @param {number} x The horizontal offset of the slider. - * @param {number} y The vertical offset of the slider. - * @param {number} width The total width of the slider. - * @param {!Element} svgParent The SVG element to append the slider to. - * @param {Function=} opt_changeFunc Optional callback function that will be - * called when the slider is moved. The current value is passed. - * @constructor - */ -var Slider = function(x, y, width, svgParent, opt_changeFunc) { - this.KNOB_Y_ = y - 12; - this.KNOB_MIN_X_ = x + 8; - this.KNOB_MAX_X_ = x + width - 8; - this.TARGET_OVERHANG_ = 20; - this.value_ = 0.5; - this.changeFunc_ = opt_changeFunc; - this.animationTasks_ = []; - - // Draw the slider. - /* - - - - - */ - var track = document.createElementNS(Slider.SVG_NS_, 'line'); - track.setAttribute('class', 'sliderTrack'); - track.setAttribute('x1', x); - track.setAttribute('y1', y); - track.setAttribute('x2', x + width); - track.setAttribute('y2', y); - svgParent.appendChild(track); - this.track_ = track; - var rect = document.createElementNS(Slider.SVG_NS_, 'rect'); - rect.setAttribute('style', 'opacity: 0'); - rect.setAttribute('x', x - this.TARGET_OVERHANG_); - rect.setAttribute('y', y - this.TARGET_OVERHANG_); - rect.setAttribute('width', width + 2 * this.TARGET_OVERHANG_); - rect.setAttribute('height', 2 * this.TARGET_OVERHANG_); - rect.setAttribute('rx', this.TARGET_OVERHANG_); - rect.setAttribute('ry', this.TARGET_OVERHANG_); - svgParent.appendChild(rect); - this.trackTarget_ = rect; - var knob = document.createElementNS(Slider.SVG_NS_, 'path'); - knob.setAttribute('class', 'sliderKnob'); - knob.setAttribute('d', 'm 0,0 l -8,8 v 12 h 16 v -12 z'); - svgParent.appendChild(knob); - this.knob_ = knob; - var circle = document.createElementNS(Slider.SVG_NS_, 'circle'); - circle.setAttribute('style', 'opacity: 0'); - circle.setAttribute('r', this.TARGET_OVERHANG_); - circle.setAttribute('cy', y); - svgParent.appendChild(circle); - this.knobTarget_ = circle; - this.setValue(0.5); - - // Find the root SVG object. - while (svgParent && svgParent.nodeName.toLowerCase() !== 'svg') { - svgParent = svgParent.parentNode; - } - this.SVG_ = svgParent; - - // Bind the events to this slider. - Slider.bindEvent_(this.knobTarget_, 'mousedown', this, this.knobMouseDown_); - Slider.bindEvent_(this.knobTarget_, 'touchstart', this, this.knobMouseDown_); - Slider.bindEvent_(this.trackTarget_, 'mousedown', this, this.rectMouseDown_); - Slider.bindEvent_(this.SVG_, 'mouseup', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'touchend', null, Slider.knobMouseUp_); - Slider.bindEvent_(this.SVG_, 'mousemove', null, Slider.knobMouseMove_); - Slider.bindEvent_(this.SVG_, 'touchmove', null, Slider.knobMouseMove_); - Slider.bindEvent_(document, 'mouseover', null, Slider.mouseOver_); -}; - - -Slider.SVG_NS_ = 'http://www.w3.org/2000/svg'; - -Slider.activeSlider_ = null; -Slider.startMouseX_ = 0; -Slider.startKnobX_ = 0; - -/** - * Start a drag when clicking down on the knob. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.knobMouseDown_ = function(e) { - if (e.type === 'touchstart') { - if (e.changedTouches.length !== 1) { - return; - } - Slider.touchToMouse_(e) - } - Slider.activeSlider_ = this; - Slider.startMouseX_ = this.mouseToSvg_(e).x; - Slider.startKnobX_ = 0; - var transform = this.knob_.getAttribute('transform'); - if (transform) { - var r = transform.match(/translate\(\s*([-\d.]+)/); - if (r) { - Slider.startKnobX_ = Number(r[1]); - } - } - // Stop browser from attempting to drag the knob or - // from scrolling/zooming the page. - e.preventDefault(); -}; - -/** - * Stop a drag when clicking up anywhere. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.knobMouseUp_ = function(e) { - Slider.activeSlider_ = null; -}; - -/** - * Stop a drag when the mouse enters a node not part of the SVG. - * @param {Event} e Mouse-up event. - * @private - */ -Slider.mouseOver_ = function(e) { - if (!Slider.activeSlider_) { - return; - } - var node = e.target; - // Find the root SVG object. - do { - if (node === Slider.activeSlider_.SVG_) { - return; - } - } while (node = node.parentNode); - Slider.knobMouseUp_(e); -}; - -/** - * Drag the knob to follow the mouse. - * @param {!Event} e Mouse-move event. - * @private - */ -Slider.knobMouseMove_ = function(e) { - var thisSlider = Slider.activeSlider_; - if (!thisSlider) { - return; - } - if (e.type === 'touchmove') { - if (e.changedTouches.length !== 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = thisSlider.mouseToSvg_(e).x - Slider.startMouseX_ + - Slider.startKnobX_; - thisSlider.setValue((x - thisSlider.KNOB_MIN_X_) / - (thisSlider.KNOB_MAX_X_ - thisSlider.KNOB_MIN_X_)); -}; - -/** - * Jump to a new value when the track is clicked. - * @param {!Event} e Mouse-down event. - * @private - */ -Slider.prototype.rectMouseDown_ = function(e) { - if (e.type === 'touchstart') { - if (e.changedTouches.length !== 1) { - return; - } - Slider.touchToMouse_(e) - } - var x = this.mouseToSvg_(e).x; - this.animateValue((x - this.KNOB_MIN_X_) / - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_)); -}; - -/** - * Returns the slider's value (0.0 - 1.0). - * @return {number} Current value. - */ -Slider.prototype.getValue = function() { - return this.value_; -}; - -/** - * Animates the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.animateValue = function(value) { - // Clear any ongoing animations. - while (this.animationTasks_.length) { - clearTimeout(this.animationTasks_.pop()); - } - var duration = 200; // Milliseconds to animate for. - var steps = 10; // Number of steps to animate. - var oldValue = this.getValue(); - var thisSlider = this; - var stepFunc = function(i) { - return function() { - var newVal = i * (value - oldValue) / (steps - 1) + oldValue; - thisSlider.setValue(newVal); - }; - } - for (var i = 0; i < steps; i++) { - this.animationTasks_.push(setTimeout(stepFunc(i), i * duration / steps)); - } -}; - -/** - * Sets the slider's value (0.0 - 1.0). - * @param {number} value New value. - */ -Slider.prototype.setValue = function(value) { - this.value_ = Math.min(Math.max(value, 0), 1); - var x = this.KNOB_MIN_X_ + - (this.KNOB_MAX_X_ - this.KNOB_MIN_X_) * this.value_; - this.knob_.setAttribute('transform', - 'translate(' + x + ',' + this.KNOB_Y_ + ')'); - this.knobTarget_.setAttribute('cx', x); - this.changeFunc_ && this.changeFunc_(this.value_); -}; - -/** - * Convert the mouse coordinates into SVG coordinates. - * @param {!Object} e Object with x and y mouse coordinates. - * @return {!Object} Object with x and y properties in SVG coordinates. - * @private - */ -Slider.prototype.mouseToSvg_ = function(e) { - var svgPoint = this.SVG_.createSVGPoint(); - svgPoint.x = e.clientX; - svgPoint.y = e.clientY; - var matrix = this.SVG_.getScreenCTM().inverse(); - return svgPoint.matrixTransform(matrix); -}; - -/** - * Bind an event to a function call. - * @param {!Node} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @private - */ -Slider.bindEvent_ = function(node, name, thisObject, func) { - var wrapFunc = function(e) { - func.apply(thisObject, arguments); - }; - node.addEventListener(name, wrapFunc, false); -}; - -/** - * Map the touch event's properties to be compatible with a mouse event. - * @param {TouchEvent} e Event to modify. - */ -Slider.touchToMouse_ = function(e) { - var touchPoint = e.changedTouches[0]; - e.clientX = touchPoint.clientX; - e.clientY = touchPoint.clientY; -}; diff --git a/demos/plane/soy/COPYING b/demos/plane/soy/COPYING deleted file mode 100644 index d6456956733..00000000000 --- a/demos/plane/soy/COPYING +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/demos/plane/soy/README b/demos/plane/soy/README deleted file mode 100644 index 51aa75caf58..00000000000 --- a/demos/plane/soy/README +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2009 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - - -Contents: - -+ SoyToJsSrcCompiler.jar - Executable jar that compiles template files into JavaScript files. - -+ SoyMsgExtractor.jar - Executable jar that extracts messages from template files into XLF files. - -+ soyutils.js - Helper utilities required by all JavaScript code that SoyToJsSrcCompiler - generates. Equivalent functionality to soyutils_usegoog.js, but this - version does not need Closure Library. - - -Instructions: - -+ A simple Hello World for JavaScript: - http://code.google.com/closure/templates/docs/helloworld_js.html - -+ Complete documentation: - http://code.google.com/closure/templates/ - -+ Closure Templates project on Google Code: - http://code.google.com/p/closure-templates/ - - -Notes: - -+ Closure Templates requires Java 6 or higher: - http://www.java.com/ diff --git a/demos/plane/soy/SoyMsgExtractor.jar b/demos/plane/soy/SoyMsgExtractor.jar deleted file mode 100644 index d5c112f5ed6..00000000000 Binary files a/demos/plane/soy/SoyMsgExtractor.jar and /dev/null differ diff --git a/demos/plane/soy/SoyToJsSrcCompiler.jar b/demos/plane/soy/SoyToJsSrcCompiler.jar deleted file mode 100644 index bb3b7a9794c..00000000000 Binary files a/demos/plane/soy/SoyToJsSrcCompiler.jar and /dev/null differ diff --git a/demos/plane/soy/soyutils.js b/demos/plane/soy/soyutils.js deleted file mode 100644 index ca9191612da..00000000000 --- a/demos/plane/soy/soyutils.js +++ /dev/null @@ -1,3299 +0,0 @@ -/** - * @license - * Copyright 2008 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @fileoverview - * Utility functions and classes for Soy. - * - *

- * The top portion of this file contains utilities for Soy users:

    - *
  • soy.StringBuilder: Compatible with the 'stringbuilder' code style. - *
  • soy.renderElement: Render template and set as innerHTML of an element. - *
  • soy.renderAsFragment: Render template and return as HTML fragment. - *
- * - *

- * The bottom portion of this file contains utilities that should only be called - * by Soy-generated JS code. Please do not use these functions directly from - * your hand-writen code. Their names all start with '$$'. - * - * @author Garrett Boyer - * @author Mike Samuel - * @author Kai Huang - * @author Aharon Lanin - */ - - -// COPIED FROM nogoog_shim.js - -// Create closure namespaces. -var goog = goog || {}; - - -goog.DEBUG = false; - - -goog.inherits = function(childCtor, parentCtor) { - /** @constructor */ - function tempCtor() {}; - tempCtor.prototype = parentCtor.prototype; - childCtor.superClass_ = parentCtor.prototype; - childCtor.prototype = new tempCtor(); - childCtor.prototype.constructor = childCtor; - - /** - * Calls superclass constructor/method. - * @param {!Object} me Should always be "this". - * @param {string} methodName - * @param {...*} var_args - * @return {?} The return value of the superclass method/constructor. - */ - childCtor.base = function(me, methodName, var_args) { - var args = Array.prototype.slice.call(arguments, 2); - return parentCtor.prototype[methodName].apply(me, args); - }; -}; - - -// Just enough browser detection for this file. -if (!goog.userAgent) { - goog.userAgent = (function() { - var userAgent = ""; - if ("undefined" !== typeof navigator && navigator - && "string" == typeof navigator.userAgent) { - userAgent = navigator.userAgent; - } - var isOpera = userAgent.indexOf('Opera') == 0; - return { - jscript: { - /** - * @type {boolean} - */ - HAS_JSCRIPT: 'ScriptEngine' in this - }, - /** - * @type {boolean} - */ - OPERA: isOpera, - /** - * @type {boolean} - */ - IE: !isOpera && userAgent.indexOf('MSIE') != -1, - /** - * @type {boolean} - */ - WEBKIT: !isOpera && userAgent.indexOf('WebKit') != -1 - }; - })(); -} - -if (!goog.asserts) { - goog.asserts = { - /** - * @param {*} condition Condition to check. - */ - assert: function (condition) { - if (!condition) { - throw Error('Assertion error'); - } - }, - /** - * @param {...*} var_args - */ - fail: function (var_args) {} - }; -} - - -// Stub out the document wrapper used by renderAs*. -if (!goog.dom) { - goog.dom = {}; - /** - * @param {Document=} d - * @constructor - */ - goog.dom.DomHelper = function(d) { - this.document_ = d || document; - }; - /** - * @return {!Document} - */ - goog.dom.DomHelper.prototype.getDocument = function() { - return this.document_; - }; - /** - * Creates a new element. - * @param {string} name Tag name. - * @return {!Element} - */ - goog.dom.DomHelper.prototype.createElement = function(name) { - return this.document_.createElement(name); - }; - /** - * Creates a new document fragment. - * @return {!DocumentFragment} - */ - goog.dom.DomHelper.prototype.createDocumentFragment = function() { - return this.document_.createDocumentFragment(); - }; -} - - -if (!goog.format) { - goog.format = { - insertWordBreaks: function(str, maxCharsBetweenWordBreaks) { - str = String(str); - - var resultArr = []; - var resultArrLen = 0; - - // These variables keep track of important state inside str. - var isInTag = false; // whether we're inside an HTML tag - var isMaybeInEntity = false; // whether we might be inside an HTML entity - var numCharsWithoutBreak = 0; // number of chars since last word break - var flushIndex = 0; // index of first char not yet flushed to resultArr - - for (var i = 0, n = str.length; i < n; ++i) { - var charCode = str.charCodeAt(i); - - // If hit maxCharsBetweenWordBreaks, and not space next, then add . - if (numCharsWithoutBreak >= maxCharsBetweenWordBreaks && - // space - charCode != 32) { - resultArr[resultArrLen++] = str.substring(flushIndex, i); - flushIndex = i; - resultArr[resultArrLen++] = goog.format.WORD_BREAK; - numCharsWithoutBreak = 0; - } - - if (isInTag) { - // If inside an HTML tag and we see '>', it's the end of the tag. - if (charCode == 62) { - isInTag = false; - } - - } else if (isMaybeInEntity) { - switch (charCode) { - // Inside an entity, a ';' is the end of the entity. - // The entity that just ended counts as one char, so increment - // numCharsWithoutBreak. - case 59: // ';' - isMaybeInEntity = false; - ++numCharsWithoutBreak; - break; - // If maybe inside an entity and we see '<', we weren't actually in - // an entity. But now we're inside and HTML tag. - case 60: // '<' - isMaybeInEntity = false; - isInTag = true; - break; - // If maybe inside an entity and we see ' ', we weren't actually in - // an entity. Just correct the state and reset the - // numCharsWithoutBreak since we just saw a space. - case 32: // ' ' - isMaybeInEntity = false; - numCharsWithoutBreak = 0; - break; - } - - } else { // !isInTag && !isInEntity - switch (charCode) { - // When not within a tag or an entity and we see '<', we're now - // inside an HTML tag. - case 60: // '<' - isInTag = true; - break; - // When not within a tag or an entity and we see '&', we might be - // inside an entity. - case 38: // '&' - isMaybeInEntity = true; - break; - // When we see a space, reset the numCharsWithoutBreak count. - case 32: // ' ' - numCharsWithoutBreak = 0; - break; - // When we see a non-space, increment the numCharsWithoutBreak. - default: - ++numCharsWithoutBreak; - break; - } - } - } - - // Flush the remaining chars at the end of the string. - resultArr[resultArrLen++] = str.substring(flushIndex); - - return resultArr.join(''); - }, - /** - * String inserted as a word break by insertWordBreaks(). Safari requires - * , Opera needs the ­ entity, though this will give a - * visible hyphen at breaks. IE8+ use a zero width space. Other browsers - * just use . - * @type {string} - * @private - */ - WORD_BREAK: - goog.userAgent.WEBKIT ? '' : - goog.userAgent.OPERA ? '­' : - goog.userAgent.IE ? '​' : - '' - }; -} - - -if (!goog.i18n) { - goog.i18n = { - bidi: {} - }; -} - - -/** - * Constant that defines whether or not the current locale is an RTL locale. - * - * @type {boolean} - */ -goog.i18n.bidi.IS_RTL = false; - - -/** - * Directionality enum. - * @enum {number} - */ -goog.i18n.bidi.Dir = { - /** - * Left-to-right. - */ - LTR: 1, - - /** - * Right-to-left. - */ - RTL: -1, - - /** - * Neither left-to-right nor right-to-left. - */ - NEUTRAL: 0, - - /** - * A historical misnomer for NEUTRAL. - * @deprecated For "neutral", use NEUTRAL; for "unknown", use null. - */ - UNKNOWN: 0 -}; - - -/** - * Convert a directionality given in various formats to a goog.i18n.bidi.Dir - * constant. Useful for interaction with different standards of directionality - * representation. - * - * @param {goog.i18n.bidi.Dir|number|boolean|null} givenDir Directionality given - * in one of the following formats: - * 1. A goog.i18n.bidi.Dir constant. - * 2. A number (positive = LTR, negative = RTL, 0 = neutral). - * 3. A boolean (true = RTL, false = LTR). - * 4. A null for unknown directionality. - * @param {boolean=} opt_noNeutral Whether a givenDir of zero or - * goog.i18n.bidi.Dir.NEUTRAL should be treated as null, i.e. unknown, in - * order to preserve legacy behavior. - * @return {?goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the - * given directionality. If given null, returns null (i.e. unknown). - */ -goog.i18n.bidi.toDir = function(givenDir, opt_noNeutral) { - if (typeof givenDir == 'number') { - // This includes the non-null goog.i18n.bidi.Dir case. - return givenDir > 0 ? goog.i18n.bidi.Dir.LTR : - givenDir < 0 ? goog.i18n.bidi.Dir.RTL : - opt_noNeutral ? null : goog.i18n.bidi.Dir.NEUTRAL; - } else if (givenDir == null) { - return null; - } else { - // Must be typeof givenDir == 'boolean'. - return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR; - } -}; - - -/** - * Estimates the directionality of a string based on relative word counts. - * If the number of RTL words is above a certain percentage of the total number - * of strongly directional words, returns RTL. - * Otherwise, if any words are strongly or weakly LTR, returns LTR. - * Otherwise, returns NEUTRAL. - * Numbers are counted as weakly LTR. - * @param {string} str The string to be checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {goog.i18n.bidi.Dir} Estimated overall directionality of {@code str}. - */ -goog.i18n.bidi.estimateDirection = function(str, opt_isHtml) { - var rtlCount = 0; - var totalCount = 0; - var hasWeaklyLtr = false; - var tokens = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml). - split(soyshim.$$bidiWordSeparatorRe_); - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - if (soyshim.$$bidiRtlDirCheckRe_.test(token)) { - rtlCount++; - totalCount++; - } else if (soyshim.$$bidiIsRequiredLtrRe_.test(token)) { - hasWeaklyLtr = true; - } else if (soyshim.$$bidiLtrCharRe_.test(token)) { - totalCount++; - } else if (soyshim.$$bidiHasNumeralsRe_.test(token)) { - hasWeaklyLtr = true; - } - } - - return totalCount == 0 ? - (hasWeaklyLtr ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL) : - (rtlCount / totalCount > soyshim.$$bidiRtlDetectionThreshold_ ? - goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR); -}; - - -/** - * Utility class for formatting text for display in a potentially - * opposite-directionality context without garbling. Provides the following - * functionality: - * - * @param {goog.i18n.bidi.Dir|number|boolean|null} dir The context - * directionality, in one of the following formats: - * 1. A goog.i18n.bidi.Dir constant. NEUTRAL is treated the same as null, - * i.e. unknown, for backward compatibility with legacy calls. - * 2. A number (positive = LTR, negative = RTL, 0 = unknown). - * 3. A boolean (true = RTL, false = LTR). - * 4. A null for unknown directionality. - * @constructor - */ -goog.i18n.BidiFormatter = function(dir) { - /** - * The overall directionality of the context in which the formatter is being - * used. - * @type {?goog.i18n.bidi.Dir} - * @private - */ - this.dir_ = goog.i18n.bidi.toDir(dir, true /* opt_noNeutral */); -}; - -/** - * @return {?goog.i18n.bidi.Dir} The context directionality. - */ -goog.i18n.BidiFormatter.prototype.getContextDir = function() { - return this.dir_; -}; - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on the given directionality, if - * it is not the same as the context directionality. Otherwise, returns the - * empty string. - * - * @param {goog.i18n.bidi.Dir} dir A directionality. - * @return {string} 'dir="rtl"' for RTL text in non-RTL context; 'dir="ltr"' for - * LTR text in non-LTR context; else, the empty string. - */ -goog.i18n.BidiFormatter.prototype.knownDirAttr = function(dir) { - return !dir || dir == this.dir_ ? '' : dir < 0 ? 'dir="rtl"' : 'dir="ltr"'; -}; - -/** - * Returns the trailing horizontal edge, i.e. "right" or "left", depending on - * the global bidi directionality. - * @return {string} "left" for RTL context and "right" otherwise. - */ -goog.i18n.BidiFormatter.prototype.endEdge = function () { - return this.dir_ < 0 ? 'left' : 'right'; -}; - -/** - * Returns the Unicode BiDi mark matching the context directionality (LRM for - * LTR context directionality, RLM for RTL context directionality), or the - * empty string for unknown context directionality. - * - * @return {string} LRM for LTR context directionality and RLM for RTL context - * directionality. - */ -goog.i18n.BidiFormatter.prototype.mark = function () { - return ( - (this.dir_ > 0) ? '\u200E' /*LRM*/ : - (this.dir_ < 0) ? '\u200F' /*RLM*/ : - ''); -}; - -/** - * Returns a Unicode bidi mark matching the context directionality (LRM or RLM) - * if the directionality or the exit directionality of {@code text} are opposite - * to the context directionality. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * @param {?goog.i18n.bidi.Dir} textDir {@code text}'s overall directionality, - * or null if unknown and needs to be estimated. - * @param {string} text The text whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching the context directionality, or - * the empty string when either the context directionality is unknown or - * neither the text's overall nor its exit directionality is opposite to it. - */ -goog.i18n.BidiFormatter.prototype.markAfterKnownDir = function ( - textDir, text, opt_isHtml) { - if (textDir == null) { - textDir = goog.i18n.bidi.estimateDirection(text, opt_isHtml); - } - return ( - this.dir_ > 0 && (textDir < 0 || - soyshim.$$bidiIsRtlExitText_(text, opt_isHtml)) ? '\u200E' : // LRM - this.dir_ < 0 && (textDir > 0 || - soyshim.$$bidiIsLtrExitText_(text, opt_isHtml)) ? '\u200F' : // RLM - ''); -}; - -/** - * Formats an HTML string for use in HTML output of the context directionality, - * so an opposite-directionality string is neither garbled nor garbles what - * follows it. - * - * @param {?goog.i18n.bidi.Dir} textDir {@code str}'s overall directionality, or - * null if unknown and needs to be estimated. - * @param {string} str The input text (HTML or HTML-escaped). - * @param {boolean=} placeholder This argument exists for consistency with the - * Closure Library. Specifying it has no effect. - * @return {string} The input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.spanWrapWithKnownDir = function( - textDir, str, placeholder) { - if (textDir == null) { - textDir = goog.i18n.bidi.estimateDirection(str, true); - } - var reset = this.markAfterKnownDir(textDir, str, true); - if (textDir > 0 && this.dir_ <= 0) { - str = '' + str + ''; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '' + str + ''; - } - return str + reset; -}; - -/** - * Returns the leading horizontal edge, i.e. "left" or "right", depending on - * the global bidi directionality. - * @return {string} "right" for RTL context and "left" otherwise. - */ -goog.i18n.BidiFormatter.prototype.startEdge = function () { - return this.dir_ < 0 ? 'right' : 'left'; -}; - -/** - * Formats an HTML-escaped string for use in HTML output of the context - * directionality, so an opposite-directionality string is neither garbled nor - * garbles what follows it. - * As opposed to {@link #spanWrapWithKnownDir}, this makes use of unicode bidi - * formatting characters. In HTML, it should only be used inside attribute - * values and elements that do not allow markup, e.g. an 'option' tag. - * - * @param {?goog.i18n.bidi.Dir} textDir {@code str}'s overall directionality, or - * null if unknown and needs to be estimated. - * @param {string} str The input text (HTML-escaped). - * @param {boolean=} opt_isHtml Whether {@code str} is HTML / HTML-escaped. - * Default: false. - * @return {string} The input text after applying the above processing. - */ -goog.i18n.BidiFormatter.prototype.unicodeWrapWithKnownDir = function( - textDir, str, opt_isHtml) { - if (textDir == null) { - textDir = goog.i18n.bidi.estimateDirection(str, opt_isHtml); - } - var reset = this.markAfterKnownDir(textDir, str, opt_isHtml); - if (textDir > 0 && this.dir_ <= 0) { - str = '\u202A' + str + '\u202C'; - } else if (textDir < 0 && this.dir_ >= 0) { - str = '\u202B' + str + '\u202C'; - } - return str + reset; -}; - - -if (!goog.string) { - goog.string = { - /** - * Converts \r\n, \r, and \n to
s - * @param {*} str The string in which to convert newlines. - * @param {boolean=} opt_xml Whether to use XML compatible tags. - * @return {string} A copy of {@code str} with converted newlines. - */ - newLineToBr: function(str, opt_xml) { - - str = String(str); - - // This quick test helps in the case when there are no chars to replace, - // in the worst case this makes barely a difference to the time taken. - if (!goog.string.NEWLINE_TO_BR_RE_.test(str)) { - return str; - } - - return str.replace(/(\r\n|\r|\n)/g, opt_xml ? '
' : '
'); - }, - urlEncode: encodeURIComponent, - /** - * Regular expression used within newlineToBr(). - * @type {RegExp} - * @private - */ - NEWLINE_TO_BR_RE_: /[\r\n]/ - }; -} - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object|number|string|boolean=} opt_a1 Optional first initial item - * to append. - * @param {...Object|number|string|boolean} var_args Other initial items to - * append, e.g., new goog.string.StringBuffer('foo', 'bar'). - * @constructor - */ -goog.string.StringBuffer = function(opt_a1, var_args) { - /** - * Internal buffer for the string to be concatenated. - * @type {string|Array} - * @private - */ - this.buffer_ = goog.userAgent.jscript.HAS_JSCRIPT ? [] : ''; - - if (opt_a1 != null) { - this.append.apply(this, arguments); - } -}; - - -/** - * Length of internal buffer (faster than calling buffer_.length). - * Only used for IE. - * @type {number} - * @private - */ -goog.string.StringBuffer.prototype.bufferLength_ = 0; - -/** - * Appends one or more items to the string. - * - * Calling this with null, undefined, or empty arguments is an error. - * - * @param {Object|number|string|boolean} a1 Required first string. - * @param {Object|number|string|boolean=} opt_a2 Optional second string. - * @param {...Object|number|string|boolean} var_args Other items to append, - * e.g., sb.append('foo', 'bar', 'baz'). - * @return {goog.string.StringBuffer} This same StringBuilder object. - */ -goog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - if (opt_a2 == null) { // no second argument (note: undefined == null) - // Array assignment is 2x faster than Array push. Also, use a1 - // directly to avoid arguments instantiation, another 2x improvement. - this.buffer_[this.bufferLength_++] = a1; - } else { - var arr = /**@type {Array}*/(this.buffer_); - arr.push.apply(arr, arguments); - this.bufferLength_ = this.buffer_.length; - } - - } else { - - // Use a1 directly to avoid arguments instantiation for single-arg case. - this.buffer_ += a1; - if (opt_a2 != null) { // no second argument (note: undefined == null) - for (var i = 1; i < arguments.length; i++) { - this.buffer_ += arguments[i]; - } - } - } - - return this; -}; - - -/** - * Clears the string. - */ -goog.string.StringBuffer.prototype.clear = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - this.buffer_.length = 0; // reuse array to avoid creating new object - this.bufferLength_ = 0; - - } else { - this.buffer_ = ''; - } -}; - - -/** - * Returns the concatenated string. - * - * @return {string} The concatenated string. - */ -goog.string.StringBuffer.prototype.toString = function() { - - if (goog.userAgent.jscript.HAS_JSCRIPT) { - var str = this.buffer_.join(''); - // Given a string with the entire contents, simplify the StringBuilder by - // setting its contents to only be this string, rather than many fragments. - this.clear(); - if (str) { - this.append(str); - } - return str; - - } else { - return /** @type {string} */ (this.buffer_); - } -}; - - -if (!goog.soy) goog.soy = { - /** - * Helper function to render a Soy template and then set the - * output string as the innerHTML of an element. It is recommended - * to use this helper function instead of directly setting - * innerHTML in your hand-written code, so that it will be easier - * to audit the code for cross-site scripting vulnerabilities. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - */ - renderAsElement: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return /** @type {!Element} */ (soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, true /* asElement */, - opt_injectedData)); - }, - /** - * Helper function to render a Soy template into a single node or - * a document fragment. If the rendered HTML string represents a - * single node, then that node is returned (note that this is - * *not* a fragment, despite them name of the method). Otherwise a - * document fragment is returned containing the rendered nodes. - * - * @param {Function} template The Soy template defining element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @return {!Node} The resulting node or document fragment. - */ - renderAsFragment: function( - template, opt_templateData, opt_injectedData, opt_dom) { - return soyshim.$$renderWithWrapper_( - template, opt_templateData, opt_dom, false /* asElement */, - opt_injectedData); - }, - /** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ - renderElement: function( - element, template, opt_templateData, opt_injectedData) { - element.innerHTML = template(opt_templateData, null, opt_injectedData); - }, - data: {} -}; - - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -goog.soy.data.SanitizedContentKind = { - - /** - * A snippet of HTML that does not start or end inside a tag, comment, entity, - * or DOCTYPE; and that does not contain any executable code - * (JS, {@code }s, etc.) from a different trust domain. - */ - HTML: goog.DEBUG ? {sanitizedContentKindHtml: true} : {}, - - /** - * Executable Javascript code or expression, safe for insertion in a - * script-tag or event handler context, known to be free of any - * attacker-controlled scripts. This can either be side-effect-free - * Javascript (such as JSON) or Javascript that's entirely under Google's - * control. - */ - JS: goog.DEBUG ? {sanitizedContentJsChars: true} : {}, - - /** - * A sequence of code units that can appear between quotes (either kind) in a - * JS program without causing a parse error, and without causing any side - * effects. - *

- * The content should not contain unescaped quotes, newlines, or anything else - * that would cause parsing to fail or to cause a JS parser to finish the - * string its parsing inside the content. - *

- * The content must also not end inside an escape sequence ; no partial octal - * escape sequences or odd number of '{@code \}'s at the end. - */ - JS_STR_CHARS: goog.DEBUG ? {sanitizedContentJsStrChars: true} : {}, - - /** A properly encoded portion of a URI. */ - URI: goog.DEBUG ? {sanitizedContentUri: true} : {}, - - /** - * Repeated attribute names and values. For example, - * {@code dir="ltr" foo="bar" onclick="trustedFunction()" checked}. - */ - ATTRIBUTES: goog.DEBUG ? {sanitizedContentHtmlAttribute: true} : {}, - - // TODO: Consider separating rules, declarations, and values into - // separate types, but for simplicity, we'll treat explicitly blessed - // SanitizedContent as allowed in all of these contexts. - /** - * A CSS3 declaration, property, value or group of semicolon separated - * declarations. - */ - CSS: goog.DEBUG ? {sanitizedContentCss: true} : {}, - - /** - * Unsanitized plain-text content. - * - * This is effectively the "null" entry of this enum, and is sometimes used - * to explicitly mark content that should never be used unescaped. Since any - * string is safe to use as text, being of ContentKind.TEXT makes no - * guarantees about its safety in any other context such as HTML. - */ - TEXT: goog.DEBUG ? {sanitizedContentKindText: true} : {} -}; - - - -/** - * A string-like object that carries a content-type and a content direction. - * - * IMPORTANT! Do not create these directly, nor instantiate the subclasses. - * Instead, use a trusted, centrally reviewed library as endorsed by your team - * to generate these objects. Otherwise, you risk accidentally creating - * SanitizedContent that is attacker-controlled and gets evaluated unescaped in - * templates. - * - * @constructor - */ -goog.soy.data.SanitizedContent = function() { - throw Error('Do not instantiate directly'); -}; - - -/** - * The context in which this content is safe from XSS attacks. - * @type {goog.soy.data.SanitizedContentKind} - */ -goog.soy.data.SanitizedContent.prototype.contentKind; - - -/** - * The content's direction; null if unknown and thus to be estimated when - * necessary. - * @type {?goog.i18n.bidi.Dir} - */ -goog.soy.data.SanitizedContent.prototype.contentDir = null; - - -/** - * The already-safe content. - * @type {string} - */ -goog.soy.data.SanitizedContent.prototype.content; - - -/** @override */ -goog.soy.data.SanitizedContent.prototype.toString = function() { - return this.content; -}; - - -var soy = { esc: {} }; -var soydata = {}; -soydata.VERY_UNSAFE = {}; -var soyshim = { $$DEFAULT_TEMPLATE_DATA_: {} }; -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned. Otherwise a document fragment is created and returned - * (wrapped in a DIV element if #opt_singleNode is true). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {(goog.dom.DomHelper|Document)=} opt_dom The context in which DOM - * nodes will be created. - * @param {boolean=} opt_asElement Whether to wrap the fragment in an - * element if the template does not render a single element. If true, - * result is always an Element. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - * @private - */ -soyshim.$$renderWithWrapper_ = function( - template, opt_templateData, opt_dom, opt_asElement, opt_injectedData) { - - var dom = opt_dom || document; - var wrapper = dom.createElement('div'); - wrapper.innerHTML = template( - opt_templateData || soyshim.$$DEFAULT_TEMPLATE_DATA_, undefined, - opt_injectedData); - - // If the template renders as a single element, return it. - if (wrapper.childNodes.length == 1) { - var firstChild = wrapper.firstChild; - if (!opt_asElement || firstChild.nodeType == 1 /* Element */) { - return /** @type {!Node} */ (firstChild); - } - } - - // If we're forcing it to be a single element, return the wrapper DIV. - if (opt_asElement) { - return wrapper; - } - - // Otherwise, create and return a fragment. - var fragment = dom.createDocumentFragment(); - while (wrapper.firstChild) { - fragment.appendChild(wrapper.firstChild); - } - return fragment; -}; - - -/** - * Strips str of any HTML mark-up and escapes. Imprecise in several ways, but - * precision is not very important, since the result is only meant to be used - * for directionality detection. - * Based on goog.i18n.bidi.stripHtmlIfNeeded_(). - * @param {string} str The string to be stripped. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {string} The stripped string. - * @private - */ -soyshim.$$bidiStripHtmlIfNecessary_ = function(str, opt_isHtml) { - return opt_isHtml ? str.replace(soyshim.$$BIDI_HTML_SKIP_RE_, '') : str; -}; - - -/** - * Simplified regular expression for am HTML tag (opening or closing) or an HTML - * escape - the things we want to skip over in order to ignore their ltr - * characters. - * Copied from goog.i18n.bidi.htmlSkipReg_. - * @type {RegExp} - * @private - */ -soyshim.$$BIDI_HTML_SKIP_RE_ = /<[^>]*>|&[^;]+;/g; - - -/** - * A practical pattern to identify strong LTR character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * Copied from goog.i18n.bidi.ltrChars_. - * @type {string} - * @private - */ -soyshim.$$bidiLtrChars_ = - 'A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02B8\u0300-\u0590\u0800-\u1FFF' + - '\u200E\u2C00-\uFB1C\uFE00-\uFE6F\uFEFD-\uFFFF'; - - -/** - * A practical pattern to identify strong RTL character. This pattern is not - * theoretically correct according to unicode standard. It is simplified for - * performance and small code size. - * Copied from goog.i18n.bidi.rtlChars_. - * @type {string} - * @private - */ -soyshim.$$bidiRtlChars_ = '\u0591-\u07FF\u200F\uFB1D-\uFDFF\uFE70-\uFEFC'; - - -/** - * Regular expressions to check if a piece of text is of RTL directionality - * on first character with strong directionality. - * Based on goog.i18n.bidi.rtlDirCheckRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlDirCheckRe_ = new RegExp( - '^[^' + soyshim.$$bidiLtrChars_ + ']*[' + soyshim.$$bidiRtlChars_ + ']'); - - -/** - * Regular expression to check for LTR characters. - * Based on goog.i18n.bidi.ltrCharReg_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiLtrCharRe_ = new RegExp('[' + soyshim.$$bidiLtrChars_ + ']'); - - -/** - * Regular expression to check if a string looks like something that must - * always be LTR even in RTL text, e.g. a URL. When estimating the - * directionality of text containing these, we treat these as weakly LTR, - * like numbers. - * Copied from goog.i18n.bidi.isRequiredLtrRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiIsRequiredLtrRe_ = /^http:\/\/.*/; - - -/** - * Regular expression to check if a string contains any numerals. Used to - * differentiate between completely neutral strings and those containing - * numbers, which are weakly LTR. - * Copied from goog.i18n.bidi.hasNumeralsRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiHasNumeralsRe_ = /\d/; - - -/** - * Regular expression to split a string into "words" for directionality - * estimation based on relative word counts. - * Copied from goog.i18n.bidi.wordSeparatorRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiWordSeparatorRe_ = /\s+/; - - -/** - * This constant controls threshold of rtl directionality. - * Copied from goog.i18n.bidi.rtlDetectionThreshold_. - * @type {number} - * @private - */ -soyshim.$$bidiRtlDetectionThreshold_ = 0.40; - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is LTR. - * Based on goog.i18n.bidi.ltrExitDirCheckRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiLtrExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiLtrChars_ + '][^' + soyshim.$$bidiRtlChars_ + ']*$'); - - -/** - * Regular expressions to check if the last strongly-directional character in a - * piece of text is RTL. - * Based on goog.i18n.bidi.rtlExitDirCheckRe_. - * @type {RegExp} - * @private - */ -soyshim.$$bidiRtlExitDirCheckRe_ = new RegExp( - '[' + soyshim.$$bidiRtlChars_ + '][^' + soyshim.$$bidiLtrChars_ + ']*$'); - - -/** - * Check if the exit directionality a piece of text is LTR, i.e. if the last - * strongly-directional character in the string is LTR. - * Based on goog.i18n.bidi.endsWithLtr(). - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether LTR exit directionality was detected. - * @private - */ -soyshim.$$bidiIsLtrExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiLtrExitDirCheckRe_.test(str); -}; - - -/** - * Check if the exit directionality a piece of text is RTL, i.e. if the last - * strongly-directional character in the string is RTL. - * Based on goog.i18n.bidi.endsWithRtl(). - * @param {string} str string being checked. - * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped. - * Default: false. - * @return {boolean} Whether RTL exit directionality was detected. - * @private - */ -soyshim.$$bidiIsRtlExitText_ = function(str, opt_isHtml) { - str = soyshim.$$bidiStripHtmlIfNecessary_(str, opt_isHtml); - return soyshim.$$bidiRtlExitDirCheckRe_.test(str); -}; - - -// ============================================================================= -// COPIED FROM soyutils_usegoog.js - - -// ----------------------------------------------------------------------------- -// StringBuilder (compatible with the 'stringbuilder' code style). - - -/** - * Utility class to facilitate much faster string concatenation in IE, - * using Array.join() rather than the '+' operator. For other browsers - * we simply use the '+' operator. - * - * @param {Object} var_args Initial items to append, - * e.g., new soy.StringBuilder('foo', 'bar'). - * @constructor - */ -soy.StringBuilder = goog.string.StringBuffer; - - -// ----------------------------------------------------------------------------- -// soydata: Defines typed strings, e.g. an HTML string {@code "ac"} is -// semantically distinct from the plain text string {@code "ac"} and smart -// templates can take that distinction into account. - -/** - * A type of textual content. - * - * This is an enum of type Object so that these values are unforgeable. - * - * @enum {!Object} - */ -soydata.SanitizedContentKind = goog.soy.data.SanitizedContentKind; - - -/** - * Checks whether a given value is of a given content kind. - * - * @param {*} value The value to be examined. - * @param {soydata.SanitizedContentKind} contentKind The desired content - * kind. - * @return {boolean} Whether the given value is of the given kind. - * @private - */ -soydata.isContentKind = function(value, contentKind) { - // TODO(user): This function should really include the assert on - // value.constructor that is currently sprinkled at most of the call sites. - // Unfortunately, that would require a (debug-mode-only) switch statement. - // TODO(user): Perhaps we should get rid of the contentKind property - // altogether and only at the constructor. - return value != null && value.contentKind === contentKind; -}; - - -/** - * Returns a given value's contentDir property, constrained to a - * goog.i18n.bidi.Dir value or null. Returns null if the value is null, - * undefined, a primitive or does not have a contentDir property, or the - * property's value is not 1 (for LTR), -1 (for RTL), or 0 (for neutral). - * - * @param {*} value The value whose contentDir property, if any, is to - * be returned. - * @return {?goog.i18n.bidi.Dir} The contentDir property. - */ -soydata.getContentDir = function(value) { - if (value != null) { - switch (value.contentDir) { - case goog.i18n.bidi.Dir.LTR: - return goog.i18n.bidi.Dir.LTR; - case goog.i18n.bidi.Dir.RTL: - return goog.i18n.bidi.Dir.RTL; - case goog.i18n.bidi.Dir.NEUTRAL: - return goog.i18n.bidi.Dir.NEUTRAL; - } - } - return null; -}; - - -/** - * Content of type {@link soydata.SanitizedContentKind.HTML}. - * - * The content is a string of HTML that can safely be embedded in a PCDATA - * context in your app. If you would be surprised to find that an HTML - * sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) and - * you wouldn't write a template that produces {@code s} on security or privacy - * grounds, then don't pass {@code s} here. The default content direction is - * unknown, i.e. to be estimated when necessary. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtml = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtml, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtml.prototype.contentKind = soydata.SanitizedContentKind.HTML; - -/** - * Returns a SanitizedHtml object for a particular value. The content direction - * is preserved. - * - * This HTML-escapes the value unless it is already SanitizedHtml. - * - * @param {*} value The value to convert. If it is already a SanitizedHtml - * object, it is left alone. - * @return {!soydata.SanitizedHtml} A SanitizedHtml object derived from the - * stringified value. It is escaped unless the input is SanitizedHtml. - */ -soydata.SanitizedHtml.from = function(value) { - // The check is soydata.isContentKind() inlined for performance. - if (value != null && - value.contentKind === soydata.SanitizedContentKind.HTML) { - goog.asserts.assert(value.constructor === soydata.SanitizedHtml); - return /** @type {!soydata.SanitizedHtml} */ (value); - } - return soydata.VERY_UNSAFE.ordainSanitizedHtml( - soy.esc.$$escapeHtmlHelper(String(value)), soydata.getContentDir(value)); -}; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS}. - * - * The content is Javascript source that when evaluated does not execute any - * attacker-controlled scripts. The content direction is LTR. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJs = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJs, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJs.prototype.contentKind = - soydata.SanitizedContentKind.JS; - -/** @override */ -soydata.SanitizedJs.prototype.contentDir = goog.i18n.bidi.Dir.LTR; - - -/** - * Content of type {@link soydata.SanitizedContentKind.JS_STR_CHARS}. - * - * The content can be safely inserted as part of a single- or double-quoted - * string without terminating the string. The default content direction is - * unknown, i.e. to be estimated when necessary. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedJsStrChars = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedJsStrChars, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedJsStrChars.prototype.contentKind = - soydata.SanitizedContentKind.JS_STR_CHARS; - -/** - * Content of type {@link soydata.SanitizedContentKind.URI}. - * - * The content is a URI chunk that the caller knows is safe to emit in a - * template. The content direction is LTR. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedUri = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedUri, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedUri.prototype.contentKind = soydata.SanitizedContentKind.URI; - -/** @override */ -soydata.SanitizedUri.prototype.contentDir = goog.i18n.bidi.Dir.LTR; - - -/** - * Content of type {@link soydata.SanitizedContentKind.ATTRIBUTES}. - * - * The content should be safely embeddable within an open tag, such as a - * key="value" pair. The content direction is LTR. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedHtmlAttribute = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedHtmlAttribute, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedHtmlAttribute.prototype.contentKind = - soydata.SanitizedContentKind.ATTRIBUTES; - -/** @override */ -soydata.SanitizedHtmlAttribute.prototype.contentDir = goog.i18n.bidi.Dir.LTR; - - -/** - * Content of type {@link soydata.SanitizedContentKind.CSS}. - * - * The content is non-attacker-exploitable CSS, such as {@code color:#c3d9ff}. - * The content direction is LTR. - * - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.SanitizedCss = function() { - goog.soy.data.SanitizedContent.call(this); // Throws an exception. -}; -goog.inherits(soydata.SanitizedCss, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.SanitizedCss.prototype.contentKind = - soydata.SanitizedContentKind.CSS; - -/** @override */ -soydata.SanitizedCss.prototype.contentDir = goog.i18n.bidi.Dir.LTR; - - -/** - * Unsanitized plain text string. - * - * While all strings are effectively safe to use as a plain text, there are no - * guarantees about safety in any other context such as HTML. This is - * sometimes used to mark that should never be used unescaped. - * - * @param {*} content Plain text with no guarantees. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @constructor - * @extends {goog.soy.data.SanitizedContent} - */ -soydata.UnsanitizedText = function(content, opt_contentDir) { - /** @override */ - this.content = String(content); - this.contentDir = opt_contentDir != null ? opt_contentDir : null; -}; -goog.inherits(soydata.UnsanitizedText, goog.soy.data.SanitizedContent); - -/** @override */ -soydata.UnsanitizedText.prototype.contentKind = - soydata.SanitizedContentKind.TEXT; - - -/** - * Empty string, used as a type in Soy templates. - * @enum {string} - * @private - */ -soydata.$$EMPTY_STRING_ = { - VALUE: '' -}; - - -/** - * Creates a factory for SanitizedContent types. - * - * This is a hack so that the soydata.VERY_UNSAFE.ordainSanitized* can - * instantiate Sanitized* classes, without making the Sanitized* constructors - * publicly usable. Requiring all construction to use the VERY_UNSAFE names - * helps callers and their reviewers easily tell that creating SanitizedContent - * is not always safe and calls for careful review. - * - * @param {function(new: T)} ctor A constructor. - * @return {!function(*, ?goog.i18n.bidi.Dir=): T} A factory that takes - * content and an optional content direction and returns a new instance. If - * the content direction is undefined, ctor.prototype.contentDir is used. - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactory_ = function(ctor) { - /** @type {function(new: goog.soy.data.SanitizedContent)} */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - /** - * Creates a ctor-type SanitizedContent instance. - * - * @param {*} content The content to put in the instance. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction. If - * undefined, ctor.prototype.contentDir is used. - * @return {goog.soy.data.SanitizedContent} The new instance. It is actually - * of type T above (ctor's type, a descendant of SanitizedContent), but - * there is no way to express that here. - */ - function sanitizedContentFactory(content, opt_contentDir) { - var result = new InstantiableCtor(); - result.content = String(content); - if (opt_contentDir !== undefined) { - result.contentDir = opt_contentDir; - } - return result; - } - return sanitizedContentFactory; -}; - - -/** - * Creates a factory for SanitizedContent types that should always have their - * default directionality. - * - * This is a hack so that the soydata.VERY_UNSAFE.ordainSanitized* can - * instantiate Sanitized* classes, without making the Sanitized* constructors - * publicly usable. Requiring all construction to use the VERY_UNSAFE names - * helps callers and their reviewers easily tell that creating SanitizedContent - * is not always safe and calls for careful review. - * - * @param {function(new: T, string)} ctor A constructor. - * @return {!function(*): T} A factory that takes content and returns a new - * instance (with default directionality, i.e. ctor.prototype.contentDir). - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_ = function(ctor) { - /** @type {function(new: goog.soy.data.SanitizedContent)} */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - /** - * Creates a ctor-type SanitizedContent instance. - * - * @param {*} content The content to put in the instance. - * @return {goog.soy.data.SanitizedContent} The new instance. It is actually - * of type T above (ctor's type, a descendant of SanitizedContent), but - * there is no way to express that here. - */ - function sanitizedContentFactory(content) { - var result = new InstantiableCtor(); - result.content = String(content); - return result; - } - return sanitizedContentFactory; -}; - - -// ----------------------------------------------------------------------------- -// Sanitized content ordainers. Please use these with extreme caution (with the -// exception of markUnsanitizedText). A good recommendation is to limit usage -// of these to just a handful of files in your source tree where usages can be -// carefully audited. - - -/** - * Protects a string from being used in an noAutoescaped context. - * - * This is useful for content where there is significant risk of accidental - * unescaped usage in a Soy template. A great case is for user-controlled - * data that has historically been a source of vulernabilities. - * - * @param {*} content Text to protect. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @return {!soydata.UnsanitizedText} A wrapper that is rejected by the - * Soy noAutoescape print directive. - */ -soydata.markUnsanitizedText = function(content, opt_contentDir) { - return new soydata.UnsanitizedText(content, opt_contentDir); -}; - - -/** - * Takes a leap of faith that the provided content is "safe" HTML. - * - * @param {*} content A string of HTML that can safely be embedded in - * a PCDATA context in your app. If you would be surprised to find that an - * HTML sanitizer produced {@code s} (e.g. it runs code or fetches bad URLs) - * and you wouldn't write a template that produces {@code s} on security or - * privacy grounds, then don't pass {@code s} here. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @return {!soydata.SanitizedHtml} Sanitized content wrapper that - * indicates to Soy not to escape when printed as HTML. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtml = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedHtml); - - -/** - * Takes a leap of faith that the provided content is "safe" (non-attacker- - * controlled, XSS-free) Javascript. - * - * @param {*} content Javascript source that when evaluated does not - * execute any attacker-controlled scripts. - * @return {!soydata.SanitizedJs} Sanitized content wrapper that indicates to - * Soy not to escape when printed as Javascript source. - */ -soydata.VERY_UNSAFE.ordainSanitizedJs = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_( - soydata.SanitizedJs); - - -// TODO: This function is probably necessary, either externally or internally -// as an implementation detail. Generally, plain text will always work here, -// as there's no harm to unescaping the string and then re-escaping when -// finally printed. -/** - * Takes a leap of faith that the provided content can be safely embedded in - * a Javascript string without re-escaping. - * - * @param {*} content Content that can be safely inserted as part of a - * single- or double-quoted string without terminating the string. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @return {!soydata.SanitizedJsStrChars} Sanitized content wrapper that - * indicates to Soy not to escape when printed in a JS string. - */ -soydata.VERY_UNSAFE.ordainSanitizedJsStrChars = - soydata.$$makeSanitizedContentFactory_(soydata.SanitizedJsStrChars); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as a URI - * in a Soy template. - * - * This creates a Soy SanitizedContent object which indicates to Soy there is - * no need to escape it when printed as a URI (e.g. in an href or src - * attribute), such as if it's already been encoded or if it's a Javascript: - * URI. - * - * @param {*} content A chunk of URI that the caller knows is safe to - * emit in a template. - * @return {!soydata.SanitizedUri} Sanitized content wrapper that indicates to - * Soy not to escape or filter when printed in URI context. - */ -soydata.VERY_UNSAFE.ordainSanitizedUri = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_( - soydata.SanitizedUri); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as an - * HTML attribute. - * - * @param {*} content An attribute name and value, such as - * {@code dir="ltr"}. - * @return {!soydata.SanitizedHtmlAttribute} Sanitized content wrapper that - * indicates to Soy not to escape when printed as an HTML attribute. - */ -soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_( - soydata.SanitizedHtmlAttribute); - - -/** - * Takes a leap of faith that the provided content is "safe" to use as CSS - * in a style attribute or block. - * - * @param {*} content CSS, such as {@code color:#c3d9ff}. - * @return {!soydata.SanitizedCss} Sanitized CSS wrapper that indicates to - * Soy there is no need to escape or filter when printed in CSS context. - */ -soydata.VERY_UNSAFE.ordainSanitizedCss = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnly_( - soydata.SanitizedCss); - - -// ----------------------------------------------------------------------------- -// Public utilities. - - -/** - * Helper function to render a Soy template and then set the output string as - * the innerHTML of an element. It is recommended to use this helper function - * instead of directly setting innerHTML in your hand-written code, so that it - * will be easier to audit the code for cross-site scripting vulnerabilities. - * - * NOTE: New code should consider using goog.soy.renderElement instead. - * - * @param {Element} element The element whose content we are rendering. - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Object=} opt_injectedData The injected data for the template. - */ -soy.renderElement = goog.soy.renderElement; - - -/** - * Helper function to render a Soy template into a single node or a document - * fragment. If the rendered HTML string represents a single node, then that - * node is returned (note that this is *not* a fragment, despite them name of - * the method). Otherwise a document fragment is returned containing the - * rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsFragment - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Node} The resulting node or document fragment. - */ -soy.renderAsFragment = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsFragment( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -/** - * Helper function to render a Soy template into a single node. If the rendered - * HTML string represents a single node, then that node is returned. Otherwise, - * a DIV element is returned containing the rendered nodes. - * - * NOTE: New code should consider using goog.soy.renderAsElement - * instead (note that the arguments are different). - * - * @param {Function} template The Soy template defining the element's content. - * @param {Object=} opt_templateData The data for the template. - * @param {Document=} opt_document The document used to create DOM nodes. If not - * specified, global document object is used. - * @param {Object=} opt_injectedData The injected data for the template. - * @return {!Element} Rendered template contents, wrapped in a parent DIV - * element if necessary. - */ -soy.renderAsElement = function( - template, opt_templateData, opt_document, opt_injectedData) { - return goog.soy.renderAsElement( - template, opt_templateData, opt_injectedData, - new goog.dom.DomHelper(opt_document)); -}; - - -// ----------------------------------------------------------------------------- -// Below are private utilities to be used by Soy-generated code only. - - -/** - * Whether the locale is right-to-left. - * - * @type {boolean} - */ -soy.$$IS_LOCALE_RTL = goog.i18n.bidi.IS_RTL; - - -/** - * Builds an augmented map. The returned map will contain mappings from both - * the base map and the additional map. If the same key appears in both, then - * the value from the additional map will be visible, while the value from the - * base map will be hidden. The base map will be used, but not modified. - * - * @param {!Object} baseMap The original map to augment. - * @param {!Object} additionalMap A map containing the additional mappings. - * @return {!Object} An augmented map containing both the original and - * additional mappings. - */ -soy.$$augmentMap = function(baseMap, additionalMap) { - - // Create a new map whose '__proto__' field is set to baseMap. - /** @constructor */ - function TempCtor() {} - TempCtor.prototype = baseMap; - var augmentedMap = new TempCtor(); - - // Add the additional mappings to the new map. - for (var key in additionalMap) { - augmentedMap[key] = additionalMap[key]; - } - - return augmentedMap; -}; - - -/** - * Checks that the given map key is a string. - * @param {*} key Key to check. - * @return {string} The given key. - */ -soy.$$checkMapKey = function(key) { - // TODO: Support map literal with nonstring key. - if ((typeof key) != 'string') { - throw Error( - 'Map literal\'s key expression must evaluate to string' + - ' (encountered type "' + (typeof key) + '").'); - } - return key; -}; - - -/** - * Gets the keys in a map as an array. There are no guarantees on the order. - * @param {Object} map The map to get the keys of. - * @return {Array} The array of keys in the given map. - */ -soy.$$getMapKeys = function(map) { - var mapKeys = []; - for (var key in map) { - mapKeys.push(key); - } - return mapKeys; -}; - - -/** - * Gets a consistent unique id for the given delegate template name. Two calls - * to this function will return the same id if and only if the input names are - * the same. - * - *

Important: This function must always be called with a string constant. - * - *

If Closure Compiler is not being used, then this is just this identity - * function. If Closure Compiler is being used, then each call to this function - * will be replaced with a short string constant, which will be consistent per - * input name. - * - * @param {string} delTemplateName The delegate template name for which to get a - * consistent unique id. - * @return {string} A unique id that is consistent per input name. - * - * @consistentIdGenerator - */ -soy.$$getDelTemplateId = function(delTemplateName) { - return delTemplateName; -}; - - -/** - * Map from registered delegate template key to the priority of the - * implementation. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_PRIORITIES_ = {}; - -/** - * Map from registered delegate template key to the implementation function. - * @type {Object} - * @private - */ -soy.$$DELEGATE_REGISTRY_FUNCTIONS_ = {}; - - -/** - * Registers a delegate implementation. If the same delegate template key (id - * and variant) has been registered previously, then priority values are - * compared and only the higher priority implementation is stored (if - * priorities are equal, an error is thrown). - * - * @param {string} delTemplateId The delegate template id. - * @param {string} delTemplateVariant The delegate template variant (can be - * empty string). - * @param {number} delPriority The implementation's priority value. - * @param {Function} delFn The implementation function. - */ -soy.$$registerDelegateFn = function( - delTemplateId, delTemplateVariant, delPriority, delFn) { - - var mapKey = 'key_' + delTemplateId + ':' + delTemplateVariant; - var currPriority = soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey]; - if (currPriority === undefined || delPriority > currPriority) { - // Registering new or higher-priority function: replace registry entry. - soy.$$DELEGATE_REGISTRY_PRIORITIES_[mapKey] = delPriority; - soy.$$DELEGATE_REGISTRY_FUNCTIONS_[mapKey] = delFn; - } else if (delPriority == currPriority) { - // Registering same-priority function: error. - throw Error( - 'Encountered two active delegates with the same priority ("' + - delTemplateId + ':' + delTemplateVariant + '").'); - } else { - // Registering lower-priority function: do nothing. - } -}; - - -/** - * Retrieves the (highest-priority) implementation that has been registered for - * a given delegate template key (id and variant). If no implementation has - * been registered for the key, then the fallback is the same id with empty - * variant. If the fallback is also not registered, and allowsEmptyDefault is - * true, then returns an implementation that is equivalent to an empty template - * (i.e. rendered output would be empty string). - * - * @param {string} delTemplateId The delegate template id. - * @param {string|number} delTemplateVariant The delegate template variant (can - * be an empty string, or a number when a global is used). - * @param {boolean} allowsEmptyDefault Whether to default to the empty template - * function if there's no active implementation. - * @return {Function} The retrieved implementation function. - */ -soy.$$getDelegateFn = function( - delTemplateId, delTemplateVariant, allowsEmptyDefault) { - - var delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_[ - 'key_' + delTemplateId + ':' + delTemplateVariant]; - if (! delFn && delTemplateVariant != '') { - // Fallback to empty variant. - delFn = soy.$$DELEGATE_REGISTRY_FUNCTIONS_['key_' + delTemplateId + ':']; - } - - if (delFn) { - return delFn; - } else if (allowsEmptyDefault) { - return soy.$$EMPTY_TEMPLATE_FN_; - } else { - throw Error( - 'Found no active impl for delegate call to "' + delTemplateId + ':' + - delTemplateVariant + '" (and not allowemptydefault="true").'); - } -}; - - -/** - * Private helper soy.$$getDelegateFn(). This is the empty template function - * that is returned whenever there's no delegate implementation found. - * - * @param {Object=} opt_data - * @param {soy.StringBuilder=} opt_sb - * @param {Object=} opt_ijData - * @return {string} - * @private - */ -soy.$$EMPTY_TEMPLATE_FN_ = function(opt_data, opt_sb, opt_ijData) { - return ''; -}; - - -// ----------------------------------------------------------------------------- -// Internal sanitized content wrappers. - - -/** - * Creates a SanitizedContent factory for SanitizedContent types for internal - * Soy let and param blocks. - * - * This is a hack within Soy so that SanitizedContent objects created via let - * and param blocks will truth-test as false if they are empty string. - * Tricking the Javascript runtime to treat empty SanitizedContent as falsey is - * not possible, and changing the Soy compiler to wrap every boolean statement - * for just this purpose is impractical. Instead, we just avoid wrapping empty - * string as SanitizedContent, since it's a no-op for empty strings anyways. - * - * @param {function(new: T)} ctor A constructor. - * @return {!function(*, ?goog.i18n.bidi.Dir=): (T|soydata.$$EMPTY_STRING_)} - * A factory that takes content and an optional content direction and - * returns a new instance, or an empty string. If the content direction is - * undefined, ctor.prototype.contentDir is used. - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactoryForInternalBlocks_ = function(ctor) { - /** @type {function(new: goog.soy.data.SanitizedContent)} */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - /** - * Creates a ctor-type SanitizedContent instance. - * - * @param {*} content The content to put in the instance. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction. If - * undefined, ctor.prototype.contentDir is used. - * @return {goog.soy.data.SanitizedContent|soydata.$$EMPTY_STRING_} The new - * instance, or an empty string. A new instance is actually of type T - * above (ctor's type, a descendant of SanitizedContent), but there's no - * way to express that here. - */ - function sanitizedContentFactory(content, opt_contentDir) { - var contentString = String(content); - if (!contentString) { - return soydata.$$EMPTY_STRING_.VALUE; - } - var result = new InstantiableCtor(); - result.content = String(content); - if (opt_contentDir !== undefined) { - result.contentDir = opt_contentDir; - } - return result; - } - return sanitizedContentFactory; -}; - - -/** - * Creates a SanitizedContent factory for SanitizedContent types that should - * always have their default directionality for internal Soy let and param - * blocks. - * - * This is a hack within Soy so that SanitizedContent objects created via let - * and param blocks will truth-test as false if they are empty string. - * Tricking the Javascript runtime to treat empty SanitizedContent as falsey is - * not possible, and changing the Soy compiler to wrap every boolean statement - * for just this purpose is impractical. Instead, we just avoid wrapping empty - * string as SanitizedContent, since it's a no-op for empty strings anyways. - * - * @param {function(new: T)} ctor A constructor. - * @return {!function(*): (T|soydata.$$EMPTY_STRING_)} A - * factory that takes content and returns a - * new instance (with default directionality, i.e. - * ctor.prototype.contentDir), or an empty string. - * @template T - * @private - */ -soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_ = - function(ctor) { - /** @type {function(new: goog.soy.data.SanitizedContent)} */ - function InstantiableCtor() {} - InstantiableCtor.prototype = ctor.prototype; - /** - * Creates a ctor-type SanitizedContent instance. - * - * @param {*} content The content to put in the instance. - * @return {goog.soy.data.SanitizedContent|soydata.$$EMPTY_STRING_} The new - * instance, or an empty string. A new instance is actually of type T - * above (ctor's type, a descendant of SanitizedContent), but there's no - * way to express that here. - */ - function sanitizedContentFactory(content) { - var contentString = String(content); - if (!contentString) { - return soydata.$$EMPTY_STRING_.VALUE; - } - var result = new InstantiableCtor(); - result.content = String(content); - return result; - } - return sanitizedContentFactory; -}; - - -/** - * Creates kind="text" block contents (internal use only). - * - * @param {*} content Text. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @return {!soydata.UnsanitizedText|soydata.$$EMPTY_STRING_} Wrapped result. - */ -soydata.$$markUnsanitizedTextForInternalBlocks = function( - content, opt_contentDir) { - var contentString = String(content); - if (!contentString) { - return soydata.$$EMPTY_STRING_.VALUE; - } - return new soydata.UnsanitizedText(contentString, opt_contentDir); -}; - - -/** - * Creates kind="html" block contents (internal use only). - * - * @param {*} content Text. - * @param {?goog.i18n.bidi.Dir=} opt_contentDir The content direction; null if - * unknown and thus to be estimated when necessary. Default: null. - * @return {soydata.SanitizedHtml|soydata.$$EMPTY_STRING_} Wrapped result. - */ -soydata.VERY_UNSAFE.$$ordainSanitizedHtmlForInternalBlocks = - soydata.$$makeSanitizedContentFactoryForInternalBlocks_( - soydata.SanitizedHtml); - - -/** - * Creates kind="js" block contents (internal use only). - * - * @param {*} content Text. - * @return {soydata.SanitizedJs|soydata.$$EMPTY_STRING_} Wrapped result. - */ -soydata.VERY_UNSAFE.$$ordainSanitizedJsForInternalBlocks = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( - soydata.SanitizedJs); - - -/** - * Creates kind="uri" block contents (internal use only). - * - * @param {*} content Text. - * @return {soydata.SanitizedUri|soydata.$$EMPTY_STRING_} Wrapped result. - */ -soydata.VERY_UNSAFE.$$ordainSanitizedUriForInternalBlocks = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( - soydata.SanitizedUri); - - -/** - * Creates kind="attributes" block contents (internal use only). - * - * @param {*} content Text. - * @return {soydata.SanitizedHtmlAttribute|soydata.$$EMPTY_STRING_} Wrapped - * result. - */ -soydata.VERY_UNSAFE.$$ordainSanitizedAttributesForInternalBlocks = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( - soydata.SanitizedHtmlAttribute); - - -/** - * Creates kind="css" block contents (internal use only). - * - * @param {*} content Text. - * @return {soydata.SanitizedCss|soydata.$$EMPTY_STRING_} Wrapped result. - */ -soydata.VERY_UNSAFE.$$ordainSanitizedCssForInternalBlocks = - soydata.$$makeSanitizedContentFactoryWithDefaultDirOnlyForInternalBlocks_( - soydata.SanitizedCss); - - -// ----------------------------------------------------------------------------- -// Escape/filter/normalize. - - -/** - * Returns a SanitizedHtml object for a particular value. The content direction - * is preserved. - * - * This HTML-escapes the value unless it is already SanitizedHtml. Escapes - * double quote '"' in addition to '&', '<', and '>' so that a string can be - * included in an HTML tag attribute value within double quotes. - * - * @param {*} value The value to convert. If it is already a SanitizedHtml - * object, it is left alone. - * @return {!soydata.SanitizedHtml} An escaped version of value. - */ -soy.$$escapeHtml = function(value) { - return soydata.SanitizedHtml.from(value); -}; - - -/** - * Strips unsafe tags to convert a string of untrusted HTML into HTML that - * is safe to embed. The content direction is preserved. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {!soydata.SanitizedHtml} A sanitized and normalized version of value. - */ -soy.$$cleanHtml = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { - goog.asserts.assert(value.constructor === soydata.SanitizedHtml); - return /** @type {!soydata.SanitizedHtml} */ (value); - } - return soydata.VERY_UNSAFE.ordainSanitizedHtml( - soy.$$stripHtmlTags(value, soy.esc.$$SAFE_TAG_ALLOWLIST_), - soydata.getContentDir(value)); -}; - - -/** - * Escapes HTML special characters in a string so that it can be embedded in - * RCDATA. - *

- * Escapes HTML special characters so that the value will not prematurely end - * the body of a tag like {@code }. - *

- * Will normalize known safe HTML to make sure that sanitized HTML (which could - * contain an innocuous {@code } don't prematurely end an RCDATA - * element. - * - * @param {*} value The string-like value to be escaped. May not be a string, - * but the value will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeHtmlRcdata = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { - goog.asserts.assert(value.constructor === soydata.SanitizedHtml); - return soy.esc.$$normalizeHtmlHelper(value.content); - } - return soy.esc.$$escapeHtmlHelper(value); -}; - - -/** - * Matches any/only HTML5 void elements' start tags. - * See http://www.w3.org/TR/html-markup/syntax.html#syntax-elements - * @type {RegExp} - * @private - */ -soy.$$HTML5_VOID_ELEMENTS_ = new RegExp( - '^<(?:area|base|br|col|command|embed|hr|img|input' + - '|keygen|link|meta|param|source|track|wbr)\\b'); - - -/** - * Removes HTML tags from a string of known safe HTML. - * If opt_tagAllowlist is not specified or is empty, then - * the result can be used as an attribute value. - * - * @param {*} value The HTML to be escaped. May not be a string, but the - * value will be coerced to a string. - * @param {Object=} opt_tagAllowlist Has an own property whose - * name is a lower-case tag name and whose value is {@code 1} for - * each element that is allowed in the output. - * @return {string} A representation of value without disallowed tags, - * HTML comments, or other non-text content. - */ -soy.$$stripHtmlTags = function(value, opt_tagAllowlist) { - if (!opt_tagAllowlist) { - // If we have no allow-list, then use a fast track which elides all tags. - return String(value).replace(soy.esc.$$HTML_TAG_REGEX_, '') - // This is just paranoia since callers should normalize the result - // anyway, but if they didn't, it would be necessary to ensure that - // after the first replace non-tag uses of < do not recombine into - // tags as in "<script>alert(1337)script>". - .replace(soy.esc.$$LT_REGEX_, '<'); - } - - // Escapes '[' so that we can use [123] below to mark places where tags - // have been removed. - var html = String(value).replace(/\[/g, '['); - - // Consider all uses of '<' and replace allowlisted tags with markers like - // [1] which are indices into a list of approved tag names. - // Replace all other uses of < and > with entities. - var tags = []; - html = html.replace( - soy.esc.$$HTML_TAG_REGEX_, - function(tok, tagName) { - if (tagName) { - tagName = tagName.toLowerCase(); - if (opt_tagAllowlist.hasOwnProperty(tagName) && - opt_tagAllowlist[tagName]) { - var start = tok.charAt(1) === '/' ? ''; - return '[' + index + ']'; - } - } - return ''; - }); - - // Escape HTML special characters. Now there are no '<' in html that could - // start a tag. - html = soy.esc.$$normalizeHtmlHelper(html); - - var finalCloseTags = soy.$$balanceTags_(tags); - - // Now html contains no tags or less-than characters that could become - // part of a tag via a replacement operation and tags only contains - // approved tags. - // Reinsert the allow-listed tags. - html = html.replace( - /\[(\d+)\]/g, function(_, index) { return tags[index]; }); - - // Close any still open tags. - // This prevents unclosed formatting elements like

    and from - // breaking the layout of containing HTML. - return html + finalCloseTags; -}; - - -/** - * Throw out any close tags that don't correspond to start tags. - * If {@code
    } is used for formatting, embedded HTML shouldn't be able - * to use a mismatched {@code
    } to break page layout. - * - * @param {Array} tags an array of tags that will be modified in place - * include tags, the empty string, or concatenations of empty tags. - * @return {string} zero or more closed tags that close all elements that are - * opened in tags but not closed. - * @private - */ -soy.$$balanceTags_ = function(tags) { - var open = []; - for (var i = 0, n = tags.length; i < n; ++i) { - var tag = tags[i]; - if (tag.charAt(1) === '/') { - var openTagIndex = open.length - 1; - // NOTE: This is essentially lastIndexOf, but it's not supported in IE. - while (openTagIndex >= 0 && open[openTagIndex] != tag) { - openTagIndex--; - } - if (openTagIndex < 0) { - tags[i] = ''; // Drop close tag. - } else { - tags[i] = open.slice(openTagIndex).reverse().join(''); - open.length = openTagIndex; - } - } else if (!soy.$$HTML5_VOID_ELEMENTS_.test(tag)) { - open.push('Hello World - return soy.esc.$$filterHtmlElementNameHelper(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - * @deprecated - */ -soy.$$escapeJs = function(value) { - return soy.$$escapeJsString(value); -}; - - -/** - * Escapes characters in the value to make it valid content for a JS string - * literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsString = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.JS_STR_CHARS)) { - // TODO: It might still be worthwhile to normalize it to remove - // unescaped quotes, null, etc: replace(/(?:^|[^\])['"]/g, '\\$ - goog.asserts.assert(value.constructor === soydata.SanitizedJsStrChars); - return value.content; - } - return soy.esc.$$escapeJsStringHelper(value); -}; - - -/** - * Encodes a value as a JavaScript literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A JavaScript code representation of the input. - */ -soy.$$escapeJsValue = function(value) { - // We surround values with spaces so that they can't be interpolated into - // identifiers by accident. - // We could use parentheses but those might be interpreted as a function call. - if (value == null) { // Intentionally matches undefined. - // Java returns null from maps where there is no corresponding key while - // JS returns undefined. - // We always output null for compatibility with Java which does not have a - // distinct undefined value. - return ' null '; - } - if (soydata.isContentKind(value, soydata.SanitizedContentKind.JS)) { - goog.asserts.assert(value.constructor === soydata.SanitizedJs); - return value.content; - } - switch (typeof value) { - case 'boolean': case 'number': - return ' ' + value + ' '; - default: - return "'" + soy.esc.$$escapeJsStringHelper(String(value)) + "'"; - } -}; - - -/** - * Escapes characters in the string to make it valid content for a JS regular - * expression literal. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeJsRegex = function(value) { - return soy.esc.$$escapeJsRegexHelper(value); -}; - - -/** - * Matches all URI mark characters that conflict with HTML attribute delimiters - * or that cannot appear in a CSS uri. - * From G.2: CSS grammar - *
    - *     url        ([!#$%&*-~]|{nonascii}|{escape})*
    - * 
    - * - * @type {RegExp} - * @private - */ -soy.$$problematicUriMarks_ = /['()]/g; - -/** - * @param {string} ch A single character in {@link soy.$$problematicUriMarks_}. - * @return {string} - * @private - */ -soy.$$pctEncode_ = function(ch) { - return '%' + ch.charCodeAt(0).toString(16); -}; - -/** - * Escapes a string so that it can be safely included in a URI. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeUri = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.URI)) { - goog.asserts.assert(value.constructor === soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - // Apostophes and parentheses are not matched by encodeURIComponent. - // They are technically special in URIs, but only appear in the obsolete mark - // production in Appendix D.2 of RFC 3986, so can be encoded without changing - // semantics. - var encoded = soy.esc.$$escapeUriHelper(value); - soy.$$problematicUriMarks_.lastIndex = 0; - if (soy.$$problematicUriMarks_.test(encoded)) { - return encoded.replace(soy.$$problematicUriMarks_, soy.$$pctEncode_); - } - return encoded; -}; - - -/** - * Removes rough edges from a URI by escaping any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$normalizeUri = function(value) { - return soy.esc.$$normalizeUriHelper(value); -}; - - -/** - * Vets a URI's protocol and removes rough edges from a URI by escaping - * any raw HTML/JS string delimiters. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$filterNormalizeUri = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.URI)) { - goog.asserts.assert(value.constructor === soydata.SanitizedUri); - return soy.$$normalizeUri(value); - } - return soy.esc.$$filterNormalizeUriHelper(value); -}; - - -/** - * Allows only data-protocol image URI's. - * - * @param {*} value The value to process. May not be a string, but the value - * will be coerced to a string. - * @return {!soydata.SanitizedUri} An escaped version of value. - */ -soy.$$filterImageDataUri = function(value) { - // NOTE: Even if it's a SanitizedUri, we will still filter it. - return soydata.VERY_UNSAFE.ordainSanitizedUri( - soy.esc.$$filterImageDataUriHelper(value)); -}; - - -/** - * Escapes a string so it can safely be included inside a quoted CSS string. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} An escaped version of value. - */ -soy.$$escapeCssString = function(value) { - return soy.esc.$$escapeCssStringHelper(value); -}; - - -/** - * Encodes a value as a CSS identifier part, keyword, or quantity. - * - * @param {*} value The value to escape. May not be a string, but the value - * will be coerced to a string. - * @return {string} A safe CSS identifier part, keyword, or quanitity. - */ -soy.$$filterCssValue = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.CSS)) { - goog.asserts.assert(value.constructor === soydata.SanitizedCss); - return value.content; - } - // Uses == to intentionally match null and undefined for Java compatibility. - if (value == null) { - return ''; - } - return soy.esc.$$filterCssValueHelper(value); -}; - - -/** - * Sanity-checks noAutoescape input for explicitly tainted content. - * - * SanitizedContentKind.TEXT is used to explicitly mark input that was never - * meant to be used unescaped. - * - * @param {*} value The value to filter. - * @return {*} The value, that we dearly hope will not cause an attack. - */ -soy.$$filterNoAutoescape = function(value) { - if (soydata.isContentKind(value, soydata.SanitizedContentKind.TEXT)) { - // Fail in development mode. - goog.asserts.fail( - 'Tainted SanitizedContentKind.TEXT for |noAutoescape: `%s`', - [value.content]); - // Return innocuous data in production. - return 'zSoyz'; - } - - return value; -}; - - -// ----------------------------------------------------------------------------- -// Basic directives/functions. - - -/** - * Converts \r\n, \r, and \n to
    s - * @param {*} value The string in which to convert newlines. - * @return {string|!soydata.SanitizedHtml} A copy of {@code value} with - * converted newlines. If {@code value} is SanitizedHtml, the return value - * is also SanitizedHtml, of the same known directionality. - */ -soy.$$changeNewlineToBr = function(value) { - var result = goog.string.newLineToBr(String(value), false); - if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { - return soydata.VERY_UNSAFE.ordainSanitizedHtml( - result, soydata.getContentDir(value)); - } - return result; -}; - - -/** - * Inserts word breaks ('wbr' tags) into a HTML string at a given interval. The - * counter is reset if a space is encountered. Word breaks aren't inserted into - * HTML tags or entities. Entities count towards the character count; HTML tags - * do not. - * - * @param {*} value The HTML string to insert word breaks into. Can be other - * types, but the value will be coerced to a string. - * @param {number} maxCharsBetweenWordBreaks Maximum number of non-space - * characters to allow before adding a word break. - * @return {string|!soydata.SanitizedHtml} The string including word - * breaks. If {@code value} is SanitizedHtml, the return value - * is also SanitizedHtml, of the same known directionality. - */ -soy.$$insertWordBreaks = function(value, maxCharsBetweenWordBreaks) { - var result = goog.format.insertWordBreaks( - String(value), maxCharsBetweenWordBreaks); - if (soydata.isContentKind(value, soydata.SanitizedContentKind.HTML)) { - return soydata.VERY_UNSAFE.ordainSanitizedHtml( - result, soydata.getContentDir(value)); - } - return result; -}; - - -/** - * Truncates a string to a given max length (if it's currently longer), - * optionally adding ellipsis at the end. - * - * @param {*} str The string to truncate. Can be other types, but the value will - * be coerced to a string. - * @param {number} maxLen The maximum length of the string after truncation - * (including ellipsis, if applicable). - * @param {boolean} doAddEllipsis Whether to add ellipsis if the string needs - * truncation. - * @return {string} The string after truncation. - */ -soy.$$truncate = function(str, maxLen, doAddEllipsis) { - - str = String(str); - if (str.length <= maxLen) { - return str; // no need to truncate - } - - // If doAddEllipsis, either reduce maxLen to compensate, or else if maxLen is - // too small, just turn off doAddEllipsis. - if (doAddEllipsis) { - if (maxLen > 3) { - maxLen -= 3; - } else { - doAddEllipsis = false; - } - } - - // Make sure truncating at maxLen doesn't cut up a unicode surrogate pair. - if (soy.$$isHighSurrogate_(str.charAt(maxLen - 1)) && - soy.$$isLowSurrogate_(str.charAt(maxLen))) { - maxLen -= 1; - } - - // Truncate. - str = str.substring(0, maxLen); - - // Add ellipsis. - if (doAddEllipsis) { - str += '...'; - } - - return str; -}; - -/** - * Private helper for $$truncate() to check whether a char is a high surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode high surrogate. - * @private - */ -soy.$$isHighSurrogate_ = function(ch) { - return 0xD800 <= ch && ch <= 0xDBFF; -}; - -/** - * Private helper for $$truncate() to check whether a char is a low surrogate. - * @param {string} ch The char to check. - * @return {boolean} Whether the given char is a unicode low surrogate. - * @private - */ -soy.$$isLowSurrogate_ = function(ch) { - return 0xDC00 <= ch && ch <= 0xDFFF; -}; - - -// ----------------------------------------------------------------------------- -// Bidi directives/functions. - - -/** - * Cache of bidi formatter by context directionality, so we don't keep on - * creating new objects. - * @type {!Object} - * @private - */ -soy.$$bidiFormatterCache_ = {}; - - -/** - * Returns cached bidi formatter for bidiGlobalDir, or creates a new one. - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @return {goog.i18n.BidiFormatter} A formatter for bidiGlobalDir. - * @private - */ -soy.$$getBidiFormatterInstance_ = function(bidiGlobalDir) { - return soy.$$bidiFormatterCache_[bidiGlobalDir] || - (soy.$$bidiFormatterCache_[bidiGlobalDir] = - new goog.i18n.BidiFormatter(bidiGlobalDir)); -}; - - -/** - * Estimate the overall directionality of text. If opt_isHtml, makes sure to - * ignore the LTR nature of the mark-up and escapes in text, making the logic - * suitable for HTML and HTML-escaped text. - * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of - * estimating the directionality. - * - * @param {*} text The content whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {number} 1 if text is LTR, -1 if it is RTL, and 0 if it is neutral. - */ -soy.$$bidiTextDir = function(text, opt_isHtml) { - var contentDir = soydata.getContentDir(text); - if (contentDir != null) { - return contentDir; - } - var isHtml = opt_isHtml || - soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); - return goog.i18n.bidi.estimateDirection(text + '', isHtml); -}; - - -/** - * Returns 'dir="ltr"' or 'dir="rtl"', depending on text's estimated - * directionality, if it is not the same as bidiGlobalDir. - * Otherwise, returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of - * estimating the directionality. - * - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} text The content whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {soydata.SanitizedHtmlAttribute} 'dir="rtl"' for RTL text in non-RTL - * context; 'dir="ltr"' for LTR text in non-LTR context; - * else, the empty string. - */ -soy.$$bidiDirAttr = function(bidiGlobalDir, text, opt_isHtml) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - var contentDir = soydata.getContentDir(text); - if (contentDir == null) { - var isHtml = opt_isHtml || - soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); - contentDir = goog.i18n.bidi.estimateDirection(text + '', isHtml); - } - return soydata.VERY_UNSAFE.ordainSanitizedHtmlAttribute( - formatter.knownDirAttr(contentDir)); -}; - - -/** - * Returns a Unicode BiDi mark matching bidiGlobalDir (LRM or RLM) if the - * directionality or the exit directionality of text are opposite to - * bidiGlobalDir. Otherwise returns the empty string. - * If opt_isHtml, makes sure to ignore the LTR nature of the mark-up and escapes - * in text, making the logic suitable for HTML and HTML-escaped text. - * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of - * estimating the directionality. - * - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} text The content whose directionality is to be estimated. - * @param {boolean=} opt_isHtml Whether text is HTML/HTML-escaped. - * Default: false. - * @return {string} A Unicode bidi mark matching bidiGlobalDir, or the empty - * string when text's overall and exit directionalities both match - * bidiGlobalDir, or bidiGlobalDir is 0 (unknown). - */ -soy.$$bidiMarkAfter = function(bidiGlobalDir, text, opt_isHtml) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - var isHtml = opt_isHtml || - soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); - return formatter.markAfterKnownDir(soydata.getContentDir(text), text + '', - isHtml); -}; - - -/** - * Returns text wrapped in a according to its - * directionality - but only if that is neither neutral nor the same as the - * global context. Otherwise, returns text unchanged. - * Always treats text as HTML/HTML-escaped, i.e. ignores mark-up and escapes - * when estimating text's directionality. - * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of - * estimating the directionality. - * - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} text The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {!goog.soy.data.SanitizedContent|string} The wrapped text. - */ -soy.$$bidiSpanWrap = function(bidiGlobalDir, text) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - - // We always treat the value as HTML, because span-wrapping is only useful - // when its output will be treated as HTML (without escaping), and because - // |bidiSpanWrap is not itself specified to do HTML escaping in Soy. (Both - // explicit and automatic HTML escaping, if any, is done before calling - // |bidiSpanWrap because the BidiSpanWrapDirective Java class implements - // SanitizedContentOperator, but this does not mean that the input has to be - // HTML SanitizedContent. In legacy usage, a string that is not - // SanitizedContent is often printed in an autoescape="false" template or by - // a print with a |noAutoescape, in which case our input is just SoyData.) If - // the output will be treated as HTML, the input had better be safe - // HTML/HTML-escaped (even if it isn't HTML SanitizedData), or we have an XSS - // opportunity and a much bigger problem than bidi garbling. - var wrappedText = formatter.spanWrapWithKnownDir( - soydata.getContentDir(text), text + '', true /* opt_isHtml */); - - // Like other directives whose Java class implements SanitizedContentOperator, - // |bidiSpanWrap is called after the escaping (if any) has already been done, - // and thus there is no need for it to produce actual SanitizedContent. - return wrappedText; -}; - - -/** - * Returns text wrapped in Unicode BiDi formatting characters according to its - * directionality, i.e. either LRE or RLE at the beginning and PDF at the end - - * but only if text's directionality is neither neutral nor the same as the - * global context. Otherwise, returns text unchanged. - * Only treats soydata.SanitizedHtml as HTML/HTML-escaped, i.e. ignores mark-up - * and escapes when estimating text's directionality. - * If text has a goog.i18n.bidi.Dir-valued contentDir, this is used instead of - * estimating the directionality. - * - * @param {number} bidiGlobalDir The global directionality context: 1 if ltr, -1 - * if rtl, 0 if unknown. - * @param {*} text The string to be wrapped. Can be other types, but the value - * will be coerced to a string. - * @return {!goog.soy.data.SanitizedContent|string} The wrapped string. - */ -soy.$$bidiUnicodeWrap = function(bidiGlobalDir, text) { - var formatter = soy.$$getBidiFormatterInstance_(bidiGlobalDir); - - // We treat the value as HTML if and only if it says it's HTML, even though in - // legacy usage, we sometimes have an HTML string (not SanitizedContent) that - // is passed to an autoescape="false" template or a {print $foo|noAutoescape}, - // with the output going into an HTML context without escaping. We simply have - // no way of knowing if this is what is happening when we get - // non-SanitizedContent input, and most of the time it isn't. - var isHtml = soydata.isContentKind(text, soydata.SanitizedContentKind.HTML); - var wrappedText = formatter.unicodeWrapWithKnownDir( - soydata.getContentDir(text), text + '', isHtml); - - // Bidi-wrapping a value converts it to the context directionality. Since it - // does not cost us anything, we will indicate this known direction in the - // output SanitizedContent, even though the intended consumer of that - // information - a bidi wrapping directive - has already been run. - var wrappedTextDir = formatter.getContextDir(); - - // Unicode-wrapping UnsanitizedText gives UnsanitizedText. - // Unicode-wrapping safe HTML or JS string data gives valid, safe HTML or JS - // string data. - // ATTENTION: Do these need to be ...ForInternalBlocks()? - if (soydata.isContentKind(text, soydata.SanitizedContentKind.TEXT)) { - return new soydata.UnsanitizedText(wrappedText, wrappedTextDir); - } - if (isHtml) { - return soydata.VERY_UNSAFE.ordainSanitizedHtml(wrappedText, wrappedTextDir); - } - if (soydata.isContentKind(text, soydata.SanitizedContentKind.JS_STR_CHARS)) { - return soydata.VERY_UNSAFE.ordainSanitizedJsStrChars( - wrappedText, wrappedTextDir); - } - - // Unicode-wrapping does not conform to the syntax of the other types of - // content. For lack of anything better to do, we we do not declare a content - // kind at all by falling through to the non-SanitizedContent case below. - // TODO(user): Consider throwing a runtime error on receipt of - // SanitizedContent other than TEXT, HTML, or JS_STR_CHARS. - - // The input was not SanitizedContent, so our output isn't SanitizedContent - // either. - return wrappedText; -}; - - -// ----------------------------------------------------------------------------- -// Generated code. - - - - - - - - -// START GENERATED CODE FOR ESCAPERS. - -/** - * @type {function (*) : string} - */ -soy.esc.$$escapeUriHelper = function(v) { - return encodeURIComponent(String(v)); -}; - -/** - * Maps characters to the escaped versions for the named escape directives. - * @type {Object} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = { - '\x00': '\x26#0;', - '\x22': '\x26quot;', - '\x26': '\x26amp;', - '\x27': '\x26#39;', - '\x3c': '\x26lt;', - '\x3e': '\x26gt;', - '\x09': '\x26#9;', - '\x0a': '\x26#10;', - '\x0b': '\x26#11;', - '\x0c': '\x26#12;', - '\x0d': '\x26#13;', - ' ': '\x26#32;', - '-': '\x26#45;', - '\/': '\x26#47;', - '\x3d': '\x26#61;', - '`': '\x26#96;', - '\x85': '\x26#133;', - '\xa0': '\x26#160;', - '\u2028': '\x26#8232;', - '\u2029': '\x26#8233;' -}; - -/** - * A function that can be used with String.replace. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_[ch]; -}; - -/** - * Maps characters to the escaped versions for the named escape directives. - * @type {Object} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = { - '\x00': '\\x00', - '\x08': '\\x08', - '\x09': '\\t', - '\x0a': '\\n', - '\x0b': '\\x0b', - '\x0c': '\\f', - '\x0d': '\\r', - '\x22': '\\x22', - '\x26': '\\x26', - '\x27': '\\x27', - '\/': '\\\/', - '\x3c': '\\x3c', - '\x3d': '\\x3d', - '\x3e': '\\x3e', - '\\': '\\\\', - '\x85': '\\x85', - '\u2028': '\\u2028', - '\u2029': '\\u2029', - '$': '\\x24', - '(': '\\x28', - ')': '\\x29', - '*': '\\x2a', - '+': '\\x2b', - ',': '\\x2c', - '-': '\\x2d', - '.': '\\x2e', - ':': '\\x3a', - '?': '\\x3f', - '[': '\\x5b', - ']': '\\x5d', - '^': '\\x5e', - '{': '\\x7b', - '|': '\\x7c', - '}': '\\x7d' -}; - -/** - * A function that can be used with String.replace. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_[ch]; -}; - -/** - * Maps characters to the escaped versions for the named escape directives. - * @type {Object} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_ = { - '\x00': '\\0 ', - '\x08': '\\8 ', - '\x09': '\\9 ', - '\x0a': '\\a ', - '\x0b': '\\b ', - '\x0c': '\\c ', - '\x0d': '\\d ', - '\x22': '\\22 ', - '\x26': '\\26 ', - '\x27': '\\27 ', - '(': '\\28 ', - ')': '\\29 ', - '*': '\\2a ', - '\/': '\\2f ', - ':': '\\3a ', - ';': '\\3b ', - '\x3c': '\\3c ', - '\x3d': '\\3d ', - '\x3e': '\\3e ', - '@': '\\40 ', - '\\': '\\5c ', - '{': '\\7b ', - '}': '\\7d ', - '\x85': '\\85 ', - '\xa0': '\\a0 ', - '\u2028': '\\2028 ', - '\u2029': '\\2029 ' -}; - -/** - * A function that can be used with String.replace. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_ESCAPE_CSS_STRING_[ch]; -}; - -/** - * Maps characters to the escaped versions for the named escape directives. - * @type {Object} - * @private - */ -soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = { - '\x00': '%00', - '\x01': '%01', - '\x02': '%02', - '\x03': '%03', - '\x04': '%04', - '\x05': '%05', - '\x06': '%06', - '\x07': '%07', - '\x08': '%08', - '\x09': '%09', - '\x0a': '%0A', - '\x0b': '%0B', - '\x0c': '%0C', - '\x0d': '%0D', - '\x0e': '%0E', - '\x0f': '%0F', - '\x10': '%10', - '\x11': '%11', - '\x12': '%12', - '\x13': '%13', - '\x14': '%14', - '\x15': '%15', - '\x16': '%16', - '\x17': '%17', - '\x18': '%18', - '\x19': '%19', - '\x1a': '%1A', - '\x1b': '%1B', - '\x1c': '%1C', - '\x1d': '%1D', - '\x1e': '%1E', - '\x1f': '%1F', - ' ': '%20', - '\x22': '%22', - '\x27': '%27', - '(': '%28', - ')': '%29', - '\x3c': '%3C', - '\x3e': '%3E', - '\\': '%5C', - '{': '%7B', - '}': '%7D', - '\x7f': '%7F', - '\x85': '%C2%85', - '\xa0': '%C2%A0', - '\u2028': '%E2%80%A8', - '\u2029': '%E2%80%A9', - '\uff01': '%EF%BC%81', - '\uff03': '%EF%BC%83', - '\uff04': '%EF%BC%84', - '\uff06': '%EF%BC%86', - '\uff07': '%EF%BC%87', - '\uff08': '%EF%BC%88', - '\uff09': '%EF%BC%89', - '\uff0a': '%EF%BC%8A', - '\uff0b': '%EF%BC%8B', - '\uff0c': '%EF%BC%8C', - '\uff0f': '%EF%BC%8F', - '\uff1a': '%EF%BC%9A', - '\uff1b': '%EF%BC%9B', - '\uff1d': '%EF%BC%9D', - '\uff1f': '%EF%BC%9F', - '\uff20': '%EF%BC%A0', - '\uff3b': '%EF%BC%BB', - '\uff3d': '%EF%BC%BD' -}; - -/** - * A function that can be used with String.replace. - * @param {string} ch A single character matched by a compatible matcher. - * @return {string} A token in the output language. - * @private - */ -soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = function(ch) { - return soy.esc.$$ESCAPE_MAP_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_[ch]; -}; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_ = /[\x00\x22\x26\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_ = /[\x00\x22\x27\x3c\x3e]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x26\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_ = /[\x00\x09-\x0d \x22\x27\x2d\/\x3c-\x3e`\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_ = /[\x00\x08-\x0d\x22\x26\x27\/\x3c-\x3e\\\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_ = /[\x00\x08-\x0d\x22\x24\x26-\/\x3a\x3c-\x3f\x5b-\x5e\x7b-\x7d\x85\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_ = /[\x00\x08-\x0d\x22\x26-\x2a\/\x3a-\x3e@\\\x7b\x7d\x85\xa0\u2028\u2029]/g; - -/** - * Matches characters that need to be escaped for the named directives. - * @type RegExp - * @private - */ -soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_ = /[\x00- \x22\x27-\x29\x3c\x3e\\\x7b\x7d\x7f\x85\xa0\u2028\u2029\uff01\uff03\uff04\uff06-\uff0c\uff0f\uff1a\uff1b\uff1d\uff1f\uff20\uff3b\uff3d]/g; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_ = /^(?!-*(?:expression|(?:moz-)?binding))(?:[.#]?-?(?:[_a-z0-9-]+)(?:-[_a-z0-9-]+)*-?|-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[a-z]{1,2}|%)?|!important|)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_ = /^(?:(?:https?|mailto):|[^&:\/?#]*(?:[\/?#]|$))/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_IMAGE_DATA_URI_ = /^data:image\/(?:bmp|gif|jpe?g|png|tiff|webp);base64,[a-z0-9+\/]+=*$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_ = /^(?!style|on|action|archive|background|cite|classid|codebase|data|dsync|href|longdesc|src|usemap)(?:[a-z0-9_$:-]*)$/i; - -/** - * A pattern that vets values produced by the named directives. - * @type RegExp - * @private - */ -soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_ = /^(?!script|style|title|textarea|xmp|no)[a-z0-9_$:-]*$/i; - -/** - * A helper for the Soy directive |escapeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtml - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |normalizeHtmlNospace - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeHtmlNospaceHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_HTML_NOSPACE_, - soy.esc.$$REPLACER_FOR_ESCAPE_HTML__AND__NORMALIZE_HTML__AND__ESCAPE_HTML_NOSPACE__AND__NORMALIZE_HTML_NOSPACE_); -}; - -/** - * A helper for the Soy directive |escapeJsString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeJsRegex - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeJsRegexHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_JS_REGEX_, - soy.esc.$$REPLACER_FOR_ESCAPE_JS_STRING__AND__ESCAPE_JS_REGEX_); -}; - -/** - * A helper for the Soy directive |escapeCssString - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$escapeCssStringHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_ESCAPE_CSS_STRING_, - soy.esc.$$REPLACER_FOR_ESCAPE_CSS_STRING_); -}; - -/** - * A helper for the Soy directive |filterCssValue - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterCssValueHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_CSS_VALUE_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |normalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$normalizeUriHelper = function(value) { - var str = String(value); - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterNormalizeUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterNormalizeUriHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_NORMALIZE_URI_.test(str)) { - return '#zSoyz'; - } - return str.replace( - soy.esc.$$MATCHER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_, - soy.esc.$$REPLACER_FOR_NORMALIZE_URI__AND__FILTER_NORMALIZE_URI_); -}; - -/** - * A helper for the Soy directive |filterImageDataUri - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterImageDataUriHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_IMAGE_DATA_URI_.test(str)) { - return 'data:image/gif;base64,zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |filterHtmlAttributes - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlAttributesHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ATTRIBUTES_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * A helper for the Soy directive |filterHtmlElementName - * @param {*} value Can be of any type but will be coerced to a string. - * @return {string} The escaped text. - */ -soy.esc.$$filterHtmlElementNameHelper = function(value) { - var str = String(value); - if (!soy.esc.$$FILTER_FOR_FILTER_HTML_ELEMENT_NAME_.test(str)) { - return 'zSoyz'; - } - return str; -}; - -/** - * Matches all tags, HTML comments, and DOCTYPEs in tag soup HTML. - * By removing these, and replacing any '<' or '>' characters with - * entities we guarantee that the result can be embedded into a - * an attribute without introducing a tag boundary. - * - * @type {RegExp} - * @private - */ -soy.esc.$$HTML_TAG_REGEX_ = /<(?:!|\/?([a-zA-Z][a-zA-Z0-9:\-]*))(?:[^>'"]|"[^"]*"|'[^']*')*>/g; - -/** - * Matches all occurrences of '<'. - * - * @type {RegExp} - * @private - */ -soy.esc.$$LT_REGEX_ = /} - * @private - */ -soy.esc.$$SAFE_TAG_ALLOWLIST_ = {'b': 1, 'br': 1, 'em': 1, 'i': 1, 's': 1, 'sub': 1, 'sup': 1, 'u': 1}; - -// END GENERATED CODE diff --git a/demos/plane/style.css b/demos/plane/style.css deleted file mode 100644 index 16e2c6f412a..00000000000 --- a/demos/plane/style.css +++ /dev/null @@ -1,97 +0,0 @@ -body { - background-color: #fff; - font-family: sans-serif; - margin-top: 0; -} -h1 { - font-weight: normal; - font-size: 140%; -} -.farSide { - text-align: right; -} -html[dir="RTL"] .farSide { - text-align: left; -} -.tab { - padding: 6px 12px; - text-decoration: none; - color: #000; -} -#selected { - font-weight: bold; - background-color: #ddd; - border-radius: 20px; -} - -/* Pulse the language menu once to draw attention to it. */ -#languageBorder { - border-radius: 4px; - animation: pulse 2s ease-in-out forwards; - animation-delay: 2s; -} -@keyframes pulse { - 0% { background-color: #fff } - 50% { background-color: #f00 } - 100% { background-color: #fff } -} - -#blockly { - height: 300px; - width: 100%; - border-style: solid; - border-color: #ddd; - border-width: 0 1px 1px 0; -} - -/* SVG Plane. */ -#plane { - overflow: hidden; -} -#fuselage { - fill: #fff; - stroke: #000; -} -#wing, #tail { - fill: #ddd; - stroke: #444; -} -.crew { - fill: #f44; - stroke: #000; -} -.seat1st { - fill: #88f; - stroke: #000; -} -.seat2nd { - fill: #8b8; - stroke: #000; -} -#seatYes, #seatNo { - font-size: 40pt; -} -text { - font-family: sans-serif; - font-size: 20pt; - fill: #444; -} -html[dir="RTL"] #plane text { - text-anchor: end; -} - -/* Slider. */ -.sliderTrack { - stroke: #aaa; - stroke-width: 6px; - stroke-linecap: round; -} -.sliderKnob { - fill: #ddd; - stroke: #bbc; - stroke-width: 1px; - stroke-linejoin: round; -} -.sliderKnob:hover { - fill: #eee; -} diff --git a/demos/plane/template.soy b/demos/plane/template.soy deleted file mode 100644 index cbccc9ae467..00000000000 --- a/demos/plane/template.soy +++ /dev/null @@ -1,225 +0,0 @@ -{namespace planepage} - -/** - * This is a Closure Template. - * - * See the README.txt for details. - */ - -/** - * Translated messages for use in JavaScript. - */ -{template .messages} -
    - {msg meaning="Plane.rows" desc="page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}Rows: %1{/msg} - {msg meaning="Plane.getRows" desc="block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero."}rows (%1){/msg} - {msg meaning="Plane.rows1" desc="page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows: %1{/msg} - {msg meaning="Plane.getRows1" desc="block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero."}1st class rows (%1){/msg} - {msg meaning="Plane.rows2" desc="page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows: %1{/msg} - {msg meaning="Plane.getRows2" desc="block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero."}2nd class rows (%1){/msg} - {msg meaning="Plane.seats" desc="page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero."}Seats: %1{/msg} - {msg meaning="Plane.placeholder" desc="page text - A word or symbol indicating that this numeric value has not yet been determined."}?{/msg} - {msg meaning="Plane.setSeats" desc="block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'."}seats ={/msg} -
    -{/template} - -/** - * Web page structure. - */ -{template .start} - {call .messages /} - - - - - -
    -

    Blockly‏ >{sp} - Demos‏ >{sp} - - {msg meaning="Plane.plane" desc="title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal."} - Plane Seat Calculator - {/msg} - - {sp} {sp} - {for $i in range(1, $ij.maxLevel + 1)} - {sp} - {if $i == $ij.level} - {$i} - {else} - {if $i < $ij.level} - - {else} - {$i} - {/if} - {/if} - {/for} -

    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {if $ij.level > 1} - - - {/if} - - -

    - {switch $ij.level} - {case 1} - {msg meaning="Plane.description1" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane."}An airplane has a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 2} - {msg meaning="Plane.description2" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats.{/msg} - {case 3} - {msg meaning="Plane.description3" desc="instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages."}An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats.{/msg} - {/switch} -

    -

    - {msg meaning="Plane.instructions" desc="page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture."}Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above).{/msg} -

    - - - - - - - {call .toolbox /} -
    -{/template} - -/** - * Toolboxes for each level. - */ -{template .toolbox} - -{/template} diff --git a/demos/plane/xlf/extracted_msgs.xlf b/demos/plane/xlf/extracted_msgs.xlf deleted file mode 100644 index 6a4fd44ff4f..00000000000 --- a/demos/plane/xlf/extracted_msgs.xlf +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - Rows: %1 - page text - Total number of rows of seats on an airplane.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows - - - seats = - block text - The first half of a mathematical equation determining the number of seats in an airplane, such as: ''''seats =''' 4 x rows'. - Plane.setSeats - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3 this level], there are three types of seats on this plane. Be sure to use the same terms for '1st class' and '2nd class' as you did for the earlier messages. - Plane.description3 - - - ? - page text - A word or symbol indicating that this numeric value has not yet been determined. - Plane.placeholder - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - page text - This text appears below the airplane graphic and above the space for the user to create the formula. The number of rows an the graphic may be changed by the user with a slider. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1] for a picture. - Plane.instructions - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=2 this level], there are two types of seats on this plane. - Plane.description2 - - - 1st class rows (%1) - block text - The number of rows of first-class seats on the, to be used in a mathematical equation. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows1 - - - 2nd class rows: %1 - page text - The number of rows of second-class seats on the airplane. %1 is an integer greater or equal to zero. See [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows2 - - - Seats: %1 - page text - The total number of seats on the airplane.\n\nParameters:\n* %1 - number of seats on an airplane. It is always either the next message or an integer greater than or equal to zero. - Plane.seats - - - Plane Seat Calculator - title - Specifies that this is Blockly's '''Plane''' (airplane) tutorial. The word 'plane' was chosen over 'airplane' in English because it is shorter and less formal. - Plane.plane - - - rows (%1) - block text - The number of rows on the airplane, to be used in a mathematical equation, such as: 'seats = 4 x '''rows (5)''''.\n\nParameters:\n* %1 - number of rows of seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows - - - 1st class rows: %1 - page text - The number of rows of first-class seats on the airplane. You can see the block at [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=3].\n\nParameters:\n* %1 - number of rows of first-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.rows1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - instructions - Note that in [http://blockly-share.appspot.com/static/apps/plane/plane.html?lang=en&level=1 this level], there is only one type of seat on the plane. - Plane.description1 - - - 2nd class rows (%1) - block text - The number of rows of second-class (also called 'economy class') seats on the airplane, to be used in a mathematical expression.\n\nParameters:\n* %1 - number of rows of second-class seats on an airplane. It is always an integer greater than or equal to zero. - Plane.getRows2 - - - - diff --git a/demos/plane/xlf/translated_msgs_ar.xlf b/demos/plane/xlf/translated_msgs_ar.xlf deleted file mode 100644 index c9b8e1689ac..00000000000 --- a/demos/plane/xlf/translated_msgs_ar.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - الصفوف: %1 - - - seats = - المقاعد = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من المقاعد في صفوف الدرجة الأولى والثانية. كل صف من صفوف الدرجة الأولى يحتوي على أربعة مقاعد. ويحتوي كل صف في الدرجة الثانية على خمسة مقاعد. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - لبناء صيغة (أدناه) تقوم بحساب إجمالي عدد المقاعد في الطائرة عند تغيير الصفوف (أعلاه). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - طائرة بمقعدين في مقطورة الطيّار (للطيار ومساعده) وعدد من الصفوف يحتوي كل صف على أربعة مقاعد. - - - 1st class rows (%1) - صفوف الطبقة الأولى (%1) - - - 2nd class rows: %1 - صفوف الفئة الثانية: %1 - - - Seats: %1 - المقاعد: %1 - - - Plane Seat Calculator - آلة حاسبة لمقعد الطائرة - - - rows (%1) - الصفوف (%1) - - - 1st class rows: %1 - صفوف الطبقة الأولى: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - هنالك طائرة تحتوي على عدد من صفوف مقاعد الركاب. كل صف يحتوي على أربعة مقاعد. - - - 2nd class rows (%1) - صفوف الفئة الثانية: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_be-tarask.xlf b/demos/plane/xlf/translated_msgs_be-tarask.xlf deleted file mode 100644 index 4580b5f1d6e..00000000000 --- a/demos/plane/xlf/translated_msgs_be-tarask.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Радкоў: %1 - - - seats = - месцаў = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі пасажырскіх шэрагаў месцаў 1-га кляса і 2-га кляса. Кожны шэраг 1-га кляса утрымлівае чатыры месцы. Кожны шэраг 2-га кляса ўтрымлівае пяць месцаў. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Пабудаваць формулу (ніжэй), якая падлічвае агульную колькасьць месцаў у самалёце пры зьмене радоў (гл. вышэй). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Самалёт мае два месцы ў кабіне экіпажа (пілот і другі пілот), і некалькі шэрагаў пасажырскіх сядзеньняў. Кожны шэраг утрымлівае чатыры месцы. - - - 1st class rows (%1) - радкі першага клясу (%1) - - - 2nd class rows: %1 - Радкі другога клясу: %1 - - - Seats: %1 - Месцаў: %1 - - - Plane Seat Calculator - Калькулятар месцаў у самалёце - - - rows (%1) - радкоў (%1) - - - 1st class rows: %1 - Радкі першага клясу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Самалёт мае некалькі шэрагаў пасажырскіх сядзеньняў. Кожная шэраг утрымлівае чатыры месцы. - - - 2nd class rows (%1) - радкі другога клясу (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_br.xlf b/demos/plane/xlf/translated_msgs_br.xlf deleted file mode 100644 index 4a7fc0c26c2..00000000000 --- a/demos/plane/xlf/translated_msgs_br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Renkennadoù : %1 - - - seats = - azezennoù = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag un toullad renkennadoù azezennoù tremenidi kentañ hag eil klas. Peder azezenn zo e pep renkennad kentañ klas. Pemp azezenn zo e pemp renkennad eil klas. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sevel ur formulenn (amañ dindan) evit jediñ an niver a azezennoù en holl en nijerez pa vez kemmet an niver a renkennadoù (amañ a-us). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En un nijerez ez eus div azezenn el logell leviañ(evit al loman hag an eil loman), hag ur toullad renkennadoù azezennoù evit an dremenidi. Peder azezenn zo e pep renkennad. - - - 1st class rows (%1) - Renkennadoù kentañ klas (%1) - - - 2nd class rows: %1 - Renkennadoù eil klas : %1 - - - Seats: %1 - Azezennoù : %1 - - - Plane Seat Calculator - Jederez azezenn nijerez - - - rows (%1) - renkennadoù (%1) - - - 1st class rows: %1 - Renkennadoù kentañ klas : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un nijerez he deus un toullad renkennadoù azezennoù evit ar veajourien. Peder azezenn a zo e pep renkennad. - - - 2nd class rows (%1) - Renkennadoù eil klas (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ca.xlf b/demos/plane/xlf/translated_msgs_ca.xlf deleted file mode 100644 index 17dfe65e09e..00000000000 --- a/demos/plane/xlf/translated_msgs_ca.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Files: %1 - - - seats = - seients = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avió té dos seients en la cabina de vol (pel pilot i copilot) i un nombre de files per seients de passatgers de primera classe i de segona classe. Cada fila de primera classe conté quatre seients. Cada fila de segona classe conté cinc seients. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construïu una fórmula (a sota) que calculi el nombre total de seients de l'avió a mida que canviïn les files (a dalt). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avió té dos seients en la cabina de vol (pel pilot i pel copilot) i un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 1st class rows (%1) - files de primera classe (%1) - - - 2nd class rows: %1 - files de segona classe: %1 - - - Seats: %1 - Seients: %1 - - - Plane Seat Calculator - Calculadora de seients d'avió - - - rows (%1) - files (%1) - - - 1st class rows: %1 - files de primera classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avió té un nombre de files de seients de passatgers. Cada fila conté quatre seients. - - - 2nd class rows (%1) - files de segona classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_da.xlf b/demos/plane/xlf/translated_msgs_da.xlf deleted file mode 100644 index 752fe24f5b8..00000000000 --- a/demos/plane/xlf/translated_msgs_da.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rækker: %1 - - - seats = - sæder = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af 1. klasses og 2. klasses passagersæder. Hver 1. klasses række indeholder fire sæder. Hver 2. klasses række indeholder fem sæder. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Opbyg en formel (nedenfor), der beregner det samlede antal pladser på flyet, hvis antal rækker ændres (ovenfor). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to pladser i cockpittet (til pilot og med-pilot), og et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 1st class rows (%1) - 1. klasse rækker (%1) - - - 2nd class rows: %1 - 2. klasse rækker: %1 - - - Seats: %1 - Sæder: %1 - - - Plane Seat Calculator - Flysædelommeregner - - - rows (%1) - rækker (%1) - - - 1st class rows: %1 - 1. klasse rækker: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antal rækker af passagersæder. Hver række indeholder fire sæder. - - - 2nd class rows (%1) - 2. klasse rækker (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_de.xlf b/demos/plane/xlf/translated_msgs_de.xlf deleted file mode 100644 index f06bc77253e..00000000000 --- a/demos/plane/xlf/translated_msgs_de.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihen: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen der 1. und 2. Klasse. Jede 1.-Klasse-Reihe enthält vier Sitze. Jede 2.-Klasse-Reihe enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstelle eine Formel (unten), die die gesamte Anzahl an Sitzen im Flugzeug berechnet, wenn die Reihen (oben) geändert werden. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat zwei Sitze im Pilotenstand (für den Piloten und Co-Piloten) und eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 1st class rows (%1) - Reihen der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihen der 2. Klasse: %1 - - - Seats: %1 - Sitze: %1 - - - Plane Seat Calculator - Flugzeugsitzrechner - - - rows (%1) - Reihen (%1) - - - 1st class rows: %1 - Reihen der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ein Flugzeug hat eine Anzahl an Reihen mit Passagiersitzen. Jede Reihe enthält vier Sitze. - - - 2nd class rows (%1) - Reihen der 2. Klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_el.xlf b/demos/plane/xlf/translated_msgs_el.xlf deleted file mode 100644 index 5acb291d2c3..00000000000 --- a/demos/plane/xlf/translated_msgs_el.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Σειρές: %1 - - - seats = - καθίσματα = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό σειρών καθισμάτων για την 1η και 2η θέση. Κάθε σειρά της 1ης θέσης έχει τέσσερα καθίσματα και κάθε σειρά της 2ης θέσης έχει πέντε καθίσματα. - - - ? - ; - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Φτιάξε έναν τύπο (κάτω) που θα υπολογίζει τον συνολικό αριθμό καθισμάτων του αεροπλάνου καθώς αλλάζουν οι σειρές (πάνω). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει δύο καθίσματα στον θάλαμο διακυβέρνησης (για τον κυβερνήτη και τον συγκυβερνήτη), καθώς και έναν αριθμό από σειρές καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 1st class rows (%1) - Σειρές 1ης θέσης (%1) - - - 2nd class rows: %1 - Σειρές 2ης θέσης: %1 - - - Seats: %1 - Καθίσματα: %1 - - - Plane Seat Calculator - Υπολογισμός Θέσεων Σε Αεροπλάνο - - - rows (%1) - σειρές (%1) - - - 1st class rows: %1 - Σειρές 1ης θέσης: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ένα αεροπλάνο έχει έναν συγκεκριμένο αριθμό σειρών καθισμάτων επιβατών. Κάθε σειρά έχει τέσσερα καθίσματα. - - - 2nd class rows (%1) - Σειρές 2ης θέσης (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_en.xlf b/demos/plane/xlf/translated_msgs_en.xlf deleted file mode 100644 index e471a00085b..00000000000 --- a/demos/plane/xlf/translated_msgs_en.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rows: %1 - - - seats = - seats = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - - - 1st class rows (%1) - 1st class rows (%1) - - - 2nd class rows: %1 - 2nd class rows: %1 - - - Seats: %1 - Seats: %1 - - - Plane Seat Calculator - Plane Seat Calculator - - - rows (%1) - rows (%1) - - - 1st class rows: %1 - 1st class rows: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - An airplane has a number of rows of passenger seats. Each row contains four seats. - - - 2nd class rows (%1) - 2nd class rows (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_es.xlf b/demos/plane/xlf/translated_msgs_es.xlf deleted file mode 100644 index e2022b5f123..00000000000 --- a/demos/plane/xlf/translated_msgs_es.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - asientos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos para pasajeros de primera y segunda clase. Cada fila de la primera clase contiene cuatro asientos. Cada fila de la segunda clase contiene cinco asientos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construir una fórmula (abajo) que calcule el número total de asientos en el avión cuando las filas sean cambiadas (arriba). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avión tiene dos asientos en la cabina de vuelo (para el piloto y co-piloto), y un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 1st class rows (%1) - Filas de primera clase: (%1) - - - 2nd class rows: %1 - Filas de segunda clase: %1 - - - Seats: %1 - Asientos: %1 - - - Plane Seat Calculator - Calculadora de asientos de avión - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de primera clase: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avión  tiene un número de filas de asientos de pasajeros. Cada fila contiene cuatro asientos. - - - 2nd class rows (%1) - Filas de segunda clase: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_et.xlf b/demos/plane/xlf/translated_msgs_et.xlf deleted file mode 100644 index d88be0a9f73..00000000000 --- a/demos/plane/xlf/translated_msgs_et.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Ridu: %1 - - - seats = - istmete arv = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Lennuki kokpitis on kaks istet (üks kummalegi piloodile), mingi arv ridu 1. klassi reisijatele ja mingi arv ridu 2. klassi reisijatele. Igas 1. klassi reas on neli istet, igas 2. klassi reas viis istet. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Ehita plokkidest valem, mis arvutab istmete arvu lennukis õigesti sõltumata ridade arvust (seda saad muuta lennuki juures oleva liuguriga). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Lennuki kokpitis on kaks istet (üks kummalegi piloodile) ja mingi arv istemridu reisijatele. Igas reas on neli istet. - - - 1st class rows (%1) - 1. klassi ridu (%1) - - - 2nd class rows: %1 - 2. klassi ridu: %1 - - - Seats: %1 - Istmeid: %1 - - - Plane Seat Calculator - Lennukiistmete kalkulaator - - - rows (%1) - rows (%1) - - - 1st class rows: %1 - 1. klassi ridu: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Lennukis on reisijate istmed mitmes reas. Igas reas on neli istet. - - - 2nd class rows (%1) - 2. klassi ridu (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_fa.xlf b/demos/plane/xlf/translated_msgs_fa.xlf deleted file mode 100644 index 264ec310444..00000000000 --- a/demos/plane/xlf/translated_msgs_fa.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - ردیف: %1 - - - seats = - صندلی‌ها = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - یک هواپیما دو صندلی در کابین خلبان دارد (برای خلبان و کمک خلبان) و تهداد از صندلی‌ها مسافرین درجه یک و درجه دو. هر ردیف درجه یک شامل چهار صندلی است. هر ردیف درجه دو شامل پنج صندلی است. - - - ? - ؟ - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - یک فرمول بسازید (پایین) که تعداد کل صندلی‌های هواپیما با تغییر ردیف را حساب کند (بالا). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - یک هواپیما دو صندلی در عرشهٔ پرواز دارد (برای خلبان و کمک خلبان) و تعدادی صندلی مسافرین. هر ردیف شامل چهار صندلی است. - - - 1st class rows (%1) - اولین کلاس ردیف‌ها (%1) - - - 2nd class rows: %1 - دومین کلاس ردیف: %1 - - - Seats: %1 - صندلی‌ها: %1 - - - Plane Seat Calculator - محاسبه‌گر صندلی‌های هواپیما - - - rows (%1) - ردیف‌ها (%1) - - - 1st class rows: %1 - اولین ردیف کلاس: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - یک هواپیما تعداد از صندلی‌های مسافرین را دارد. هر ردیف شمال چهار صندلی است. - - - 2nd class rows (%1) - دومین کلاس ردیف‌ها (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_fr.xlf b/demos/plane/xlf/translated_msgs_fr.xlf deleted file mode 100644 index 9485da29bd3..00000000000 --- a/demos/plane/xlf/translated_msgs_fr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rangées : %1 - - - seats = - sièges = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion a deux sièges dans la cabine de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager de première et seconde classes. Chaque rangée de première classe contient quatre sièges. Chaque rangée de seconde classe contient cinq sièges. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construire une formule (ci-dessous) qui calcule le nombre total de sièges dans l’avion quand le nombre de rangées est modifié (ci-dessus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion a deux sièges dans le poste de pilotage (pour le pilote et le copilote), et un certain nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 1st class rows (%1) - rangées de première classe (%1) - - - 2nd class rows: %1 - rangées de seconde classe : %1 - - - Seats: %1 - Sièges : %1 - - - Plane Seat Calculator - Calculateur de sièges d’avion - - - rows (%1) - rangées (%1) - - - 1st class rows: %1 - rangées de première classe : %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion a un nombre de rangées de sièges passager. Chaque rangée contient quatre sièges. - - - 2nd class rows (%1) - rangées de seconde classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_he.xlf b/demos/plane/xlf/translated_msgs_he.xlf deleted file mode 100644 index 55ac148c5ae..00000000000 --- a/demos/plane/xlf/translated_msgs_he.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - שורות: %1 - - - seats = - מושבים = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות מושבים במחלקת הנוסעים הראשונה ובמחלקת הנוסעים השנייה. כל שורה במחלקה הראשונה מכילה ארבעה מושבים. כל שורה במחלקה השנייה מכילה חמישה מושבים. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - בנה נוסחה (למטה) אשר תחשב את סך כל המושבים במטוס בהתאם לשינוי מספר השורות (למעלה). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - במטוס יש שני מושבים עבור הצוות (בשביל הטייס וטייס המשנה), ומספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 1st class rows (%1) - שורות במחלקה ראשונה (%1) - - - 2nd class rows: %1 - שורות במחלקה שנייה: %1 - - - Seats: %1 - מושבים: %1 - - - Plane Seat Calculator - מחשבון מושב במטוס - - - rows (%1) - שורות (%1) - - - 1st class rows: %1 - שורות במחלקה ראשונה: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - במטוס יש מספר שורות עם מושבי נוסעים. בכל שורה יש ארבעה מושבים. - - - 2nd class rows (%1) - שורות במחלקה שנייה: (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_hrx.xlf b/demos/plane/xlf/translated_msgs_hrx.xlf deleted file mode 100644 index 263d3050749..00000000000 --- a/demos/plane/xlf/translated_msgs_hrx.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Reihe: %1 - - - seats = - Sitze = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - En Fluchzeich hot zwooi Sitze im Pilotstand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze der 1. und 2. Klasse. Jede 1.-Klasse-Reih enthält vier Sitze. Jede 2.-Klasse-Reih enthält fünf Sitze. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Erstell en Formel (unne), die die gesamte Oonzohl an Sitze im Fluchzeich berechnet, wenn die Reihe (uwe) geännert sin. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot zwooi Sitze im Pilotestand (für den Pilot und Co-Pilot) und en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 1st class rows (%1) - Reihe von der 1. Klasse (%1) - - - 2nd class rows: %1 - Reihe von der 2. Klasse: %1 - - - Seats: %1 - Sitz: %1 - - - Plane Seat Calculator - Fluchzeichsitzrechner - - - rows (%1) - Reihe (%1) - - - 1st class rows: %1 - Reihe von der 1. Klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - En Fluchzeich hot en Oonzohl an Reihe mit Passagiersitze. Jede Reih enthält vier Sitze. - - - 2nd class rows (%1) - Reihe von der 2. Klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_hu.xlf b/demos/plane/xlf/translated_msgs_hu.xlf deleted file mode 100644 index c44d1aa9d4a..00000000000 --- a/demos/plane/xlf/translated_msgs_hu.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sorok száma: %1 - - - seats = - Ülések száma = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok 1. és 2. osztályon utazhatnak. Az 1. osztályon négy szék van egy sorban. A 2. osztályon öt szék van egy sorban. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Készítsd el a képletet (lent) amivel kiszámolható, hogy hány ülés van összesen a repülőgépen annak függvényében, ahogy (fent) állítod a sorok számát. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépnek 2 ülése van a pilótafülkében (a pilótának és a másodpilótának), az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 1st class rows (%1) - 1. osztály sorai (%1) - - - 2nd class rows: %1 - 2. osztály: %1 sor - - - Seats: %1 - Ülések száma összesen: %1 - - - Plane Seat Calculator - Repülőgép alkalmazás - - - rows (%1) - Sorok száma (%1) - - - 1st class rows: %1 - 1. osztály: %1 sor - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Egy repülőgépen az utasok több sorban ülnek az utastérben. Az utastér minden sorában négy szék van. - - - 2nd class rows (%1) - 2. osztály sorai (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ia.xlf b/demos/plane/xlf/translated_msgs_ia.xlf deleted file mode 100644 index 83ae2c6d2f8..00000000000 --- a/demos/plane/xlf/translated_msgs_ia.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - sedes = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros del prime classe e del secunde classes. Cata fila del prime classe contine quatro sedes. Cata fila del secunde classe contine cinque sedes. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construe un formula (ci infra) que calcula le numero total de sedes in le avion quando le numero de filas es cambiate (ci supra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion ha duo sedes in le cabina (pro le pilota e le copilota) e un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 1st class rows (%1) - filas de prime classe (%1) - - - 2nd class rows: %1 - Filas de secunde classe: %1 - - - Seats: %1 - Sedes: %1 - - - Plane Seat Calculator - Calculator de sedias de avion - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - Filas de prime classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion ha un numero de filas de sedes pro passageros. Cata fila contine quatro sedes. - - - 2nd class rows (%1) - filas de secunde classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_is.xlf b/demos/plane/xlf/translated_msgs_is.xlf deleted file mode 100644 index 3810f4b34c8..00000000000 --- a/demos/plane/xlf/translated_msgs_is.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Raðir: %1 - - - seats = - sæti = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega á 1. og 2. farrými. Hver sætaröð á 1. farrými hefur fjögur sæti. Hver sætaröð á 2. farrými hefur fimm sæti. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Búðu til formúlu (hér fyrir neðan) sem reiknar heildarfjölda sæta í flugvélinni eftir því sem röðunum er breytt (hér fyrir ofan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Flugvél er með tvö sæti í stjórnklefa (fyrir flugmanninn og aðstoðarflugmanninn) og einhvern fjölda sætaraða fyrir farþega. Hver sætaröð hefur fjögur sæti. - - - 1st class rows (%1) - raðir 1. farrými (%1) - - - 2nd class rows: %1 - Raðir 2. farrými: %1 - - - Seats: %1 - Sæti: %1 - - - Plane Seat Calculator - Flugsætareiknir - - - rows (%1) - raðir (%1) - - - 1st class rows: %1 - Raðir 1. farrými: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Flugvél er með einhvern fjölda sætaraða fyrir farþega. Í hverri röð eru fjögur sæti. - - - 2nd class rows (%1) - raðir 2. farrými (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_it.xlf b/demos/plane/xlf/translated_msgs_it.xlf deleted file mode 100644 index 27bad0dcffd..00000000000 --- a/demos/plane/xlf/translated_msgs_it.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - File: %1 - - - seats = - sedili = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un aereo ha due posti nella cabina di pilotaggio (per il pilota e il co-pilota), e un numero di file in prima e seconda classe, con i posti a sedere dei passeggeri. Ogni fila della prima classe contiene quattro posti. Quelle invece della seconda classe, ne contengono cinque. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Costruisci una formula (sotto) che calcola il numero totale di posti a sedere su un aeroplano, così come cambiano le file di posti (sopra). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha due posti a sedere nella cabina di pilotaggio (per il pilota e co-pilota), e un numero di file con i posti a sedere dei passeggeri. Ogni fila contiene quattro posti. - - - 1st class rows (%1) - file 1ª classe (%1) - - - 2nd class rows: %1 - File 2ª classe: %1 - - - Seats: %1 - Sedili: %1 - - - Plane Seat Calculator - Calcolo posti aereo - - - rows (%1) - file (%1) - - - 1st class rows: %1 - File 1ª classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un aeroplano ha un numero di file contenenti i posti a sedere dei passeggeri. Ogni fila, contiene quattro posti a sedere. - - - 2nd class rows (%1) - File 2ª classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ja.xlf b/demos/plane/xlf/translated_msgs_ja.xlf deleted file mode 100644 index b04624a2719..00000000000 --- a/demos/plane/xlf/translated_msgs_ja.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 列の数: %1 - - - seats = - 座席の数 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、ファーストクラスとセカンドクラスの乗客の座席の列があります。それぞれの列に、ファーストクラスでは 4 つの座席、セカンドクラスでは 5 つの座席があります。 - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 飛行機の座席の数を計算する式を、上で列の数を変更しても正しくなるように、下に入力してください。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 飛行機には、操縦室の 2 つの座席 (操縦士と副操縦士) と、乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 1st class rows (%1) - ファーストクラスの列数 (%1) - - - 2nd class rows: %1 - セカンドクラスの列数: %1 - - - Seats: %1 - 座席の数: %1 - - - Plane Seat Calculator - 飛行機座席計算機 - - - rows (%1) - 列の数 (%1) - - - 1st class rows: %1 - ファーストクラスの列数: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 飛行機に乗客の座席の列があります。それぞれの列に 4 つの座席があります。 - - - 2nd class rows (%1) - セカンドクラスの列数 (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ko.xlf b/demos/plane/xlf/translated_msgs_ko.xlf deleted file mode 100644 index 07e23288e66..00000000000 --- a/demos/plane/xlf/translated_msgs_ko.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 행 수: %1 - - - seats = - 좌석수 = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 1등석과 2등석 승객 좌석의 행 수가 있습니다. 각 1등석 행에는 시트 네 개가 포함되어 있습니다. 각 2등석 행에는 시트 다섯 개가 포함되어 있습니다. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 행이 바뀐(위) 비행기에 좌석의 총 수를 계산하는 공식(아래)을 구축하세요. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 비행기는 비행 갑판(조종사와 부조종사용)에서 좌석 두 개가 있고, 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 1st class rows (%1) - 1등석 행 수 (%1) - - - 2nd class rows: %1 - 2등석 행 수: %1 - - - Seats: %1 - 좌석 수: %1 - - - Plane Seat Calculator - 비행기 좌석 계산기 - - - rows (%1) - 행 수 (%1) - - - 1st class rows: %1 - 1등석 행 수: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 비행기는 승객 좌석의 행 수가 있습니다. 각 행에는 시트 네 개가 포함되어 있습니다. - - - 2nd class rows (%1) - 2등석 행 수 (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ms.xlf b/demos/plane/xlf/translated_msgs_ms.xlf deleted file mode 100644 index c34f084a3d4..00000000000 --- a/demos/plane/xlf/translated_msgs_ms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Baris: %1 - - - seats = - tempat duduk = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Sebuah kapal terbang mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang kelas pertama dan kelas kedua. Setiap baris kelas pertama mengandungi empat tempat duduk. Setiap baris kelas pertama mengandungi lima tempat duduk. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Wujudkan formula (di bawah) yang mengira jumlah tempat duduk di dalam kapal terbang sedangkan baris-barisnya diubah (di atas). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbang mempunyai tempat duduk di kokpit (untuk juruterbang dan pembantunya) dan sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 1st class rows (%1) - baris kelas pertama (%1) - - - 2nd class rows: %1 - Baris kelas kedua: %1 - - - Seats: %1 - Tempat duduk: %1 - - - Plane Seat Calculator - Pengira Tempat Duduk Kapal Terbang - - - rows (%1) - baris (%1) - - - 1st class rows: %1 - Baris kelas pertama: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Sebuah kapal terbang mempunyai sebilangan baris tempat duduk penumpang. Setiap baris mengandungi empat tempat duduk. - - - 2nd class rows (%1) - baris kelas kedua (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_nb.xlf b/demos/plane/xlf/translated_msgs_nb.xlf deleted file mode 100644 index 99c9c6a9971..00000000000 --- a/demos/plane/xlf/translated_msgs_nb.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - seter = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter på første og andre klasse. Hver av radene på første klasse har fire seter. Hver av radene på andre klasse har fem seter. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (under) som beregner det totale antall seter på flyet etter hvert som radene endres (over). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Et fly har to seter i cockpit (for piloten og andrepiloten), og et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 1st class rows (%1) - Rader i første klasse (%1) - - - 2nd class rows: %1 - Rader i andre klasse: %1 - - - Seats: %1 - Seter: %1 - - - Plane Seat Calculator - Flysetekalkulator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i første klasse: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Et fly har et antall rader med passasjerseter. Hver rad inneholder fire seter. - - - 2nd class rows (%1) - Rader i andre klasse (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_nl.xlf b/demos/plane/xlf/translated_msgs_nl.xlf deleted file mode 100644 index 6f36fa026c7..00000000000 --- a/demos/plane/xlf/translated_msgs_nl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rijen: %1 - - - seats = - stoelen= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen voor 1e klasse en 2e klasse passagiers. Iedere rij in de 1e klasse heeft vier stoelen. Iedere rij in de 2e klasse heeft vijf stoelen. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Maak hieronder een formule die het totale aantal stoelen in het vliegtuig berekent als het aantal rijen hierboven wordt aangepast. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft twee stoelen in de cockpit (voor de piloot en de copiloot) en een aantal rijen met stoelen voor passagiers. Iedere rij bevat vier stoelen. - - - 1st class rows (%1) - Rijen 1e klas (%1) - - - 2nd class rows: %1 - Rijen 2e klas: %1 - - - Seats: %1 - Zitplaatsen: %1 - - - Plane Seat Calculator - Vliegtuigstoelencalculator - - - rows (%1) - rijen (%1) - - - 1st class rows: %1 - Rijen 1e klas: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Een vliegtuig heeft een aantal rijen met stoelen. Iedere rij heeft vier stoelen. - - - 2nd class rows (%1) - Rijen 2e klas (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pl.xlf b/demos/plane/xlf/translated_msgs_pl.xlf deleted file mode 100644 index 4c8b044e2c8..00000000000 --- a/demos/plane/xlf/translated_msgs_pl.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rzędów: %1 - - - seats = - siedzeń = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów pierwszej i drugiej klasy. Każdy rząd pierwszej klasy składa się z czterech siedzeń. Każdy rząd drugiej klasy składa się z pięciu siedzeń. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Zbuduj wzór (poniżej), który pozwala obliczyć łączną liczbę siedzeń w samolocie w funkcji zmieniającej się liczby rzędów (powyżej). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Samolot ma dwa miejsca w kabinie pilotów (dla pierwszego i drugiego pilota) oraz rzędy siedzeń dla pasażerów. Każdy taki rząd składa się z czterech siedzeń. - - - 1st class rows (%1) - Rzędów w pierwszej klasie (%1) - - - 2nd class rows: %1 - Rzędów w drugiej klasie: %1 - - - Seats: %1 - Siedzeń: %1 - - - Plane Seat Calculator - Kalkulator miejsc w samolocie. - - - rows (%1) - rzędów (%1) - - - 1st class rows: %1 - Rzędów w pierwszej klasie: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Samolot ma kilka rzędów siedzeń pasażerów. Każdy rząd zawiera cztery miejsca. - - - 2nd class rows (%1) - Rzędów w drugiej klasie (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pms.xlf b/demos/plane/xlf/translated_msgs_pms.xlf deleted file mode 100644 index 0fef9121763..00000000000 --- a/demos/plane/xlf/translated_msgs_pms.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Linie: %1 - - - seats = - sedij = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta) e un chèich nùmer ëd file ëd sedij pr'ij passagé ëd prima e sconda classa. Minca fila ëd prima classa a conten quatr sedij. Minca fila ëd seconda classa a conten sinch sedij. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Fabriché na fórmola (sì-sota) ch'a fa 'l cont dël nùmer total ëd sedij ant l'avion cand che ël nùmer dle file a cangia (sì-dzora). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha doi sedij ant la cabin-a ëd pilotage (për ël pilòta e ël cò-pilòta), e un chèich nùmer ëd file ëd sedij pr'ij passagé. Minca fila a conten quatr sedij. - - - 1st class rows (%1) - linie ëd prima classa (%1) - - - 2nd class rows: %1 - linie ëd seconda classa: %1 - - - Seats: %1 - Sedij: %1 - - - Plane Seat Calculator - Calcolator ëd sedij d'avion - - - rows (%1) - linie (%1) - - - 1st class rows: %1 - linie ëd prima classa: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - N'avion a l'ha un nùmer ëd file ëd sedij da passëgé. Minca fila a l'ha quatr sedij. - - - 2nd class rows (%1) - linie ëd seconda classa (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_pt-br.xlf b/demos/plane/xlf/translated_msgs_pt-br.xlf deleted file mode 100644 index 7bdd9ccff99..00000000000 --- a/demos/plane/xlf/translated_msgs_pt-br.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Filas: %1 - - - seats = - assentos = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos na primeira e na segunda classe. Cada fila da primeira classe contém quatro assentos. Cada fila da segunda classe contém cinco assentos. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Elabore uma fórmula (abaixo) que calcule o número total de assentos no avião a medida que as filas são alteradas (acima). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Um avião tem dois assentos na cabine de comando (para o piloto e o copiloto) e um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 1st class rows (%1) - filas na primeira classe (%1) - - - 2nd class rows: %1 - filas na segunda classe: %1 - - - Seats: %1 - Assentos: %1 - - - Plane Seat Calculator - Calculadora de Assentos em Avião - - - rows (%1) - filas (%1) - - - 1st class rows: %1 - filas na primeira classe: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Um avião tem um número de filas de assentos para os passageiros. Cada fila contém quatro assentos. - - - 2nd class rows (%1) - filas na segunda classe (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ro.xlf b/demos/plane/xlf/translated_msgs_ro.xlf deleted file mode 100644 index 614a3bda28b..00000000000 --- a/demos/plane/xlf/translated_msgs_ro.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rânduri: %1 - - - seats = - scaune = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune de clasa I și clasa a II-a pentru pasageri. Fiecare rând de clasa I conține patru scaune. Fiecare rând de clasa a II-a conține cinci scaune. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Construiește o formulă (mai jos) care calculează numărul total de locuri dintr-un avion în timp ce rândurile se schimbă (mai sus). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Un avion are două scaune în carlingă (pentru pilot și copilot) și un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 1st class rows (%1) - rânduri de clasa I (%1) - - - 2nd class rows: %1 - rânduri de clasa a II-a: %1 - - - Seats: %1 - Scaune: %1 - - - Plane Seat Calculator - Calculator pentru locurile dintr-un avion - - - rows (%1) - rânduri (%1) - - - 1st class rows: %1 - rânduri de clasa I: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Un avion are un număr de rânduri cu scaune pentru pasageri. Fiecare rând conține patru scaune. - - - 2nd class rows (%1) - rânduri de clasa a II-a (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_ru.xlf b/demos/plane/xlf/translated_msgs_ru.xlf deleted file mode 100644 index d25b25458d7..00000000000 --- a/demos/plane/xlf/translated_msgs_ru.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядов: %1 - - - seats = - места = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - В самолёте 2 места для пилота и его помощника, несколько рядов с пассажирскими местами первого класса, а также несколько рядов с пассажирскими местами второго класса. В каждом ряду первого класса 4 места. В каждом ряду второго класса 5 мест. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Постройте формулу в области ниже, которая поможет рассчитать общее количество мест в самолёте (как на рисунке выше). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - В самолёте 2 места для пилота и его помощника, а также несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 1st class rows (%1) - ряды 1-го класса (%1) - - - 2nd class rows: %1 - Рядов 2-го класса: %1 - - - Seats: %1 - Мест: %1 - - - Plane Seat Calculator - Калькулятор посадочных мест в самолёте - - - rows (%1) - ряды (%1) - - - 1st class rows: %1 - Рядов 1-го класса: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - В самолёте несколько рядов с пассажирскими местами. В каждом ряду 4 места. - - - 2nd class rows (%1) - ряды 2-го класса (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_sc.xlf b/demos/plane/xlf/translated_msgs_sc.xlf deleted file mode 100644 index 63281235617..00000000000 --- a/demos/plane/xlf/translated_msgs_sc.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Fileras: %1 - - - seats = - cadironis = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris de prima classi e de segunda classi. Dònnia filera de prima classi tenit cuatru cadironis. Dònnia filera de segunda classi tenit cincu cadironis. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Cuncorda una formula (innoi asuta) chi cumpudit su numeru totali de postus a setzi in s'aparechiu, a segunda de comenti mudant is fileras de postus (innoi in susu) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit duus cadironis in sa cabina de cumandu (po su pilota e su co-pilota), e unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 1st class rows (%1) - fileras de primu classi (%1) - - - 2nd class rows: %1 - fileras de segunda classi: %1 - - - Seats: %1 - Cadironis: %1 - - - Plane Seat Calculator - Fai su contu de is cadironis de unu aparèchiu - - - rows (%1) - fileras (%1) - - - 1st class rows: %1 - fileras de primu classi: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Unu aparèchiu tenit unas cantu fileras de cadironis po passigeris. Dònnia filera tenit cuatru cadironis. - - - 2nd class rows (%1) - fileras de segunda classi (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_sv.xlf b/demos/plane/xlf/translated_msgs_sv.xlf deleted file mode 100644 index f3d836fba33..00000000000 --- a/demos/plane/xlf/translated_msgs_sv.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Rader: %1 - - - seats = - säten = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten i första och andra klass. Varje rad i första klass innehåller fyra säten. Varje rad i andra klass innehåller fem säten. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Bygg en formel (nedan) som beräknar det totala antalet säten på flygplanet när raderna ändras (ovan). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har två säten i cockpiten (ett för piloten och ett för andrepiloten) och ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 1st class rows (%1) - Rader i första klass (%1) - - - 2nd class rows: %1 - Rader i andra klass: %1 - - - Seats: %1 - Säten: %1 - - - Plane Seat Calculator - Plansäteskalkylator - - - rows (%1) - rader (%1) - - - 1st class rows: %1 - Rader i första klass: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Ett flygplan har ett antal rader med passagerarsäten. Varje rad innehåller fyra säten. - - - 2nd class rows (%1) - Rader i andra klass (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_th.xlf b/demos/plane/xlf/translated_msgs_th.xlf deleted file mode 100644 index 0967d4d199f..00000000000 --- a/demos/plane/xlf/translated_msgs_th.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - %1 แถว - - - seats = - จำนวนที่นั่ง = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และจะมีแถวที่นั่งสำหรับผู้โดยสาร "ชั้นเฟิร์สคลาส" และ "ชั้นธุรกิจ" อยู่จำนวนหนึ่ง โดยในชั้นเฟิร์สคลาสจะมีแถวละ 4 ที่นั่ง ส่วนในชั้นธุรกิจจะมีแถวละ 5 ที่นั่ง - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - สร้างสูตรคำนวณ (ด้านล่าง) เพื่อคำนวณหาจำนวนที่นั่งทั้งหมดบนเครื่องบิน ตามจำนวนแถวที่เปลี่ยนไป (ด้านบน) - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินจะมีที่นั่งนักบินอยู่ 2 ที่ (สำหรับนักบิน และผู้ช่วยนักบิน) และมีแถวที่นั่งผู้โดยสารอยู่จำนวนหนึ่ง ในแต่ละแถวจะมี 4 ที่นั่ง - - - 1st class rows (%1) - จำนวนแถวชั้นเฟิร์สคลาส (%1) - - - 2nd class rows: %1 - ชั้นธุรกิจ %1 แถว - - - Seats: %1 - คำนวณได้ทั้งหมด %1 ที่นั่ง - - - Plane Seat Calculator - ระบบคำนวณที่นั่งบนเครื่องบิน - - - rows (%1) - จำนวนแถว (%1) - - - 1st class rows: %1 - ชั้นเฟิร์สคลาส %1 แถว - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - ภายในเครื่องบินประกอบไปด้วยแถวของที่นั่งผู้โดยสาร ในแต่ละแถวจะมี 4 ที่นั่ง - - - 2nd class rows (%1) - จำนวนแถวชั้นธุรกิจ (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_tr.xlf b/demos/plane/xlf/translated_msgs_tr.xlf deleted file mode 100644 index 678541a32d9..00000000000 --- a/demos/plane/xlf/translated_msgs_tr.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Sıralar: %1 - - - seats = - koltuklar = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda birinci sınıf ve ikinci sınıf yolcu koltuğu sırası vardır. Her birinci sınıf sıra dört koltuk içerir. Her ikinci sınıf sıra beş koltuk içerir. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Sıralar(üstte) değiştikçe uçaktaki toplam koltuk sayısını hesaplayan bir formül(altta) oluşturun. - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Bir uçağın uçuş güvertesinde iki koltuğu (pilot ve yardımcı pilot için), ve belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 1st class rows (%1) - Birinci sınıf sıralar (%1) - - - 2nd class rows: %1 - İkinci sınıf sıralar: %1 - - - Seats: %1 - Koltuklar: %1 - - - Plane Seat Calculator - Uçak Koltuğu Hesaplayıcı - - - rows (%1) - sıralar (%1) - - - 1st class rows: %1 - Birinci sınıf sıralar: (%1) - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Bir uçağın belirli sayıda koltuk sırası vardır. Her sıra dört koltuk içerir. - - - 2nd class rows (%1) - İkinci sınıf sıralar (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_uk.xlf b/demos/plane/xlf/translated_msgs_uk.xlf deleted file mode 100644 index d5e7682a58b..00000000000 --- a/demos/plane/xlf/translated_msgs_uk.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Рядки: %1 - - - seats = - місць= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів 1-го класу 2-го класу пасажирських місць. Кожний ряд 1-го класу містить чотири місця. Кожен ряд 2-го класу містить п'ять місць. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Побудувати формулу (нижче), яка обчислює кількість місць на літаку при зміні рядків (див. вище). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Літак має два місця в кабіні екіпажу (пілот і другий пілот), і кілька рядів пасажирських сидінь. Кожен рядок містить чотири місця. - - - 1st class rows (%1) - рядів 1-го класу (%1) - - - 2nd class rows: %1 - рядів 2-го класу: %1 - - - Seats: %1 - Місць: %1 - - - Plane Seat Calculator - Калькулятор місць у літаку - - - rows (%1) - рядки (%1) - - - 1st class rows: %1 - рядів 1-го класу: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Літак має кілька рядів пасажирських сидінь. Кожен ряд містить чотири місця. - - - 2nd class rows (%1) - рядів 2-го класу (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_vi.xlf b/demos/plane/xlf/translated_msgs_vi.xlf deleted file mode 100644 index 1f4ef6fcf07..00000000000 --- a/demos/plane/xlf/translated_msgs_vi.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - Số hàng ghế: %1 - - - seats = - Tính số chỗ ngồi = - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - Một chiếc máy bay này có hai chỗ ngồi ở sàn (cho phi công trưởng và phi công phó), và một số hàng ghế hạng 1 và hạng 2. Mỗi hàng hạng 1 có bốn chỗ ngồi. Mỗi hàng hạng 2 có năm chỗ ngồi. - - - ? - ? - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - Dưới đây hãy tạo công thức tính số chỗ ngồi trên máy bay để nó thay đổi tùy theo số lượng hàng ghế (hình trên). - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - Một máy bay có hai ghế trong buồng lái (dành cho phi công trưởng và phi công phụ), và một loạt hàng ghế cho hành khách. Mỗi hàng có bốn ghế (bốn chỗ ngồi). - - - 1st class rows (%1) - số hàng hạng nhất (%1) - - - 2nd class rows: %1 - Hàng hạng hai: %1 - - - Seats: %1 - Số chỗ ngồi: %1 - - - Plane Seat Calculator - Máy bay ghế máy tính - - - rows (%1) - đếm số hàng ghế (%1) - - - 1st class rows: %1 - Hàng hạng nhất: %1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - Máy bay có một số hàng ghế hành khách. Mỗi hàng có bốn chỗ ngồi. - - - 2nd class rows (%1) - số hàng hạng hai (%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_zh-hans.xlf b/demos/plane/xlf/translated_msgs_zh-hans.xlf deleted file mode 100644 index 2cbb7e858f5..00000000000 --- a/demos/plane/xlf/translated_msgs_zh-hans.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 行:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的头等及经济乘客座位。头等每行共四座,经济每行共五座。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 于下方写出一条公式以计算飞机上的座位总数。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飞机除了有两个座位供正副驾驶员,还有一定量行数的乘客座位。每行共四座。 - - - 1st class rows (%1) - 头等行(%1) - - - 2nd class rows: %1 - 经济等行:%1 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飞机座位计算器 - - - rows (%1) - 行 (%1) - - - 1st class rows: %1 - 头等行:%1 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飞机有一定量行数的乘客座位,每行共四座。 - - - 2nd class rows (%1) - 经济等行(%1) - - - - diff --git a/demos/plane/xlf/translated_msgs_zh-hant.xlf b/demos/plane/xlf/translated_msgs_zh-hant.xlf deleted file mode 100644 index 2dadf6d4e7c..00000000000 --- a/demos/plane/xlf/translated_msgs_zh-hant.xlf +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - Rows: %1 - 排:%1 - - - seats = - 座位= - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of 1st class and 2nd class passenger seats. Each 1st class row contains four seats. Each 2nd class row contains five seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的頭等及經濟乘客座位。頭等艙每排都包含四個席位,經濟艙每排都包含五個席位。。 - - - ? - - - - Build a formula (below) that calculates the total number of seats on the airplane as the rows are changed (above). - 於下方寫出一條公式以計算飛機上的座位總數。 - - - An airplane has two seats in the flight deck (for the pilot and co-pilot), and a number of rows of passenger seats. Each row contains four seats. - 一架飛機除了有兩個座位供正副機師,還有一定量行數的乘客座位。每排都包含四個席位。 - - - 1st class rows (%1) - 頭等艙(%1) - - - 2nd class rows: %1 - 經濟艙:%1 排 - - - Seats: %1 - 座位:%1 - - - Plane Seat Calculator - 飛機座位計算器 - - - rows (%1) - 排(%1) - - - 1st class rows: %1 - 頭等艙:%1 排 - - - An airplane has a number of rows of passenger seats. Each row contains four seats. - 一架飛機有一定量行數的乘客座位,每排都包含四個席位。 - - - 2nd class rows (%1) - 經濟艙(%1) - - - - diff --git a/demos/resizable/icon.png b/demos/resizable/icon.png deleted file mode 100644 index c4eaf81aef9..00000000000 Binary files a/demos/resizable/icon.png and /dev/null differ diff --git a/demos/resizable/index.html b/demos/resizable/index.html deleted file mode 100644 index e2ee1e06d76..00000000000 --- a/demos/resizable/index.html +++ /dev/null @@ -1,52 +0,0 @@ - - - - - Blockly Demo: Resizable Blockly (Part 1) - - - - - - - - - - -
    -

    Blockly > - Demos > Resizable Blockly (Part 1)

    - -

    The first step in creating a resizable Blockly workspace is to use - CSS or tables to create an area for it. - Next, inject Blockly over that area.

    - -

    → More info on injecting resizable Blockly

    -
    - Blockly will be positioned here. -
    - - diff --git a/demos/resizable/overlay.html b/demos/resizable/overlay.html deleted file mode 100644 index 826a667bd4d..00000000000 --- a/demos/resizable/overlay.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - Blockly Demo: Resizable Blockly (Part 2) - - - - - - - - - - - - - -
    -

    Blockly > - Demos > Resizable Blockly (Part 2)

    - -

    - Once an area is defined, Blockly can be - injected and positioned over the area. - A resize handler keeps it in position as the page changes. -

    - -

    → More info on injecting resizable Blockly

    -
    -
    - -
    - - - - - - diff --git a/demos/rtl/icon.png b/demos/rtl/icon.png deleted file mode 100644 index 284c1efa894..00000000000 Binary files a/demos/rtl/icon.png and /dev/null differ diff --git a/demos/rtl/index.html b/demos/rtl/index.html deleted file mode 100644 index ff2b6306bed..00000000000 --- a/demos/rtl/index.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - Blockly Demo: RTL - - - - - - - -

    Blockly > - Demos > Right-to-Left

    - -
    - - - - - - diff --git a/demos/toolbox/icon.png b/demos/toolbox/icon.png deleted file mode 100644 index fe54fe49219..00000000000 Binary files a/demos/toolbox/icon.png and /dev/null differ diff --git a/demos/toolbox/index.html b/demos/toolbox/index.html deleted file mode 100644 index 007b8eeb59f..00000000000 --- a/demos/toolbox/index.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - Blockly Demo: Toolbox - - - - - - -

    Blockly > - Demos > Toolbox

    - -

    This is a demo of a complex category structure for the toolbox.

    - -

    → More info on the Toolbox

    - -
    - - - - - - - diff --git a/generators/dart.js b/generators/dart.js index d9e873a6ed0..dacbcd2a543 100644 --- a/generators/dart.js +++ b/generators/dart.js @@ -11,7 +11,6 @@ 'use strict'; goog.module('Blockly.Dart'); -goog.module.declareLegacyNamespace(); const Variables = goog.require('Blockly.Variables'); const stringUtils = goog.require('Blockly.utils.string'); @@ -301,4 +300,4 @@ Dart.getAdjusted = function(block, atId, opt_delta, opt_negate, return at; }; -exports = Dart; +exports.dartGenerator = Dart; diff --git a/generators/dart/all.js b/generators/dart/all.js index f250f7c27d1..ffd726a26b0 100644 --- a/generators/dart/all.js +++ b/generators/dart/all.js @@ -13,6 +13,7 @@ goog.module('Blockly.Dart.all'); +const moduleExports = goog.require('Blockly.Dart'); goog.require('Blockly.Dart.colour'); goog.require('Blockly.Dart.lists'); goog.require('Blockly.Dart.logic'); @@ -23,3 +24,4 @@ goog.require('Blockly.Dart.texts'); goog.require('Blockly.Dart.variables'); goog.require('Blockly.Dart.variablesDynamic'); +exports = moduleExports; diff --git a/generators/dart/colour.js b/generators/dart/colour.js index 96aeaea51b0..324fe65c448 100644 --- a/generators/dart/colour.js +++ b/generators/dart/colour.js @@ -11,7 +11,7 @@ goog.module('Blockly.Dart.colour'); -const Dart = goog.require('Blockly.Dart'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart.addReservedWords('Math'); diff --git a/generators/dart/lists.js b/generators/dart/lists.js index 493cd7a83d4..28fc9bd8915 100644 --- a/generators/dart/lists.js +++ b/generators/dart/lists.js @@ -11,8 +11,8 @@ goog.module('Blockly.Dart.lists'); -const Dart = goog.require('Blockly.Dart'); const {NameType} = goog.require('Blockly.Names'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart.addReservedWords('Math'); diff --git a/generators/dart/logic.js b/generators/dart/logic.js index 56cdaef6ce2..4fa11798751 100644 --- a/generators/dart/logic.js +++ b/generators/dart/logic.js @@ -11,7 +11,7 @@ goog.module('Blockly.Dart.logic'); -const Dart = goog.require('Blockly.Dart'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart['controls_if'] = function(block) { diff --git a/generators/dart/loops.js b/generators/dart/loops.js index 0360737b8f3..ce66c2d3320 100644 --- a/generators/dart/loops.js +++ b/generators/dart/loops.js @@ -11,7 +11,7 @@ goog.module('Blockly.Dart.loops'); -const Dart = goog.require('Blockly.Dart'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); const stringUtils = goog.require('Blockly.utils.string'); const {NameType} = goog.require('Blockly.Names'); diff --git a/generators/dart/math.js b/generators/dart/math.js index 24c42c2ae4b..81580c213c6 100644 --- a/generators/dart/math.js +++ b/generators/dart/math.js @@ -11,8 +11,8 @@ goog.module('Blockly.Dart.math'); -const Dart = goog.require('Blockly.Dart'); const {NameType} = goog.require('Blockly.Names'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart.addReservedWords('Math'); diff --git a/generators/dart/procedures.js b/generators/dart/procedures.js index 1427c0c4e5a..bf877277ee0 100644 --- a/generators/dart/procedures.js +++ b/generators/dart/procedures.js @@ -11,8 +11,8 @@ goog.module('Blockly.Dart.procedures'); -const Dart = goog.require('Blockly.Dart'); const {NameType} = goog.require('Blockly.Names'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart['procedures_defreturn'] = function(block) { diff --git a/generators/dart/text.js b/generators/dart/text.js index 5dfb372b058..b611f0d8bba 100644 --- a/generators/dart/text.js +++ b/generators/dart/text.js @@ -11,8 +11,8 @@ goog.module('Blockly.Dart.texts'); -const Dart = goog.require('Blockly.Dart'); const {NameType} = goog.require('Blockly.Names'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart.addReservedWords('Html,Math'); diff --git a/generators/dart/variables.js b/generators/dart/variables.js index 38ab39bb467..33e3147646e 100644 --- a/generators/dart/variables.js +++ b/generators/dart/variables.js @@ -11,8 +11,8 @@ goog.module('Blockly.Dart.variables'); -const Dart = goog.require('Blockly.Dart'); const {NameType} = goog.require('Blockly.Names'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); Dart['variables_get'] = function(block) { diff --git a/generators/dart/variables_dynamic.js b/generators/dart/variables_dynamic.js index 1eac6ed6719..50bfdb62011 100644 --- a/generators/dart/variables_dynamic.js +++ b/generators/dart/variables_dynamic.js @@ -11,7 +11,7 @@ goog.module('Blockly.Dart.variablesDynamic'); -const Dart = goog.require('Blockly.Dart'); +const {dartGenerator: Dart} = goog.require('Blockly.Dart'); /** @suppress {extraRequire} */ goog.require('Blockly.Dart.variables'); diff --git a/generators/javascript.js b/generators/javascript.js index 4b5bf9dbf52..75220f760a4 100644 --- a/generators/javascript.js +++ b/generators/javascript.js @@ -11,14 +11,12 @@ 'use strict'; goog.module('Blockly.JavaScript'); -goog.module.declareLegacyNamespace(); const Variables = goog.require('Blockly.Variables'); const objectUtils = goog.require('Blockly.utils.object'); const stringUtils = goog.require('Blockly.utils.string'); const {Block} = goog.requireType('Blockly.Block'); const {Generator} = goog.require('Blockly.Generator'); -const {globalThis} = goog.require('Blockly.utils.global'); const {inputTypes} = goog.require('Blockly.inputTypes'); const {Names, NameType} = goog.require('Blockly.Names'); const {Workspace} = goog.requireType('Blockly.Workspace'); @@ -321,4 +319,4 @@ JavaScript.getAdjusted = function( return at; }; -exports = JavaScript; +exports.javascriptGenerator = JavaScript; diff --git a/generators/javascript/all.js b/generators/javascript/all.js index 05eca00406d..1ffbd3de8aa 100644 --- a/generators/javascript/all.js +++ b/generators/javascript/all.js @@ -13,6 +13,7 @@ goog.module('Blockly.JavaScript.all'); +const moduleExports = goog.require('Blockly.JavaScript'); goog.require('Blockly.JavaScript.colour'); goog.require('Blockly.JavaScript.lists'); goog.require('Blockly.JavaScript.logic'); @@ -23,3 +24,4 @@ goog.require('Blockly.JavaScript.texts'); goog.require('Blockly.JavaScript.variables'); goog.require('Blockly.JavaScript.variablesDynamic'); +exports = moduleExports; diff --git a/generators/javascript/colour.js b/generators/javascript/colour.js index a2cc64a5a0b..944a4bb1af1 100644 --- a/generators/javascript/colour.js +++ b/generators/javascript/colour.js @@ -11,7 +11,7 @@ goog.module('Blockly.JavaScript.colour'); -const JavaScript = goog.require('Blockly.JavaScript'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['colour_picker'] = function(block) { diff --git a/generators/javascript/lists.js b/generators/javascript/lists.js index e9fbc359841..a614f2a0c05 100644 --- a/generators/javascript/lists.js +++ b/generators/javascript/lists.js @@ -12,8 +12,8 @@ goog.module('Blockly.JavaScript.lists'); -const JavaScript = goog.require('Blockly.JavaScript'); const {NameType} = goog.require('Blockly.Names'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['lists_create_empty'] = function(block) { diff --git a/generators/javascript/logic.js b/generators/javascript/logic.js index 582d557de2b..0933b0d7c31 100644 --- a/generators/javascript/logic.js +++ b/generators/javascript/logic.js @@ -11,7 +11,7 @@ goog.module('Blockly.JavaScript.logic'); -const JavaScript = goog.require('Blockly.JavaScript'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['controls_if'] = function(block) { diff --git a/generators/javascript/loops.js b/generators/javascript/loops.js index 0626f37e4b1..dd710cbebc9 100644 --- a/generators/javascript/loops.js +++ b/generators/javascript/loops.js @@ -12,8 +12,8 @@ goog.module('Blockly.JavaScript.loops'); const stringUtils = goog.require('Blockly.utils.string'); -const JavaScript = goog.require('Blockly.JavaScript'); const {NameType} = goog.require('Blockly.Names'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['controls_repeat_ext'] = function(block) { diff --git a/generators/javascript/math.js b/generators/javascript/math.js index f370ba55988..ba4a1a129a5 100644 --- a/generators/javascript/math.js +++ b/generators/javascript/math.js @@ -12,8 +12,8 @@ goog.module('Blockly.JavaScript.math'); -const JavaScript = goog.require('Blockly.JavaScript'); const {NameType} = goog.require('Blockly.Names'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['math_number'] = function(block) { @@ -222,7 +222,7 @@ JavaScript['math_on_list'] = function(block) { case 'SUM': list = JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_MEMBER) || '[]'; - code = list + '.reduce(function(x, y) {return x + y;})'; + code = list + '.reduce(function(x, y) {return x + y;}, 0)'; break; case 'MIN': list = JavaScript.valueToCode(block, 'LIST', @@ -238,7 +238,7 @@ JavaScript['math_on_list'] = function(block) { // mathMean([null,null,1,3]) === 2.0. const functionName = JavaScript.provideFunction_('mathMean', ` function ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(myList) { - return myList.reduce(function(x, y) {return x + y;}) / myList.length; + return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length; } `); list = JavaScript.valueToCode(block, 'LIST', @@ -250,7 +250,7 @@ function ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(myList) { // mathMedian([null,null,1,3]) === 2.0. const functionName = JavaScript.provideFunction_('mathMedian', ` function ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(myList) { - var localList = myList.filter(function (x) {return typeof x === \'number\';}); + var localList = myList.filter(function (x) {return typeof x === 'number';}); if (!localList.length) return null; localList.sort(function(a, b) {return b - a;}); if (localList.length % 2 === 0) { diff --git a/generators/javascript/procedures.js b/generators/javascript/procedures.js index 214e6e196a1..e47e490f491 100644 --- a/generators/javascript/procedures.js +++ b/generators/javascript/procedures.js @@ -11,8 +11,8 @@ goog.module('Blockly.JavaScript.procedures'); -const JavaScript = goog.require('Blockly.JavaScript'); const {NameType} = goog.require('Blockly.Names'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); JavaScript['procedures_defreturn'] = function(block) { diff --git a/generators/javascript/text.js b/generators/javascript/text.js index 9c60bfa6c16..270c51368e6 100644 --- a/generators/javascript/text.js +++ b/generators/javascript/text.js @@ -11,8 +11,8 @@ goog.module('Blockly.JavaScript.texts'); -const JavaScript = goog.require('Blockly.JavaScript'); const {NameType} = goog.require('Blockly.Names'); +const {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript'); /** @@ -356,7 +356,7 @@ JavaScript['text_replace'] = function(block) { function ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(haystack, needle, replacement) { needle = needle.replace(/([-()\\[\\]{}+?*.$\\^|,:#c?h=g=this.ORDER_SUBTRACTION:d&&(h=g=this.ORDER_UNARY_NEGATION);a=this.valueToCode(a,b,g)||f;(0,$.module$exports$Blockly$utils$string.isNumber)(a)?(a=Number(a)+c,d&&(a=-a)):(0c&&(a=a+" - "+-c),d&&(a=c?"-("+a+")":"-"+a),h=Math.floor(h),e=Math.floor(e), -h&&e>=h&&(a="("+a+")"));return a};$.Blockly.JavaScript=module$contents$Blockly$JavaScript_JavaScript;var module$exports$Blockly$JavaScript$variables={};$.Blockly.JavaScript.variables_get=function(a){return[$.Blockly.JavaScript.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),$.Blockly.JavaScript.ORDER_ATOMIC]}; -$.Blockly.JavaScript.variables_set=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"VALUE",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"0";return $.Blockly.JavaScript.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE)+" = "+b+";\n"};var module$exports$Blockly$JavaScript$variablesDynamic={};$.Blockly.JavaScript.variables_get_dynamic=$.Blockly.JavaScript.variables_get;$.Blockly.JavaScript.variables_set_dynamic=$.Blockly.JavaScript.variables_set;var module$exports$Blockly$JavaScript$texts={},module$contents$Blockly$JavaScript$texts_strRegExp=/^\s*'([^']|\\')*'\s*$/,module$contents$Blockly$JavaScript$texts_forceString=function(a){return module$contents$Blockly$JavaScript$texts_strRegExp.test(a)?[a,$.Blockly.JavaScript.ORDER_ATOMIC]:["String("+a+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]},module$contents$Blockly$JavaScript$texts_getSubstringIndex=function(a,b,c){return"FIRST"===b?"0":"FROM_END"===b?a+".length - 1 - "+c:"LAST"===b?a+".length - 1": -c};$.Blockly.JavaScript.text=function(a){return[$.Blockly.JavaScript.quote_(a.getFieldValue("TEXT")),$.Blockly.JavaScript.ORDER_ATOMIC]};$.Blockly.JavaScript.text_multiline=function(a){a=$.Blockly.JavaScript.multiline_quote_(a.getFieldValue("TEXT"));var b=-1!==a.indexOf("+")?$.Blockly.JavaScript.ORDER_ADDITION:$.Blockly.JavaScript.ORDER_ATOMIC;return[a,b]}; -$.Blockly.JavaScript.text_join=function(a){switch(a.itemCount_){case 0:return["''",$.Blockly.JavaScript.ORDER_ATOMIC];case 1:return a=$.Blockly.JavaScript.valueToCode(a,"ADD0",$.Blockly.JavaScript.ORDER_NONE)||"''",module$contents$Blockly$JavaScript$texts_forceString(a);case 2:var b=$.Blockly.JavaScript.valueToCode(a,"ADD0",$.Blockly.JavaScript.ORDER_NONE)||"''";a=$.Blockly.JavaScript.valueToCode(a,"ADD1",$.Blockly.JavaScript.ORDER_NONE)||"''";return[module$contents$Blockly$JavaScript$texts_forceString(b)[0]+ -" + "+module$contents$Blockly$JavaScript$texts_forceString(a)[0],$.Blockly.JavaScript.ORDER_ADDITION];default:b=Array(a.itemCount_);for(var c=0;c 0",$.Blockly.JavaScript.ORDER_RELATIONAL,$.Blockly.JavaScript.ORDER_RELATIONAL],NEGATIVE:[" < 0",$.Blockly.JavaScript.ORDER_RELATIONAL,$.Blockly.JavaScript.ORDER_RELATIONAL], -DIVISIBLE_BY:[null,$.Blockly.JavaScript.ORDER_MODULUS,$.Blockly.JavaScript.ORDER_EQUALITY],PRIME:[null,$.Blockly.JavaScript.ORDER_NONE,$.Blockly.JavaScript.ORDER_FUNCTION_CALL]},c=a.getFieldValue("PROPERTY");b=$.$jscomp.makeIterator(b[c]);var d=b.next().value,e=b.next().value;b=b.next().value;e=$.Blockly.JavaScript.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";"PRIME"===c?a=$.Blockly.JavaScript.provideFunction_("mathIsPrime","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if (n == 2 || n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (isNaN(n) || n <= 1 || n % 1 !== 0 || n % 2 === 0 || n % 3 === 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {\n if (n % (x - 1) === 0 || n % (x + 1) === 0) {\n return false;\n }\n }\n return true;\n}\n")+ -"("+e+")":"DIVISIBLE_BY"===c?(a=$.Blockly.JavaScript.valueToCode(a,"DIVISOR",$.Blockly.JavaScript.ORDER_MODULUS)||"0",a=e+" % "+a+" === 0"):a=e+d;return[a,b]};$.Blockly.JavaScript.math_change=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"DELTA",$.Blockly.JavaScript.ORDER_ADDITION)||"0";a=$.Blockly.JavaScript.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE);return a+" = (typeof "+a+" === 'number' ? "+a+" : 0) + "+b+";\n"}; -$.Blockly.JavaScript.math_round=$.Blockly.JavaScript.math_single;$.Blockly.JavaScript.math_trig=$.Blockly.JavaScript.math_single; -$.Blockly.JavaScript.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_MEMBER)||"[]";a+=".reduce(function(x, y) {return x + y;})";break;case "MIN":a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a="Math.min.apply(null, "+a+")";break;case "MAX":a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a="Math.max.apply(null, "+a+")";break;case "AVERAGE":b= -$.Blockly.JavaScript.provideFunction_("mathMean","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {\n return myList.reduce(function(x, y) {return x + y;}) / myList.length;\n}\n");a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MEDIAN":b=$.Blockly.JavaScript.provideFunction_("mathMedian","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(myList) {\n var localList = myList.filter(function (x) {return typeof x === 'number';});\n if (!localList.length) return null;\n localList.sort(function(a, b) {return b - a;});\n if (localList.length % 2 === 0) {\n return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;\n } else {\n return localList[(localList.length - 1) / 2];\n }\n}\n"); -a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=$.Blockly.JavaScript.provideFunction_("mathModes","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(values) {\n var modes = [];\n var counts = [];\n var maxCount = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var found = false;\n var thisCount;\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][0] === value) {\n thisCount = ++counts[j][1];\n found = true;\n break;\n }\n }\n if (!found) {\n counts.push([value, 1]);\n thisCount = 1;\n }\n maxCount = Math.max(thisCount, maxCount);\n }\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][1] === maxCount) {\n modes.push(counts[j][0]);\n }\n }\n return modes;\n}\n"); -a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=$.Blockly.JavaScript.provideFunction_("mathStandardDeviation","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(numbers) {\n var n = numbers.length;\n if (!n) return null;\n var mean = numbers.reduce(function(x, y) {return x + y;}) / n;\n var variance = 0;\n for (var j = 0; j < n; j++) {\n variance += Math.pow(numbers[j] - mean, 2);\n }\n variance = variance / n;\n return Math.sqrt(variance);\n}\n"); -a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=$.Blockly.JavaScript.provideFunction_("mathRandomList","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(list) {\n var x = Math.floor(Math.random() * list.length);\n return list[x];\n}\n");a=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw Error("Unknown operator: "+b);}return[a,$.Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -$.Blockly.JavaScript.math_modulo=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"DIVIDEND",$.Blockly.JavaScript.ORDER_MODULUS)||"0";a=$.Blockly.JavaScript.valueToCode(a,"DIVISOR",$.Blockly.JavaScript.ORDER_MODULUS)||"0";return[b+" % "+a,$.Blockly.JavaScript.ORDER_MODULUS]}; -$.Blockly.JavaScript.math_constrain=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"VALUE",$.Blockly.JavaScript.ORDER_NONE)||"0",c=$.Blockly.JavaScript.valueToCode(a,"LOW",$.Blockly.JavaScript.ORDER_NONE)||"0";a=$.Blockly.JavaScript.valueToCode(a,"HIGH",$.Blockly.JavaScript.ORDER_NONE)||"Infinity";return["Math.min(Math.max("+b+", "+c+"), "+a+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -$.Blockly.JavaScript.math_random_int=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"FROM",$.Blockly.JavaScript.ORDER_NONE)||"0";a=$.Blockly.JavaScript.valueToCode(a,"TO",$.Blockly.JavaScript.ORDER_NONE)||"0";return[$.Blockly.JavaScript.provideFunction_("mathRandomInt","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(a, b) {\n if (a > b) {\n // Swap a and b to ensure a is smaller.\n var c = a;\n a = b;\n b = c;\n }\n return Math.floor(Math.random() * (b - a + 1) + a);\n}\n")+ -"("+b+", "+a+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]};$.Blockly.JavaScript.math_random_float=function(a){return["Math.random()",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]};$.Blockly.JavaScript.math_atan2=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"X",$.Blockly.JavaScript.ORDER_NONE)||"0";return["Math.atan2("+($.Blockly.JavaScript.valueToCode(a,"Y",$.Blockly.JavaScript.ORDER_NONE)||"0")+", "+b+") / Math.PI * 180",$.Blockly.JavaScript.ORDER_DIVISION]};var module$exports$Blockly$JavaScript$loops={}; -$.Blockly.JavaScript.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):$.Blockly.JavaScript.valueToCode(a,"TIMES",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"0";var c=$.Blockly.JavaScript.statementToCode(a,"DO");c=$.Blockly.JavaScript.addLoopTrap(c,a);a="";var d=$.Blockly.JavaScript.nameDB_.getDistinctName("count",$.module$exports$Blockly$Names.NameType.VARIABLE),e=b;b.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(b)||(e=$.Blockly.JavaScript.nameDB_.getDistinctName("repeat_end", -$.module$exports$Blockly$Names.NameType.VARIABLE),a+="var "+e+" = "+b+";\n");return a+("for (var "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};$.Blockly.JavaScript.controls_repeat=$.Blockly.JavaScript.controls_repeat_ext; -$.Blockly.JavaScript.controls_whileUntil=function(a){var b="UNTIL"===a.getFieldValue("MODE"),c=$.Blockly.JavaScript.valueToCode(a,"BOOL",b?$.Blockly.JavaScript.ORDER_LOGICAL_NOT:$.Blockly.JavaScript.ORDER_NONE)||"false",d=$.Blockly.JavaScript.statementToCode(a,"DO");d=$.Blockly.JavaScript.addLoopTrap(d,a);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -$.Blockly.JavaScript.controls_for=function(a){var b=$.Blockly.JavaScript.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.JavaScript.valueToCode(a,"FROM",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",d=$.Blockly.JavaScript.valueToCode(a,"TO",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"0",e=$.Blockly.JavaScript.valueToCode(a,"BY",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"1",f=$.Blockly.JavaScript.statementToCode(a,"DO");f=$.Blockly.JavaScript.addLoopTrap(f, -a);if((0,$.module$exports$Blockly$utils$string.isNumber)(c)&&(0,$.module$exports$Blockly$utils$string.isNumber)(d)&&(0,$.module$exports$Blockly$utils$string.isNumber)(e)){var g=Number(c)<=Number(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(e));a=(1===b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(c)||(g=$.Blockly.JavaScript.nameDB_.getDistinctName(b+"_start",$.module$exports$Blockly$Names.NameType.VARIABLE), -a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(d)||(c=$.Blockly.JavaScript.nameDB_.getDistinctName(b+"_end",$.module$exports$Blockly$Names.NameType.VARIABLE),a+="var "+c+" = "+d+";\n"),d=$.Blockly.JavaScript.nameDB_.getDistinctName(b+"_inc",$.module$exports$Blockly$Names.NameType.VARIABLE),a+="var "+d+" = ",a=(0,$.module$exports$Blockly$utils$string.isNumber)(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a=a+("if ("+g+" > "+c+") {\n")+($.Blockly.JavaScript.INDENT+ -d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n";return a}; -$.Blockly.JavaScript.controls_forEach=function(a){var b=$.Blockly.JavaScript.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_ASSIGNMENT)||"[]",d=$.Blockly.JavaScript.statementToCode(a,"DO");d=$.Blockly.JavaScript.addLoopTrap(d,a);a="";var e=c;c.match(/^\w+$/)||(e=$.Blockly.JavaScript.nameDB_.getDistinctName(b+"_list",$.module$exports$Blockly$Names.NameType.VARIABLE),a+="var "+e+" = "+c+ -";\n");c=$.Blockly.JavaScript.nameDB_.getDistinctName(b+"_index",$.module$exports$Blockly$Names.NameType.VARIABLE);d=$.Blockly.JavaScript.INDENT+b+" = "+e+"["+c+"];\n"+d;return a+("for (var "+c+" in "+e+") {\n"+d+"}\n")}; -$.Blockly.JavaScript.controls_flow_statements=function(a){var b="";$.Blockly.JavaScript.STATEMENT_PREFIX&&(b+=$.Blockly.JavaScript.injectId($.Blockly.JavaScript.STATEMENT_PREFIX,a));$.Blockly.JavaScript.STATEMENT_SUFFIX&&(b+=$.Blockly.JavaScript.injectId($.Blockly.JavaScript.STATEMENT_SUFFIX,a));if($.Blockly.JavaScript.STATEMENT_PREFIX){var c=a.getSurroundLoop();c&&!c.suppressPrefixSuffix&&(b+=$.Blockly.JavaScript.injectId($.Blockly.JavaScript.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+ -"break;\n";case "CONTINUE":return b+"continue;\n"}throw Error("Unknown flow statement.");};var module$exports$Blockly$JavaScript$logic={}; -$.Blockly.JavaScript.controls_if=function(a){var b=0,c="";$.Blockly.JavaScript.STATEMENT_PREFIX&&(c+=$.Blockly.JavaScript.injectId($.Blockly.JavaScript.STATEMENT_PREFIX,a));do{var d=$.Blockly.JavaScript.valueToCode(a,"IF"+b,$.Blockly.JavaScript.ORDER_NONE)||"false",e=$.Blockly.JavaScript.statementToCode(a,"DO"+b);$.Blockly.JavaScript.STATEMENT_SUFFIX&&(e=$.Blockly.JavaScript.prefixLines($.Blockly.JavaScript.injectId($.Blockly.JavaScript.STATEMENT_SUFFIX,a),$.Blockly.JavaScript.INDENT)+e);c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="===b||"!="===b?$.Blockly.JavaScript.ORDER_EQUALITY:$.Blockly.JavaScript.ORDER_RELATIONAL,d=$.Blockly.JavaScript.valueToCode(a,"A",c)||"0";a=$.Blockly.JavaScript.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -$.Blockly.JavaScript.logic_operation=function(a){var b="AND"===a.getFieldValue("OP")?"&&":"||",c="&&"===b?$.Blockly.JavaScript.ORDER_LOGICAL_AND:$.Blockly.JavaScript.ORDER_LOGICAL_OR,d=$.Blockly.JavaScript.valueToCode(a,"A",c);a=$.Blockly.JavaScript.valueToCode(a,"B",c);if(d||a){var e="&&"===b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; -$.Blockly.JavaScript.logic_negate=function(a){var b=$.Blockly.JavaScript.ORDER_LOGICAL_NOT;return["!"+($.Blockly.JavaScript.valueToCode(a,"BOOL",b)||"true"),b]};$.Blockly.JavaScript.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",$.Blockly.JavaScript.ORDER_ATOMIC]};$.Blockly.JavaScript.logic_null=function(a){return["null",$.Blockly.JavaScript.ORDER_ATOMIC]}; -$.Blockly.JavaScript.logic_ternary=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"IF",$.Blockly.JavaScript.ORDER_CONDITIONAL)||"false",c=$.Blockly.JavaScript.valueToCode(a,"THEN",$.Blockly.JavaScript.ORDER_CONDITIONAL)||"null";a=$.Blockly.JavaScript.valueToCode(a,"ELSE",$.Blockly.JavaScript.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,$.Blockly.JavaScript.ORDER_CONDITIONAL]};var module$exports$Blockly$JavaScript$lists={};$.Blockly.JavaScript.lists_create_empty=function(a){return["[]",$.Blockly.JavaScript.ORDER_ATOMIC]};$.Blockly.JavaScript.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c b.toString() ? 1 : -1; },\n 'IGNORE_CASE': function(a, b) {\n return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },\n };\n var compare = compareFuncs[type];\n return function(a, b) { return compare(a, b) * direction; };\n}\n "); -return[b+".slice().sort("+d+'("'+a+'", '+c+"))",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]};$.Blockly.JavaScript.lists_split=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"INPUT",$.Blockly.JavaScript.ORDER_MEMBER),c=$.Blockly.JavaScript.valueToCode(a,"DELIM",$.Blockly.JavaScript.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"===a)b||(b="''"),a="split";else if("JOIN"===a)b||(b="[]"),a="join";else throw Error("Unknown mode: "+a);return[b+"."+a+"("+c+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -$.Blockly.JavaScript.lists_reverse=function(a){return[($.Blockly.JavaScript.valueToCode(a,"LIST",$.Blockly.JavaScript.ORDER_FUNCTION_CALL)||"[]")+".slice().reverse()",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]};var module$exports$Blockly$JavaScript$colour={};$.Blockly.JavaScript.colour_picker=function(a){return[$.Blockly.JavaScript.quote_(a.getFieldValue("COLOUR")),$.Blockly.JavaScript.ORDER_ATOMIC]};$.Blockly.JavaScript.colour_random=function(a){return[$.Blockly.JavaScript.provideFunction_("colourRandom","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"() {\n var num = Math.floor(Math.random() * Math.pow(2, 24));\n return '#' + ('00000' + num.toString(16)).substr(-6);\n}\n")+"()",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -$.Blockly.JavaScript.colour_rgb=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"RED",$.Blockly.JavaScript.ORDER_NONE)||0,c=$.Blockly.JavaScript.valueToCode(a,"GREEN",$.Blockly.JavaScript.ORDER_NONE)||0;a=$.Blockly.JavaScript.valueToCode(a,"BLUE",$.Blockly.JavaScript.ORDER_NONE)||0;return[$.Blockly.JavaScript.provideFunction_("colourRgb","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(r, g, b) {\n r = Math.max(Math.min(Number(r), 100), 0) * 2.55;\n g = Math.max(Math.min(Number(g), 100), 0) * 2.55;\n b = Math.max(Math.min(Number(b), 100), 0) * 2.55;\n r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);\n g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);\n b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);\n return '#' + r + g + b;\n}\n")+ -"("+b+", "+c+", "+a+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]}; -$.Blockly.JavaScript.colour_blend=function(a){var b=$.Blockly.JavaScript.valueToCode(a,"COLOUR1",$.Blockly.JavaScript.ORDER_NONE)||"'#000000'",c=$.Blockly.JavaScript.valueToCode(a,"COLOUR2",$.Blockly.JavaScript.ORDER_NONE)||"'#000000'";a=$.Blockly.JavaScript.valueToCode(a,"RATIO",$.Blockly.JavaScript.ORDER_NONE)||.5;return[$.Blockly.JavaScript.provideFunction_("colourBlend","\nfunction "+$.Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_+"(c1, c2, ratio) {\n ratio = Math.max(Math.min(Number(ratio), 1), 0);\n var r1 = parseInt(c1.substring(1, 3), 16);\n var g1 = parseInt(c1.substring(3, 5), 16);\n var b1 = parseInt(c1.substring(5, 7), 16);\n var r2 = parseInt(c2.substring(1, 3), 16);\n var g2 = parseInt(c2.substring(3, 5), 16);\n var b2 = parseInt(c2.substring(5, 7), 16);\n var r = Math.round(r1 * (1 - ratio) + r2 * ratio);\n var g = Math.round(g1 * (1 - ratio) + g2 * ratio);\n var b = Math.round(b1 * (1 - ratio) + b2 * ratio);\n r = ('0' + (r || 0).toString(16)).slice(-2);\n g = ('0' + (g || 0).toString(16)).slice(-2);\n b = ('0' + (b || 0).toString(16)).slice(-2);\n return '#' + r + g + b;\n}\n")+ -"("+b+", "+c+", "+a+")",$.Blockly.JavaScript.ORDER_FUNCTION_CALL]};var module$exports$Blockly$JavaScript$all={}; -$.Blockly.JavaScript.__namespace__=$; -return $.Blockly.JavaScript; +var module$exports$Blockly$JavaScript={},module$contents$Blockly$JavaScript_Variables=$.module$build$src$core$variables,module$contents$Blockly$JavaScript_objectUtils=$.module$build$src$core$utils$object,module$contents$Blockly$JavaScript_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$JavaScript_Generator=$.Generator$$module$build$src$core$generator,module$contents$Blockly$JavaScript_inputTypes=$.module$build$src$core$input_types.inputTypes,module$contents$Blockly$JavaScript_Names= +$.module$build$src$core$names.Names,module$contents$Blockly$JavaScript_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$JavaScript.javascriptGenerator=new $.Generator$$module$build$src$core$generator("JavaScript"); +module$exports$Blockly$JavaScript.javascriptGenerator.addReservedWords("break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,in,instanceof,new,return,super,switch,this,throw,try,typeof,var,void,while,with,yield,enum,implements,interface,let,package,private,protected,public,static,await,null,true,false,arguments,"+Object.getOwnPropertyNames(globalThis).join(","));module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC=0; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NEW=1.1;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER=1.2;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL=2;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_INCREMENT=3;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_DECREMENT=3;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_BITWISE_NOT=4.1; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_UNARY_PLUS=4.2;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_UNARY_NEGATION=4.3;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_NOT=4.4;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_TYPEOF=4.5;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_VOID=4.6;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_DELETE=4.7; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_AWAIT=4.8;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_EXPONENTIATION=5;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MULTIPLICATION=5.1;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_DIVISION=5.2;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS=5.3;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_SUBTRACTION=6.1; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION=6.2;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_BITWISE_SHIFT=7;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL=8;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_IN=8;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_INSTANCEOF=8;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_EQUALITY=9; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_BITWISE_AND=10;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_BITWISE_XOR=11;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_BITWISE_OR=12;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_AND=13;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_OR=14;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_CONDITIONAL=15; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT=16;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_YIELD=17;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_COMMA=18;module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE=99; +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_OVERRIDES=[[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER, +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_NOT,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_NOT],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MULTIPLICATION,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MULTIPLICATION],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION], +[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_AND,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_AND],[module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_OR,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_OR]];module$exports$Blockly$JavaScript.javascriptGenerator.isInitialized=!1; +module$exports$Blockly$JavaScript.javascriptGenerator.init=function(a){Object.getPrototypeOf(this).init.call(this);this.nameDB_?this.nameDB_.reset():this.nameDB_=new $.module$build$src$core$names.Names(this.RESERVED_WORDS_);this.nameDB_.setVariableMap(a.getVariableMap());this.nameDB_.populateVariables(a);this.nameDB_.populateProcedures(a);const b=[];var c=$.module$build$src$core$variables.allDeveloperVariables(a);for(let d=0;dc?g=h=this.ORDER_SUBTRACTION:d&&(g=h=this.ORDER_UNARY_NEGATION);a=this.valueToCode(a,b,h)||f;$.module$build$src$core$utils$string.isNumber(a)?(a=Number(a)+c,d&&(a=-a)):(0c&&(a=a+" - "+-c),d&&(a=c?"-("+a+")":"-"+a),g=Math.floor(g),e=Math.floor(e), +g&&e>=g&&(a="("+a+")"));return a};var module$exports$Blockly$JavaScript$variables={},module$contents$Blockly$JavaScript$variables_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$JavaScript.javascriptGenerator.variables_get=function(a){return[module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$JavaScript.javascriptGenerator.variables_set=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"VALUE",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)||"0";return module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE)+" = "+b+";\n"};var module$exports$Blockly$JavaScript$variablesDynamic={};module$exports$Blockly$JavaScript.javascriptGenerator.variables_get_dynamic=module$exports$Blockly$JavaScript.javascriptGenerator.variables_get;module$exports$Blockly$JavaScript.javascriptGenerator.variables_set_dynamic=module$exports$Blockly$JavaScript.javascriptGenerator.variables_set;var module$exports$Blockly$JavaScript$texts={},module$contents$Blockly$JavaScript$texts_NameType=$.NameType$$module$build$src$core$names,module$contents$Blockly$JavaScript$texts_strRegExp=/^\s*'([^']|\\')*'\s*$/,module$contents$Blockly$JavaScript$texts_forceString=function(a){return module$contents$Blockly$JavaScript$texts_strRegExp.test(a)?[a,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]:["String("+a+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}, +module$contents$Blockly$JavaScript$texts_getSubstringIndex=function(a,b,c){return"FIRST"===b?"0":"FROM_END"===b?a+".length - 1 - "+c:"LAST"===b?a+".length - 1":c};module$exports$Blockly$JavaScript.javascriptGenerator.text=function(a){return[module$exports$Blockly$JavaScript.javascriptGenerator.quote_(a.getFieldValue("TEXT")),module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$JavaScript.javascriptGenerator.text_multiline=function(a){a=module$exports$Blockly$JavaScript.javascriptGenerator.multiline_quote_(a.getFieldValue("TEXT"));const b=-1!==a.indexOf("+")?module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION:module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC;return[a,b]}; +module$exports$Blockly$JavaScript.javascriptGenerator.text_join=function(a){switch(a.itemCount_){case 0:return["''",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC];case 1:return a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"ADD0",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"''",module$contents$Blockly$JavaScript$texts_forceString(a);case 2:var b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"ADD0",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)|| +"''";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"ADD1",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"''";return[module$contents$Blockly$JavaScript$texts_forceString(b)[0]+" + "+module$contents$Blockly$JavaScript$texts_forceString(a)[0],module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION];default:b=Array(a.itemCount_);for(let c=0;c 0",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL],NEGATIVE:[" < 0",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL],DIVISIBLE_BY:[null,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_EQUALITY],PRIME:[null,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE, +module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]};const c=a.getFieldValue("PROPERTY"),[d,e,f]=b[c];b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";"PRIME"===c?a=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathIsPrime",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(n) { + // https://en.wikipedia.org/wiki/Primality_test#Naive_methods + if (n == 2 || n == 3) { + return true; + } + // False if n is NaN, negative, is 1, or not whole. + // And false if n is divisible by 2 or 3. + if (isNaN(n) || n <= 1 || n % 1 !== 0 || n % 2 === 0 || n % 3 === 0) { + return false; + } + // Check all the numbers of form 6k +/- 1, up to sqrt(n). + for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) { + if (n % (x - 1) === 0 || n % (x + 1) === 0) { + return false; + } + } + return true; +} +`)+"("+b+")":"DIVISIBLE_BY"===c?(a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS)||"0",a=b+" % "+a+" === 0"):a=b+d;return[a,f]}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_change=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"DELTA",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ADDITION)||"0";a=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE);return a+" = (typeof "+a+" === 'number' ? "+a+" : 0) + "+b+";\n"}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_round=module$exports$Blockly$JavaScript.javascriptGenerator.math_single;module$exports$Blockly$JavaScript.javascriptGenerator.math_trig=module$exports$Blockly$JavaScript.javascriptGenerator.math_single; +module$exports$Blockly$JavaScript.javascriptGenerator.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER)||"[]";a+=".reduce(function(x, y) {return x + y;}, 0)";break;case "MIN":a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a="Math.min.apply(null, "+ +a+")";break;case "MAX":a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a="Math.max.apply(null, "+a+")";break;case "AVERAGE":b=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathMean",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(myList) { + return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length; +} +`);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MEDIAN":b=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathMedian",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(myList) { + var localList = myList.filter(function (x) {return typeof x === 'number';}); + if (!localList.length) return null; + localList.sort(function(a, b) {return b - a;}); + if (localList.length % 2 === 0) { + return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2; + } else { + return localList[(localList.length - 1) / 2]; + } +} +`);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathModes",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(values) { + var modes = []; + var counts = []; + var maxCount = 0; + for (var i = 0; i < values.length; i++) { + var value = values[i]; + var found = false; + var thisCount; + for (var j = 0; j < counts.length; j++) { + if (counts[j][0] === value) { + thisCount = ++counts[j][1]; + found = true; + break; + } + } + if (!found) { + counts.push([value, 1]); + thisCount = 1; + } + maxCount = Math.max(thisCount, maxCount); + } + for (var j = 0; j < counts.length; j++) { + if (counts[j][1] === maxCount) { + modes.push(counts[j][0]); + } + } + return modes; +} +`);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathStandardDeviation",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(numbers) { + var n = numbers.length; + if (!n) return null; + var mean = numbers.reduce(function(x, y) {return x + y;}) / n; + var variance = 0; + for (var j = 0; j < n; j++) { + variance += Math.pow(numbers[j] - mean, 2); + } + variance = variance / n; + return Math.sqrt(variance); +} +`);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathRandomList",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(list) { + var x = Math.floor(Math.random() * list.length); + return list[x]; +} +`);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw Error("Unknown operator: "+b);}return[a,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_modulo=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"DIVIDEND",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS)||"0";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS)||"0";return[b+" % "+a,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MODULUS]}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_constrain=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"VALUE",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0",c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LOW",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"HIGH",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)|| +"Infinity";return["Math.min(Math.max("+b+", "+c+"), "+a+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_random_int=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"FROM",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"TO",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0";return[module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("mathRandomInt",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(a, b) { + if (a > b) { + // Swap a and b to ensure a is smaller. + var c = a; + a = b; + b = c; + } + return Math.floor(Math.random() * (b - a + 1) + a); +} +`)+"("+b+", "+a+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]};module$exports$Blockly$JavaScript.javascriptGenerator.math_random_float=function(a){return["Math.random()",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.math_atan2=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"X",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0";return["Math.atan2("+(module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"Y",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"0")+", "+b+") / Math.PI * 180",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_DIVISION]};var module$exports$Blockly$JavaScript$loops={},module$contents$Blockly$JavaScript$loops_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$JavaScript$loops_NameType=$.NameType$$module$build$src$core$names; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_repeat_ext=function(a){let b;b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"TIMES",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)||"0";let c=module$exports$Blockly$JavaScript.javascriptGenerator.statementToCode(a,"DO");c=module$exports$Blockly$JavaScript.javascriptGenerator.addLoopTrap(c,a);a="";const d=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName("count", +$.NameType$$module$build$src$core$names.VARIABLE);let e=b;b.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(b)||(e=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName("repeat_end",$.NameType$$module$build$src$core$names.VARIABLE),a+="var "+e+" = "+b+";\n");return a+("for (var "+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};module$exports$Blockly$JavaScript.javascriptGenerator.controls_repeat=module$exports$Blockly$JavaScript.javascriptGenerator.controls_repeat_ext; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_whileUntil=function(a){const b="UNTIL"===a.getFieldValue("MODE");let c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"BOOL",b?module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_NOT:module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"false",d=module$exports$Blockly$JavaScript.javascriptGenerator.statementToCode(a,"DO");d=module$exports$Blockly$JavaScript.javascriptGenerator.addLoopTrap(d, +a);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_for=function(a){var b=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"FROM",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)||"0",d=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"TO",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)|| +"0";const e=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"BY",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)||"1";let f=module$exports$Blockly$JavaScript.javascriptGenerator.statementToCode(a,"DO");f=module$exports$Blockly$JavaScript.javascriptGenerator.addLoopTrap(f,a);if($.module$build$src$core$utils$string.isNumber(c)&&$.module$build$src$core$utils$string.isNumber(d)&&$.module$build$src$core$utils$string.isNumber(e)){var g=Number(c)<=Number(d);a= +"for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(e));a=1===b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b);a+=") {\n"+f+"}\n"}else a="",g=c,c.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(c)||(g=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName(b+"_start",$.NameType$$module$build$src$core$names.VARIABLE),a+="var "+g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(d)||(c=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName(b+ +"_end",$.NameType$$module$build$src$core$names.VARIABLE),a+="var "+c+" = "+d+";\n"),d=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName(b+"_inc",$.NameType$$module$build$src$core$names.VARIABLE),a+="var "+d+" = ",a=$.module$build$src$core$utils$string.isNumber(e)?a+(Math.abs(e)+";\n"):a+("Math.abs("+e+");\n"),a+="if ("+g+" > "+c+") {\n",a+=module$exports$Blockly$JavaScript.javascriptGenerator.INDENT+d+" = -"+d+";\n",a=a+"}\nfor ("+(b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+ +c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n");return a}; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_forEach=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE);var c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ASSIGNMENT)||"[]";let d=module$exports$Blockly$JavaScript.javascriptGenerator.statementToCode(a,"DO");d=module$exports$Blockly$JavaScript.javascriptGenerator.addLoopTrap(d, +a);a="";let e=c;c.match(/^\w+$/)||(e=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName(b+"_list",$.NameType$$module$build$src$core$names.VARIABLE),a+="var "+e+" = "+c+";\n");c=module$exports$Blockly$JavaScript.javascriptGenerator.nameDB_.getDistinctName(b+"_index",$.NameType$$module$build$src$core$names.VARIABLE);d=module$exports$Blockly$JavaScript.javascriptGenerator.INDENT+b+" = "+e+"["+c+"];\n"+d;return a+("for (var "+c+" in "+e+") {\n"+d+"}\n")}; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_flow_statements=function(a){let b="";module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX&&(b+=module$exports$Blockly$JavaScript.javascriptGenerator.injectId(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX,a));module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_SUFFIX&&(b+=module$exports$Blockly$JavaScript.javascriptGenerator.injectId(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_SUFFIX, +a));if(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX){const c=a.getSurroundLoop();c&&!c.suppressPrefixSuffix&&(b+=module$exports$Blockly$JavaScript.javascriptGenerator.injectId(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break;\n";case "CONTINUE":return b+"continue;\n"}throw Error("Unknown flow statement.");};var module$exports$Blockly$JavaScript$logic={}; +module$exports$Blockly$JavaScript.javascriptGenerator.controls_if=function(a){var b=0;let c="";module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX&&(c+=module$exports$Blockly$JavaScript.javascriptGenerator.injectId(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_PREFIX,a));do{const d=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"IF"+b,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"false";let e=module$exports$Blockly$JavaScript.javascriptGenerator.statementToCode(a, +"DO"+b);module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_SUFFIX&&(e=module$exports$Blockly$JavaScript.javascriptGenerator.prefixLines(module$exports$Blockly$JavaScript.javascriptGenerator.injectId(module$exports$Blockly$JavaScript.javascriptGenerator.STATEMENT_SUFFIX,a),module$exports$Blockly$JavaScript.javascriptGenerator.INDENT)+e);c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="===b||"!="===b?module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_EQUALITY:module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_RELATIONAL,d=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"A",c)||"0";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"B",c)||"0";return[d+" "+b+ +" "+a,c]}; +module$exports$Blockly$JavaScript.javascriptGenerator.logic_operation=function(a){const b="AND"===a.getFieldValue("OP")?"&&":"||",c="&&"===b?module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_AND:module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_OR;let d=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"A",c);a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"B",c);if(d||a){const e="&&"===b?"true":"false";d||(d=e);a||(a=e)}else a= +d="false";return[d+" "+b+" "+a,c]};module$exports$Blockly$JavaScript.javascriptGenerator.logic_negate=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_LOGICAL_NOT;return["!"+(module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"BOOL",b)||"true"),b]};module$exports$Blockly$JavaScript.javascriptGenerator.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$JavaScript.javascriptGenerator.logic_null=function(a){return["null",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$JavaScript.javascriptGenerator.logic_ternary=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"IF",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_CONDITIONAL)||"false",c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"THEN",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_CONDITIONAL)||"null";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"ELSE",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_CONDITIONAL)|| +"null";return[b+" ? "+c+" : "+a,module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_CONDITIONAL]};var module$exports$Blockly$JavaScript$lists={},module$contents$Blockly$JavaScript$lists_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$JavaScript.javascriptGenerator.lists_create_empty=function(a){return["[]",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$JavaScript.javascriptGenerator.lists_create_with=function(a){const b=Array(a.itemCount_);for(let c=0;c b.toString() ? 1 : -1; }, + 'IGNORE_CASE': function(a, b) { + return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; }, + }; + var compare = compareFuncs[type]; + return function(a, b) { return compare(a, b) * direction; }; +} + `);return[b+".slice().sort("+d+'("'+a+'", '+c+"))",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.lists_split=function(a){let b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"INPUT",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_MEMBER);const c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"DELIM",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"===a)b||(b="''"),a="split";else if("JOIN"===a)b||(b="[]"),a="join";else throw Error("Unknown mode: "+ +a);return[b+"."+a+"("+c+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]};module$exports$Blockly$JavaScript.javascriptGenerator.lists_reverse=function(a){return[(module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"LIST",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL)||"[]")+".slice().reverse()",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]};var module$exports$Blockly$JavaScript$colour={};module$exports$Blockly$JavaScript.javascriptGenerator.colour_picker=function(a){return[module$exports$Blockly$JavaScript.javascriptGenerator.quote_(a.getFieldValue("COLOUR")),module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_ATOMIC]};module$exports$Blockly$JavaScript.javascriptGenerator.colour_random=function(a){return[module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("colourRandom",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}() { + var num = Math.floor(Math.random() * Math.pow(2, 24)); + return '#' + ('00000' + num.toString(16)).substr(-6); +} +`)+"()",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.colour_rgb=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"RED",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||0,c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"GREEN",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||0;a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"BLUE",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)|| +0;return[module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("colourRgb",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(r, g, b) { + r = Math.max(Math.min(Number(r), 100), 0) * 2.55; + g = Math.max(Math.min(Number(g), 100), 0) * 2.55; + b = Math.max(Math.min(Number(b), 100), 0) * 2.55; + r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2); + g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2); + b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2); + return '#' + r + g + b; +} +`)+"("+b+", "+c+", "+a+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$JavaScript.javascriptGenerator.colour_blend=function(a){const b=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"COLOUR1",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"'#000000'",c=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"COLOUR2",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)||"'#000000'";a=module$exports$Blockly$JavaScript.javascriptGenerator.valueToCode(a,"RATIO",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_NONE)|| +.5;return[module$exports$Blockly$JavaScript.javascriptGenerator.provideFunction_("colourBlend",` +function ${module$exports$Blockly$JavaScript.javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_}(c1, c2, ratio) { + ratio = Math.max(Math.min(Number(ratio), 1), 0); + var r1 = parseInt(c1.substring(1, 3), 16); + var g1 = parseInt(c1.substring(3, 5), 16); + var b1 = parseInt(c1.substring(5, 7), 16); + var r2 = parseInt(c2.substring(1, 3), 16); + var g2 = parseInt(c2.substring(3, 5), 16); + var b2 = parseInt(c2.substring(5, 7), 16); + var r = Math.round(r1 * (1 - ratio) + r2 * ratio); + var g = Math.round(g1 * (1 - ratio) + g2 * ratio); + var b = Math.round(b1 * (1 - ratio) + b2 * ratio); + r = ('0' + (r || 0).toString(16)).slice(-2); + g = ('0' + (g || 0).toString(16)).slice(-2); + b = ('0' + (b || 0).toString(16)).slice(-2); + return '#' + r + g + b; +} +`)+"("+b+", "+c+", "+a+")",module$exports$Blockly$JavaScript.javascriptGenerator.ORDER_FUNCTION_CALL]};var module$exports$Blockly$JavaScript$all=module$exports$Blockly$JavaScript; +module$exports$Blockly$JavaScript.__namespace__=$; +return module$exports$Blockly$JavaScript; })); diff --git a/javascript_compressed.js.map b/javascript_compressed.js.map index 6a5f7bf0afd..13d86a0dc01 100644 --- a/javascript_compressed.js.map +++ b/javascript_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/javascript.js","generators/javascript/variables.js","generators/javascript/variables_dynamic.js","generators/javascript/text.js","generators/javascript/procedures.js","generators/javascript/math.js","generators/javascript/loops.js","generators/javascript/logic.js","generators/javascript/lists.js","generators/javascript/colour.js","generators/javascript/all.js"],"names":["JavaScript","Generator","addReservedWords","Object","getOwnPropertyNames","globalThis","join","ORDER_ATOMIC","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_LOGICAL_NOT","ORDER_TYPEOF","ORDER_VOID","ORDER_DELETE","ORDER_AWAIT","ORDER_EXPONENTIATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_SUBTRACTION","ORDER_ADDITION","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_IN","ORDER_INSTANCEOF","ORDER_EQUALITY","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_YIELD","ORDER_COMMA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","JavaScript.init","workspace","getPrototypeOf","call","nameDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","defvars","devVarList","Variables","allDeveloperVariables","i","length","push","getName","NameType","DEVELOPER_VARIABLE","variables","allUsedVarModels","getId","VARIABLE","definitions_","finish","JavaScript.finish","code","definitions","objectUtils","values","scrubNakedValue","JavaScript.scrubNakedValue","line","quote_","JavaScript.quote_","string","replace","multiline_quote_","JavaScript.multiline_quote_","split","map","lines","scrub_","JavaScript.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","stringUtils","wrap","COMMENT_WRAP","prefixLines","inputList","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","JavaScript.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","outerOrder","innerOrder","at","valueToCode","isNumber","Number","Math","floor","exports","getFieldValue","argument0","varName","strRegExp","forceString","value","test","getSubstringIndex","stringName","where","opt_at","indexOf","itemCount_","element","codeAndOrder","element0","element1","elements","Array","operator","substring","text","textOrder","provideFunction_","functionName","FUNCTION_NAME_PLACEHOLDER_","Error","where1","where2","requiresLengthCall","match","at1","at2","wherePascalCase","at1Param","at2Param","OPERATORS","getField","msg","sub","from","to","funcName","PROCEDURE","xfix1","STATEMENT_PREFIX","injectId","STATEMENT_SUFFIX","INDENT","loopTrap","INFINITE_LOOP_TRAP","branch","statementToCode","returnValue","xfix2","args","getVars","tuple","hasReturnValue_","argument1","arg","CONSTANTS","PROPERTIES","dropdownProperty","suffix","inputOrder","outputOrder","numberToCheck","divisor","func","list","argument2","repeats","String","addLoopTrap","loopVar","getDistinctName","endVar","until","variable0","increment","up","step","abs","startVar","incVar","listVar","indexVar","xfix","loop","getSurroundLoop","suppressPrefixSuffix","n","conditionCode","branchCode","getInput","defaultArgument","value_if","value_then","value_else","repeatCount","item","mode","listOrder","cacheList","xVar","listName","direction","getCompareFunctionName","input","delimiter","red","green","blue","c1","c2","ratio"],"mappings":"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","file":"javascript_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/javascript.js","generators/javascript/variables.js","generators/javascript/variables_dynamic.js","generators/javascript/text.js","generators/javascript/procedures.js","generators/javascript/math.js","generators/javascript/loops.js","generators/javascript/logic.js","generators/javascript/lists.js","generators/javascript/colour.js","generators/javascript/all.js"],"names":["Variables","objectUtils","stringUtils","Generator","inputTypes","Names","NameType","JavaScript","addReservedWords","Object","getOwnPropertyNames","globalThis","join","ORDER_ATOMIC","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_LOGICAL_NOT","ORDER_TYPEOF","ORDER_VOID","ORDER_DELETE","ORDER_AWAIT","ORDER_EXPONENTIATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_SUBTRACTION","ORDER_ADDITION","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_IN","ORDER_INSTANCEOF","ORDER_EQUALITY","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_YIELD","ORDER_COMMA","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","JavaScript.init","workspace","getPrototypeOf","call","nameDB_","reset","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","defvars","devVarList","allDeveloperVariables","i","length","push","getName","DEVELOPER_VARIABLE","variables","allUsedVarModels","getId","VARIABLE","definitions_","finish","JavaScript.finish","code","definitions","values","scrubNakedValue","JavaScript.scrubNakedValue","line","quote_","JavaScript.quote_","string","replace","multiline_quote_","JavaScript.multiline_quote_","split","map","lines","scrub_","JavaScript.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","prefixLines","inputList","type","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","JavaScript.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","innerOrder","outerOrder","at","valueToCode","isNumber","Number","Math","floor","getFieldValue","argument0","varName","strRegExp","forceString","value","test","getSubstringIndex","stringName","where","opt_at","indexOf","itemCount_","element","codeAndOrder","element0","element1","elements","Array","operator","substring","text","textOrder","provideFunction_","functionName","FUNCTION_NAME_PLACEHOLDER_","Error","where1","where2","requiresLengthCall","match","at1","at2","wherePascalCase","at1Param","at2Param","OPERATORS","getField","msg","sub","from","to","funcName","PROCEDURE","xfix1","STATEMENT_PREFIX","injectId","STATEMENT_SUFFIX","INDENT","loopTrap","INFINITE_LOOP_TRAP","branch","statementToCode","returnValue","xfix2","args","getVars","tuple","hasReturnValue_","argument1","arg","CONSTANTS","PROPERTIES","dropdownProperty","suffix","inputOrder","outputOrder","numberToCheck","divisor","func","list","argument2","repeats","String","addLoopTrap","loopVar","getDistinctName","endVar","until","variable0","increment","up","step","abs","startVar","incVar","listVar","indexVar","xfix","loop","getSurroundLoop","suppressPrefixSuffix","n","conditionCode","branchCode","getInput","defaultArgument","value_if","value_then","value_else","repeatCount","item","mode","listOrder","cacheList","xVar","listName","direction","getCompareFunctionName","input","delimiter","red","green","blue","c1","c2","ratio","exports","moduleExports"],"mappings":"A;;;;;;;;;;;;;;;AAYA,IAAA,kCAAA,EAAA,CAEMA,6CAAY,CAAA,CAAA,+BAFlB,CAGMC,+CAAc,CAAA,CAAA,kCAHpB,CAIMC,+CAAc,CAAA,CAAA,kCAJpB,CAMOC,6CAAA,CAAA,CAAA,0CANP,CAOOC,8CAAA,CAAA,CAAA,iCAAA,CAAA,UAPP,CAQOC;AAAA,CAAA,CAAA,2BAAA,CAAA,KARP,CAQcC,4CAAA,CAAA,CAAA,qCAQRC,kCAAAA,CAAAA,mBAAN,CAAmB,IAAIJ,CAAAA,CAAAA,0CAAJ,CAAc,YAAd,CAQnBI;iCAAAA,CAAAA,mBAAWC,CAAAA,gBAAX,CAEI,kTAFJ,CAUIC,MAAOC,CAAAA,mBAAP,CAA2BC,UAA3B,CAAuCC,CAAAA,IAAvC,CAA4C,GAA5C,CAVJ,CAgBAL,kCAAAA,CAAAA,mBAAWM,CAAAA,YAAX,CAA0B,CAC1BN;iCAAAA,CAAAA,mBAAWO,CAAAA,SAAX,CAAuB,GACvBP,kCAAAA,CAAAA,mBAAWQ,CAAAA,YAAX,CAA0B,GAC1BR,kCAAAA,CAAAA,mBAAWS,CAAAA,mBAAX,CAAiC,CACjCT,kCAAAA,CAAAA,mBAAWU,CAAAA,eAAX,CAA6B,CAC7BV,kCAAAA,CAAAA,mBAAWW,CAAAA,eAAX,CAA6B,CAC7BX,kCAAAA,CAAAA,mBAAWY,CAAAA,iBAAX,CAA+B,GAC/BZ;iCAAAA,CAAAA,mBAAWa,CAAAA,gBAAX,CAA8B,GAC9Bb,kCAAAA,CAAAA,mBAAWc,CAAAA,oBAAX,CAAkC,GAClCd,kCAAAA,CAAAA,mBAAWe,CAAAA,iBAAX,CAA+B,GAC/Bf,kCAAAA,CAAAA,mBAAWgB,CAAAA,YAAX,CAA0B,GAC1BhB,kCAAAA,CAAAA,mBAAWiB,CAAAA,UAAX,CAAwB,GACxBjB,kCAAAA,CAAAA,mBAAWkB,CAAAA,YAAX,CAA0B,GAC1BlB;iCAAAA,CAAAA,mBAAWmB,CAAAA,WAAX,CAAyB,GACzBnB,kCAAAA,CAAAA,mBAAWoB,CAAAA,oBAAX,CAAkC,CAClCpB,kCAAAA,CAAAA,mBAAWqB,CAAAA,oBAAX,CAAkC,GAClCrB,kCAAAA,CAAAA,mBAAWsB,CAAAA,cAAX,CAA4B,GAC5BtB,kCAAAA,CAAAA,mBAAWuB,CAAAA,aAAX,CAA2B,GAC3BvB,kCAAAA,CAAAA,mBAAWwB,CAAAA,iBAAX,CAA+B,GAC/BxB;iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAX,CAA4B,GAC5BzB,kCAAAA,CAAAA,mBAAW0B,CAAAA,mBAAX,CAAiC,CACjC1B,kCAAAA,CAAAA,mBAAW2B,CAAAA,gBAAX,CAA8B,CAC9B3B,kCAAAA,CAAAA,mBAAW4B,CAAAA,QAAX,CAAsB,CACtB5B,kCAAAA,CAAAA,mBAAW6B,CAAAA,gBAAX,CAA8B,CAC9B7B,kCAAAA,CAAAA,mBAAW8B,CAAAA,cAAX,CAA4B,CAC5B9B;iCAAAA,CAAAA,mBAAW+B,CAAAA,iBAAX,CAA+B,EAC/B/B,kCAAAA,CAAAA,mBAAWgC,CAAAA,iBAAX,CAA+B,EAC/BhC,kCAAAA,CAAAA,mBAAWiC,CAAAA,gBAAX,CAA8B,EAC9BjC,kCAAAA,CAAAA,mBAAWkC,CAAAA,iBAAX,CAA+B,EAC/BlC,kCAAAA,CAAAA,mBAAWmC,CAAAA,gBAAX,CAA8B,EAC9BnC,kCAAAA,CAAAA,mBAAWoC,CAAAA,iBAAX,CAA+B,EAC/BpC;iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAAX,CAA8B,EAC9BrC,kCAAAA,CAAAA,mBAAWsC,CAAAA,WAAX,CAAyB,EACzBtC,kCAAAA,CAAAA,mBAAWuC,CAAAA,WAAX,CAAyB,EACzBvC,kCAAAA,CAAAA,mBAAWwC,CAAAA,UAAX,CAAwB,EAMxBxC;iCAAAA,CAAAA,mBAAWyC,CAAAA,eAAX,CAA6B,CAG3B,CAACzC,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAZ,CAAiCT,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAA5C,CAH2B,CAK3B,CAACR,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAZ,CAAiCT,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAA5C,CAL2B,CAU3B,CAACT,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAZ,CAA0BR,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAArC,CAV2B,CAa3B,CAACR,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAZ;AAA0BR,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAArC,CAb2B,CAgB3B,CAACT,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAAZ,CAA+Bf,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAA1C,CAhB2B,CAkB3B,CAACf,iCAAAA,CAAAA,mBAAWqB,CAAAA,oBAAZ,CAAkCrB,iCAAAA,CAAAA,mBAAWqB,CAAAA,oBAA7C,CAlB2B,CAoB3B,CAACrB,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAZ,CAA4BzB,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAvC,CApB2B;AAsB3B,CAACzB,iCAAAA,CAAAA,mBAAWkC,CAAAA,iBAAZ,CAA+BlC,iCAAAA,CAAAA,mBAAWkC,CAAAA,iBAA1C,CAtB2B,CAwB3B,CAAClC,iCAAAA,CAAAA,mBAAWmC,CAAAA,gBAAZ,CAA8BnC,iCAAAA,CAAAA,mBAAWmC,CAAAA,gBAAzC,CAxB2B,CA+B7BnC,kCAAAA,CAAAA,mBAAW0C,CAAAA,aAAX,CAA2B,CAAA,CAM3B1C;iCAAAA,CAAAA,mBAAW2C,CAAAA,IAAX,CAAkBC,QAAQ,CAACC,CAAD,CAAY,CAEpC3C,MAAO4C,CAAAA,cAAP,CAAsB,IAAtB,CAA4BH,CAAAA,IAAKI,CAAAA,IAAjC,CAAsC,IAAtC,CAEK,KAAKC,CAAAA,OAAV,CAGE,IAAKA,CAAAA,OAAQC,CAAAA,KAAb,EAHF,CACE,IAAKD,CAAAA,OADP,CACiB,IAAIlD,CAAAA,CAAAA,2BAAAA,CAAAA,KAAJ,CAAU,IAAKoD,CAAAA,eAAf,CAKjB,KAAKF,CAAAA,OAAQG,CAAAA,cAAb,CAA4BN,CAAUO,CAAAA,cAAV,EAA5B,CACA,KAAKJ,CAAAA,OAAQK,CAAAA,iBAAb,CAA+BR,CAA/B,CACA,KAAKG,CAAAA,OAAQM,CAAAA,kBAAb,CAAgCT,CAAhC,CAEA,OAAMU,EAAU,EAEhB,KAAMC,EAAa/D,CAAAA,CAAAA,+BAAUgE,CAAAA,qBAAV,CAAgCZ,CAAhC,CACnB,KAAK,IAAIa,EAAI,CAAb,CAAgBA,CAAhB,CAAoBF,CAAWG,CAAAA,MAA/B,CAAuCD,CAAA,EAAvC,CACEH,CAAQK,CAAAA,IAAR,CACI,IAAKZ,CAAAA,OAAQa,CAAAA,OAAb,CAAqBL,CAAA,CAAWE,CAAX,CAArB,CAAoC3D,CAAAA,CAAAA,qCAAS+D,CAAAA,kBAA7C,CADJ,CAKIC;CAAAA,CAAYtE,CAAAA,CAAAA,+BAAUuE,CAAAA,gBAAV,CAA2BnB,CAA3B,CAClB,KAASa,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACEH,CAAQK,CAAAA,IAAR,CAAa,IAAKZ,CAAAA,OAAQa,CAAAA,OAAb,CAAqBE,CAAA,CAAUL,CAAV,CAAaO,CAAAA,KAAb,EAArB,CAA2ClE,CAAAA,CAAAA,qCAASmE,CAAAA,QAApD,CAAb,CAIEX,EAAQI,CAAAA,MAAZ,GACE,IAAKQ,CAAAA,YAAL,CAAA,SADF,CACmC,MADnC,CAC4CZ,CAAQlD,CAAAA,IAAR,CAAa,IAAb,CAD5C,CACiE,GADjE,CAGA,KAAKqC,CAAAA,aAAL,CAAqB,CAAA,CAhCe,CAwCtC1C;iCAAAA,CAAAA,mBAAWoE,CAAAA,MAAX,CAAoBC,QAAQ,CAACC,CAAD,CAAO,CAEjC,MAAMC,EAAc7E,CAAAA,CAAAA,kCAAY8E,CAAAA,MAAZ,CAAmB,IAAKL,CAAAA,YAAxB,CAEpBG,EAAA,CAAOpE,MAAO4C,CAAAA,cAAP,CAAsB,IAAtB,CAA4BsB,CAAAA,MAAOrB,CAAAA,IAAnC,CAAwC,IAAxC,CAA8CuB,CAA9C,CACP,KAAK5B,CAAAA,aAAL,CAAqB,CAAA,CAErB,KAAKM,CAAAA,OAAQC,CAAAA,KAAb,EACA,OAAOsB,EAAYlE,CAAAA,IAAZ,CAAiB,MAAjB,CAAP,CAAkC,QAAlC,CAA6CiE,CARZ,CAiBnCtE,kCAAAA,CAAAA,mBAAWyE,CAAAA,eAAX,CAA6BC,QAAQ,CAACC,CAAD,CAAO,CAC1C,MAAOA,EAAP,CAAc,KAD4B,CAW5C3E;iCAAAA,CAAAA,mBAAW4E,CAAAA,MAAX,CAAoBC,QAAQ,CAACC,CAAD,CAAS,CAGnCA,CAAA,CAASA,CAAOC,CAAAA,OAAP,CAAe,KAAf,CAAsB,MAAtB,CACKA,CAAAA,OADL,CACa,KADb,CACoB,MADpB,CAEKA,CAAAA,OAFL,CAEa,IAFb,CAEmB,KAFnB,CAGT,OAAO,GAAP,CAAcD,CAAd,CAAuB,GANY,CAgBrC9E,kCAAAA,CAAAA,mBAAWgF,CAAAA,gBAAX,CAA8BC,QAAQ,CAACH,CAAD,CAAS,CAI7C,MADcA,EAAOI,CAAAA,KAAP,CAAa,KAAb,CAAoBC,CAAAA,GAApBC,CAAwB,IAAKR,CAAAA,MAA7BQ,CACD/E,CAAAA,IAAN,CAAW,cAAX,CAJsC,CAiB/CL;iCAAAA,CAAAA,mBAAWqF,CAAAA,MAAX,CAAoBC,QAAQ,CAACC,CAAD,CAAQjB,CAAR,CAAckB,CAAd,CAA4B,CACtD,IAAIC,EAAc,EAElB,IAAI,CAACF,CAAMG,CAAAA,gBAAX,EAA+B,CAACH,CAAMG,CAAAA,gBAAiBC,CAAAA,gBAAvD,CAAyE,CAEvE,IAAIC,EAAUL,CAAMM,CAAAA,cAAN,EACVD,EAAJ,GACEA,CACA,CADUjG,CAAAA,CAAAA,kCAAYmG,CAAAA,IAAZ,CAAiBF,CAAjB,CAA0B,IAAKG,CAAAA,YAA/B,CAA8C,CAA9C,CACV,CAAAN,CAAA,EAAe,IAAKO,CAAAA,WAAL,CAAiBJ,CAAjB,CAA2B,IAA3B,CAAiC,KAAjC,CAFjB,CAMA,KAAK,IAAIlC,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6B,CAAMU,CAAAA,SAAUtC,CAAAA,MAApC,CAA4CD,CAAA,EAA5C,CACM6B,CAAMU,CAAAA,SAAN,CAAgBvC,CAAhB,CAAmBwC,CAAAA,IAAvB,GAAgCrG,CAAAA,CAAAA,iCAAAA,CAAAA,UAAWsG,CAAAA,KAA3C,GACQC,CADR,CACqBb,CAAMU,CAAAA,SAAN,CAAgBvC,CAAhB,CAAmB2C,CAAAA,UAAWC,CAAAA,WAA9B,EADrB,IAGIV,CAHJ,CAGc,IAAKW,CAAAA,iBAAL,CAAuBH,CAAvB,CAHd,IAKMX,CALN,EAKqB,IAAKO,CAAAA,WAAL,CAAiBJ,CAAjB,CAA0B,KAA1B,CALrB,CAVqE,CAqBnEY,CAAAA;AAAYjB,CAAMkB,CAAAA,cAAlBD,EAAoCjB,CAAMkB,CAAAA,cAAeH,CAAAA,WAArB,EACpCI,EAAAA,CAAWlB,CAAA,CAAe,EAAf,CAAoB,IAAKmB,CAAAA,WAAL,CAAiBH,CAAjB,CACrC,OAAOf,EAAP,CAAqBnB,CAArB,CAA4BoC,CA1B0B,CAsCxD1G;iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAyBC,QAAQ,CAC7BtB,CAD6B,CACtBuB,CADsB,CAChBC,CADgB,CACLC,CADK,CACOC,CADP,CACkB,CAC7CC,CAAAA,CAAQH,CAARG,EAAqB,CACrBC,EAAAA,CAAQF,CAARE,EAAqB,IAAK3E,CAAAA,UAC1B+C,EAAM1C,CAAAA,SAAUuE,CAAAA,OAAQC,CAAAA,aAA5B,EACEH,CAAA,EAEF,OAAMI,EAAiB/B,CAAM1C,CAAAA,SAAUuE,CAAAA,OAAQC,CAAAA,aAAxB,CAAwC,GAAxC,CAA8C,GAErE,KAAIE,CAAJ,CACIC,EAAaL,CACL,EAAZ,CAAID,CAAJ,CAEEK,CAFF,CACEC,CADF,CACe,IAAK/F,CAAAA,cADpB,CAGmB,CAAZ,CAAIyF,CAAJ,CAELK,CAFK,CACLC,CADK,CACQ,IAAKhG,CAAAA,iBADb,CAGIwF,CAHJ,GAKLO,CALK,CAILC,CAJK,CAIQ,IAAK1G,CAAAA,oBAJb,CAQH2G,EAAAA,CAAK,IAAKC,CAAAA,WAAL,CAAiBnC,CAAjB,CAAwBuB,CAAxB,CAA8BU,CAA9B,CAALC,EAAkDH,CAElD3H,EAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqBF,CAArB,CAAJ,EAEEA,CACA,CADKG,MAAA,CAAOH,CAAP,CACL,CADkBP,CAClB,CAAIF,CAAJ,GACES,CADF,CACO,CAACA,CADR,CAHF,GAQc,CAAZ,CAAIP,CAAJ,CACEO,CADF,CACOA,CADP,CACY,KADZ,CACoBP,CADpB,CAEmB,CAFnB,CAEWA,CAFX,GAGEO,CAHF,CAGOA,CAHP,CAGY,KAHZ,CAGoB,CAACP,CAHrB,CAcA,CATIF,CASJ,GAPIS,CAOJ,CARMP,CAAJ,CACO,IADP,CACcO,CADd,CACmB,GADnB,CAGO,GAHP,CAGaA,CAKf,EAFAF,CAEA,CAFaM,IAAKC,CAAAA,KAAL,CAAWP,CAAX,CAEb,CADAJ,CACA,CADQU,IAAKC,CAAAA,KAAL,CAAWX,CAAX,CACR;AAAII,CAAJ,EAAkBJ,CAAlB,EAA2BI,CAA3B,GACEE,CADF,CACO,GADP,CACaA,CADb,CACkB,GADlB,CAtBF,CA0BA,OAAOA,EAjD0C,C,CClQnD,IAAA,4CAAA,EAAA,CAEO1H,sDAAA,CAAA,CAAA,qCAIPC,kCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAI5C,MAAO,CAFMvF,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnBS,CAA2BiB,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAA3BzD,CACTvE,CAAAA,CAAAA,qCAASmE,CAAAA,QADAI,CAEN,CAAOtE,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CAJqC,CAO9CN;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAE5C,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CACInC,CADJ,CACW,OADX,CACoBvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAD/B,CAAZ2F,EACgE,GAGtE,OAFgBhI,kCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnBoE,CACZ1C,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CADYE,CACgBlI,CAAAA,CAAAA,qCAASmE,CAAAA,QADzB+D,CAEhB,CAAiB,KAAjB,CAAyBD,CAAzB,CAAqC,KANO,C,CCb9C,IAAA,mDAAA,EAQAhI,kCAAAA,CAAAA,mBAAA,CAAA,qBAAA,CAAsCA,iCAAAA,CAAAA,mBAAA,CAAA,aACtCA,kCAAAA,CAAAA,mBAAA,CAAA,qBAAA,CAAsCA,iCAAAA,CAAAA,mBAAA,CAAA,a,CCTtC,IAAA,wCAAA,EAAA,CAEOD,kDAAA,CAAA,CAAA,qCAFP,CASMmI,mDAAY,uBATlB,CAkBMC,qDAAcA,QAAQ,CAACC,CAAD,CAAQ,CAClC,MAAIF,mDAAUG,CAAAA,IAAV,CAAeD,CAAf,CAAJ,CACS,CAACA,CAAD,CAAQpI,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAnB,CADT,CAGO,CAAC,SAAD,CAAa8H,CAAb,CAAqB,GAArB,CAA0BpI,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAArC,CAJ2B,CAlBpC;AAgCM6H,2DAAoBA,QAAQ,CAACC,CAAD,CAAaC,CAAb,CAAoBC,CAApB,CAA4B,CAC5D,MAAc,OAAd,GAAID,CAAJ,CACS,GADT,CAEqB,UAAd,GAAIA,CAAJ,CACED,CADF,CACe,gBADf,CACkCE,CADlC,CAEc,MAAd,GAAID,CAAJ,CACED,CADF,CACe,aADf,CAGEE,CARmD,CAY9DzI,kCAAAA,CAAAA,mBAAA,CAAA,IAAA,CAAqB,QAAQ,CAACuF,CAAD,CAAQ,CAGnC,MAAO,CADMvF,iCAAAA,CAAAA,mBAAW4E,CAAAA,MAAXN,CAAkBiB,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAlBzD,CACN,CAAOtE,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CAH4B,CAMrCN;iCAAAA,CAAAA,mBAAA,CAAA,cAAA,CAA+B,QAAQ,CAACuF,CAAD,CAAQ,CAEvCjB,CAAAA,CAAOtE,iCAAAA,CAAAA,mBAAWgF,CAAAA,gBAAX,CAA4BO,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAA5B,CACb,OAAMZ,EAA8B,CAAC,CAAvB,GAAA7C,CAAKoE,CAAAA,OAAL,CAAa,GAAb,CAAA,CAA2B1I,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAtC,CACVzB,iCAAAA,CAAAA,mBAAWM,CAAAA,YACf,OAAO,CAACgE,CAAD,CAAO6C,CAAP,CALsC,CAQ/CnH;iCAAAA,CAAAA,mBAAA,CAAA,SAAA,CAA0B,QAAQ,CAACuF,CAAD,CAAQ,CAExC,OAAQA,CAAMoD,CAAAA,UAAd,EACE,KAAK,CAAL,CACE,MAAO,CAAC,IAAD,CAAO3I,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CACT,MAAK,CAAL,CAIE,MAHMsI,EAEeC,CAFL7I,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACZvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADC,CAEKqG,EADS,IACTA,CAAAV,oDAAAU,CAAYD,CAAZC,CAGvB,MAAK,CAAL,CACE,IAAMC,EAAW9I,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACbvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADE,CAAXsG;AACwB,IACxBC,EAAAA,CAAW/I,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACbvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADE,CAAXuG,EACwB,IAG9B,OAAO,CAFMZ,oDAAA,CAAYW,CAAZ,CAAA,CAAsB,CAAtB,CAEN,CADH,KACG,CADKX,oDAAA,CAAYY,CAAZ,CAAA,CAAsB,CAAtB,CACL,CAAO/I,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAlB,CAET,SACQuH,CAAAA,CAAeC,KAAJ,CAAU1D,CAAMoD,CAAAA,UAAhB,CACjB,KAAK,IAAIjF,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6B,CAAMoD,CAAAA,UAA1B,CAAsCjF,CAAA,EAAtC,CACEsF,CAAA,CAAStF,CAAT,CAAA,CAAc1D,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CAAsC7B,CAAtC,CACV1D,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADD,CAAd;AAC8B,IAGhC,OAAO,CADM,GACN,CADYwG,CAAS3I,CAAAA,IAAT,CAAc,GAAd,CACZ,CADiC,YACjC,CAAOL,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAzBX,CAFwC,CAgC1CT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,MAAM0C,EAAUjI,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CACZ0B,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CADY,CACgBhI,CAAAA,CAAAA,qCAASmE,CAAAA,QADzB,CAEVkE,EAAAA,CAAQpI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACVvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADD,CAAR4F,EACwB,IAG9B,OAFaH,EAEb,CAFuB,MAEvB,CADIE,oDAAA,CAAYC,CAAZ,CAAA,CAAmB,CAAnB,CACJ,CAD4B,KAPc,CAW5CpI;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAI1C,MAAO,EAFMvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CACTvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADF,CAEN,EADyB,IACzB,EAAQ,SAAR,CAAmBR,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAA9B,CAJmC,CAO5CR;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAI3C,MAAO,CAAC,GAAD,EAFMvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CACTvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADF,CAEN,EADyB,IACzB,EAAc,SAAd,CAAyBR,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAApC,CAJoC,CAO7Cf;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,IAAM2D,EAA0C,OAA/B,GAAA3D,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAAA,CACb,SADa,CACD,aAChB,OAAMoB,EAAYnJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZ2G,EACwB,IAGxB7E,EAAAA,EAFOtE,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CACTvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADF,CAEP8D,EAD0B,IAC1BA,EAAc,GAAdA,CAAoB4E,CAApB5E,CAA+B,GAA/BA,CAAqC6E,CAArC7E,CAAiD,GAEvD,OAAIiB,EAAM1C,CAAAA,SAAUuE,CAAAA,OAAQC,CAAAA,aAA5B;AACS,CAAC/C,CAAD,CAAQ,MAAR,CAAgBtE,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAA3B,CADT,CAGO,CAAC6C,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAboC,CAgB7CT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAG1C,MAAMiD,EAAQjD,CAAMwC,CAAAA,aAAN,CAAoB,OAApB,CAARS,EAAwC,YAA9C,CAGMY,EAAOpJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAFgB,QAAX8D,GAACb,CAADa,CAAuBrJ,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlC6G,CACdrJ,iCAAAA,CAAAA,mBAAWQ,CAAAA,YACF,CAAP4I,EAA4D,IAClE,QAAQZ,CAAR,EACE,KAAK,OAAL,CAEE,MAAO,CADMY,CACN,CADa,YACb,CAAOpJ,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAET,MAAK,MAAL,CAEE,MAAO,CADM2I,CACN,CADa,YACb;AAAOpJ,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAET,MAAK,YAAL,CAIE,MAHMgH,EAGC,CAHIzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,IAA9B,CAGJ,CAAA,CADM6D,CACN,CADa,UACb,CAD0B3B,CAC1B,CAD+B,GAC/B,CAAOzH,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAET,MAAK,UAAL,CAGE,MAFMgH,EAEC,CAFIzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,IAA9B,CAAoC,CAApC,CAAuC,CAAA,CAAvC,CAEJ,CAAA,CADM6D,CACN,CADa,SACb,CADyB3B,CACzB,CAD8B,aAC9B,CAAOzH,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAET,MAAK,QAAL,CAQE,MAAO,CAPcT,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,kBAA5BA;AAAiD;WACjEvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADsD;;;;CAAjDD,CAOd,CADqB,GACrB,CAD2BH,CAC3B,CADkC,GAClC,CAAOpJ,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CA5BX,CA+BA,KAAMgJ,MAAA,CAAM,iCAAN,CAAN,CAtC0C,CAyC5CzJ;iCAAAA,CAAAA,mBAAA,CAAA,iBAAA,CAAkC,QAAQ,CAACuF,CAAD,CAAQ,CAEhD,IAAMmE,EAASnE,CAAMwC,CAAAA,aAAN,CAAoB,QAApB,CAAf,CACM4B,EAASpE,CAAMwC,CAAAA,aAAN,CAAoB,QAApB,CADf,CAEM6B,EAAiC,UAAjCA,GAAsBF,CAAtBE,EAA0D,MAA1DA,GAA+CF,CAA/CE,EACS,UADTA,GACFD,CADEC,EACkC,MADlCA,GACuBD,CAH7B,CAMMP,EAAOpJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,QAA9B,CAFKqE,CAAAP,CAAqBrJ,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAhC6I,CACdrJ,iCAAAA,CAAAA,mBAAWwC,CAAAA,UACF,CAAP4G,EAA6D,IAEnE,IAAe,OAAf,GAAIM,CAAJ,EAAqC,MAArC,GAA0BC,CAA1B,CAEE,MAAO,CADAP,CACA,CAAOpJ,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlB,CACF;GAAI4G,CAAKS,CAAAA,KAAL,CAAW,WAAX,CAAJ,EAA+BD,CAA/B,CAAmD,CAIxD,OAAQF,CAAR,EACE,KAAK,YAAL,CACEI,CAAA,CAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACN,MACF,MAAK,UAAL,CACEuE,CAAA,CAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CAAqC,CAArC,CAAwC,CAAA,CAAxC,CACFvF,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBADT,CAENsI,EAAA,CAAMV,CAAN,CAAa,YAAb,CAA4BU,CAC5B,MACF,MAAK,OAAL,CACEA,CAAA,CAAM,GACN,MACF,SACE,KAAML,MAAA,CAAM,uCAAN,CAAN,CAbJ,CAgBA,OAAQE,CAAR,EACE,KAAK,YAAL,CACEI,CAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB;AAA8B,KAA9B,CAAqC,CAArC,CACN,MACF,MAAK,UAAL,CACEwE,CAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CAAqC,CAArC,CAAwC,CAAA,CAAxC,CACFvF,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBADT,CAENuI,EAAA,CAAMX,CAAN,CAAa,YAAb,CAA4BW,CAC5B,MACF,MAAK,MAAL,CACEA,CAAA,CAAMX,CAAN,CAAa,SACb,MACF,SACE,KAAMK,MAAA,CAAM,uCAAN,CAAN,CAbJ,CAeAnF,CAAA,CAAO8E,CAAP,CAAc,SAAd,CAA0BU,CAA1B,CAAgC,IAAhC,CAAuCC,CAAvC,CAA6C,GAnCW,CAAnD,IAoCA,CACCD,CAAAA,CAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACNwE,EAAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACZ,OAAMyE,EAAkB,CAAC,MAAS,OAAV;AAAmB,KAAQ,MAA3B,CACtB,WAAc,WADQ,CACK,SAAY,SADjB,CAgBxB1F,EAAA,CARqBtE,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CACjB,aADiBA,CACDS,CAAA,CAAgBN,CAAhB,CADCH,CACyBS,CAAA,CAAgBL,CAAhB,CADzBJ,CACmD;WACjEvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADsD,YAJxD,UAAZS,GAACP,CAADO,EAAqC,YAArCA,GAA0BP,CAA1BO,CAAqD,OAArDA,CAA+D,EAIK,GAFxD,UAAZC,GAACP,CAADO,EAAqC,YAArCA,GAA0BP,CAA1BO,CAAqD,OAArDA,CAA+D,EAEK;gBAE5D5B,0DAAA,CAAkB,UAAlB,CAA8BoB,CAA9B,CAAsC,KAAtC,CAF4D;cAG9DpB,0DAAA,CAAkB,UAAlB,CAA8BqB,CAA9B,CAAsC,KAAtC,CAH8D;;;CADnDJ,CAQrB,CAAsB,GAAtB,CAA4BH,CAA5B,EAGiB,UAAZ,GAACM,CAAD,EAAqC,YAArC,GAA0BA,CAA1B,CAAqD,IAArD,CAA4DI,CAA5D,CAAkE,EAHvE,GAIiB,UAAZ,GAACH,CAAD,EAAqC,YAArC,GAA0BA,CAA1B,CAAqD,IAArD,CAA4DI,CAA5D,CAAkE,EAJvE,EAKI,GAxBC,CA0BP,MAAO,CAACzF,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CA3EyC,CA8ElDT;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgC,QAAQ,CAACuF,CAAD,CAAQ,CAO9C,MAAM2D,EALYiB,CAChB,UAAa,gBADGA,CAEhB,UAAa,gBAFGA,CAGhB,UAAa,IAHGA,CAKD,CAAU5E,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAV,CAEXqB,EAAAA,CAAOpJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CADK2D,CAAAG,CAAWrJ,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAtB6I,CAAqCrJ,iCAAAA,CAAAA,mBAAWwC,CAAAA,UACrD,CAAP4G,EAA2D,IAejE,OAAO,CAbHF,CAAJ5E,CAES8E,CAFT9E,CAEgB4E,CAFhB5E,CAKuBtE,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,iBAA5BA;AAAgD;WAC9DvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADmD;;;;CAAhDD,CALvBjF,CAWwB,GAXxBA,CAW8B8E,CAX9B9E,CAWqC,GAE9B,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAxBuC,CA2BhDT,kCAAAA,CAAAA,mBAAA,CAAA,SAAA,CAA0B,QAAQ,CAACuF,CAAD,CAAQ,CAOxC,MAAM2D,EALYiB,CAChB,KAAQ,8BADQA,CAEhB,MAAS,8BAFOA,CAGhB,KAAQ,SAHQA,CAKD,CAAU5E,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAV,CAGjB,OAAO,EAFM/H,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACTvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADF,CAEN,EADyB,IACzB,EAAQ0I,CAAR,CAAkBlJ,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAA7B,CAViC,CAa1CT;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CAIzC,MAAO,eAAP,EAFYvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACRvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADH,CAEZ,EAD8B,IAC9B,EAA+B,MAJU,CAO3CxC;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgC,QAAQ,CAACuF,CAAD,CAAQ,CAU9C,IAAIjB,EAAO,gBAAPA,EAPAiB,CAAM6E,CAAAA,QAAN,CAAe,MAAf,CAAJC,CAEQrK,iCAAAA,CAAAA,mBAAW4E,CAAAA,MAAX,CAAkBW,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAlB,CAFRsC,CAKQrK,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAjD,CALR6H,EAKwE,IAEpE/F,EAAgC,GACa,SACjD,GADiBiB,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CACjB,GACEzD,CADF,CACS,SADT,CACqBA,CADrB,CAC4B,GAD5B,CAGA,OAAO,CAACA,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAfuC,CAkBhDT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4BA,iCAAAA,CAAAA,mBAAA,CAAA,eAE5BA;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CACzC,MAAM6D,EAAOpJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACTvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADF,CAAP4G,EACwB,IACxBkB,EAAAA,CAAMtK,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CACRvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADH,CAAN8H,EACwB,IAW9B,OAAO,CAVctK,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,WAA5BA,CAA0C;WACtDvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD2C;;;;;;;CAA1CD,CAUd,CADqB,GACrB,CAD2BH,CAC3B,CADkC,IAClC,CADyCkB,CACzC,CAD+C,GAC/C,CAAOtK,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAfkC,CAkB3CT;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAC3C,MAAM6D,EAAOpJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACTvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADF,CAAP4G,EACwB,IAD9B,CAEMmB,EAAOvK,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACTvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADF,CAAP+H,EACwB,IACxBC,EAAAA,CAAKxK,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAoCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAA/C,CAALgI;AAAmE,IAWzE,OAAO,CARcxK,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,aAA5BA,CAA4C;WACxDvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD6C;;;;;CAA5CD,CAQd,CADqB,GACrB,CAD2BH,CAC3B,CADkC,IAClC,CADyCmB,CACzC,CADgD,IAChD,CADuDC,CACvD,CAD4D,GAC5D,CAAOxK,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAhBoC,CAmB7CT,kCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAI3C,MAAO,EAHMvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACTvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADF,CAGN,EAFyB,IAEzB,EADa,+BACb,CAAOR,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAJoC,C,CClW7C,IAAA,6CAAA,EAAA,CAEOV,uDAAA,CAAA,CAAA,qCAIPC;iCAAAA,CAAAA,mBAAA,CAAA,oBAAA,CAAqC,QAAQ,CAACuF,CAAD,CAAQ,CAEnD,MAAMkF,EAAWzK,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CACb0B,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CADa,CACgBhI,CAAAA,CAAAA,qCAAS2K,CAAAA,SADzB,CAEjB,KAAIC,EAAQ,EACR3K,kCAAAA,CAAAA,mBAAW4K,CAAAA,gBAAf,GACED,CADF,EACW3K,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW4K,CAAAA,gBAA/B,CAAiDrF,CAAjD,CADX,CAGIvF,kCAAAA,CAAAA,mBAAW8K,CAAAA,gBAAf;CACEH,CADF,EACW3K,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAA/B,CAAiDvF,CAAjD,CADX,CAGIoF,EAAJ,GACEA,CADF,CACU3K,iCAAAA,CAAAA,mBAAWgG,CAAAA,WAAX,CAAuB2E,CAAvB,CAA8B3K,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAAzC,CADV,CAGA,KAAIC,EAAW,EACXhL,kCAAAA,CAAAA,mBAAWiL,CAAAA,kBAAf,GACED,CADF,CACahL,iCAAAA,CAAAA,mBAAWgG,CAAAA,WAAX,CACPhG,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAWiL,CAAAA,kBAA/B;AAAmD1F,CAAnD,CADO,CAEPvF,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAFJ,CADb,CAKA,OAAMG,EAASlL,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,OAAlC,CACf,KAAI6F,EACApL,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,QAA9B,CAAwCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAnD,CADA4I,EACkE,EADtE,CAEIC,EAAQ,EACRH,EAAJ,EAAcE,CAAd,GAEEC,CAFF,CAEUV,CAFV,CAIIS,EAAJ,GACEA,CADF,CACgBpL,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAD3B,CACoC,SADpC,CACgDK,CADhD,CAC8D,KAD9D,CAGA,OAAME,EAAO,EAAb,CACMvH,EAAYwB,CAAMgG,CAAAA,OAAN,EAClB,KAAK,IAAI7H,EAAI,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACE4H,CAAA,CAAK5H,CAAL,CAAA,CAAU1D,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CAA2BE,CAAA,CAAUL,CAAV,CAA3B;AAAyC3D,CAAAA,CAAAA,qCAASmE,CAAAA,QAAlD,CAERI,EAAAA,CAAO,WAAPA,CAAqBmG,CAArBnG,CAAgC,GAAhCA,CAAsCgH,CAAKjL,CAAAA,IAAL,CAAU,IAAV,CAAtCiE,CAAwD,OAAxDA,CAAkEqG,CAAlErG,CACA0G,CADA1G,CACW4G,CADX5G,CACoB+G,CADpB/G,CAC4B8G,CAD5B9G,CAC0C,GAC9CA,EAAA,CAAOtE,iCAAAA,CAAAA,mBAAWqF,CAAAA,MAAX,CAAkBE,CAAlB,CAAyBjB,CAAzB,CAEPtE,kCAAAA,CAAAA,mBAAWmE,CAAAA,YAAX,CAAwB,GAAxB,CAA8BsG,CAA9B,CAAA,CAA0CnG,CAC1C,OAAO,KAzC4C,CA8CrDtE,kCAAAA,CAAAA,mBAAA,CAAA,sBAAA,CAAuCA,iCAAAA,CAAAA,mBAAA,CAAA,oBAEvCA;iCAAAA,CAAAA,mBAAA,CAAA,qBAAA,CAAsC,QAAQ,CAACuF,CAAD,CAAQ,CAEpD,MAAMkF,EAAWzK,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CACb0B,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CADa,CACgBhI,CAAAA,CAAAA,qCAAS2K,CAAAA,SADzB,CAAjB,CAEMY,EAAO,EAFb,CAGMvH,EAAYwB,CAAMgG,CAAAA,OAAN,EAClB,KAAK,IAAI7H,EAAI,CAAb,CAAgBA,CAAhB,CAAoBK,CAAUJ,CAAAA,MAA9B,CAAsCD,CAAA,EAAtC,CACE4H,CAAA,CAAK5H,CAAL,CAAA,CAAU1D,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CAAsC7B,CAAtC,CAAyC1D,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAApD,CAAV,EACI,MAGN,OAAO,CADMiI,CACN,CADiB,GACjB,CADuBa,CAAKjL,CAAAA,IAAL,CAAU,IAAV,CACvB,CADyC,GACzC,CAAOL,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAX6C,CActDT;iCAAAA,CAAAA,mBAAA,CAAA,uBAAA,CAAwC,QAAQ,CAACuF,CAAD,CAAQ,CAKtD,MADcvF,kCAAAA,CAAAA,mBAAA,CAAA,qBAAAwL,CAAoCjG,CAApCiG,CACP,CAAM,CAAN,CAAP,CAAkB,KALoC,CAQxDxL;iCAAAA,CAAAA,mBAAA,CAAA,mBAAA,CAAoC,QAAQ,CAACuF,CAAD,CAAQ,CAKlD,IAAIjB,EAAO,MAAPA,EAFAtE,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,WAA9B,CAA2CvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAtD,CAEA8B,EADA,OACAA,EAA4B,OAC5BtE,kCAAAA,CAAAA,mBAAW8K,CAAAA,gBAAf,GAGExG,CAHF,EAGUtE,iCAAAA,CAAAA,mBAAWgG,CAAAA,WAAX,CACJhG,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAA/B;AAAiDvF,CAAjD,CADI,CAEJvF,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAFP,CAHV,CAOIxF,EAAMkG,CAAAA,eAAV,EACQrD,CAEN,CADIpI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlD,CACJ,EADqE,MACrE,CAAA8B,CAAA,EAAQtE,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAAnB,CAA4B,SAA5B,CAAwC3C,CAAxC,CAAgD,KAHlD,EAKE9D,CALF,EAKUtE,iCAAAA,CAAAA,mBAAW+K,CAAAA,MALrB,CAK8B,WAG9B,OADAzG,EACA,CADQ,KApB0C,C,CC3EpD,IAAA,uCAAA,EAAA,CAEOvE,iDAAA,CAAA,CAAA,qCAIPC,kCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAEpCjB,CAAAA,CAAOsD,MAAA,CAAOrC,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAAP,CAGb,OAAO,CAACzD,CAAD,CAFe,CAAR6C,EAAA7C,CAAA6C,CAAYnH,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAvB6G,CACFnH,iCAAAA,CAAAA,mBAAWc,CAAAA,oBAChB,CALmC,CAQ5Cd;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgC,QAAQ,CAACuF,CAAD,CAAQ,CAS9C,IAAMiG,EAPYrB,CAChB,IAAO,CAAC,KAAD,CAAQnK,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAAnB,CADS0I,CAEhB,MAAS,CAAC,KAAD,CAAQnK,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBAAnB,CAFO2I,CAGhB,SAAY,CAAC,KAAD,CAAQnK,iCAAAA,CAAAA,mBAAWqB,CAAAA,oBAAnB,CAHI8I,CAIhB,OAAU,CAAC,KAAD,CAAQnK,iCAAAA,CAAAA,mBAAWsB,CAAAA,cAAnB,CAJM6I,CAKhB,MAAS,CAAC,IAAD,CAAOnK,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlB,CALO2H,CAOJ,CAAU5E,CAAMwC,CAAAA,aAAN,CAAoB,IAApB,CAAV,CACd;MAAMmB,EAAWsC,CAAA,CAAM,CAAN,CACXrE,EAAAA,CAAQqE,CAAA,CAAM,CAAN,CACd,OAAMxD,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CAAZa,EAAyD,GACzD0D,EAAAA,CAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CAAZuE,EAAyD,GAG/D,OAAKxC,EAAL,CAKO,CADAlB,CACA,CADYkB,CACZ,CADuBwC,CACvB,CAAOvE,CAAP,CALP,CAES,CADA,WACA,CADca,CACd,CAD0B,IAC1B,CADiC0D,CACjC,CAD6C,GAC7C,CAAO1L,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAlBqC,CAwBhDT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,MAAM2D,EAAW3D,CAAMwC,CAAAA,aAAN,CAAoB,IAApB,CACjB,KAAIzD,CAEJ,IAAiB,KAAjB,GAAI4E,CAAJ,CASE,MAPAyC,EAOO,CAPD3L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CACFvF,iCAAAA,CAAAA,mBAAWc,CAAAA,oBADT,CAOC,EANiC,GAMjC,CALQ,GAKR,GALH6K,CAAA,CAAI,CAAJ,CAKG,GAHLA,CAGK,CAHC,GAGD,CAHOA,CAGP,EAAA,CADA,GACA,CADMA,CACN,CAAO3L,iCAAAA,CAAAA,mBAAWc,CAAAA,oBAAlB,CAGP6K,EAAA,CADe,KAAjB,GAAIzC,CAAJ,EAAuC,KAAvC,GAA0BA,CAA1B,EAA6D,KAA7D,GAAgDA,CAAhD,CACQlJ,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B;AACFvF,iCAAAA,CAAAA,mBAAWsB,CAAAA,cADT,CADR,EAEoC,GAFpC,CAIQtB,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CACFvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADT,CAJR,EAKgC,GAIhC,QAAQ0G,CAAR,EACE,KAAK,KAAL,CACE5E,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,GAC3B,MACF,MAAK,MAAL,CACErH,CAAA,CAAO,YAAP,CAAsBqH,CAAtB,CAA4B,GAC5B,MACF,MAAK,IAAL,CACErH,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,GAC3B,MACF,MAAK,KAAL,CACErH,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,GAC3B,MACF,MAAK,OAAL,CACErH,CAAA,CAAO,cAAP,CAAwBqH,CAAxB,CAA8B,GAC9B,MACF,MAAK,OAAL,CACErH,CAAA,CAAO,aAAP,CAAuBqH,CAAvB,CAA6B,GAC7B,MACF,MAAK,SAAL,CACErH,CAAA,CAAO,YAAP,CAAsBqH,CAAtB,CAA4B,GAC5B,MACF;KAAK,WAAL,CACErH,CAAA,CAAO,aAAP,CAAuBqH,CAAvB,CAA6B,GAC7B,MACF,MAAK,KAAL,CACErH,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,mBAC3B,MACF,MAAK,KAAL,CACErH,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,mBAC3B,MACF,MAAK,KAAL,CACErH,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,mBAhC/B,CAmCA,GAAIrH,CAAJ,CACE,MAAO,CAACA,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAIT,QAAQyI,CAAR,EACE,KAAK,OAAL,CACE5E,CAAA,CAAO,WAAP,CAAqBqH,CAArB,CAA2B,kBAC3B,MACF,MAAK,MAAL,CACErH,CAAA,CAAO,YAAP,CAAsBqH,CAAtB,CAA4B,mBAC5B,MACF,MAAK,MAAL,CACErH,CAAA,CAAO,YAAP,CAAsBqH,CAAtB,CAA4B,mBAC5B,MACF,MAAK,MAAL,CACErH,CAAA,CAAO,YAAP,CAAsBqH,CAAtB,CAA4B,mBAC5B;KACF,SACE,KAAMlC,MAAA,CAAM,yBAAN,CAAkCP,CAAlC,CAAN,CAdJ,CAgBA,MAAO,CAAC5E,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWsB,CAAAA,cAAlB,CAjFmC,CAoF5CtB;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAU5C,MARkBqG,CAChB,GAAM,CAAC,SAAD,CAAY5L,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAvB,CADUoL,CAEhB,EAAK,CAAC,QAAD,CAAW5L,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAtB,CAFWoL,CAGhB,aAAgB,CAAC,wBAAD,CAA2B5L,iCAAAA,CAAAA,mBAAWsB,CAAAA,cAAtC,CAHAsK,CAIhB,MAAS,CAAC,YAAD,CAAe5L,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAA1B,CAJOoL,CAKhB,QAAW,CAAC,cAAD,CAAiB5L,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAA5B,CALKoL;AAMhB,SAAY,CAAC,UAAD,CAAa5L,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAxB,CANIsL,CAQX,CAAUrG,CAAMwC,CAAAA,aAAN,CAAoB,UAApB,CAAV,CAVqC,CAa9C/H;iCAAAA,CAAAA,mBAAA,CAAA,oBAAA,CAAqC,QAAQ,CAACuF,CAAD,CAAQ,CAGnD,IAAMsG,EAAa,CACjB,KAAQ,CAAC,YAAD,CAAe7L,iCAAAA,CAAAA,mBAAWuB,CAAAA,aAA1B,CAAyCvB,iCAAAA,CAAAA,mBAAW8B,CAAAA,cAApD,CADS,CAEjB,IAAO,CAAC,YAAD,CAAe9B,iCAAAA,CAAAA,mBAAWuB,CAAAA,aAA1B,CAAyCvB,iCAAAA,CAAAA,mBAAW8B,CAAAA,cAApD,CAFU,CAGjB,MAAS,CAAC,YAAD,CAAe9B,iCAAAA,CAAAA,mBAAWuB,CAAAA,aAA1B,CACLvB,iCAAAA,CAAAA,mBAAW8B,CAAAA,cADN,CAHQ;AAKjB,SAAY,CAAC,MAAD,CAAS9B,iCAAAA,CAAAA,mBAAW2B,CAAAA,gBAApB,CACR3B,iCAAAA,CAAAA,mBAAW2B,CAAAA,gBADH,CALK,CAOjB,SAAY,CAAC,MAAD,CAAS3B,iCAAAA,CAAAA,mBAAW2B,CAAAA,gBAApB,CACR3B,iCAAAA,CAAAA,mBAAW2B,CAAAA,gBADH,CAPK,CASjB,aAAgB,CAAC,IAAD,CAAO3B,iCAAAA,CAAAA,mBAAWuB,CAAAA,aAAlB,CAAiCvB,iCAAAA,CAAAA,mBAAW8B,CAAAA,cAA5C,CATC,CAUjB,MAAS,CAAC,IAAD,CAAO9B,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlB;AAA8BxC,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAzC,CAVQ,CAYnB,OAAMqL,EAAmBvG,CAAMwC,CAAAA,aAAN,CAAoB,UAApB,CAAzB,CACM,CAACgE,CAAD,CAASC,CAAT,CAAqBC,CAArB,CAAA,CAAoCJ,CAAA,CAAWC,CAAX,CACpCI,EAAAA,CAAgBlM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,iBAA9B,CAClByG,CADkB,CAAhBE,EACa,GAEM,QAAzB,GAAIJ,CAAJ,CAsBExH,CAtBF,CAEuBtE,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,aAA5BA,CAA4C;WAC1DvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD+C;;;;;;;;;;;;;;;;;;CAA5CD,CAFvB,CAsBwB,GAtBxB,CAsB8B2C,CAtB9B,CAsB8C,GAtB9C,CAuBgC,cAAzB,GAAIJ,CAAJ,EACCK,CAEN,CAFgBnM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,SAA9B,CACZvF,iCAAAA,CAAAA,mBAAWuB,CAAAA,aADC,CAEhB,EADiC,GACjC,CAAA+C,CAAA,CAAO4H,CAAP,CAAuB,KAAvB,CAA+BC,CAA/B,CAAyC,QAHpC,EAKL7H,CALK,CAKE4H,CALF,CAKkBH,CAEzB,OAAO,CAACzH,CAAD,CAAO2H,CAAP,CAlD4C,CAqDrDjM;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CACdvF,iCAAAA,CAAAA,mBAAWyB,CAAAA,cADG,CAAZuG,EAC4B,GAC5BC,EAAAA,CAAUjI,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CACZ0B,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CADY,CACgBhI,CAAAA,CAAAA,qCAASmE,CAAAA,QADzB,CAEhB,OAAO+D,EAAP,CAAiB,aAAjB,CAAiCA,CAAjC,CAA2C,kBAA3C,CAAkEA,CAAlE,CACI,UADJ,CACiBD,CADjB,CAC6B,KAPa,CAW5ChI;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2BA,iCAAAA,CAAAA,mBAAA,CAAA,WAE3BA,kCAAAA,CAAAA,mBAAA,CAAA,SAAA,CAA0BA,iCAAAA,CAAAA,mBAAA,CAAA,WAE1BA;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,IAAM6G,EAAO7G,CAAMwC,CAAAA,aAAN,CAAoB,IAApB,CAGb,QAAQqE,CAAR,EACE,KAAK,KAAL,CACEC,CAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YADR,CAAP,EACgC,IACzB6L,EAAP,EAAc,4CACd,MACF,MAAK,KAAL,CACEA,CAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAO,uBAAP;AAAiC+H,CAAjC,CAAwC,GACxC,MACF,MAAK,KAAL,CACEA,CAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAO,uBAAP,CAAiC+H,CAAjC,CAAwC,GACxC,MACF,MAAK,SAAL,CAEQ9C,CAAAA,CAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,UAA5B,CAAyC;WACzDtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD8C;;;CAAzC,CAKrB6C,EAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAOiF,CAAP,CAAsB,GAAtB,CAA4B8C,CAA5B,CAAmC,GACnC,MAEF,MAAK,QAAL,CAEQ9C,CAAAA,CAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,YAA5B,CAA2C;WAC3DtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADgD;;;;;;;;;;CAA3C,CAYrB6C,EAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAOiF,CAAP,CAAsB,GAAtB,CAA4B8C,CAA5B,CAAmC,GACnC,MAEF,MAAK,MAAL,CAIQ9C,CAAAA,CAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,WAA5B,CAA0C;WAC1DtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD+C;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA1C,CA8BrB6C,EAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAOiF,CAAP,CAAsB,GAAtB,CAA4B8C,CAA5B,CAAmC,GACnC,MAEF,MAAK,SAAL,CACQ9C,CAAAA,CAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,uBAA5B,CAAsD;WACtEtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD2D;;;;;;;;;;;CAAtD,CAarB6C,EAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAOiF,CAAP,CAAsB,GAAtB,CAA4B8C,CAA5B,CAAmC,GACnC,MAEF,MAAK,QAAL,CACQ9C,CAAAA,CAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,gBAA5B,CAA+C;WAC/DtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADoD;;;;CAA/C,CAMrB6C,EAAA,CAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACHvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADR,CAAP,EAC8B,IAC9B8B,EAAA,CAAOiF,CAAP,CAAsB,GAAtB,CAA4B8C,CAA5B,CAAmC,GACnC,MAEF,SACE,KAAM5C,MAAA,CAAM,oBAAN,CAA6B2C,CAA7B,CAAN,CAtHJ,CAwHA,MAAO,CAAC9H,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CA7HoC,CAgI7CT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,UAA9B,CACdvF,iCAAAA,CAAAA,mBAAWuB,CAAAA,aADG,CAAZyG,EAC2B,GAC3B0D,EAAAA,CAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,SAA9B,CACdvF,iCAAAA,CAAAA,mBAAWuB,CAAAA,aADG,CAAZmK,EAC2B,GAEjC,OAAO,CADM1D,CACN,CADkB,KAClB,CAD0B0D,CAC1B,CAAO1L,iCAAAA,CAAAA,mBAAWuB,CAAAA,aAAlB,CAPmC,CAU5CvB;iCAAAA,CAAAA,mBAAA,CAAA,cAAA,CAA+B,QAAQ,CAACuF,CAAD,CAAQ,CAE7C,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZwF,EACwB,GAD9B,CAEM0D,EAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZkJ,EACwB,GACxBY,EAAAA,CAAYtM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZ8J;AACwB,UAG9B,OAAO,CAFM,oBAEN,CAF6BtE,CAE7B,CAFyC,IAEzC,CAFgD0D,CAEhD,CAF4D,KAE5D,CADHY,CACG,CADS,GACT,CAAOtM,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAVsC,CAa/CT;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgC,QAAQ,CAACuF,CAAD,CAAQ,CAE9C,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZwF,EACwB,GACxB0D,EAAAA,CAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZkJ,EACwB,GAa9B,OAAO,CAZc1L,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,eAA5BA,CAA8C;WAC1DvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD+C;;;;;;;;;CAA9CD,CAYd,CADqB,GACrB,CAD2BvB,CAC3B,CADuC,IACvC,CAD8C0D,CAC9C,CAD0D,GAC1D,CAAO1L,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAlBuC,CAqBhDT,kCAAAA,CAAAA,mBAAA,CAAA,iBAAA,CAAkC,QAAQ,CAACuF,CAAD,CAAQ,CAEhD,MAAO,CAAC,eAAD,CAAkBvF,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAA7B,CAFyC,CAKlDT;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CAEzC,MAAMyC,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAAZwF,EACwB,GAG9B,OAAO,CAAC,aAAD,EAFWhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CACdvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UADG,CAEX,EADuB,GACvB,EAA6B,IAA7B,CAAoCwF,CAApC,CAAgD,mBAAhD,CACHhI,iCAAAA,CAAAA,mBAAWsB,CAAAA,cADR,CANkC,C,CC7X3C,IAAA,wCAAA,EAAA,CAEM3B,qDAAc,CAAA,CAAA,kCAFpB,CAGOI,kDAAA,CAAA,CAAA,qCAIPC;iCAAAA,CAAAA,mBAAA,CAAA,mBAAA,CAAoC,QAAQ,CAACuF,CAAD,CAAQ,CAElD,IAAIgH,CAGFA,EAAA,CAFEhH,CAAM6E,CAAAA,QAAN,CAAe,OAAf,CAAJ,CAEYoC,MAAA,CAAO5E,MAAA,CAAOrC,CAAMwC,CAAAA,aAAN,CAAoB,OAApB,CAAP,CAAP,CAFZ,CAMM/H,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAAlD,CANN,EAOM,GAEN,KAAI6I,EAASlL,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,IAAlC,CACb2F,EAAA,CAASlL,iCAAAA,CAAAA,mBAAWyM,CAAAA,WAAX,CAAuBvB,CAAvB,CAA+B3F,CAA/B,CACLjB,EAAAA,CAAO,EACX,OAAMoI,EACF1M,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CAAmC,OAAnC;AAA4C5M,CAAAA,CAAAA,qCAASmE,CAAAA,QAArD,CACJ,KAAI0I,EAASL,CACRA,EAAQ1C,CAAAA,KAAR,CAAc,OAAd,CAAL,EAAgClK,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqB4E,CAArB,CAAhC,GACEK,CAEA,CADI5M,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CAAmC,YAAnC,CAAiD5M,CAAAA,CAAAA,qCAASmE,CAAAA,QAA1D,CACJ,CAAAI,CAAA,EAAQ,MAAR,CAAiBsI,CAAjB,CAA0B,KAA1B,CAAkCL,CAAlC,CAA4C,KAH9C,CAOA,OAFAjI,EAEA,EAFQ,WAER,CAFsBoI,CAEtB,CAFgC,QAEhC,CAF2CA,CAE3C,CAFqD,KAErD,CAF6DE,CAE7D,CAFsE,IAEtE,CADIF,CACJ,CADc,SACd,CAD0BxB,CAC1B,CADmC,KACnC,CAzBkD,CA4BpDlL,kCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgCA,iCAAAA,CAAAA,mBAAA,CAAA,mBAEhCA;iCAAAA,CAAAA,mBAAA,CAAA,mBAAA,CAAoC,QAAQ,CAACuF,CAAD,CAAQ,CAElD,MAAMsH,EAAwC,OAAxCA,GAAQtH,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CACd,KAAIC,EACAhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CACInC,CADJ,CACW,MADX,CAEIsH,CAAA,CAAQ7M,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAAnB,CAAuCf,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAFtD,CADAwF,EAIA,OAJJ,CAKIkD,EAASlL,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,IAAlC,CACb2F,EAAA,CAASlL,iCAAAA,CAAAA,mBAAWyM,CAAAA,WAAX,CAAuBvB,CAAvB;AAA+B3F,CAA/B,CACLsH,EAAJ,GACE7E,CADF,CACc,GADd,CACoBA,CADpB,CAGA,OAAO,SAAP,CAAmBA,CAAnB,CAA+B,OAA/B,CAAyCkD,CAAzC,CAAkD,KAbA,CAgBpDlL;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,IAAMuH,EACF9M,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CAA2B0B,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAA3B,CAAuDhI,CAAAA,CAAAA,qCAASmE,CAAAA,QAAhE,CADJ,CAEM8D,EACFhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAAjD,CADE2F,EACoE,GAH1E,CAIM0D,EACF1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAoCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAA/C,CADEqJ;AACkE,GACxE,OAAMqB,EACF/M,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAoCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAA/C,CADE0K,EACkE,GACxE,KAAI7B,EAASlL,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,IAAlC,CACb2F,EAAA,CAASlL,iCAAAA,CAAAA,mBAAWyM,CAAAA,WAAX,CAAuBvB,CAAvB,CAA+B3F,CAA/B,CAET,IAAI5F,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqBK,CAArB,CAAJ,EAAuCrI,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqB+D,CAArB,CAAvC,EACI/L,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqBoF,CAArB,CADJ,CACqC,CAEnC,IAAMC,EAAKpF,MAAA,CAAOI,CAAP,CAALgF,EAA0BpF,MAAA,CAAO8D,CAAP,CAChCpH,EAAA;AAAO,OAAP,CAAiBwI,CAAjB,CAA6B,KAA7B,CAAqC9E,CAArC,CAAiD,IAAjD,CAAwD8E,CAAxD,EACKE,CAAA,CAAK,MAAL,CAAc,MADnB,EAC6BtB,CAD7B,CACyC,IADzC,CACgDoB,CAC1CG,EAAAA,CAAOpF,IAAKqF,CAAAA,GAAL,CAAStF,MAAA,CAAOmF,CAAP,CAAT,CAEXzI,EAAA,CADW,CAAb,GAAI2I,CAAJ,CACE3I,CADF,EACU0I,CAAA,CAAK,IAAL,CAAY,IADtB,EAGE1I,CAHF,GAGW0I,CAAA,CAAK,MAAL,CAAc,MAHzB,EAGmCC,CAHnC,CAKA3I,EAAA,EAAQ,OAAR,CAAkB4G,CAAlB,CAA2B,KAXQ,CADrC,IAcE5G,EA2BA,CA3BO,EA2BP,CAzBI6I,CAyBJ,CAzBenF,CAyBf,CAxBKA,CAAU6B,CAAAA,KAAV,CAAgB,OAAhB,CAwBL,EAxBkClK,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqBK,CAArB,CAwBlC,GAvBEmF,CAEA,CAFWnN,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CACPG,CADO,CACK,QADL,CACe/M,CAAAA,CAAAA,qCAASmE,CAAAA,QADxB,CAEX,CAAAI,CAAA,EAAQ,MAAR,CAAiB6I,CAAjB,CAA4B,KAA5B,CAAoCnF,CAApC,CAAgD,KAqBlD,EAnBI4E,CAmBJ,CAnBalB,CAmBb,CAlBKA,CAAU7B,CAAAA,KAAV,CAAgB,OAAhB,CAkBL,EAlBkClK,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqB+D,CAArB,CAkBlC,GAjBEkB,CAEA,CAFS5M,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CACLG,CADK;AACO,MADP,CACe/M,CAAAA,CAAAA,qCAASmE,CAAAA,QADxB,CAET,CAAAI,CAAA,EAAQ,MAAR,CAAiBsI,CAAjB,CAA0B,KAA1B,CAAkClB,CAAlC,CAA8C,KAehD,EAXM0B,CAWN,CAXepN,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CACXG,CADW,CACC,MADD,CACS/M,CAAAA,CAAAA,qCAASmE,CAAAA,QADlB,CAWf,CATAI,CASA,EATQ,MASR,CATiB8I,CASjB,CAT0B,KAS1B,CAPE9I,CAOF,CARI3E,CAAAA,CAAAA,kCAAYgI,CAAAA,QAAZ,CAAqBoF,CAArB,CAAJ,CACEzI,CADF,EACUuD,IAAKqF,CAAAA,GAAL,CAASH,CAAT,CADV,CACgC,KADhC,EAGEzI,CAHF,EAGU,WAHV,CAGwByI,CAHxB,CAGoC,MAHpC,CAQA,CAHAzI,CAGA,EAHQ,MAGR,CAHiB6I,CAGjB,CAH4B,KAG5B,CAHoCP,CAGpC,CAH6C,OAG7C,CAFAtI,CAEA,EAFQtE,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAEnB,CAF4BqC,CAE5B,CAFqC,MAErC,CAF8CA,CAE9C,CAFuD,KAEvD,CAAA9I,CAAA,CADAA,CACA,CADQ,UACR,EAAkBwI,CAAlB,CAA8B,KAA9B,CAAsCK,CAAtC,CAAiD,IAAjD,CAAwDC,CAAxD,CACI,UADJ,CACiBN,CADjB,CAC6B,MAD7B;AACsCF,CADtC,CAC+C,KAD/C,CACuDE,CADvD,CAEI,MAFJ,CAEaF,CAFb,CAEsB,IAFtB,CAE6BE,CAF7B,CAEyC,MAFzC,CAEkDM,CAFlD,CAE2D,OAF3D,CAGIlC,CAHJ,CAGa,KAHb,CAKF,OAAO5G,EA3DoC,CA8D7CtE;iCAAAA,CAAAA,mBAAA,CAAA,gBAAA,CAAiC,QAAQ,CAACuF,CAAD,CAAQ,CAE/C,MAAMuH,EACF9M,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQa,CAAAA,OAAnB,CAA2B0B,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAA3B,CAAuDhI,CAAAA,CAAAA,qCAASmE,CAAAA,QAAhE,CACJ,KAAM8D,EACFhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAAjD,CADE2F,EAEF,IACJ,KAAIkD,EAASlL,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,IAAlC,CACb2F,EAAA,CAASlL,iCAAAA,CAAAA,mBAAWyM,CAAAA,WAAX,CAAuBvB,CAAvB;AAA+B3F,CAA/B,CACLjB,EAAAA,CAAO,EAEX,KAAI+I,EAAUrF,CACTA,EAAU6B,CAAAA,KAAV,CAAgB,OAAhB,CAAL,GACEwD,CAEA,CAFUrN,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CACNG,CADM,CACM,OADN,CACe/M,CAAAA,CAAAA,qCAASmE,CAAAA,QADxB,CAEV,CAAAI,CAAA,EAAQ,MAAR,CAAiB+I,CAAjB,CAA2B,KAA3B,CAAmCrF,CAAnC,CAA+C,KAHjD,CAKMsF,EAAAA,CAAWtN,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CACbG,CADa,CACD,QADC,CACS/M,CAAAA,CAAAA,qCAASmE,CAAAA,QADlB,CAEjBgH,EAAA,CAASlL,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAApB,CAA6B+B,CAA7B,CAAyC,KAAzC,CAAiDO,CAAjD,CAA2D,GAA3D,CAAiEC,CAAjE,CACI,MADJ,CACapC,CAEb,OADA5G,EACA,EADQ,WACR,CADsBgJ,CACtB,CADiC,MACjC,CAD0CD,CAC1C,CADoD,OACpD,CAD8DnC,CAC9D,CADuE,KACvE,CAtB+C,CAyBjDlL;iCAAAA,CAAAA,mBAAA,CAAA,wBAAA,CAAyC,QAAQ,CAACuF,CAAD,CAAQ,CAEvD,IAAIgI,EAAO,EACPvN,kCAAAA,CAAAA,mBAAW4K,CAAAA,gBAAf,GAEE2C,CAFF,EAEUvN,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW4K,CAAAA,gBAA/B,CAAiDrF,CAAjD,CAFV,CAIIvF,kCAAAA,CAAAA,mBAAW8K,CAAAA,gBAAf,GAGEyC,CAHF,EAGUvN,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAA/B;AAAiDvF,CAAjD,CAHV,CAKA,IAAIvF,iCAAAA,CAAAA,mBAAW4K,CAAAA,gBAAf,CAAiC,CAC/B,MAAM4C,EAAOjI,CAAMkI,CAAAA,eAAN,EACTD,EAAJ,EAAY,CAACA,CAAKE,CAAAA,oBAAlB,GAIEH,CAJF,EAIUvN,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW4K,CAAAA,gBAA/B,CAAiD4C,CAAjD,CAJV,CAF+B,CASjC,OAAQjI,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAR,EACE,KAAK,OAAL,CACE,MAAOwF,EAAP,CAAc,UAChB,MAAK,UAAL,CACE,MAAOA,EAAP,CAAc,aAJlB,CAMA,KAAM9D,MAAA,CAAM,yBAAN,CAAN,CA3BuD,C,CC5IzD,IAAA,wCAAA,EAKAzJ;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,IAAIoI,EAAI,CACR,KAAIrJ,EAAO,EACPtE,kCAAAA,CAAAA,mBAAW4K,CAAAA,gBAAf,GAEEtG,CAFF,EAEUtE,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW4K,CAAAA,gBAA/B,CAAiDrF,CAAjD,CAFV,CAIA,GAAG,CACD,MAAMqI,EACF5N,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAqCoI,CAArC,CAAwC3N,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAnD,CADEoL,EAEF,OACJ,KAAIC,EAAa7N,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B;AAAkC,IAAlC,CAAyCoI,CAAzC,CACb3N,kCAAAA,CAAAA,mBAAW8K,CAAAA,gBAAf,GACE+C,CADF,CACe7N,iCAAAA,CAAAA,mBAAWgG,CAAAA,WAAX,CACIhG,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAA/B,CAAiDvF,CAAjD,CADJ,CAEIvF,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAFf,CADf,CAIM8C,CAJN,CAMAvJ,EAAA,GAAa,CAAJ,CAAAqJ,CAAA,CAAQ,QAAR,CAAmB,EAA5B,EAAkC,MAAlC,CAA2CC,CAA3C,CAA2D,OAA3D,CACIC,CADJ,CACiB,GACjBF,EAAA,EAbC,CAAH,MAcSpI,CAAMuI,CAAAA,QAAN,CAAe,IAAf,CAAsBH,CAAtB,CAdT,CAgBA,IAAIpI,CAAMuI,CAAAA,QAAN,CAAe,MAAf,CAAJ,EAA8B9N,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAAzC,CACM+C,CAOJ;AAPiB7N,iCAAAA,CAAAA,mBAAWmL,CAAAA,eAAX,CAA2B5F,CAA3B,CAAkC,MAAlC,CAOjB,CANIvF,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAMf,GALE+C,CAKF,CALe7N,iCAAAA,CAAAA,mBAAWgG,CAAAA,WAAX,CACIhG,iCAAAA,CAAAA,mBAAW6K,CAAAA,QAAX,CAAoB7K,iCAAAA,CAAAA,mBAAW8K,CAAAA,gBAA/B,CAAiDvF,CAAjD,CADJ,CAEIvF,iCAAAA,CAAAA,mBAAW+K,CAAAA,MAFf,CAKf,CAFM8C,CAEN,EAAAvJ,CAAA,EAAQ,WAAR,CAAsBuJ,CAAtB,CAAmC,GAErC,OAAOvJ,EAAP,CAAc,IAlC4B,CAqC5CtE;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgCA,iCAAAA,CAAAA,mBAAA,CAAA,WAEhCA;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAI5C,MAAM2D,EADFiB,CAAC,GAAM,IAAPA,CAAa,IAAO,IAApBA,CAA0B,GAAM,GAAhCA,CAAqC,IAAO,IAA5CA,CAAkD,GAAM,GAAxDA,CAA6D,IAAO,IAApEA,CACa,CAAU5E,CAAMwC,CAAAA,aAAN,CAAoB,IAApB,CAAV,CAAjB,CACMZ,EAAsB,IAAd,GAAC+B,CAAD,EAAmC,IAAnC,GAAsBA,CAAtB,CACVlJ,iCAAAA,CAAAA,mBAAW8B,CAAAA,cADD,CAEV9B,iCAAAA,CAAAA,mBAAW2B,CAAAA,gBAHf,CAIMqG,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CAAZa,EAAyD,GACzD0D,EAAAA,CAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CAAZuE,EAAyD,GAE/D,OAAO,CADM1D,CACN,CADkB,GAClB,CADwBkB,CACxB;AADmC,GACnC,CADyCwC,CACzC,CAAOvE,CAAP,CAXqC,CAc9CnH;iCAAAA,CAAAA,mBAAA,CAAA,eAAA,CAAgC,QAAQ,CAACuF,CAAD,CAAQ,CAE9C,MAAM2D,EAA0C,KAA/B,GAAC3D,CAAMwC,CAAAA,aAAN,CAAoB,IAApB,CAAD,CAAwC,IAAxC,CAA+C,IAAhE,CACMZ,EAAsB,IAAd,GAAC+B,CAAD,CAAsBlJ,iCAAAA,CAAAA,mBAAWkC,CAAAA,iBAAjC,CACsBlC,iCAAAA,CAAAA,mBAAWmC,CAAAA,gBAC/C,KAAI6F,EAAYhI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CACZuE,EAAAA,CAAY1L,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,GAA9B,CAAmC4B,CAAnC,CAChB,IAAKa,CAAL,EAAmB0D,CAAnB,CAIO,CAEL,MAAMqC,EAAgC,IAAd,GAAC7E,CAAD,CAAsB,MAAtB,CAA+B,OAClDlB,EAAL,GACEA,CADF,CACc+F,CADd,CAGKrC,EAAL,GACEA,CADF,CACcqC,CADd,CANK,CAJP,IAGErC,EAAA;AADA1D,CACA,CADY,OAad,OAAO,CADMA,CACN,CADkB,GAClB,CADwBkB,CACxB,CADmC,GACnC,CADyCwC,CACzC,CAAOvE,CAAP,CAtBuC,CAyBhDnH,kCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,MAAM4B,EAAQnH,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAGzB,OAAO,CADM,GACN,EAFWf,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsC4B,CAAtC,CAEX,EAF2D,MAE3D,EAAOA,CAAP,CALoC,CAQ7CnH,kCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAG5C,MAAO,CADuC,MAAjCjB,GAACiB,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAADzD,CAA2C,MAA3CA,CAAoD,OAC1D,CAAOtE,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CAHqC,CAM9CN;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CAEzC,MAAO,CAAC,MAAD,CAASvF,iCAAAA,CAAAA,mBAAWM,CAAAA,YAApB,CAFkC,CAK3CN;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAE5C,MAAMyI,EACFhO,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAoCvF,iCAAAA,CAAAA,mBAAWoC,CAAAA,iBAA/C,CADE4L,EAEF,OAFJ,CAGMC,EACFjO,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWoC,CAAAA,iBAAjD,CADE6L,EAEF,MACEC,EAAAA,CACFlO,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWoC,CAAAA,iBAAjD,CADE8L;AAEF,MAEJ,OAAO,CADMF,CACN,CADiB,KACjB,CADyBC,CACzB,CADsC,KACtC,CAD8CC,CAC9C,CAAOlO,iCAAAA,CAAAA,mBAAWoC,CAAAA,iBAAlB,CAZqC,C,CCrG9C,IAAA,wCAAA,EAAA,CAEOrC,kDAAA,CAAA,CAAA,qCAIPC,kCAAAA,CAAAA,mBAAA,CAAA,kBAAA,CAAmC,QAAQ,CAACuF,CAAD,CAAQ,CAEjD,MAAO,CAAC,IAAD,CAAOvF,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CAF0C,CAKnDN;iCAAAA,CAAAA,mBAAA,CAAA,iBAAA,CAAkC,QAAQ,CAACuF,CAAD,CAAQ,CAEhD,MAAMyD,EAAeC,KAAJ,CAAU1D,CAAMoD,CAAAA,UAAhB,CACjB,KAAK,IAAIjF,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6B,CAAMoD,CAAAA,UAA1B,CAAsCjF,CAAA,EAAtC,CACEsF,CAAA,CAAStF,CAAT,CAAA,CACI1D,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CAAsC7B,CAAtC,CAAyC1D,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAApD,CADJ,EAEI,MAGN,OAAO,CADM,GACN,CADYwG,CAAS3I,CAAAA,IAAT,CAAc,IAAd,CACZ,CADkC,GAClC,CAAOL,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CATyC,CAYlDN;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,MAAMgE,EAAevJ,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,aAA5B,CAA4C;WACxDtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD6C;;;;;;;CAA5C,CAArB,CASMZ,EACF5I,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAjD,CADEoG,EAC8D,MAC9DuF,EAAAA,CACFnO,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CAAqCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAhD,CADE2L,EAC6D,GAEnE,OAAO,CADM5E,CACN,CADqB,GACrB,CAD2BX,CAC3B,CADqC,IACrC,CAD4CuF,CAC5C,CAD0D,GAC1D,CAAOnO,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAhBoC,CAmB7CT;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAI3C,MAAO,EADHvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlD,CACG,EADgE,IAChE,EAAQ,SAAR,CAAmBR,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAA9B,CAJoC,CAO7CR;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAI5C,MAAO,CAAC,GAAD,EADHvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlD,CACG,EADgE,IAChE,EAAc,SAAd,CAAyBR,iCAAAA,CAAAA,mBAAWe,CAAAA,iBAApC,CAJqC,CAO9Cf;iCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAE5C,IAAM2D,EAC6B,OAA/B,GAAA3D,CAAMwC,CAAAA,aAAN,CAAoB,KAApB,CAAA,CAAyC,SAAzC,CAAqD,aACzD,OAAMqG,EACFpO,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAjD,CADE4L,EAC8D,IAG9D9J,EAAAA,EADFtE,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlD,CACE8D,EADiE,IACjEA,EAAc,GAAdA,CAAoB4E,CAApB5E,CAA+B,GAA/BA,CAAqC8J,CAArC9J,CAA4C,GAClD,OAAIiB,EAAM1C,CAAAA,SAAUuE,CAAAA,OAAQC,CAAAA,aAA5B;AACS,CAAC/C,CAAD,CAAQ,MAAR,CAAgBtE,iCAAAA,CAAAA,mBAAWyB,CAAAA,cAA3B,CADT,CAGO,CAAC6C,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAZqC,CAe9CT;iCAAAA,CAAAA,mBAAA,CAAA,cAAA,CAA+B,QAAQ,CAACuF,CAAD,CAAQ,CAG7C,MAAM8I,EAAO9I,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAPsG,EAAsC,KAA5C,CACM7F,EAAQjD,CAAMwC,CAAAA,aAAN,CAAoB,OAApB,CAARS,EAAwC,YAG9C,KAAM6D,EAAOrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CADE,QAAX+I,GAAC9F,CAAD8F,CAAuBtO,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlC8L,CAA+CtO,iCAAAA,CAAAA,mBAAWQ,CAAAA,YACjD,CAAP6L,EAA4D,IAElE,QAAQ7D,CAAR,EACE,KAAM,OAAN,CACE,GAAa,KAAb,GAAI6F,CAAJ,CAEE,MAAO,CADMhC,CACN,CADa,KACb,CAAOrM,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlB,CACF;GAAa,YAAb,GAAI6N,CAAJ,CAEL,MAAO,CADMhC,CACN,CADa,UACb,CAAOrM,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlB,CACF,IAAa,QAAb,GAAI6N,CAAJ,CACL,MAAOhC,EAAP,CAAc,aAEhB,MACF,MAAM,MAAN,CACE,GAAa,KAAb,GAAIgC,CAAJ,CAEE,MAAO,CADMhC,CACN,CADa,eACb,CAAOrM,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlB,CACF,IAAa,YAAb,GAAI6N,CAAJ,CAEL,MAAO,CADMhC,CACN,CADa,QACb,CAAOrM,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlB,CACF,IAAa,QAAb,GAAI6N,CAAJ,CACL,MAAOhC,EAAP,CAAc,WAEhB,MACF,MAAM,YAAN,CACQ5E,CAAAA,CAAKzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB;AAA8B,IAA9B,CACX,IAAa,KAAb,GAAI8I,CAAJ,CAEE,MAAO,CADMhC,CACN,CADa,GACb,CADmB5E,CACnB,CADwB,GACxB,CAAOzH,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlB,CACF,IAAa,YAAb,GAAI6N,CAAJ,CAEL,MAAO,CADMhC,CACN,CADa,UACb,CAD0B5E,CAC1B,CAD+B,SAC/B,CAAOzH,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CACF,IAAa,QAAb,GAAI4N,CAAJ,CACL,MAAOhC,EAAP,CAAc,UAAd,CAA2B5E,CAA3B,CAAgC,SAElC,MAEF,MAAM,UAAN,CACQA,CAAAA,CAAKzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,IAA9B,CAAoC,CAApC,CAAuC,CAAA,CAAvC,CACX,IAAa,KAAb,GAAI8I,CAAJ,CAEE,MAAO,CADMhC,CACN,CADa,SACb,CADyB5E,CACzB,CAD8B,MAC9B,CAAOzH,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CACF,IAAa,YAAb;AAAI4N,CAAJ,CAEL,MAAO,CADMhC,CACN,CADa,UACb,CAD0B5E,CAC1B,CAD+B,SAC/B,CAAOzH,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CACF,IAAa,QAAb,GAAI4N,CAAJ,CACL,MAAOhC,EAAP,CAAc,UAAd,CAA2B5E,CAA3B,CAAgC,OAElC,MAEF,MAAM,QAAN,CAWQnD,CAAAA,CAVetE,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,oBAA5BA,CAAmD;WACnEvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADwD;;;;;;;;CAAnDD,CAUfjF,CAAsB,GAAtBA,CAA4B+H,CAA5B/H,CAAmC,IAAnCA,EAAoD,KAApDA,GAA2C+J,CAA3C/J,EAA6D,GACnE,IAAa,KAAb,GAAI+J,CAAJ,EAA+B,YAA/B,GAAsBA,CAAtB,CACE,MAAO,CAAC/J,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CACF,IAAa,QAAb,GAAI4N,CAAJ,CACL,MAAO/J,EAAP,CAAc,KAhEpB,CAqEA,KAAMmF,MAAA,CAAM,yCAAN,CAAN,CA9E6C,CAiF/CzJ;iCAAAA,CAAAA,mBAAA,CAAA,cAAA,CAA+B,QAAQ,CAACuF,CAAD,CAAQ,CAY7CgJ,QAASA,EAAS,EAAG,CACnB,GAAIlC,CAAKxC,CAAAA,KAAL,CAAW,OAAX,CAAJ,CACE,MAAO,EAET,OAAMwD,EACFrN,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CAAmC,SAAnC,CAA8C5M,CAAAA,CAAAA,qCAASmE,CAAAA,QAAvD,CADJ,CAEMI,EAAO,MAAPA,CAAgB+I,CAAhB/I,CAA0B,KAA1BA,CAAkC+H,CAAlC/H,CAAyC,KAC/C+H,EAAA,CAAOgB,CACP,OAAO/I,EARY,CATrB,IAAI+H,EACArM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAjD,CADA6L,EACkE,IACtE,OAAMgC,EAAO9I,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAAPsG,EAAsC,KAC5C;IAAM7F,EAAQjD,CAAMwC,CAAAA,aAAN,CAAoB,OAApB,CAARS,EAAwC,YAC9C,OAAMJ,EACFpI,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,IAA9B,CAAoCvF,iCAAAA,CAAAA,mBAAWqC,CAAAA,gBAA/C,CADE+F,EAEF,MAaJ,QAAQI,CAAR,EACE,KAAM,OAAN,CACE,GAAa,KAAb,GAAI6F,CAAJ,CACE,MAAOhC,EAAP,CAAc,QAAd,CAAyBjE,CAAzB,CAAiC,KAC5B,IAAa,QAAb,GAAIiG,CAAJ,CACL,MAAOhC,EAAP,CAAc,WAAd,CAA4BjE,CAA5B,CAAoC,MAEtC,MACF,MAAM,MAAN,CACE,GAAa,KAAb,GAAIiG,CAAJ,CAGE,MAFWE,EAAAjK,EAEX,EADQ+H,CACR,CADe,GACf,CADqBA,CACrB,CAD4B,iBAC5B,CADgDjE,CAChD,CADwD,KACxD,CACK,IAAa,QAAb,GAAIiG,CAAJ,CACL,MAAOhC,EAAP,CAAc,QAAd,CAAyBjE,CAAzB,CAAiC,MAEnC,MACF,MAAM,YAAN,CACQX,CAAAA,CAAKzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB;AAA8B,IAA9B,CACX,IAAa,KAAb,GAAI8I,CAAJ,CACE,MAAOhC,EAAP,CAAc,GAAd,CAAoB5E,CAApB,CAAyB,MAAzB,CAAkCW,CAAlC,CAA0C,KACrC,IAAa,QAAb,GAAIiG,CAAJ,CACL,MAAOhC,EAAP,CAAc,UAAd,CAA2B5E,CAA3B,CAAgC,OAAhC,CAA0CW,CAA1C,CAAkD,MAEpD,MAEF,MAAM,UAAN,CACQX,CAAAA,CAAKzH,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CACPrB,CADO,CACA,IADA,CACM,CADN,CACS,CAAA,CADT,CACgBvF,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBAD3B,CAEP8C,EAAAA,CAAOiK,CAAA,EACX,IAAa,KAAb,GAAIF,CAAJ,CAEE,MADA/J,EACA,EADQ+H,CACR,CADe,GACf,CADqBA,CACrB,CAD4B,YAC5B,CAD2C5E,CAC3C,CADgD,MAChD,CADyDW,CACzD,CADiE,KACjE,CACK,IAAa,QAAb,GAAIiG,CAAJ,CAGL,MAFA/J,EAEA,EAFQ+H,CAER,CAFe,UAEf,CAF4BA,CAE5B,CAFmC,YAEnC,CAFkD5E,CAElD,CAFuD,OAEvD,CAFiEW,CAEjE,CADI,MACJ,CAEF,MAEF,MAAM,QAAN,CACM9D,CAAAA,CAAOiK,CAAA,EACLC,EAAAA,CACFxO,iCAAAA,CAAAA,mBAAWgD,CAAAA,OAAQ2J,CAAAA,eAAnB,CAAmC,MAAnC;AAA2C5M,CAAAA,CAAAA,qCAASmE,CAAAA,QAApD,CACJI,EAAA,EAAQ,MAAR,CAAiBkK,CAAjB,CAAwB,gCAAxB,CAA2DnC,CAA3D,CACI,aACJ,IAAa,KAAb,GAAIgC,CAAJ,CAEE,MADA/J,EACA,EADQ+H,CACR,CADe,GACf,CADqBmC,CACrB,CAD4B,MAC5B,CADqCpG,CACrC,CAD6C,KAC7C,CACK,IAAa,QAAb,GAAIiG,CAAJ,CAEL,MADA/J,EACA,EADQ+H,CACR,CADe,UACf,CAD4BmC,CAC5B,CADmC,OACnC,CAD6CpG,CAC7C,CADqD,MACrD,CAnDN,CAwDA,KAAMqB,MAAA,CAAM,yCAAN,CAAN,CA9E6C,CAwF/C,KAAMnB,2DAAoBA,QAAQ,CAACmG,CAAD,CAAWjG,CAAX,CAAkBC,CAAlB,CAA0B,CAC1D,MAAc,OAAd,GAAID,CAAJ,CACS,GADT,CAEqB,UAAd,GAAIA,CAAJ,CACEiG,CADF,CACa,gBADb,CACgChG,CADhC,CAEc,MAAd,GAAID,CAAJ,CACEiG,CADF,CACa,aADb,CAGEhG,CARiD,CAY5DzI;iCAAAA,CAAAA,mBAAA,CAAA,gBAAA,CAAiC,QAAQ,CAACuF,CAAD,CAAQ,CAE/C,IAAM8G,EACFrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAjD,CADE6L,EACgE,IADtE,CAEM3C,EAASnE,CAAMwC,CAAAA,aAAN,CAAoB,QAApB,CAFf,CAGM4B,EAASpE,CAAMwC,CAAAA,aAAN,CAAoB,QAApB,CAEf,IAAe,OAAf,GAAI2B,CAAJ,EAAqC,MAArC,GAA0BC,CAA1B,CACS0C,CAAP,EAAc,WADhB,KAEO,IACHA,CAAKxC,CAAAA,KAAL,CAAW,OAAX,CADG,EAES,UAFT,GAEFH,CAFE,EAEkC,YAFlC,GAEuBC,CAFvB,CAEiD,CAItD,OAAQD,CAAR,EACE,KAAK,YAAL,CACEI,CAAA,CAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACN;KACF,MAAK,UAAL,CACEuE,CAAA,CAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CACFrB,CADE,CACK,KADL,CACY,CADZ,CACe,CAAA,CADf,CACsBvF,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBADjC,CAENsI,EAAA,CAAMuC,CAAN,CAAa,YAAb,CAA4BvC,CAC5B,MACF,MAAK,OAAL,CACEA,CAAA,CAAM,GACN,MACF,SACE,KAAML,MAAA,CAAM,sCAAN,CAAN,CAbJ,CAgBA,OAAQE,CAAR,EACE,KAAK,YAAL,CACEI,CAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CAAqC,CAArC,CACN,MACF,MAAK,UAAL,CACEwE,CAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CACFrB,CADE,CACK,KADL,CACY,CADZ,CACe,CAAA,CADf,CACsBvF,iCAAAA,CAAAA,mBAAWwB,CAAAA,iBADjC,CAENuI;CAAA,CAAMsC,CAAN,CAAa,YAAb,CAA4BtC,CAC5B,MACF,MAAK,MAAL,CACEA,CAAA,CAAMsC,CAAN,CAAa,SACb,MACF,SACE,KAAM5C,MAAA,CAAM,sCAAN,CAAN,CAbJ,CAeAnF,CAAA,CAAO+H,CAAP,CAAc,SAAd,CAA0BvC,CAA1B,CAAgC,IAAhC,CAAuCC,CAAvC,CAA6C,GAnCS,CAFjD,IAsCA,CACL,MAAMD,EAAM9J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACNwE,EAAAA,CAAM/J,iCAAAA,CAAAA,mBAAW4G,CAAAA,WAAX,CAAuBrB,CAAvB,CAA8B,KAA9B,CACZ,OAAMyE,EAAkB,CACtB,MAAS,OADa,CAEtB,KAAQ,MAFc,CAGtB,WAAc,WAHQ,CAItB,SAAY,SAJU,CAoBxB1F,EAAA,CARqBtE,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CACjB,aADiBA,CACDS,CAAA,CAAgBN,CAAhB,CADCH,CACyBS,CAAA,CAAgBL,CAAhB,CADzBJ,CACmD;WACjEvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADsD,YAJxD,UAAZS,GAACP,CAADO,EAAqC,YAArCA,GAA0BP,CAA1BO,CAAqD,OAArDA,CAA+D,EAIK,GAFxD,UAAZC,GAACP,CAADO,EAAqC,YAArCA,GAA0BP,CAA1BO,CAAqD,OAArDA,CAA+D,EAEK;gBAE5D5B,0DAAA,CAAkB,UAAlB,CAA8BoB,CAA9B,CAAsC,KAAtC,CAF4D;cAG9DpB,0DAAA,CAAkB,UAAlB,CAA8BqB,CAA9B,CAAsC,KAAtC,CAH8D;;;CADnDJ,CAQrB,CAAsB,GAAtB,CAA4B8C,CAA5B,EAGiB,UAAZ,GAAC3C,CAAD,EAAqC,YAArC,GAA0BA,CAA1B,CAAqD,IAArD,CAA4DI,CAA5D,CAAkE,EAHvE,GAIiB,UAAZ,GAACH,CAAD,EAAqC,YAArC,GAA0BA,CAA1B,CAAqD,IAArD,CAA4DI,CAA5D,CAAkE,EAJvE,EAKI,GA5BC,CA8BP,MAAO,CAACzF,CAAD,CAAOtE,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CA7EwC,CAgFjDT;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CAEzC,MAAM8G,EACFrM,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAjD,CADE4L,EAEF,IAFJ,CAGMqC,EAAiD,GAArC,GAAAnJ,CAAMwC,CAAAA,aAAN,CAAoB,WAApB,CAAA,CAA2C,CAA3C,CAA+C,CAAC,CAC5D7B,EAAAA,CAAOX,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CACb,OAAM4G,EACF3O,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAX,CAA4B,qBAA5B,CAAoD;WAC/CtJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BADoC;;;;;;;;;;;;OAApD,CAcJ,OAAO,CACL6C,CADK,CACE,gBADF,CACqBsC,CADrB,CAC8C,IAD9C,CACqDzI,CADrD,CAC4D,KAD5D,CAEDwI,CAFC,CAEW,IAFX,CAGL1O,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAHN,CAtBkC,CA6B3CT;iCAAAA,CAAAA,mBAAA,CAAA,WAAA,CAA4B,QAAQ,CAACuF,CAAD,CAAQ,CAE1C,IAAIqJ,EAAQ5O,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWQ,CAAAA,YAAlD,CACZ,OAAMqO,EACF7O,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlD,CADEqM,EAC+D,IAC/DR,EAAAA,CAAO9I,CAAMwC,CAAAA,aAAN,CAAoB,MAApB,CAEb,IAAa,OAAb,GAAIsG,CAAJ,CACOO,CAGL,GAFEA,CAEF,CAFU,IAEV,EAAArF,CAAA,CAAe,OAJjB,KAKO,IAAa,MAAb,GAAI8E,CAAJ,CACAO,CAGL,GAFEA,CAEF,CAFU,IAEV,EAAArF,CAAA,CAAe,MAJV,KAML,MAAME,MAAA,CAAM,gBAAN;AAAyB4E,CAAzB,CAAN,CAGF,MAAO,CADMO,CACN,CADc,GACd,CADoBrF,CACpB,CADmC,GACnC,CADyCsF,CACzC,CADqD,GACrD,CAAO7O,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CArBmC,CAwB5CT,kCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAM5C,MAAO,EAHHvF,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAjD,CAGG,EAFH,IAEG,EADa,oBACb,CAAOT,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CANqC,C,CClY9C,IAAA,yCAAA,EAKAT,kCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAG5C,MAAO,CADMvF,iCAAAA,CAAAA,mBAAW4E,CAAAA,MAAXN,CAAkBiB,CAAMwC,CAAAA,aAAN,CAAoB,QAApB,CAAlBzD,CACN,CAAOtE,iCAAAA,CAAAA,mBAAWM,CAAAA,YAAlB,CAHqC,CAM9CN,kCAAAA,CAAAA,mBAAA,CAAA,aAAA,CAA8B,QAAQ,CAACuF,CAAD,CAAQ,CAS5C,MAAO,CAPcvF,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,cAA5BA,CAA6C;WACzDvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD8C;;;;CAA7CD,CAOd,CADqB,IACrB,CAAOvJ,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CATqC,CAY9CT;iCAAAA,CAAAA,mBAAA,CAAA,UAAA,CAA2B,QAAQ,CAACuF,CAAD,CAAQ,CAEzC,MAAMuJ,EAAM9O,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,KAA9B,CAAqCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAhD,CAANsM,EAAqE,CAA3E,CACMC,EACF/O,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlD,CADEuM,EAC+D,CAC/DC,EAAAA,CACFhP,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,MAA9B,CAAsCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAjD,CADEwM;AAC8D,CAapE,OAAO,CAZchP,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,WAA5BA,CAA0C;WACtDvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD2C;;;;;;;;;CAA1CD,CAYd,CADqB,GACrB,CAD2BuF,CAC3B,CADiC,IACjC,CADwCC,CACxC,CADgD,IAChD,CADuDC,CACvD,CAD8D,GAC9D,CAAOhP,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CAnBkC,CAsB3CT;iCAAAA,CAAAA,mBAAA,CAAA,YAAA,CAA6B,QAAQ,CAACuF,CAAD,CAAQ,CAE3C,MAAM0J,EAAKjP,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,SAA9B,CAAyCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAApD,CAALyM,EACF,WADJ,CAEMC,EAAKlP,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,SAA9B,CAAyCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAApD,CAAL0M,EACF,WACEC,EAAAA,CACFnP,iCAAAA,CAAAA,mBAAW0H,CAAAA,WAAX,CAAuBnC,CAAvB,CAA8B,OAA9B,CAAuCvF,iCAAAA,CAAAA,mBAAWwC,CAAAA,UAAlD,CADE2M;AAC+D,EAoBrE,OAAO,CAnBcnP,iCAAAA,CAAAA,mBAAWsJ,CAAAA,gBAAXC,CAA4B,aAA5BA,CAA4C;WACxDvJ,iCAAAA,CAAAA,mBAAWwJ,CAAAA,0BAD6C;;;;;;;;;;;;;;;;CAA5CD,CAmBd,CADqB,GACrB,CAD2B0F,CAC3B,CADgC,IAChC,CADuCC,CACvC,CAD4C,IAC5C,CADmDC,CACnD,CAD2D,GAC3D,CAAOnP,iCAAAA,CAAAA,mBAAWS,CAAAA,mBAAlB,CA3BoC,C,CC9B7C,IAAA2O,sCAAUC","file":"javascript_compressed.js","sourcesContent":["/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Helper functions for generating JavaScript for blocks.\n * @suppress {checkTypes|globalThis}\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript');\n\nconst Variables = goog.require('Blockly.Variables');\nconst objectUtils = goog.require('Blockly.utils.object');\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {Block} = goog.requireType('Blockly.Block');\nconst {Generator} = goog.require('Blockly.Generator');\nconst {inputTypes} = goog.require('Blockly.inputTypes');\nconst {Names, NameType} = goog.require('Blockly.Names');\nconst {Workspace} = goog.requireType('Blockly.Workspace');\n\n\n/**\n * JavaScript code generator.\n * @type {!Generator}\n */\nconst JavaScript = new Generator('JavaScript');\n\n/**\n * List of illegal variable names.\n * This is not intended to be a security feature. Blockly is 100% client-side,\n * so bypassing this list is trivial. This is intended to prevent users from\n * accidentally clobbering a built-in object or function.\n */\nJavaScript.addReservedWords(\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords\n 'break,case,catch,class,const,continue,debugger,default,delete,do,else,export,extends,finally,for,function,if,import,in,instanceof,new,return,super,switch,this,throw,try,typeof,var,void,while,with,yield,' +\n 'enum,' +\n 'implements,interface,let,package,private,protected,public,static,' +\n 'await,' +\n 'null,true,false,' +\n // Magic variable.\n 'arguments,' +\n // Everything in the current environment (835 items in Chrome, 104 in Node).\n Object.getOwnPropertyNames(globalThis).join(','));\n\n/**\n * Order of operation ENUMs.\n * https://developer.mozilla.org/en/JavaScript/Reference/Operators/Operator_Precedence\n */\nJavaScript.ORDER_ATOMIC = 0; // 0 \"\" ...\nJavaScript.ORDER_NEW = 1.1; // new\nJavaScript.ORDER_MEMBER = 1.2; // . []\nJavaScript.ORDER_FUNCTION_CALL = 2; // ()\nJavaScript.ORDER_INCREMENT = 3; // ++\nJavaScript.ORDER_DECREMENT = 3; // --\nJavaScript.ORDER_BITWISE_NOT = 4.1; // ~\nJavaScript.ORDER_UNARY_PLUS = 4.2; // +\nJavaScript.ORDER_UNARY_NEGATION = 4.3; // -\nJavaScript.ORDER_LOGICAL_NOT = 4.4; // !\nJavaScript.ORDER_TYPEOF = 4.5; // typeof\nJavaScript.ORDER_VOID = 4.6; // void\nJavaScript.ORDER_DELETE = 4.7; // delete\nJavaScript.ORDER_AWAIT = 4.8; // await\nJavaScript.ORDER_EXPONENTIATION = 5.0; // **\nJavaScript.ORDER_MULTIPLICATION = 5.1; // *\nJavaScript.ORDER_DIVISION = 5.2; // /\nJavaScript.ORDER_MODULUS = 5.3; // %\nJavaScript.ORDER_SUBTRACTION = 6.1; // -\nJavaScript.ORDER_ADDITION = 6.2; // +\nJavaScript.ORDER_BITWISE_SHIFT = 7; // << >> >>>\nJavaScript.ORDER_RELATIONAL = 8; // < <= > >=\nJavaScript.ORDER_IN = 8; // in\nJavaScript.ORDER_INSTANCEOF = 8; // instanceof\nJavaScript.ORDER_EQUALITY = 9; // == != === !==\nJavaScript.ORDER_BITWISE_AND = 10; // &\nJavaScript.ORDER_BITWISE_XOR = 11; // ^\nJavaScript.ORDER_BITWISE_OR = 12; // |\nJavaScript.ORDER_LOGICAL_AND = 13; // &&\nJavaScript.ORDER_LOGICAL_OR = 14; // ||\nJavaScript.ORDER_CONDITIONAL = 15; // ?:\nJavaScript.ORDER_ASSIGNMENT = 16; // = += -= **= *= /= %= <<= >>= ...\nJavaScript.ORDER_YIELD = 17; // yield\nJavaScript.ORDER_COMMA = 18; // ,\nJavaScript.ORDER_NONE = 99; // (...)\n\n/**\n * List of outer-inner pairings that do NOT require parentheses.\n * @type {!Array>}\n */\nJavaScript.ORDER_OVERRIDES = [\n // (foo()).bar -> foo().bar\n // (foo())[0] -> foo()[0]\n [JavaScript.ORDER_FUNCTION_CALL, JavaScript.ORDER_MEMBER],\n // (foo())() -> foo()()\n [JavaScript.ORDER_FUNCTION_CALL, JavaScript.ORDER_FUNCTION_CALL],\n // (foo.bar).baz -> foo.bar.baz\n // (foo.bar)[0] -> foo.bar[0]\n // (foo[0]).bar -> foo[0].bar\n // (foo[0])[1] -> foo[0][1]\n [JavaScript.ORDER_MEMBER, JavaScript.ORDER_MEMBER],\n // (foo.bar)() -> foo.bar()\n // (foo[0])() -> foo[0]()\n [JavaScript.ORDER_MEMBER, JavaScript.ORDER_FUNCTION_CALL],\n\n // !(!foo) -> !!foo\n [JavaScript.ORDER_LOGICAL_NOT, JavaScript.ORDER_LOGICAL_NOT],\n // a * (b * c) -> a * b * c\n [JavaScript.ORDER_MULTIPLICATION, JavaScript.ORDER_MULTIPLICATION],\n // a + (b + c) -> a + b + c\n [JavaScript.ORDER_ADDITION, JavaScript.ORDER_ADDITION],\n // a && (b && c) -> a && b && c\n [JavaScript.ORDER_LOGICAL_AND, JavaScript.ORDER_LOGICAL_AND],\n // a || (b || c) -> a || b || c\n [JavaScript.ORDER_LOGICAL_OR, JavaScript.ORDER_LOGICAL_OR]\n];\n\n/**\n * Whether the init method has been called.\n * @type {?boolean}\n */\nJavaScript.isInitialized = false;\n\n/**\n * Initialise the database of variable names.\n * @param {!Workspace} workspace Workspace to generate code from.\n */\nJavaScript.init = function(workspace) {\n // Call Blockly.Generator's init.\n Object.getPrototypeOf(this).init.call(this);\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_);\n } else {\n this.nameDB_.reset();\n }\n\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n const defvars = [];\n // Add developer variables (not created or named by the user).\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n defvars.push(\n this.nameDB_.getName(devVarList[i], NameType.DEVELOPER_VARIABLE));\n }\n\n // Add user variables, but only ones that are being used.\n const variables = Variables.allUsedVarModels(workspace);\n for (let i = 0; i < variables.length; i++) {\n defvars.push(this.nameDB_.getName(variables[i].getId(), NameType.VARIABLE));\n }\n\n // Declare all of the variables.\n if (defvars.length) {\n this.definitions_['variables'] = 'var ' + defvars.join(', ') + ';';\n }\n this.isInitialized = true;\n};\n\n/**\n * Prepend the generated code with the variable definitions.\n * @param {string} code Generated code.\n * @return {string} Completed code.\n */\nJavaScript.finish = function(code) {\n // Convert the definitions dictionary into a list.\n const definitions = objectUtils.values(this.definitions_);\n // Call Blockly.Generator's finish.\n code = Object.getPrototypeOf(this).finish.call(this, code);\n this.isInitialized = false;\n\n this.nameDB_.reset();\n return definitions.join('\\n\\n') + '\\n\\n\\n' + code;\n};\n\n/**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything. A trailing semicolon is needed to make this legal.\n * @param {string} line Line of generated code.\n * @return {string} Legal line of code.\n */\nJavaScript.scrubNakedValue = function(line) {\n return line + ';\\n';\n};\n\n/**\n * Encode a string as a properly escaped JavaScript string, complete with\n * quotes.\n * @param {string} string Text to encode.\n * @return {string} JavaScript string.\n * @protected\n */\nJavaScript.quote_ = function(string) {\n // Can't use goog.string.quote since Google's style guide recommends\n // JS string literals use single quotes.\n string = string.replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\\\n')\n .replace(/'/g, '\\\\\\'');\n return '\\'' + string + '\\'';\n};\n\n/**\n * Encode a string as a properly escaped multiline JavaScript string, complete\n * with quotes.\n * @param {string} string Text to encode.\n * @return {string} JavaScript string.\n * @protected\n */\nJavaScript.multiline_quote_ = function(string) {\n // Can't use goog.string.quote since Google's style guide recommends\n // JS string literals use single quotes.\n const lines = string.split(/\\n/g).map(this.quote_);\n return lines.join(' + \\'\\\\n\\' +\\n');\n};\n\n/**\n * Common tasks for generating JavaScript from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n * @param {!Block} block The current block.\n * @param {string} code The JavaScript code created for this block.\n * @param {boolean=} opt_thisOnly True to generate code for only this statement.\n * @return {string} JavaScript code with comments and subsequent blocks added.\n * @protected\n */\nJavaScript.scrub_ = function(block, code, opt_thisOnly) {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment + '\\n', '// ');\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '// ');\n }\n }\n }\n }\n }\n const nextBlock = block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = opt_thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n};\n\n/**\n * Gets a property and adjusts the value while taking into account indexing.\n * @param {!Block} block The block.\n * @param {string} atId The property ID of the element to get.\n * @param {number=} opt_delta Value to add.\n * @param {boolean=} opt_negate Whether to negate the value.\n * @param {number=} opt_order The highest order acting on this value.\n * @return {string|number}\n */\nJavaScript.getAdjusted = function(\n block, atId, opt_delta, opt_negate, opt_order) {\n let delta = opt_delta || 0;\n let order = opt_order || this.ORDER_NONE;\n if (block.workspace.options.oneBasedIndex) {\n delta--;\n }\n const defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\n\n let innerOrder;\n let outerOrder = order;\n if (delta > 0) {\n outerOrder = this.ORDER_ADDITION;\n innerOrder = this.ORDER_ADDITION;\n } else if (delta < 0) {\n outerOrder = this.ORDER_SUBTRACTION;\n innerOrder = this.ORDER_SUBTRACTION;\n } else if (opt_negate) {\n outerOrder = this.ORDER_UNARY_NEGATION;\n innerOrder = this.ORDER_UNARY_NEGATION;\n }\n\n let at = this.valueToCode(block, atId, outerOrder) || defaultAtIndex;\n\n if (stringUtils.isNumber(at)) {\n // If the index is a naked number, adjust it right now.\n at = Number(at) + delta;\n if (opt_negate) {\n at = -at;\n }\n } else {\n // If the index is dynamic, adjust it in code.\n if (delta > 0) {\n at = at + ' + ' + delta;\n } else if (delta < 0) {\n at = at + ' - ' + -delta;\n }\n if (opt_negate) {\n if (delta) {\n at = '-(' + at + ')';\n } else {\n at = '-' + at;\n }\n }\n innerOrder = Math.floor(innerOrder);\n order = Math.floor(order);\n if (innerOrder && order >= innerOrder) {\n at = '(' + at + ')';\n }\n }\n return at;\n};\n\nexports.javascriptGenerator = JavaScript;\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.variables');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\nJavaScript['variables_get'] = function(block) {\n // Variable getter.\n const code = JavaScript.nameDB_.getName(block.getFieldValue('VAR'),\n NameType.VARIABLE);\n return [code, JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['variables_set'] = function(block) {\n // Variable setter.\n const argument0 = JavaScript.valueToCode(\n block, 'VALUE', JavaScript.ORDER_ASSIGNMENT) || '0';\n const varName = JavaScript.nameDB_.getName(\n block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = ' + argument0 + ';\\n';\n};\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for dynamic variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.variablesDynamic');\n\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.JavaScript.variables');\n\n\n// JavaScript is dynamically typed.\nJavaScript['variables_get_dynamic'] = JavaScript['variables_get'];\nJavaScript['variables_set_dynamic'] = JavaScript['variables_set'];\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for text blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.texts');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\n/**\n * Regular expression to detect a single-quoted string literal.\n */\nconst strRegExp = /^\\s*'([^']|\\\\')*'\\s*$/;\n\n/**\n * Enclose the provided value in 'String(...)' function.\n * Leave string literals alone.\n * @param {string} value Code evaluating to a value.\n * @return {Array} Array containing code evaluating to a string\n * and the order of the returned code.[string, number]\n */\nconst forceString = function(value) {\n if (strRegExp.test(value)) {\n return [value, JavaScript.ORDER_ATOMIC];\n }\n return ['String(' + value + ')', JavaScript.ORDER_FUNCTION_CALL];\n};\n\n/**\n * Returns an expression calculating the index into a string.\n * @param {string} stringName Name of the string, used to calculate length.\n * @param {string} where The method of indexing, selected by dropdown in Blockly\n * @param {string=} opt_at The optional offset when indexing from start/end.\n * @return {string|undefined} Index expression.\n */\nconst getSubstringIndex = function(stringName, where, opt_at) {\n if (where === 'FIRST') {\n return '0';\n } else if (where === 'FROM_END') {\n return stringName + '.length - 1 - ' + opt_at;\n } else if (where === 'LAST') {\n return stringName + '.length - 1';\n } else {\n return opt_at;\n }\n};\n\nJavaScript['text'] = function(block) {\n // Text value.\n const code = JavaScript.quote_(block.getFieldValue('TEXT'));\n return [code, JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['text_multiline'] = function(block) {\n // Text value.\n const code = JavaScript.multiline_quote_(block.getFieldValue('TEXT'));\n const order = code.indexOf('+') !== -1 ? JavaScript.ORDER_ADDITION :\n JavaScript.ORDER_ATOMIC;\n return [code, order];\n};\n\nJavaScript['text_join'] = function(block) {\n // Create a string made up of any number of elements of any type.\n switch (block.itemCount_) {\n case 0:\n return [\"''\", JavaScript.ORDER_ATOMIC];\n case 1: {\n const element = JavaScript.valueToCode(block, 'ADD0',\n JavaScript.ORDER_NONE) || \"''\";\n const codeAndOrder = forceString(element);\n return codeAndOrder;\n }\n case 2: {\n const element0 = JavaScript.valueToCode(block, 'ADD0',\n JavaScript.ORDER_NONE) || \"''\";\n const element1 = JavaScript.valueToCode(block, 'ADD1',\n JavaScript.ORDER_NONE) || \"''\";\n const code = forceString(element0)[0] +\n ' + ' + forceString(element1)[0];\n return [code, JavaScript.ORDER_ADDITION];\n }\n default: {\n const elements = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] = JavaScript.valueToCode(block, 'ADD' + i,\n JavaScript.ORDER_NONE) || \"''\";\n }\n const code = '[' + elements.join(',') + '].join(\\'\\')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n }\n};\n\nJavaScript['text_append'] = function(block) {\n // Append to a variable in place.\n const varName = JavaScript.nameDB_.getName(\n block.getFieldValue('VAR'), NameType.VARIABLE);\n const value = JavaScript.valueToCode(block, 'TEXT',\n JavaScript.ORDER_NONE) || \"''\";\n const code = varName + ' += ' +\n forceString(value)[0] + ';\\n';\n return code;\n};\n\nJavaScript['text_length'] = function(block) {\n // String or array length.\n const text = JavaScript.valueToCode(block, 'VALUE',\n JavaScript.ORDER_MEMBER) || \"''\";\n return [text + '.length', JavaScript.ORDER_MEMBER];\n};\n\nJavaScript['text_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const text = JavaScript.valueToCode(block, 'VALUE',\n JavaScript.ORDER_MEMBER) || \"''\";\n return ['!' + text + '.length', JavaScript.ORDER_LOGICAL_NOT];\n};\n\nJavaScript['text_indexOf'] = function(block) {\n // Search the text for a substring.\n const operator = block.getFieldValue('END') === 'FIRST' ?\n 'indexOf' : 'lastIndexOf';\n const substring = JavaScript.valueToCode(block, 'FIND',\n JavaScript.ORDER_NONE) || \"''\";\n const text = JavaScript.valueToCode(block, 'VALUE',\n JavaScript.ORDER_MEMBER) || \"''\";\n const code = text + '.' + operator + '(' + substring + ')';\n // Adjust index if using one-based indices.\n if (block.workspace.options.oneBasedIndex) {\n return [code + ' + 1', JavaScript.ORDER_ADDITION];\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_charAt'] = function(block) {\n // Get letter at index.\n // Note: Until January 2013 this block did not have the WHERE input.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const textOrder = (where === 'RANDOM') ? JavaScript.ORDER_NONE :\n JavaScript.ORDER_MEMBER;\n const text = JavaScript.valueToCode(block, 'VALUE', textOrder) || \"''\";\n switch (where) {\n case 'FIRST': {\n const code = text + '.charAt(0)';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n case 'LAST': {\n const code = text + '.slice(-1)';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n case 'FROM_START': {\n const at = JavaScript.getAdjusted(block, 'AT');\n // Adjust index if using one-based indices.\n const code = text + '.charAt(' + at + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n case 'FROM_END': {\n const at = JavaScript.getAdjusted(block, 'AT', 1, true);\n const code = text + '.slice(' + at + ').charAt(0)';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n case 'RANDOM': {\n const functionName = JavaScript.provideFunction_('textRandomLetter', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(text) {\n var x = Math.floor(Math.random() * text.length);\n return text[x];\n}\n`);\n const code = functionName + '(' + text + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n }\n throw Error('Unhandled option (text_charAt).');\n};\n\nJavaScript['text_getSubstring'] = function(block) {\n // Get substring.\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const requiresLengthCall = (where1 !== 'FROM_END' && where1 !== 'LAST' &&\n where2 !== 'FROM_END' && where2 !== 'LAST');\n const textOrder = requiresLengthCall ? JavaScript.ORDER_MEMBER :\n JavaScript.ORDER_NONE;\n const text = JavaScript.valueToCode(block, 'STRING', textOrder) || \"''\";\n let code;\n if (where1 === 'FIRST' && where2 === 'LAST') {\n code = text;\n return [code, JavaScript.ORDER_NONE];\n } else if (text.match(/^'?\\w+'?$/) || requiresLengthCall) {\n // If the text is a variable or literal or doesn't require a call for\n // length, don't generate a helper function.\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = JavaScript.getAdjusted(block, 'AT1');\n break;\n case 'FROM_END':\n at1 = JavaScript.getAdjusted(block, 'AT1', 1, false,\n JavaScript.ORDER_SUBTRACTION);\n at1 = text + '.length - ' + at1;\n break;\n case 'FIRST':\n at1 = '0';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring).');\n }\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = JavaScript.getAdjusted(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = JavaScript.getAdjusted(block, 'AT2', 0, false,\n JavaScript.ORDER_SUBTRACTION);\n at2 = text + '.length - ' + at2;\n break;\n case 'LAST':\n at2 = text + '.length';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring).');\n }\n code = text + '.slice(' + at1 + ', ' + at2 + ')';\n } else {\n const at1 = JavaScript.getAdjusted(block, 'AT1');\n const at2 = JavaScript.getAdjusted(block, 'AT2');\n const wherePascalCase = {'FIRST': 'First', 'LAST': 'Last',\n 'FROM_START': 'FromStart', 'FROM_END': 'FromEnd'};\n // The value for 'FROM_END' and'FROM_START' depends on `at` so\n // we add it as a parameter.\n const at1Param =\n (where1 === 'FROM_END' || where1 === 'FROM_START') ? ', at1' : '';\n const at2Param =\n (where2 === 'FROM_END' || where2 === 'FROM_START') ? ', at2' : '';\n const functionName = JavaScript.provideFunction_(\n 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(sequence${at1Param}${at2Param}) {\n var start = ${getSubstringIndex('sequence', where1, 'at1')};\n var end = ${getSubstringIndex('sequence', where2, 'at2')} + 1;\n return sequence.slice(start, end);\n}\n`);\n code = functionName + '(' + text +\n // The value for 'FROM_END' and 'FROM_START' depends on `at` so we\n // pass it.\n ((where1 === 'FROM_END' || where1 === 'FROM_START') ? ', ' + at1 : '') +\n ((where2 === 'FROM_END' || where2 === 'FROM_START') ? ', ' + at2 : '') +\n ')';\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_changeCase'] = function(block) {\n // Change capitalization.\n const OPERATORS = {\n 'UPPERCASE': '.toUpperCase()',\n 'LOWERCASE': '.toLowerCase()',\n 'TITLECASE': null,\n };\n const operator = OPERATORS[block.getFieldValue('CASE')];\n const textOrder = operator ? JavaScript.ORDER_MEMBER : JavaScript.ORDER_NONE;\n const text = JavaScript.valueToCode(block, 'TEXT', textOrder) || \"''\";\n let code;\n if (operator) {\n // Upper and lower case are functions built into JavaScript.\n code = text + operator;\n } else {\n // Title case is not a native JavaScript function. Define one.\n const functionName = JavaScript.provideFunction_('textToTitleCase', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(str) {\n return str.replace(/\\\\S+/g,\n function(txt) {return txt[0].toUpperCase() + txt.substring(1).toLowerCase();});\n}\n`);\n code = functionName + '(' + text + ')';\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_trim'] = function(block) {\n // Trim spaces.\n const OPERATORS = {\n 'LEFT': \".replace(/^[\\\\s\\\\xa0]+/, '')\",\n 'RIGHT': \".replace(/[\\\\s\\\\xa0]+$/, '')\",\n 'BOTH': '.trim()',\n };\n const operator = OPERATORS[block.getFieldValue('MODE')];\n const text = JavaScript.valueToCode(block, 'TEXT',\n JavaScript.ORDER_MEMBER) || \"''\";\n return [text + operator, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_print'] = function(block) {\n // Print statement.\n const msg = JavaScript.valueToCode(block, 'TEXT',\n JavaScript.ORDER_NONE) || \"''\";\n return 'window.alert(' + msg + ');\\n';\n};\n\nJavaScript['text_prompt_ext'] = function(block) {\n // Prompt function.\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = JavaScript.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = JavaScript.valueToCode(block, 'TEXT', JavaScript.ORDER_NONE) || \"''\";\n }\n let code = 'window.prompt(' + msg + ')';\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'Number(' + code + ')';\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_prompt'] = JavaScript['text_prompt_ext'];\n\nJavaScript['text_count'] = function(block) {\n const text = JavaScript.valueToCode(block, 'TEXT',\n JavaScript.ORDER_NONE) || \"''\";\n const sub = JavaScript.valueToCode(block, 'SUB',\n JavaScript.ORDER_NONE) || \"''\";\n const functionName = JavaScript.provideFunction_('textCount', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(haystack, needle) {\n if (needle.length === 0) {\n return haystack.length + 1;\n } else {\n return haystack.split(needle).length - 1;\n }\n}\n`);\n const code = functionName + '(' + text + ', ' + sub + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['text_replace'] = function(block) {\n const text = JavaScript.valueToCode(block, 'TEXT',\n JavaScript.ORDER_NONE) || \"''\";\n const from = JavaScript.valueToCode(block, 'FROM',\n JavaScript.ORDER_NONE) || \"''\";\n const to = JavaScript.valueToCode(block, 'TO', JavaScript.ORDER_NONE) || \"''\";\n // The regex escaping code below is taken from the implementation of\n // goog.string.regExpEscape.\n const functionName = JavaScript.provideFunction_('textReplace', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(haystack, needle, replacement) {\n needle = needle.replace(/([-()\\\\[\\\\]{}+?*.$\\\\^|,:#= 0 ? JavaScript.ORDER_ATOMIC :\n JavaScript.ORDER_UNARY_NEGATION;\n return [code, order];\n};\n\nJavaScript['math_arithmetic'] = function(block) {\n // Basic arithmetic operators, and power.\n const OPERATORS = {\n 'ADD': [' + ', JavaScript.ORDER_ADDITION],\n 'MINUS': [' - ', JavaScript.ORDER_SUBTRACTION],\n 'MULTIPLY': [' * ', JavaScript.ORDER_MULTIPLICATION],\n 'DIVIDE': [' / ', JavaScript.ORDER_DIVISION],\n 'POWER': [null, JavaScript.ORDER_NONE], // Handle power separately.\n };\n const tuple = OPERATORS[block.getFieldValue('OP')];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = JavaScript.valueToCode(block, 'A', order) || '0';\n const argument1 = JavaScript.valueToCode(block, 'B', order) || '0';\n let code;\n // Power in JavaScript requires a special case since it has no operator.\n if (!operator) {\n code = 'Math.pow(' + argument0 + ', ' + argument1 + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n code = argument0 + operator + argument1;\n return [code, order];\n};\n\nJavaScript['math_single'] = function(block) {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let code;\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n arg = JavaScript.valueToCode(block, 'NUM',\n JavaScript.ORDER_UNARY_NEGATION) || '0';\n if (arg[0] === '-') {\n // --3 is not legal in JS.\n arg = ' ' + arg;\n }\n code = '-' + arg;\n return [code, JavaScript.ORDER_UNARY_NEGATION];\n }\n if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {\n arg = JavaScript.valueToCode(block, 'NUM',\n JavaScript.ORDER_DIVISION) || '0';\n } else {\n arg = JavaScript.valueToCode(block, 'NUM',\n JavaScript.ORDER_NONE) || '0';\n }\n // First, handle cases which generate values that don't need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ABS':\n code = 'Math.abs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'Math.sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'Math.log(' + arg + ')';\n break;\n case 'EXP':\n code = 'Math.exp(' + arg + ')';\n break;\n case 'POW10':\n code = 'Math.pow(10,' + arg + ')';\n break;\n case 'ROUND':\n code = 'Math.round(' + arg + ')';\n break;\n case 'ROUNDUP':\n code = 'Math.ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'Math.floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'Math.sin(' + arg + ' / 180 * Math.PI)';\n break;\n case 'COS':\n code = 'Math.cos(' + arg + ' / 180 * Math.PI)';\n break;\n case 'TAN':\n code = 'Math.tan(' + arg + ' / 180 * Math.PI)';\n break;\n }\n if (code) {\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n }\n // Second, handle cases which generate values that may need parentheses\n // wrapping the code.\n switch (operator) {\n case 'LOG10':\n code = 'Math.log(' + arg + ') / Math.log(10)';\n break;\n case 'ASIN':\n code = 'Math.asin(' + arg + ') / Math.PI * 180';\n break;\n case 'ACOS':\n code = 'Math.acos(' + arg + ') / Math.PI * 180';\n break;\n case 'ATAN':\n code = 'Math.atan(' + arg + ') / Math.PI * 180';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, JavaScript.ORDER_DIVISION];\n};\n\nJavaScript['math_constant'] = function(block) {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS = {\n 'PI': ['Math.PI', JavaScript.ORDER_MEMBER],\n 'E': ['Math.E', JavaScript.ORDER_MEMBER],\n 'GOLDEN_RATIO': ['(1 + Math.sqrt(5)) / 2', JavaScript.ORDER_DIVISION],\n 'SQRT2': ['Math.SQRT2', JavaScript.ORDER_MEMBER],\n 'SQRT1_2': ['Math.SQRT1_2', JavaScript.ORDER_MEMBER],\n 'INFINITY': ['Infinity', JavaScript.ORDER_ATOMIC],\n };\n return CONSTANTS[block.getFieldValue('CONSTANT')];\n};\n\nJavaScript['math_number_property'] = function(block) {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES = {\n 'EVEN': [' % 2 === 0', JavaScript.ORDER_MODULUS, JavaScript.ORDER_EQUALITY],\n 'ODD': [' % 2 === 1', JavaScript.ORDER_MODULUS, JavaScript.ORDER_EQUALITY],\n 'WHOLE': [' % 1 === 0', JavaScript.ORDER_MODULUS,\n JavaScript.ORDER_EQUALITY],\n 'POSITIVE': [' > 0', JavaScript.ORDER_RELATIONAL,\n JavaScript.ORDER_RELATIONAL],\n 'NEGATIVE': [' < 0', JavaScript.ORDER_RELATIONAL,\n JavaScript.ORDER_RELATIONAL],\n 'DIVISIBLE_BY': [null, JavaScript.ORDER_MODULUS, JavaScript.ORDER_EQUALITY],\n 'PRIME': [null, JavaScript.ORDER_NONE, JavaScript.ORDER_FUNCTION_CALL],\n };\n const dropdownProperty = block.getFieldValue('PROPERTY');\n const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck = JavaScript.valueToCode(block, 'NUMBER_TO_CHECK',\n inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n const functionName = JavaScript.provideFunction_('mathIsPrime', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if (n == 2 || n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (isNaN(n) || n <= 1 || n % 1 !== 0 || n % 2 === 0 || n % 3 === 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for (var x = 6; x <= Math.sqrt(n) + 1; x += 6) {\n if (n % (x - 1) === 0 || n % (x + 1) === 0) {\n return false;\n }\n }\n return true;\n}\n`);\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor = JavaScript.valueToCode(block, 'DIVISOR',\n JavaScript.ORDER_MODULUS) || '0';\n code = numberToCheck + ' % ' + divisor + ' === 0';\n } else {\n code = numberToCheck + suffix;\n }\n return [code, outputOrder];\n};\n\nJavaScript['math_change'] = function(block) {\n // Add to a variable in place.\n const argument0 = JavaScript.valueToCode(block, 'DELTA',\n JavaScript.ORDER_ADDITION) || '0';\n const varName = JavaScript.nameDB_.getName(\n block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = (typeof ' + varName + ' === \\'number\\' ? ' + varName +\n ' : 0) + ' + argument0 + ';\\n';\n};\n\n// Rounding functions have a single operand.\nJavaScript['math_round'] = JavaScript['math_single'];\n// Trigonometry functions have a single operand.\nJavaScript['math_trig'] = JavaScript['math_single'];\n\nJavaScript['math_on_list'] = function(block) {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n let list;\n let code;\n switch (func) {\n case 'SUM':\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_MEMBER) || '[]';\n code = list + '.reduce(function(x, y) {return x + y;}, 0)';\n break;\n case 'MIN':\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = 'Math.min.apply(null, ' + list + ')';\n break;\n case 'MAX':\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = 'Math.max.apply(null, ' + list + ')';\n break;\n case 'AVERAGE': {\n // mathMean([null,null,1,3]) === 2.0.\n const functionName = JavaScript.provideFunction_('mathMean', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length;\n}\n`);\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MEDIAN': {\n // mathMedian([null,null,1,3]) === 2.0.\n const functionName = JavaScript.provideFunction_('mathMedian', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(myList) {\n var localList = myList.filter(function (x) {return typeof x === 'number';});\n if (!localList.length) return null;\n localList.sort(function(a, b) {return b - a;});\n if (localList.length % 2 === 0) {\n return (localList[localList.length / 2 - 1] + localList[localList.length / 2]) / 2;\n } else {\n return localList[(localList.length - 1) / 2];\n }\n}\n`);\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MODE': {\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].\n const functionName = JavaScript.provideFunction_('mathModes', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(values) {\n var modes = [];\n var counts = [];\n var maxCount = 0;\n for (var i = 0; i < values.length; i++) {\n var value = values[i];\n var found = false;\n var thisCount;\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][0] === value) {\n thisCount = ++counts[j][1];\n found = true;\n break;\n }\n }\n if (!found) {\n counts.push([value, 1]);\n thisCount = 1;\n }\n maxCount = Math.max(thisCount, maxCount);\n }\n for (var j = 0; j < counts.length; j++) {\n if (counts[j][1] === maxCount) {\n modes.push(counts[j][0]);\n }\n }\n return modes;\n}\n`);\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'STD_DEV': {\n const functionName = JavaScript.provideFunction_('mathStandardDeviation', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(numbers) {\n var n = numbers.length;\n if (!n) return null;\n var mean = numbers.reduce(function(x, y) {return x + y;}) / n;\n var variance = 0;\n for (var j = 0; j < n; j++) {\n variance += Math.pow(numbers[j] - mean, 2);\n }\n variance = variance / n;\n return Math.sqrt(variance);\n}\n`);\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'RANDOM': {\n const functionName = JavaScript.provideFunction_('mathRandomList', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(list) {\n var x = Math.floor(Math.random() * list.length);\n return list[x];\n}\n`);\n list = JavaScript.valueToCode(block, 'LIST',\n JavaScript.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['math_modulo'] = function(block) {\n // Remainder computation.\n const argument0 = JavaScript.valueToCode(block, 'DIVIDEND',\n JavaScript.ORDER_MODULUS) || '0';\n const argument1 = JavaScript.valueToCode(block, 'DIVISOR',\n JavaScript.ORDER_MODULUS) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, JavaScript.ORDER_MODULUS];\n};\n\nJavaScript['math_constrain'] = function(block) {\n // Constrain a number between two limits.\n const argument0 = JavaScript.valueToCode(block, 'VALUE',\n JavaScript.ORDER_NONE) || '0';\n const argument1 = JavaScript.valueToCode(block, 'LOW',\n JavaScript.ORDER_NONE) || '0';\n const argument2 = JavaScript.valueToCode(block, 'HIGH',\n JavaScript.ORDER_NONE) || 'Infinity';\n const code = 'Math.min(Math.max(' + argument0 + ', ' + argument1 + '), ' +\n argument2 + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['math_random_int'] = function(block) {\n // Random integer between [X] and [Y].\n const argument0 = JavaScript.valueToCode(block, 'FROM',\n JavaScript.ORDER_NONE) || '0';\n const argument1 = JavaScript.valueToCode(block, 'TO',\n JavaScript.ORDER_NONE) || '0';\n const functionName = JavaScript.provideFunction_('mathRandomInt', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(a, b) {\n if (a > b) {\n // Swap a and b to ensure a is smaller.\n var c = a;\n a = b;\n b = c;\n }\n return Math.floor(Math.random() * (b - a + 1) + a);\n}\n`);\n const code = functionName + '(' + argument0 + ', ' + argument1 + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['math_random_float'] = function(block) {\n // Random fraction between 0 and 1.\n return ['Math.random()', JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['math_atan2'] = function(block) {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n const argument0 = JavaScript.valueToCode(block, 'X',\n JavaScript.ORDER_NONE) || '0';\n const argument1 = JavaScript.valueToCode(block, 'Y',\n JavaScript.ORDER_NONE) || '0';\n return ['Math.atan2(' + argument1 + ', ' + argument0 + ') / Math.PI * 180',\n JavaScript.ORDER_DIVISION];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for loop blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.loops');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\nJavaScript['controls_repeat_ext'] = function(block) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(Number(block.getFieldValue('TIMES')));\n } else {\n // External number.\n repeats =\n JavaScript.valueToCode(block, 'TIMES', JavaScript.ORDER_ASSIGNMENT) ||\n '0';\n }\n let branch = JavaScript.statementToCode(block, 'DO');\n branch = JavaScript.addLoopTrap(branch, block);\n let code = '';\n const loopVar =\n JavaScript.nameDB_.getDistinctName('count', NameType.VARIABLE);\n let endVar = repeats;\n if (!repeats.match(/^\\w+$/) && !stringUtils.isNumber(repeats)) {\n endVar =\n JavaScript.nameDB_.getDistinctName('repeat_end', NameType.VARIABLE);\n code += 'var ' + endVar + ' = ' + repeats + ';\\n';\n }\n code += 'for (var ' + loopVar + ' = 0; ' + loopVar + ' < ' + endVar + '; ' +\n loopVar + '++) {\\n' + branch + '}\\n';\n return code;\n};\n\nJavaScript['controls_repeat'] = JavaScript['controls_repeat_ext'];\n\nJavaScript['controls_whileUntil'] = function(block) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 =\n JavaScript.valueToCode(\n block, 'BOOL',\n until ? JavaScript.ORDER_LOGICAL_NOT : JavaScript.ORDER_NONE) ||\n 'false';\n let branch = JavaScript.statementToCode(block, 'DO');\n branch = JavaScript.addLoopTrap(branch, block);\n if (until) {\n argument0 = '!' + argument0;\n }\n return 'while (' + argument0 + ') {\\n' + branch + '}\\n';\n};\n\nJavaScript['controls_for'] = function(block) {\n // For loop.\n const variable0 =\n JavaScript.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 =\n JavaScript.valueToCode(block, 'FROM', JavaScript.ORDER_ASSIGNMENT) || '0';\n const argument1 =\n JavaScript.valueToCode(block, 'TO', JavaScript.ORDER_ASSIGNMENT) || '0';\n const increment =\n JavaScript.valueToCode(block, 'BY', JavaScript.ORDER_ASSIGNMENT) || '1';\n let branch = JavaScript.statementToCode(block, 'DO');\n branch = JavaScript.addLoopTrap(branch, block);\n let code;\n if (stringUtils.isNumber(argument0) && stringUtils.isNumber(argument1) &&\n stringUtils.isNumber(increment)) {\n // All arguments are simple numbers.\n const up = Number(argument0) <= Number(argument1);\n code = 'for (' + variable0 + ' = ' + argument0 + '; ' + variable0 +\n (up ? ' <= ' : ' >= ') + argument1 + '; ' + variable0;\n const step = Math.abs(Number(increment));\n if (step === 1) {\n code += up ? '++' : '--';\n } else {\n code += (up ? ' += ' : ' -= ') + step;\n }\n code += ') {\\n' + branch + '}\\n';\n } else {\n code = '';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n let startVar = argument0;\n if (!argument0.match(/^\\w+$/) && !stringUtils.isNumber(argument0)) {\n startVar = JavaScript.nameDB_.getDistinctName(\n variable0 + '_start', NameType.VARIABLE);\n code += 'var ' + startVar + ' = ' + argument0 + ';\\n';\n }\n let endVar = argument1;\n if (!argument1.match(/^\\w+$/) && !stringUtils.isNumber(argument1)) {\n endVar = JavaScript.nameDB_.getDistinctName(\n variable0 + '_end', NameType.VARIABLE);\n code += 'var ' + endVar + ' = ' + argument1 + ';\\n';\n }\n // Determine loop direction at start, in case one of the bounds\n // changes during loop execution.\n const incVar = JavaScript.nameDB_.getDistinctName(\n variable0 + '_inc', NameType.VARIABLE);\n code += 'var ' + incVar + ' = ';\n if (stringUtils.isNumber(increment)) {\n code += Math.abs(increment) + ';\\n';\n } else {\n code += 'Math.abs(' + increment + ');\\n';\n }\n code += 'if (' + startVar + ' > ' + endVar + ') {\\n';\n code += JavaScript.INDENT + incVar + ' = -' + incVar + ';\\n';\n code += '}\\n';\n code += 'for (' + variable0 + ' = ' + startVar + '; ' + incVar +\n ' >= 0 ? ' + variable0 + ' <= ' + endVar + ' : ' + variable0 +\n ' >= ' + endVar + '; ' + variable0 + ' += ' + incVar + ') {\\n' +\n branch + '}\\n';\n }\n return code;\n};\n\nJavaScript['controls_forEach'] = function(block) {\n // For each loop.\n const variable0 =\n JavaScript.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 =\n JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_ASSIGNMENT) ||\n '[]';\n let branch = JavaScript.statementToCode(block, 'DO');\n branch = JavaScript.addLoopTrap(branch, block);\n let code = '';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n let listVar = argument0;\n if (!argument0.match(/^\\w+$/)) {\n listVar = JavaScript.nameDB_.getDistinctName(\n variable0 + '_list', NameType.VARIABLE);\n code += 'var ' + listVar + ' = ' + argument0 + ';\\n';\n }\n const indexVar = JavaScript.nameDB_.getDistinctName(\n variable0 + '_index', NameType.VARIABLE);\n branch = JavaScript.INDENT + variable0 + ' = ' + listVar + '[' + indexVar +\n '];\\n' + branch;\n code += 'for (var ' + indexVar + ' in ' + listVar + ') {\\n' + branch + '}\\n';\n return code;\n};\n\nJavaScript['controls_flow_statements'] = function(block) {\n // Flow statements: continue, break.\n let xfix = '';\n if (JavaScript.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += JavaScript.injectId(JavaScript.STATEMENT_PREFIX, block);\n }\n if (JavaScript.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += JavaScript.injectId(JavaScript.STATEMENT_SUFFIX, block);\n }\n if (JavaScript.STATEMENT_PREFIX) {\n const loop = block.getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += JavaScript.injectId(JavaScript.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break;\\n';\n case 'CONTINUE':\n return xfix + 'continue;\\n';\n }\n throw Error('Unknown flow statement.');\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for logic blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.logic');\n\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\nJavaScript['controls_if'] = function(block) {\n // If/elseif/else condition.\n let n = 0;\n let code = '';\n if (JavaScript.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += JavaScript.injectId(JavaScript.STATEMENT_PREFIX, block);\n }\n do {\n const conditionCode =\n JavaScript.valueToCode(block, 'IF' + n, JavaScript.ORDER_NONE) ||\n 'false';\n let branchCode = JavaScript.statementToCode(block, 'DO' + n);\n if (JavaScript.STATEMENT_SUFFIX) {\n branchCode = JavaScript.prefixLines(\n JavaScript.injectId(JavaScript.STATEMENT_SUFFIX, block),\n JavaScript.INDENT) +\n branchCode;\n }\n code += (n > 0 ? ' else ' : '') + 'if (' + conditionCode + ') {\\n' +\n branchCode + '}';\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || JavaScript.STATEMENT_SUFFIX) {\n let branchCode = JavaScript.statementToCode(block, 'ELSE');\n if (JavaScript.STATEMENT_SUFFIX) {\n branchCode = JavaScript.prefixLines(\n JavaScript.injectId(JavaScript.STATEMENT_SUFFIX, block),\n JavaScript.INDENT) +\n branchCode;\n }\n code += ' else {\\n' + branchCode + '}';\n }\n return code + '\\n';\n};\n\nJavaScript['controls_ifelse'] = JavaScript['controls_if'];\n\nJavaScript['logic_compare'] = function(block) {\n // Comparison operator.\n const OPERATORS =\n {'EQ': '==', 'NEQ': '!=', 'LT': '<', 'LTE': '<=', 'GT': '>', 'GTE': '>='};\n const operator = OPERATORS[block.getFieldValue('OP')];\n const order = (operator === '==' || operator === '!=') ?\n JavaScript.ORDER_EQUALITY :\n JavaScript.ORDER_RELATIONAL;\n const argument0 = JavaScript.valueToCode(block, 'A', order) || '0';\n const argument1 = JavaScript.valueToCode(block, 'B', order) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nJavaScript['logic_operation'] = function(block) {\n // Operations 'and', 'or'.\n const operator = (block.getFieldValue('OP') === 'AND') ? '&&' : '||';\n const order = (operator === '&&') ? JavaScript.ORDER_LOGICAL_AND :\n JavaScript.ORDER_LOGICAL_OR;\n let argument0 = JavaScript.valueToCode(block, 'A', order);\n let argument1 = JavaScript.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'false';\n argument1 = 'false';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = (operator === '&&') ? 'true' : 'false';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nJavaScript['logic_negate'] = function(block) {\n // Negation.\n const order = JavaScript.ORDER_LOGICAL_NOT;\n const argument0 = JavaScript.valueToCode(block, 'BOOL', order) || 'true';\n const code = '!' + argument0;\n return [code, order];\n};\n\nJavaScript['logic_boolean'] = function(block) {\n // Boolean values true and false.\n const code = (block.getFieldValue('BOOL') === 'TRUE') ? 'true' : 'false';\n return [code, JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['logic_null'] = function(block) {\n // Null data type.\n return ['null', JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['logic_ternary'] = function(block) {\n // Ternary operator.\n const value_if =\n JavaScript.valueToCode(block, 'IF', JavaScript.ORDER_CONDITIONAL) ||\n 'false';\n const value_then =\n JavaScript.valueToCode(block, 'THEN', JavaScript.ORDER_CONDITIONAL) ||\n 'null';\n const value_else =\n JavaScript.valueToCode(block, 'ELSE', JavaScript.ORDER_CONDITIONAL) ||\n 'null';\n const code = value_if + ' ? ' + value_then + ' : ' + value_else;\n return [code, JavaScript.ORDER_CONDITIONAL];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for list blocks.\n * @suppress {missingRequire}\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.lists');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\nJavaScript['lists_create_empty'] = function(block) {\n // Create an empty list.\n return ['[]', JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['lists_create_with'] = function(block) {\n // Create a list with any number of elements of any type.\n const elements = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] =\n JavaScript.valueToCode(block, 'ADD' + i, JavaScript.ORDER_NONE) ||\n 'null';\n }\n const code = '[' + elements.join(', ') + ']';\n return [code, JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['lists_repeat'] = function(block) {\n // Create a list with one element repeated.\n const functionName = JavaScript.provideFunction_('listsRepeat', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(value, n) {\n var array = [];\n for (var i = 0; i < n; i++) {\n array[i] = value;\n }\n return array;\n}\n`);\n const element =\n JavaScript.valueToCode(block, 'ITEM', JavaScript.ORDER_NONE) || 'null';\n const repeatCount =\n JavaScript.valueToCode(block, 'NUM', JavaScript.ORDER_NONE) || '0';\n const code = functionName + '(' + element + ', ' + repeatCount + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['lists_length'] = function(block) {\n // String or array length.\n const list =\n JavaScript.valueToCode(block, 'VALUE', JavaScript.ORDER_MEMBER) || '[]';\n return [list + '.length', JavaScript.ORDER_MEMBER];\n};\n\nJavaScript['lists_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const list =\n JavaScript.valueToCode(block, 'VALUE', JavaScript.ORDER_MEMBER) || '[]';\n return ['!' + list + '.length', JavaScript.ORDER_LOGICAL_NOT];\n};\n\nJavaScript['lists_indexOf'] = function(block) {\n // Find an item in the list.\n const operator =\n block.getFieldValue('END') === 'FIRST' ? 'indexOf' : 'lastIndexOf';\n const item =\n JavaScript.valueToCode(block, 'FIND', JavaScript.ORDER_NONE) || \"''\";\n const list =\n JavaScript.valueToCode(block, 'VALUE', JavaScript.ORDER_MEMBER) || '[]';\n const code = list + '.' + operator + '(' + item + ')';\n if (block.workspace.options.oneBasedIndex) {\n return [code + ' + 1', JavaScript.ORDER_ADDITION];\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['lists_getIndex'] = function(block) {\n // Get element at index.\n // Note: Until January 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const listOrder =\n (where === 'RANDOM') ? JavaScript.ORDER_NONE : JavaScript.ORDER_MEMBER;\n const list = JavaScript.valueToCode(block, 'VALUE', listOrder) || '[]';\n\n switch (where) {\n case ('FIRST'):\n if (mode === 'GET') {\n const code = list + '[0]';\n return [code, JavaScript.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.shift()';\n return [code, JavaScript.ORDER_MEMBER];\n } else if (mode === 'REMOVE') {\n return list + '.shift();\\n';\n }\n break;\n case ('LAST'):\n if (mode === 'GET') {\n const code = list + '.slice(-1)[0]';\n return [code, JavaScript.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop()';\n return [code, JavaScript.ORDER_MEMBER];\n } else if (mode === 'REMOVE') {\n return list + '.pop();\\n';\n }\n break;\n case ('FROM_START'): {\n const at = JavaScript.getAdjusted(block, 'AT');\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, JavaScript.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.splice(' + at + ', 1)[0]';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.splice(' + at + ', 1);\\n';\n }\n break;\n }\n case ('FROM_END'): {\n const at = JavaScript.getAdjusted(block, 'AT', 1, true);\n if (mode === 'GET') {\n const code = list + '.slice(' + at + ')[0]';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.splice(' + at + ', 1)[0]';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.splice(' + at + ', 1);';\n }\n break;\n }\n case ('RANDOM'): {\n const functionName = JavaScript.provideFunction_('listsGetRandomItem', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(list, remove) {\n var x = Math.floor(Math.random() * list.length);\n if (remove) {\n return list.splice(x, 1)[0];\n } else {\n return list[x];\n }\n}\n`);\n const code = functionName + '(' + list + ', ' + (mode !== 'GET') + ')';\n if (mode === 'GET' || mode === 'GET_REMOVE') {\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return code + ';\\n';\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_getIndex).');\n};\n\nJavaScript['lists_setIndex'] = function(block) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n let list =\n JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_MEMBER) || '[]';\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const value =\n JavaScript.valueToCode(block, 'TO', JavaScript.ORDER_ASSIGNMENT) ||\n 'null';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n // Closure, which accesses and modifies 'list'.\n function cacheList() {\n if (list.match(/^\\w+$/)) {\n return '';\n }\n const listVar =\n JavaScript.nameDB_.getDistinctName('tmpList', NameType.VARIABLE);\n const code = 'var ' + listVar + ' = ' + list + ';\\n';\n list = listVar;\n return code;\n }\n switch (where) {\n case ('FIRST'):\n if (mode === 'SET') {\n return list + '[0] = ' + value + ';\\n';\n } else if (mode === 'INSERT') {\n return list + '.unshift(' + value + ');\\n';\n }\n break;\n case ('LAST'):\n if (mode === 'SET') {\n let code = cacheList();\n code += list + '[' + list + '.length - 1] = ' + value + ';\\n';\n return code;\n } else if (mode === 'INSERT') {\n return list + '.push(' + value + ');\\n';\n }\n break;\n case ('FROM_START'): {\n const at = JavaScript.getAdjusted(block, 'AT');\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + ';\\n';\n } else if (mode === 'INSERT') {\n return list + '.splice(' + at + ', 0, ' + value + ');\\n';\n }\n break;\n }\n case ('FROM_END'): {\n const at = JavaScript.getAdjusted(\n block, 'AT', 1, false, JavaScript.ORDER_SUBTRACTION);\n let code = cacheList();\n if (mode === 'SET') {\n code += list + '[' + list + '.length - ' + at + '] = ' + value + ';\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += list + '.splice(' + list + '.length - ' + at + ', 0, ' + value +\n ');\\n';\n return code;\n }\n break;\n }\n case ('RANDOM'): {\n let code = cacheList();\n const xVar =\n JavaScript.nameDB_.getDistinctName('tmpX', NameType.VARIABLE);\n code += 'var ' + xVar + ' = Math.floor(Math.random() * ' + list +\n '.length);\\n';\n if (mode === 'SET') {\n code += list + '[' + xVar + '] = ' + value + ';\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += list + '.splice(' + xVar + ', 0, ' + value + ');\\n';\n return code;\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_setIndex).');\n};\n\n/**\n * Returns an expression calculating the index into a list.\n * @param {string} listName Name of the list, used to calculate length.\n * @param {string} where The method of indexing, selected by dropdown in Blockly\n * @param {string=} opt_at The optional offset when indexing from start/end.\n * @return {string|undefined} Index expression.\n */\nconst getSubstringIndex = function(listName, where, opt_at) {\n if (where === 'FIRST') {\n return '0';\n } else if (where === 'FROM_END') {\n return listName + '.length - 1 - ' + opt_at;\n } else if (where === 'LAST') {\n return listName + '.length - 1';\n } else {\n return opt_at;\n }\n};\n\nJavaScript['lists_getSublist'] = function(block) {\n // Get sublist.\n const list =\n JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_MEMBER) || '[]';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n let code;\n if (where1 === 'FIRST' && where2 === 'LAST') {\n code = list + '.slice(0)';\n } else if (\n list.match(/^\\w+$/) ||\n (where1 !== 'FROM_END' && where2 === 'FROM_START')) {\n // If the list is a variable or doesn't require a call for length, don't\n // generate a helper function.\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = JavaScript.getAdjusted(block, 'AT1');\n break;\n case 'FROM_END':\n at1 = JavaScript.getAdjusted(\n block, 'AT1', 1, false, JavaScript.ORDER_SUBTRACTION);\n at1 = list + '.length - ' + at1;\n break;\n case 'FIRST':\n at1 = '0';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist).');\n }\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = JavaScript.getAdjusted(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = JavaScript.getAdjusted(\n block, 'AT2', 0, false, JavaScript.ORDER_SUBTRACTION);\n at2 = list + '.length - ' + at2;\n break;\n case 'LAST':\n at2 = list + '.length';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist).');\n }\n code = list + '.slice(' + at1 + ', ' + at2 + ')';\n } else {\n const at1 = JavaScript.getAdjusted(block, 'AT1');\n const at2 = JavaScript.getAdjusted(block, 'AT2');\n const wherePascalCase = {\n 'FIRST': 'First',\n 'LAST': 'Last',\n 'FROM_START': 'FromStart',\n 'FROM_END': 'FromEnd',\n };\n // The value for 'FROM_END' and'FROM_START' depends on `at` so\n // we add it as a parameter.\n const at1Param =\n (where1 === 'FROM_END' || where1 === 'FROM_START') ? ', at1' : '';\n const at2Param =\n (where2 === 'FROM_END' || where2 === 'FROM_START') ? ', at2' : '';\n const functionName = JavaScript.provideFunction_(\n 'subsequence' + wherePascalCase[where1] + wherePascalCase[where2], `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(sequence${at1Param}${at2Param}) {\n var start = ${getSubstringIndex('sequence', where1, 'at1')};\n var end = ${getSubstringIndex('sequence', where2, 'at2')} + 1;\n return sequence.slice(start, end);\n}\n`);\n code = functionName + '(' + list +\n // The value for 'FROM_END' and 'FROM_START' depends on `at` so we\n // pass it.\n ((where1 === 'FROM_END' || where1 === 'FROM_START') ? ', ' + at1 : '') +\n ((where2 === 'FROM_END' || where2 === 'FROM_START') ? ', ' + at2 : '') +\n ')';\n }\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['lists_sort'] = function(block) {\n // Block for sorting a list.\n const list =\n JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_FUNCTION_CALL) ||\n '[]';\n const direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;\n const type = block.getFieldValue('TYPE');\n const getCompareFunctionName =\n JavaScript.provideFunction_('listsGetSortCompare', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(type, direction) {\n var compareFuncs = {\n 'NUMERIC': function(a, b) {\n return Number(a) - Number(b); },\n 'TEXT': function(a, b) {\n return a.toString() > b.toString() ? 1 : -1; },\n 'IGNORE_CASE': function(a, b) {\n return a.toString().toLowerCase() > b.toString().toLowerCase() ? 1 : -1; },\n };\n var compare = compareFuncs[type];\n return function(a, b) { return compare(a, b) * direction; };\n}\n `);\n return [\n list + '.slice().sort(' + getCompareFunctionName + '(\"' + type + '\", ' +\n direction + '))',\n JavaScript.ORDER_FUNCTION_CALL\n ];\n};\n\nJavaScript['lists_split'] = function(block) {\n // Block for splitting text into a list, or joining a list into text.\n let input = JavaScript.valueToCode(block, 'INPUT', JavaScript.ORDER_MEMBER);\n const delimiter =\n JavaScript.valueToCode(block, 'DELIM', JavaScript.ORDER_NONE) || \"''\";\n const mode = block.getFieldValue('MODE');\n let functionName;\n if (mode === 'SPLIT') {\n if (!input) {\n input = \"''\";\n }\n functionName = 'split';\n } else if (mode === 'JOIN') {\n if (!input) {\n input = '[]';\n }\n functionName = 'join';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n const code = input + '.' + functionName + '(' + delimiter + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['lists_reverse'] = function(block) {\n // Block for reversing a list.\n const list =\n JavaScript.valueToCode(block, 'LIST', JavaScript.ORDER_FUNCTION_CALL) ||\n '[]';\n const code = list + '.slice().reverse()';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating JavaScript for colour blocks.\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.colour');\n\nconst {javascriptGenerator: JavaScript} = goog.require('Blockly.JavaScript');\n\n\nJavaScript['colour_picker'] = function(block) {\n // Colour picker.\n const code = JavaScript.quote_(block.getFieldValue('COLOUR'));\n return [code, JavaScript.ORDER_ATOMIC];\n};\n\nJavaScript['colour_random'] = function(block) {\n // Generate a random colour.\n const functionName = JavaScript.provideFunction_('colourRandom', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}() {\n var num = Math.floor(Math.random() * Math.pow(2, 24));\n return '#' + ('00000' + num.toString(16)).substr(-6);\n}\n`);\n const code = functionName + '()';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['colour_rgb'] = function(block) {\n // Compose a colour from RGB components expressed as percentages.\n const red = JavaScript.valueToCode(block, 'RED', JavaScript.ORDER_NONE) || 0;\n const green =\n JavaScript.valueToCode(block, 'GREEN', JavaScript.ORDER_NONE) || 0;\n const blue =\n JavaScript.valueToCode(block, 'BLUE', JavaScript.ORDER_NONE) || 0;\n const functionName = JavaScript.provideFunction_('colourRgb', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(r, g, b) {\n r = Math.max(Math.min(Number(r), 100), 0) * 2.55;\n g = Math.max(Math.min(Number(g), 100), 0) * 2.55;\n b = Math.max(Math.min(Number(b), 100), 0) * 2.55;\n r = ('0' + (Math.round(r) || 0).toString(16)).slice(-2);\n g = ('0' + (Math.round(g) || 0).toString(16)).slice(-2);\n b = ('0' + (Math.round(b) || 0).toString(16)).slice(-2);\n return '#' + r + g + b;\n}\n`);\n const code = functionName + '(' + red + ', ' + green + ', ' + blue + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n\nJavaScript['colour_blend'] = function(block) {\n // Blend two colours together.\n const c1 = JavaScript.valueToCode(block, 'COLOUR1', JavaScript.ORDER_NONE) ||\n \"'#000000'\";\n const c2 = JavaScript.valueToCode(block, 'COLOUR2', JavaScript.ORDER_NONE) ||\n \"'#000000'\";\n const ratio =\n JavaScript.valueToCode(block, 'RATIO', JavaScript.ORDER_NONE) || 0.5;\n const functionName = JavaScript.provideFunction_('colourBlend', `\nfunction ${JavaScript.FUNCTION_NAME_PLACEHOLDER_}(c1, c2, ratio) {\n ratio = Math.max(Math.min(Number(ratio), 1), 0);\n var r1 = parseInt(c1.substring(1, 3), 16);\n var g1 = parseInt(c1.substring(3, 5), 16);\n var b1 = parseInt(c1.substring(5, 7), 16);\n var r2 = parseInt(c2.substring(1, 3), 16);\n var g2 = parseInt(c2.substring(3, 5), 16);\n var b2 = parseInt(c2.substring(5, 7), 16);\n var r = Math.round(r1 * (1 - ratio) + r2 * ratio);\n var g = Math.round(g1 * (1 - ratio) + g2 * ratio);\n var b = Math.round(b1 * (1 - ratio) + b2 * ratio);\n r = ('0' + (r || 0).toString(16)).slice(-2);\n g = ('0' + (g || 0).toString(16)).slice(-2);\n b = ('0' + (b || 0).toString(16)).slice(-2);\n return '#' + r + g + b;\n}\n`);\n const code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')';\n return [code, JavaScript.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Complete helper functions for generating JavaScript for\n * blocks. This is the entrypoint for javascript_compressed.js.\n * @suppress {extraRequire}\n */\n'use strict';\n\ngoog.module('Blockly.JavaScript.all');\n\nconst moduleExports = goog.require('Blockly.JavaScript');\ngoog.require('Blockly.JavaScript.colour');\ngoog.require('Blockly.JavaScript.lists');\ngoog.require('Blockly.JavaScript.logic');\ngoog.require('Blockly.JavaScript.loops');\ngoog.require('Blockly.JavaScript.math');\ngoog.require('Blockly.JavaScript.procedures');\ngoog.require('Blockly.JavaScript.texts');\ngoog.require('Blockly.JavaScript.variables');\ngoog.require('Blockly.JavaScript.variablesDynamic');\n\nexports = moduleExports;\n"]} \ No newline at end of file diff --git a/lua_compressed.js b/lua_compressed.js index 8295384e4b5..73dafb776d9 100644 --- a/lua_compressed.js +++ b/lua_compressed.js @@ -8,90 +8,408 @@ module.exports = factory(require("./blockly_compressed.js")); } else { // Browser var factoryExports = factory(root.Blockly); - root.Blockly.Lua = factoryExports; + root.Blockly.Lua = factoryExports.luaGenerator; + root.Blockly.Lua.__namespace__ = factoryExports.__namespace__; } }(this, function(__parent__) { var $=__parent__.__namespace__; -var module$contents$Blockly$Lua_Lua=new $.module$exports$Blockly$Generator.Generator("Lua");module$contents$Blockly$Lua_Lua.addReservedWords("_,__inext,assert,bit,colors,colours,coroutine,disk,dofile,error,fs,fetfenv,getmetatable,gps,help,io,ipairs,keys,loadfile,loadstring,math,native,next,os,paintutils,pairs,parallel,pcall,peripheral,print,printError,rawequal,rawget,rawset,read,rednet,redstone,rs,select,setfenv,setmetatable,sleep,string,table,term,textutils,tonumber,tostring,turtle,type,unpack,vector,write,xpcall,_VERSION,__indext,HTTP,and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while,add,sub,mul,div,mod,pow,unm,concat,len,eq,lt,le,index,newindex,call,assert,collectgarbage,dofile,error,_G,getmetatable,inpairs,load,loadfile,next,pairs,pcall,print,rawequal,rawget,rawlen,rawset,select,setmetatable,tonumber,tostring,type,_VERSION,xpcall,require,package,string,table,math,bit32,io,file,os,debug"); -module$contents$Blockly$Lua_Lua.ORDER_ATOMIC=0;module$contents$Blockly$Lua_Lua.ORDER_HIGH=1;module$contents$Blockly$Lua_Lua.ORDER_EXPONENTIATION=2;module$contents$Blockly$Lua_Lua.ORDER_UNARY=3;module$contents$Blockly$Lua_Lua.ORDER_MULTIPLICATIVE=4;module$contents$Blockly$Lua_Lua.ORDER_ADDITIVE=5;module$contents$Blockly$Lua_Lua.ORDER_CONCATENATION=6;module$contents$Blockly$Lua_Lua.ORDER_RELATIONAL=7;module$contents$Blockly$Lua_Lua.ORDER_AND=8;module$contents$Blockly$Lua_Lua.ORDER_OR=9; -module$contents$Blockly$Lua_Lua.ORDER_NONE=99;module$contents$Blockly$Lua_Lua.isInitialized=!1;module$contents$Blockly$Lua_Lua.init=function(a){Object.getPrototypeOf(this).init.call(this);this.nameDB_?this.nameDB_.reset():this.nameDB_=new $.module$exports$Blockly$Names.Names(this.RESERVED_WORDS_);this.nameDB_.setVariableMap(a.getVariableMap());this.nameDB_.populateVariables(a);this.nameDB_.populateProcedures(a);this.isInitialized=!0}; -module$contents$Blockly$Lua_Lua.finish=function(a){var b=(0,$.module$exports$Blockly$utils$object.values)(this.definitions_);a=Object.getPrototypeOf(this).finish.call(this,a);this.isInitialized=!1;this.nameDB_.reset();return b.join("\n\n")+"\n\n\n"+a};module$contents$Blockly$Lua_Lua.scrubNakedValue=function(a){return"local _ = "+a+"\n"};module$contents$Blockly$Lua_Lua.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"}; -module$contents$Blockly$Lua_Lua.multiline_quote_=function(a){return a.split(/\n/g).map(this.quote_).join(" .. '\\n' ..\n")}; -module$contents$Blockly$Lua_Lua.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();e&&(e=(0,$.module$exports$Blockly$utils$string.wrap)(e,this.COMMENT_WRAP-3),d+=this.prefixLines(e,"-- ")+"\n");for(var f=0;fa?$.Blockly.Lua.ORDER_UNARY:$.Blockly.Lua.ORDER_ATOMIC]}; -$.Blockly.Lua.math_arithmetic=function(a){var b={ADD:[" + ",$.Blockly.Lua.ORDER_ADDITIVE],MINUS:[" - ",$.Blockly.Lua.ORDER_ADDITIVE],MULTIPLY:[" * ",$.Blockly.Lua.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",$.Blockly.Lua.ORDER_MULTIPLICATIVE],POWER:[" ^ ",$.Blockly.Lua.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0];b=b[1];var d=$.Blockly.Lua.valueToCode(a,"A",b)||"0";a=$.Blockly.Lua.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; -$.Blockly.Lua.math_single=function(a){var b=a.getFieldValue("OP");if("NEG"===b)return a=$.Blockly.Lua.valueToCode(a,"NUM",$.Blockly.Lua.ORDER_UNARY)||"0",["-"+a,$.Blockly.Lua.ORDER_UNARY];if("POW10"===b)return a=$.Blockly.Lua.valueToCode(a,"NUM",$.Blockly.Lua.ORDER_EXPONENTIATION)||"0",["10 ^ "+a,$.Blockly.Lua.ORDER_EXPONENTIATION];a="ROUND"===b?$.Blockly.Lua.valueToCode(a,"NUM",$.Blockly.Lua.ORDER_ADDITIVE)||"0":$.Blockly.Lua.valueToCode(a,"NUM",$.Blockly.Lua.ORDER_NONE)||"0";switch(b){case "ABS":b= -"math.abs("+a+")";break;case "ROOT":b="math.sqrt("+a+")";break;case "LN":b="math.log("+a+")";break;case "LOG10":b="math.log("+a+", 10)";break;case "EXP":b="math.exp("+a+")";break;case "ROUND":b="math.floor("+a+" + .5)";break;case "ROUNDUP":b="math.ceil("+a+")";break;case "ROUNDDOWN":b="math.floor("+a+")";break;case "SIN":b="math.sin(math.rad("+a+"))";break;case "COS":b="math.cos(math.rad("+a+"))";break;case "TAN":b="math.tan(math.rad("+a+"))";break;case "ASIN":b="math.deg(math.asin("+a+"))";break; -case "ACOS":b="math.deg(math.acos("+a+"))";break;case "ATAN":b="math.deg(math.atan("+a+"))";break;default:throw Error("Unknown math operator: "+b);}return[b,$.Blockly.Lua.ORDER_HIGH]}; -$.Blockly.Lua.math_constant=function(a){return{PI:["math.pi",$.Blockly.Lua.ORDER_HIGH],E:["math.exp(1)",$.Blockly.Lua.ORDER_HIGH],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",$.Blockly.Lua.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",$.Blockly.Lua.ORDER_HIGH],SQRT1_2:["math.sqrt(1 / 2)",$.Blockly.Lua.ORDER_HIGH],INFINITY:["math.huge",$.Blockly.Lua.ORDER_HIGH]}[a.getFieldValue("CONSTANT")]}; -$.Blockly.Lua.math_number_property=function(a){var b={EVEN:[" % 2 == 0",$.Blockly.Lua.ORDER_MULTIPLICATIVE,$.Blockly.Lua.ORDER_RELATIONAL],ODD:[" % 2 == 1",$.Blockly.Lua.ORDER_MULTIPLICATIVE,$.Blockly.Lua.ORDER_RELATIONAL],WHOLE:[" % 1 == 0",$.Blockly.Lua.ORDER_MULTIPLICATIVE,$.Blockly.Lua.ORDER_RELATIONAL],POSITIVE:[" > 0",$.Blockly.Lua.ORDER_RELATIONAL,$.Blockly.Lua.ORDER_RELATIONAL],NEGATIVE:[" < 0",$.Blockly.Lua.ORDER_RELATIONAL,$.Blockly.Lua.ORDER_RELATIONAL],DIVISIBLE_BY:[null,$.Blockly.Lua.ORDER_MULTIPLICATIVE, -$.Blockly.Lua.ORDER_RELATIONAL],PRIME:[null,$.Blockly.Lua.ORDER_NONE,$.Blockly.Lua.ORDER_HIGH]},c=a.getFieldValue("PROPERTY");b=$.$jscomp.makeIterator(b[c]);var d=b.next().value,e=b.next().value;b=b.next().value;e=$.Blockly.Lua.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";if("PRIME"===c)a=$.Blockly.Lua.provideFunction_("math_isPrime","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(n)\n -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if n == 2 or n == 3 then\n return true\n end\n -- False if n is NaN, negative, is 1, or not whole.\n -- And false if n is divisible by 2 or 3.\n if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then\n return false\n end\n -- Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x = 6, math.sqrt(n) + 1.5, 6 do\n if n % (x - 1) == 0 or n % (x + 1) == 0 then\n return false\n end\n end\n return true\nend\n")+ -"("+e+")";else if("DIVISIBLE_BY"===c){a=$.Blockly.Lua.valueToCode(a,"DIVISOR",$.Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";if("0"===a)return["nil",$.Blockly.Lua.ORDER_ATOMIC];a=e+" % "+a+" == 0"}else a=e+d;return[a,b]};$.Blockly.Lua.math_change=function(a){var b=$.Blockly.Lua.valueToCode(a,"DELTA",$.Blockly.Lua.ORDER_ADDITIVE)||"0";a=$.Blockly.Lua.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE);return a+" = "+a+" + "+b+"\n"};$.Blockly.Lua.math_round=$.Blockly.Lua.math_single; -$.Blockly.Lua.math_trig=$.Blockly.Lua.math_single; -$.Blockly.Lua.math_on_list=function(a){function b(){return $.Blockly.Lua.provideFunction_("math_sum","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n local result = 0\n for _, v in ipairs(t) do\n result = result + v\n end\n return result\nend\n")}var c=a.getFieldValue("OP");a=$.Blockly.Lua.valueToCode(a,"LIST",$.Blockly.Lua.ORDER_NONE)||"{}";switch(c){case "SUM":c=b();break;case "MIN":c=$.Blockly.Lua.provideFunction_("math_min","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+ -"(t)\n if #t == 0 then\n return 0\n end\n local result = math.huge\n for _, v in ipairs(t) do\n if v < result then\n result = v\n end\n end\n return result\nend\n");break;case "AVERAGE":c=$.Blockly.Lua.provideFunction_("math_average","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n if #t == 0 then\n return 0\n end\n return "+b()+"(t) / #t\nend\n");break;case "MAX":c=$.Blockly.Lua.provideFunction_("math_max","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+ -"(t)\n if #t == 0 then\n return 0\n end\n local result = -math.huge\n for _, v in ipairs(t) do\n if v > result then\n result = v\n end\n end\n return result\nend\n");break;case "MEDIAN":c=$.Blockly.Lua.provideFunction_("math_median","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n -- Source: http://lua-users.org/wiki/SimpleStats\n if #t == 0 then\n return 0\n end\n local temp = {}\n for _, v in ipairs(t) do\n if type(v) == 'number' then\n table.insert(temp, v)\n end\n end\n table.sort(temp)\n if #temp % 2 == 0 then\n return (temp[#temp / 2] + temp[(#temp / 2) + 1]) / 2\n else\n return temp[math.ceil(#temp / 2)]\n end\nend\n"); -break;case "MODE":c=$.Blockly.Lua.provideFunction_("math_modes","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n -- Source: http://lua-users.org/wiki/SimpleStats\n local counts = {}\n for _, v in ipairs(t) do\n if counts[v] == nil then\n counts[v] = 1\n else\n counts[v] = counts[v] + 1\n end\n end\n local biggestCount = 0\n for _, v in pairs(counts) do\n if v > biggestCount then\n biggestCount = v\n end\n end\n local temp = {}\n for k, v in pairs(counts) do\n if v == biggestCount then\n table.insert(temp, k)\n end\n end\n return temp\nend\n"); -break;case "STD_DEV":c=$.Blockly.Lua.provideFunction_("math_standard_deviation","\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n local m\n local vm\n local total = 0\n local count = 0\n local result\n m = #t == 0 and 0 or "+b()+"(t) / #t\n for _, v in ipairs(t) do\n if type(v) == 'number' then\n vm = v - m\n total = total + (vm * vm)\n count = count + 1\n end\n end\n result = math.sqrt(total / (count-1))\n return result\nend\n");break;case "RANDOM":c=$.Blockly.Lua.provideFunction_("math_random_list", -"\nfunction "+$.Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_+"(t)\n if #t == 0 then\n return nil\n end\n return t[math.random(#t)]\nend\n");break;default:throw Error("Unknown operator: "+c);}return[c+"("+a+")",$.Blockly.Lua.ORDER_HIGH]};$.Blockly.Lua.math_modulo=function(a){var b=$.Blockly.Lua.valueToCode(a,"DIVIDEND",$.Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";a=$.Blockly.Lua.valueToCode(a,"DIVISOR",$.Blockly.Lua.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,$.Blockly.Lua.ORDER_MULTIPLICATIVE]}; -$.Blockly.Lua.math_constrain=function(a){var b=$.Blockly.Lua.valueToCode(a,"VALUE",$.Blockly.Lua.ORDER_NONE)||"0",c=$.Blockly.Lua.valueToCode(a,"LOW",$.Blockly.Lua.ORDER_NONE)||"-math.huge";a=$.Blockly.Lua.valueToCode(a,"HIGH",$.Blockly.Lua.ORDER_NONE)||"math.huge";return["math.min(math.max("+b+", "+c+"), "+a+")",$.Blockly.Lua.ORDER_HIGH]}; -$.Blockly.Lua.math_random_int=function(a){var b=$.Blockly.Lua.valueToCode(a,"FROM",$.Blockly.Lua.ORDER_NONE)||"0";a=$.Blockly.Lua.valueToCode(a,"TO",$.Blockly.Lua.ORDER_NONE)||"0";return["math.random("+b+", "+a+")",$.Blockly.Lua.ORDER_HIGH]};$.Blockly.Lua.math_random_float=function(a){return["math.random()",$.Blockly.Lua.ORDER_HIGH]}; -$.Blockly.Lua.math_atan2=function(a){var b=$.Blockly.Lua.valueToCode(a,"X",$.Blockly.Lua.ORDER_NONE)||"0";return["math.deg(math.atan2("+($.Blockly.Lua.valueToCode(a,"Y",$.Blockly.Lua.ORDER_NONE)||"0")+", "+b+"))",$.Blockly.Lua.ORDER_HIGH]};var module$exports$Blockly$Lua$loops={},module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT="goto continue\n",module$contents$Blockly$Lua$loops_addContinueLabel=function(a){return-1!==a.indexOf(module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT)?a+$.Blockly.Lua.INDENT+"::continue::\n":a}; -$.Blockly.Lua.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):$.Blockly.Lua.valueToCode(a,"TIMES",$.Blockly.Lua.ORDER_NONE)||"0";b=(0,$.module$exports$Blockly$utils$string.isNumber)(b)?parseInt(b,10):"math.floor("+b+")";var c=$.Blockly.Lua.statementToCode(a,"DO");c=$.Blockly.Lua.addLoopTrap(c,a);c=module$contents$Blockly$Lua$loops_addContinueLabel(c);return"for "+$.Blockly.Lua.nameDB_.getDistinctName("count",$.module$exports$Blockly$Names.NameType.VARIABLE)+ -" = 1, "+b+" do\n"+c+"end\n"};$.Blockly.Lua.controls_repeat=$.Blockly.Lua.controls_repeat_ext;$.Blockly.Lua.controls_whileUntil=function(a){var b="UNTIL"===a.getFieldValue("MODE"),c=$.Blockly.Lua.valueToCode(a,"BOOL",b?$.Blockly.Lua.ORDER_UNARY:$.Blockly.Lua.ORDER_NONE)||"false",d=$.Blockly.Lua.statementToCode(a,"DO");d=$.Blockly.Lua.addLoopTrap(d,a);d=module$contents$Blockly$Lua$loops_addContinueLabel(d);b&&(c="not "+c);return"while "+c+" do\n"+d+"end\n"}; -$.Blockly.Lua.controls_for=function(a){var b=$.Blockly.Lua.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.Lua.valueToCode(a,"FROM",$.Blockly.Lua.ORDER_NONE)||"0",d=$.Blockly.Lua.valueToCode(a,"TO",$.Blockly.Lua.ORDER_NONE)||"0",e=$.Blockly.Lua.valueToCode(a,"BY",$.Blockly.Lua.ORDER_NONE)||"1",f=$.Blockly.Lua.statementToCode(a,"DO");f=$.Blockly.Lua.addLoopTrap(f,a);f=module$contents$Blockly$Lua$loops_addContinueLabel(f);a="";if((0,$.module$exports$Blockly$utils$string.isNumber)(c)&& -(0,$.module$exports$Blockly$utils$string.isNumber)(d)&&(0,$.module$exports$Blockly$utils$string.isNumber)(e))var g=(Number(c)<=Number(d)?"":"-")+Math.abs(Number(e));else a="",g=$.Blockly.Lua.nameDB_.getDistinctName(b+"_inc",$.module$exports$Blockly$Names.NameType.VARIABLE),a+=g+" = ",a=(0,$.module$exports$Blockly$utils$string.isNumber)(e)?a+(Math.abs(e)+"\n"):a+("math.abs("+e+")\n"),a=a+("if ("+c+") > ("+d+") then\n")+($.Blockly.Lua.INDENT+g+" = -"+g+"\n"),a+="end\n";return a+("for "+b+" = "+c+", "+ -d+", "+g)+(" do\n"+f+"end\n")};$.Blockly.Lua.controls_forEach=function(a){var b=$.Blockly.Lua.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.Lua.valueToCode(a,"LIST",$.Blockly.Lua.ORDER_NONE)||"{}",d=$.Blockly.Lua.statementToCode(a,"DO");d=$.Blockly.Lua.addLoopTrap(d,a);d=module$contents$Blockly$Lua$loops_addContinueLabel(d);return"for _, "+b+" in ipairs("+c+") do \n"+d+"end\n"}; -$.Blockly.Lua.controls_flow_statements=function(a){var b="";$.Blockly.Lua.STATEMENT_PREFIX&&(b+=$.Blockly.Lua.injectId($.Blockly.Lua.STATEMENT_PREFIX,a));$.Blockly.Lua.STATEMENT_SUFFIX&&(b+=$.Blockly.Lua.injectId($.Blockly.Lua.STATEMENT_SUFFIX,a));if($.Blockly.Lua.STATEMENT_PREFIX){var c=a.getSurroundLoop();c&&!c.suppressPrefixSuffix&&(b+=$.Blockly.Lua.injectId($.Blockly.Lua.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break\n";case "CONTINUE":return b+module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT}throw Error("Unknown flow statement."); -};var module$exports$Blockly$Lua$logic={}; -$.Blockly.Lua.controls_if=function(a){var b=0,c="";$.Blockly.Lua.STATEMENT_PREFIX&&(c+=$.Blockly.Lua.injectId($.Blockly.Lua.STATEMENT_PREFIX,a));do{var d=$.Blockly.Lua.valueToCode(a,"IF"+b,$.Blockly.Lua.ORDER_NONE)||"false",e=$.Blockly.Lua.statementToCode(a,"DO"+b);$.Blockly.Lua.STATEMENT_SUFFIX&&(e=$.Blockly.Lua.prefixLines($.Blockly.Lua.injectId($.Blockly.Lua.STATEMENT_SUFFIX,a),$.Blockly.Lua.INDENT)+e);c+=(0",GTE:">="}[a.getFieldValue("OP")],c=$.Blockly.Lua.valueToCode(a,"A",$.Blockly.Lua.ORDER_RELATIONAL)||"0";a=$.Blockly.Lua.valueToCode(a,"B",$.Blockly.Lua.ORDER_RELATIONAL)||"0";return[c+" "+b+" "+a,$.Blockly.Lua.ORDER_RELATIONAL]}; -$.Blockly.Lua.logic_operation=function(a){var b="AND"===a.getFieldValue("OP")?"and":"or",c="and"===b?$.Blockly.Lua.ORDER_AND:$.Blockly.Lua.ORDER_OR,d=$.Blockly.Lua.valueToCode(a,"A",c);a=$.Blockly.Lua.valueToCode(a,"B",c);if(d||a){var e="and"===b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};$.Blockly.Lua.logic_negate=function(a){return["not "+($.Blockly.Lua.valueToCode(a,"BOOL",$.Blockly.Lua.ORDER_UNARY)||"true"),$.Blockly.Lua.ORDER_UNARY]}; -$.Blockly.Lua.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",$.Blockly.Lua.ORDER_ATOMIC]};$.Blockly.Lua.logic_null=function(a){return["nil",$.Blockly.Lua.ORDER_ATOMIC]};$.Blockly.Lua.logic_ternary=function(a){var b=$.Blockly.Lua.valueToCode(a,"IF",$.Blockly.Lua.ORDER_AND)||"false",c=$.Blockly.Lua.valueToCode(a,"THEN",$.Blockly.Lua.ORDER_AND)||"nil";a=$.Blockly.Lua.valueToCode(a,"ELSE",$.Blockly.Lua.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,$.Blockly.Lua.ORDER_OR]};var module$exports$Blockly$Lua$lists={};$.Blockly.Lua.lists_create_empty=function(a){return["{}",$.Blockly.Lua.ORDER_HIGH]};$.Blockly.Lua.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;ca?module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY:module$exports$Blockly$Lua.luaGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Lua.luaGenerator.math_arithmetic=function(a){var b={ADD:[" + ",module$exports$Blockly$Lua.luaGenerator.ORDER_ADDITIVE],MINUS:[" - ",module$exports$Blockly$Lua.luaGenerator.ORDER_ADDITIVE],MULTIPLY:[" * ",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE],POWER:[" ^ ",module$exports$Blockly$Lua.luaGenerator.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")];const c=b[0];b=b[1];const d=module$exports$Blockly$Lua.luaGenerator.valueToCode(a, +"A",b)||"0";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +module$exports$Blockly$Lua.luaGenerator.math_single=function(a){var b=a.getFieldValue("OP");if("NEG"===b)return a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"NUM",module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY)||"0",["-"+a,module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY];if("POW10"===b)return a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"NUM",module$exports$Blockly$Lua.luaGenerator.ORDER_EXPONENTIATION)||"0",["10 ^ "+a,module$exports$Blockly$Lua.luaGenerator.ORDER_EXPONENTIATION]; +a="ROUND"===b?module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"NUM",module$exports$Blockly$Lua.luaGenerator.ORDER_ADDITIVE)||"0":module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"NUM",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0";switch(b){case "ABS":b="math.abs("+a+")";break;case "ROOT":b="math.sqrt("+a+")";break;case "LN":b="math.log("+a+")";break;case "LOG10":b="math.log("+a+", 10)";break;case "EXP":b="math.exp("+a+")";break;case "ROUND":b="math.floor("+a+" + .5)";break;case "ROUNDUP":b= +"math.ceil("+a+")";break;case "ROUNDDOWN":b="math.floor("+a+")";break;case "SIN":b="math.sin(math.rad("+a+"))";break;case "COS":b="math.cos(math.rad("+a+"))";break;case "TAN":b="math.tan(math.rad("+a+"))";break;case "ASIN":b="math.deg(math.asin("+a+"))";break;case "ACOS":b="math.deg(math.acos("+a+"))";break;case "ATAN":b="math.deg(math.atan("+a+"))";break;default:throw Error("Unknown math operator: "+b);}return[b,module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}; +module$exports$Blockly$Lua.luaGenerator.math_constant=function(a){return{PI:["math.pi",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH],E:["math.exp(1)",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH],SQRT1_2:["math.sqrt(1 / 2)",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH],INFINITY:["math.huge",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}[a.getFieldValue("CONSTANT")]}; +module$exports$Blockly$Lua.luaGenerator.math_number_property=function(a){var b={EVEN:[" % 2 == 0",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],ODD:[" % 2 == 1",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],WHOLE:[" % 1 == 0",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],POSITIVE:[" > 0", +module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],NEGATIVE:[" < 0",module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],DIVISIBLE_BY:[null,module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL],PRIME:[null,module$exports$Blockly$Lua.luaGenerator.ORDER_NONE,module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}; +const c=a.getFieldValue("PROPERTY"),[d,e,f]=b[c];b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";if("PRIME"===c)a=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_isPrime",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(n) + -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods + if n == 2 or n == 3 then + return true + end + -- False if n is NaN, negative, is 1, or not whole. + -- And false if n is divisible by 2 or 3. + if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then + return false + end + -- Check all the numbers of form 6k +/- 1, up to sqrt(n). + for x = 6, math.sqrt(n) + 1.5, 6 do + if n % (x - 1) == 0 or n % (x + 1) == 0 then + return false + end + end + return true +end +`)+"("+b+")";else if("DIVISIBLE_BY"===c){a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE)||"0";if("0"===a)return["nil",module$exports$Blockly$Lua.luaGenerator.ORDER_ATOMIC];a=b+" % "+a+" == 0"}else a=b+d;return[a,f]}; +module$exports$Blockly$Lua.luaGenerator.math_change=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"DELTA",module$exports$Blockly$Lua.luaGenerator.ORDER_ADDITIVE)||"0";a=module$exports$Blockly$Lua.luaGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE);return a+" = "+a+" + "+b+"\n"};module$exports$Blockly$Lua.luaGenerator.math_round=module$exports$Blockly$Lua.luaGenerator.math_single; +module$exports$Blockly$Lua.luaGenerator.math_trig=module$exports$Blockly$Lua.luaGenerator.math_single;module$exports$Blockly$Lua.luaGenerator.math_on_list=function(a){function b(){return module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_sum",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + local result = 0 + for _, v in ipairs(t) do + result = result + v + end + return result +end +`)}var c=a.getFieldValue("OP");a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"LIST",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"{}";switch(c){case "SUM":c=b();break;case "MIN":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_min",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + if #t == 0 then + return 0 + end + local result = math.huge + for _, v in ipairs(t) do + if v < result then + result = v + end + end + return result +end +`);break;case "AVERAGE":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_average",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + if #t == 0 then + return 0 + end + return ${b()}(t) / #t +end +`);break;case "MAX":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_max",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + if #t == 0 then + return 0 + end + local result = -math.huge + for _, v in ipairs(t) do + if v > result then + result = v + end + end + return result +end +`);break;case "MEDIAN":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_median",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + -- Source: http://lua-users.org/wiki/SimpleStats + if #t == 0 then + return 0 + end + local temp = {} + for _, v in ipairs(t) do + if type(v) == 'number' then + table.insert(temp, v) + end + end + table.sort(temp) + if #temp % 2 == 0 then + return (temp[#temp / 2] + temp[(#temp / 2) + 1]) / 2 + else + return temp[math.ceil(#temp / 2)] + end +end +`);break;case "MODE":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_modes",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + -- Source: http://lua-users.org/wiki/SimpleStats + local counts = {} + for _, v in ipairs(t) do + if counts[v] == nil then + counts[v] = 1 + else + counts[v] = counts[v] + 1 + end + end + local biggestCount = 0 + for _, v in pairs(counts) do + if v > biggestCount then + biggestCount = v + end + end + local temp = {} + for k, v in pairs(counts) do + if v == biggestCount then + table.insert(temp, k) + end + end + return temp +end +`);break;case "STD_DEV":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_standard_deviation",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + local m + local vm + local total = 0 + local count = 0 + local result + m = #t == 0 and 0 or ${b()}(t) / #t + for _, v in ipairs(t) do + if type(v) == 'number' then + vm = v - m + total = total + (vm * vm) + count = count + 1 + end + end + result = math.sqrt(total / (count-1)) + return result +end +`);break;case "RANDOM":c=module$exports$Blockly$Lua.luaGenerator.provideFunction_("math_random_list",` +function ${module$exports$Blockly$Lua.luaGenerator.FUNCTION_NAME_PLACEHOLDER_}(t) + if #t == 0 then + return nil + end + return t[math.random(#t)] +end +`);break;default:throw Error("Unknown operator: "+c);}return[c+"("+a+")",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]};module$exports$Blockly$Lua.luaGenerator.math_modulo=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"DIVIDEND",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE)||"0";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,module$exports$Blockly$Lua.luaGenerator.ORDER_MULTIPLICATIVE]}; +module$exports$Blockly$Lua.luaGenerator.math_constrain=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"VALUE",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0",c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"LOW",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"-math.huge";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"HIGH",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"math.huge";return["math.min(math.max("+b+", "+c+"), "+a+")",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}; +module$exports$Blockly$Lua.luaGenerator.math_random_int=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"FROM",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"TO",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0";return["math.random("+b+", "+a+")",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]};module$exports$Blockly$Lua.luaGenerator.math_random_float=function(a){return["math.random()",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}; +module$exports$Blockly$Lua.luaGenerator.math_atan2=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"X",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0";return["math.deg(math.atan2("+(module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"Y",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0")+", "+b+"))",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]};var module$exports$Blockly$Lua$loops={},module$contents$Blockly$Lua$loops_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$Lua$loops_NameType=$.NameType$$module$build$src$core$names,module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT="goto continue\n",module$contents$Blockly$Lua$loops_addContinueLabel=function(a){return-1!==a.indexOf(module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT)?a+module$exports$Blockly$Lua.luaGenerator.INDENT+"::continue::\n":a}; +module$exports$Blockly$Lua.luaGenerator.controls_repeat_ext=function(a){let b;b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"TIMES",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0";b=$.module$build$src$core$utils$string.isNumber(b)?parseInt(b,10):"math.floor("+b+")";let c=module$exports$Blockly$Lua.luaGenerator.statementToCode(a,"DO");c=module$exports$Blockly$Lua.luaGenerator.addLoopTrap(c,a);c=module$contents$Blockly$Lua$loops_addContinueLabel(c); +return"for "+module$exports$Blockly$Lua.luaGenerator.nameDB_.getDistinctName("count",$.NameType$$module$build$src$core$names.VARIABLE)+" = 1, "+b+" do\n"+c+"end\n"};module$exports$Blockly$Lua.luaGenerator.controls_repeat=module$exports$Blockly$Lua.luaGenerator.controls_repeat_ext; +module$exports$Blockly$Lua.luaGenerator.controls_whileUntil=function(a){const b="UNTIL"===a.getFieldValue("MODE");let c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"BOOL",b?module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY:module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"false",d=module$exports$Blockly$Lua.luaGenerator.statementToCode(a,"DO");d=module$exports$Blockly$Lua.luaGenerator.addLoopTrap(d,a);d=module$contents$Blockly$Lua$loops_addContinueLabel(d);b&&(c="not "+c);return"while "+ +c+" do\n"+d+"end\n"}; +module$exports$Blockly$Lua.luaGenerator.controls_for=function(a){const b=module$exports$Blockly$Lua.luaGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"FROM",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0",d=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"TO",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"0",e=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"BY", +module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"1";let f=module$exports$Blockly$Lua.luaGenerator.statementToCode(a,"DO");f=module$exports$Blockly$Lua.luaGenerator.addLoopTrap(f,a);f=module$contents$Blockly$Lua$loops_addContinueLabel(f);a="";let g;$.module$build$src$core$utils$string.isNumber(c)&&$.module$build$src$core$utils$string.isNumber(d)&&$.module$build$src$core$utils$string.isNumber(e)?g=(Number(c)<=Number(d)?"":"-")+Math.abs(Number(e)):(a="",g=module$exports$Blockly$Lua.luaGenerator.nameDB_.getDistinctName(b+ +"_inc",$.NameType$$module$build$src$core$names.VARIABLE),a+=g+" = ",a=$.module$build$src$core$utils$string.isNumber(e)?a+(Math.abs(e)+"\n"):a+("math.abs("+e+")\n"),a=a+("if ("+c+") > ("+d+") then\n")+(module$exports$Blockly$Lua.luaGenerator.INDENT+g+" = -"+g+"\n"),a+="end\n");return a+("for "+b+" = "+c+", "+d+", "+g)+(" do\n"+f+"end\n")}; +module$exports$Blockly$Lua.luaGenerator.controls_forEach=function(a){const b=module$exports$Blockly$Lua.luaGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"LIST",module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"{}";let d=module$exports$Blockly$Lua.luaGenerator.statementToCode(a,"DO");d=module$exports$Blockly$Lua.luaGenerator.addLoopTrap(d,a);d=module$contents$Blockly$Lua$loops_addContinueLabel(d); +return"for _, "+b+" in ipairs("+c+") do \n"+d+"end\n"}; +module$exports$Blockly$Lua.luaGenerator.controls_flow_statements=function(a){let b="";module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX&&(b+=module$exports$Blockly$Lua.luaGenerator.injectId(module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX,a));module$exports$Blockly$Lua.luaGenerator.STATEMENT_SUFFIX&&(b+=module$exports$Blockly$Lua.luaGenerator.injectId(module$exports$Blockly$Lua.luaGenerator.STATEMENT_SUFFIX,a));if(module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX){const c=a.getSurroundLoop(); +c&&!c.suppressPrefixSuffix&&(b+=module$exports$Blockly$Lua.luaGenerator.injectId(module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break\n";case "CONTINUE":return b+module$contents$Blockly$Lua$loops_CONTINUE_STATEMENT}throw Error("Unknown flow statement.");};var module$exports$Blockly$Lua$logic={}; +module$exports$Blockly$Lua.luaGenerator.controls_if=function(a){var b=0;let c="";module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX&&(c+=module$exports$Blockly$Lua.luaGenerator.injectId(module$exports$Blockly$Lua.luaGenerator.STATEMENT_PREFIX,a));do{const d=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"IF"+b,module$exports$Blockly$Lua.luaGenerator.ORDER_NONE)||"false";let e=module$exports$Blockly$Lua.luaGenerator.statementToCode(a,"DO"+b);module$exports$Blockly$Lua.luaGenerator.STATEMENT_SUFFIX&&(e= +module$exports$Blockly$Lua.luaGenerator.prefixLines(module$exports$Blockly$Lua.luaGenerator.injectId(module$exports$Blockly$Lua.luaGenerator.STATEMENT_SUFFIX,a),module$exports$Blockly$Lua.luaGenerator.INDENT)+e);c+=(0",GTE:">="}[a.getFieldValue("OP")],c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"A",module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL)||"0";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"B",module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL)||"0";return[c+" "+b+" "+a,module$exports$Blockly$Lua.luaGenerator.ORDER_RELATIONAL]}; +module$exports$Blockly$Lua.luaGenerator.logic_operation=function(a){const b="AND"===a.getFieldValue("OP")?"and":"or",c="and"===b?module$exports$Blockly$Lua.luaGenerator.ORDER_AND:module$exports$Blockly$Lua.luaGenerator.ORDER_OR;let d=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"A",c);a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"B",c);if(d||a){const e="and"===b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; +module$exports$Blockly$Lua.luaGenerator.logic_negate=function(a){return["not "+(module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"BOOL",module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY)||"true"),module$exports$Blockly$Lua.luaGenerator.ORDER_UNARY]};module$exports$Blockly$Lua.luaGenerator.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",module$exports$Blockly$Lua.luaGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Lua.luaGenerator.logic_null=function(a){return["nil",module$exports$Blockly$Lua.luaGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Lua.luaGenerator.logic_ternary=function(a){const b=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"IF",module$exports$Blockly$Lua.luaGenerator.ORDER_AND)||"false",c=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"THEN",module$exports$Blockly$Lua.luaGenerator.ORDER_AND)||"nil";a=module$exports$Blockly$Lua.luaGenerator.valueToCode(a,"ELSE",module$exports$Blockly$Lua.luaGenerator.ORDER_OR)||"nil";return[b+" and "+c+" or "+a,module$exports$Blockly$Lua.luaGenerator.ORDER_OR]};var module$exports$Blockly$Lua$lists={},module$contents$Blockly$Lua$lists_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$Lua.luaGenerator.lists_create_empty=function(a){return["{}",module$exports$Blockly$Lua.luaGenerator.ORDER_HIGH]}; +module$exports$Blockly$Lua.luaGenerator.lists_create_with=function(a){const b=Array(a.itemCount_);for(let c=0;c <= >= ~= ==\nLua.ORDER_AND = 8; // and\nLua.ORDER_OR = 9; // or\nLua.ORDER_NONE = 99;\n\n/**\n * Note: Lua is not supporting zero-indexing since the language itself is\n * one-indexed, so the generator does not repoct the oneBasedIndex configuration\n * option used for lists and text.\n */\n\n/**\n * Whether the init method has been called.\n * @type {?boolean}\n */\nLua.isInitialized = false;\n\n/**\n * Initialise the database of variable names.\n * @param {!Workspace} workspace Workspace to generate code from.\n */\nLua.init = function(workspace) {\n // Call Blockly.Generator's init.\n Object.getPrototypeOf(this).init.call(this);\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_);\n } else {\n this.nameDB_.reset();\n }\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n this.isInitialized = true;\n};\n\n/**\n * Prepend the generated code with the variable definitions.\n * @param {string} code Generated code.\n * @return {string} Completed code.\n */\nLua.finish = function(code) {\n // Convert the definitions dictionary into a list.\n const definitions = objectUtils.values(this.definitions_);\n // Call Blockly.Generator's finish.\n code = Object.getPrototypeOf(this).finish.call(this, code);\n this.isInitialized = false;\n\n this.nameDB_.reset();\n return definitions.join('\\n\\n') + '\\n\\n\\n' + code;\n};\n\n/**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything. In Lua, an expression is not a legal statement, so we must assign\n * the value to the (conventionally ignored) _.\n * http://lua-users.org/wiki/ExpressionsAsStatements\n * @param {string} line Line of generated code.\n * @return {string} Legal line of code.\n */\nLua.scrubNakedValue = function(line) {\n return 'local _ = ' + line + '\\n';\n};\n\n/**\n * Encode a string as a properly escaped Lua string, complete with\n * quotes.\n * @param {string} string Text to encode.\n * @return {string} Lua string.\n * @protected\n */\nLua.quote_ = function(string) {\n string = string.replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\\\n')\n .replace(/'/g, '\\\\\\'');\n return '\\'' + string + '\\'';\n};\n\n/**\n * Encode a string as a properly escaped multiline Lua string, complete with\n * quotes.\n * @param {string} string Text to encode.\n * @return {string} Lua string.\n * @protected\n */\nLua.multiline_quote_ = function(string) {\n const lines = string.split(/\\n/g).map(this.quote_);\n // Join with the following, plus a newline:\n // .. '\\n' ..\n return lines.join(' .. \\'\\\\n\\' ..\\n');\n};\n\n/**\n * Common tasks for generating Lua from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n * @param {!Block} block The current block.\n * @param {string} code The Lua code created for this block.\n * @param {boolean=} opt_thisOnly True to generate code for only this statement.\n * @return {string} Lua code with comments and subsequent blocks added.\n * @protected\n */\nLua.scrub_ = function(block, code, opt_thisOnly) {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment, '-- ') + '\\n';\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '-- ');\n }\n }\n }\n }\n }\n const nextBlock = block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = opt_thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n};\n\nexports.luaGenerator = Lua;\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.variables');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['variables_get'] = function(block) {\n // Variable getter.\n const code =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return [code, Lua.ORDER_ATOMIC];\n};\n\nLua['variables_set'] = function(block) {\n // Variable setter.\n const argument0 = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || '0';\n const varName =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = ' + argument0 + '\\n';\n};\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for dynamic variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.variablesDynamic');\n\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.Lua.variables');\n\n\n// Lua is dynamically typed.\nLua['variables_get_dynamic'] = Lua['variables_get'];\nLua['variables_set_dynamic'] = Lua['variables_set'];\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for text blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.texts');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['text'] = function(block) {\n // Text value.\n const code = Lua.quote_(block.getFieldValue('TEXT'));\n return [code, Lua.ORDER_ATOMIC];\n};\n\nLua['text_multiline'] = function(block) {\n // Text value.\n const code = Lua.multiline_quote_(block.getFieldValue('TEXT'));\n const order =\n code.indexOf('..') !== -1 ? Lua.ORDER_CONCATENATION : Lua.ORDER_ATOMIC;\n return [code, order];\n};\n\nLua['text_join'] = function(block) {\n // Create a string made up of any number of elements of any type.\n if (block.itemCount_ === 0) {\n return [\"''\", Lua.ORDER_ATOMIC];\n } else if (block.itemCount_ === 1) {\n const element = Lua.valueToCode(block, 'ADD0', Lua.ORDER_NONE) || \"''\";\n const code = 'tostring(' + element + ')';\n return [code, Lua.ORDER_HIGH];\n } else if (block.itemCount_ === 2) {\n const element0 =\n Lua.valueToCode(block, 'ADD0', Lua.ORDER_CONCATENATION) || \"''\";\n const element1 =\n Lua.valueToCode(block, 'ADD1', Lua.ORDER_CONCATENATION) || \"''\";\n const code = element0 + ' .. ' + element1;\n return [code, Lua.ORDER_CONCATENATION];\n } else {\n const elements = [];\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] = Lua.valueToCode(block, 'ADD' + i, Lua.ORDER_NONE) || \"''\";\n }\n const code = 'table.concat({' + elements.join(', ') + '})';\n return [code, Lua.ORDER_HIGH];\n }\n};\n\nLua['text_append'] = function(block) {\n // Append to a variable in place.\n const varName =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const value =\n Lua.valueToCode(block, 'TEXT', Lua.ORDER_CONCATENATION) || \"''\";\n return varName + ' = ' + varName + ' .. ' + value + '\\n';\n};\n\nLua['text_length'] = function(block) {\n // String or array length.\n const text = Lua.valueToCode(block, 'VALUE', Lua.ORDER_UNARY) || \"''\";\n return ['#' + text, Lua.ORDER_UNARY];\n};\n\nLua['text_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const text = Lua.valueToCode(block, 'VALUE', Lua.ORDER_UNARY) || \"''\";\n return ['#' + text + ' == 0', Lua.ORDER_RELATIONAL];\n};\n\nLua['text_indexOf'] = function(block) {\n // Search the text for a substring.\n const substring = Lua.valueToCode(block, 'FIND', Lua.ORDER_NONE) || \"''\";\n const text = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || \"''\";\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n functionName = Lua.provideFunction_('firstIndexOf', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(str, substr)\n local i = string.find(str, substr, 1, true)\n if i == nil then\n return 0\n end\n return i\nend\n`);\n } else {\n functionName = Lua.provideFunction_('lastIndexOf', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(str, substr)\n local i = string.find(string.reverse(str), string.reverse(substr), 1, true)\n if i then\n return #str + 2 - i - #substr\n end\n return 0\nend\n`);\n }\n const code = functionName + '(' + text + ', ' + substring + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_charAt'] = function(block) {\n // Get letter at index.\n // Note: Until January 2013 this block did not have the WHERE input.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const atOrder = (where === 'FROM_END') ? Lua.ORDER_UNARY : Lua.ORDER_NONE;\n const at = Lua.valueToCode(block, 'AT', atOrder) || '1';\n const text = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || \"''\";\n let code;\n if (where === 'RANDOM') {\n const functionName = Lua.provideFunction_('text_random_letter', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(str)\n local index = math.random(string.len(str))\n return string.sub(str, index, index)\nend\n`);\n code = functionName + '(' + text + ')';\n } else {\n let start;\n if (where === 'FIRST') {\n start = '1';\n } else if (where === 'LAST') {\n start = '-1';\n } else {\n if (where === 'FROM_START') {\n start = at;\n } else if (where === 'FROM_END') {\n start = '-' + at;\n } else {\n throw Error('Unhandled option (text_charAt).');\n }\n }\n if (start.match(/^-?\\w*$/)) {\n code = 'string.sub(' + text + ', ' + start + ', ' + start + ')';\n } else {\n // use function to avoid reevaluation\n const functionName = Lua.provideFunction_('text_char_at', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(str, index)\n return string.sub(str, index, index)\nend\n`);\n code = functionName + '(' + text + ', ' + start + ')';\n }\n }\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_getSubstring'] = function(block) {\n // Get substring.\n const text = Lua.valueToCode(block, 'STRING', Lua.ORDER_NONE) || \"''\";\n\n // Get start index.\n const where1 = block.getFieldValue('WHERE1');\n const at1Order = (where1 === 'FROM_END') ? Lua.ORDER_UNARY : Lua.ORDER_NONE;\n const at1 = Lua.valueToCode(block, 'AT1', at1Order) || '1';\n let start;\n if (where1 === 'FIRST') {\n start = 1;\n } else if (where1 === 'FROM_START') {\n start = at1;\n } else if (where1 === 'FROM_END') {\n start = '-' + at1;\n } else {\n throw Error('Unhandled option (text_getSubstring)');\n }\n\n // Get end index.\n const where2 = block.getFieldValue('WHERE2');\n const at2Order = (where2 === 'FROM_END') ? Lua.ORDER_UNARY : Lua.ORDER_NONE;\n const at2 = Lua.valueToCode(block, 'AT2', at2Order) || '1';\n let end;\n if (where2 === 'LAST') {\n end = -1;\n } else if (where2 === 'FROM_START') {\n end = at2;\n } else if (where2 === 'FROM_END') {\n end = '-' + at2;\n } else {\n throw Error('Unhandled option (text_getSubstring)');\n }\n const code = 'string.sub(' + text + ', ' + start + ', ' + end + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_changeCase'] = function(block) {\n // Change capitalization.\n const operator = block.getFieldValue('CASE');\n const text = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n let functionName;\n if (operator === 'UPPERCASE') {\n functionName = 'string.upper';\n } else if (operator === 'LOWERCASE') {\n functionName = 'string.lower';\n } else if (operator === 'TITLECASE') {\n // There are shorter versions at\n // http://lua-users.org/wiki/SciteTitleCase\n // that do not preserve whitespace.\n functionName = Lua.provideFunction_('text_titlecase', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(str)\n local buf = {}\n local inWord = false\n for i = 1, #str do\n local c = string.sub(str, i, i)\n if inWord then\n table.insert(buf, string.lower(c))\n if string.find(c, \"%s\") then\n inWord = false\n end\n else\n table.insert(buf, string.upper(c))\n inWord = true\n end\n end\n return table.concat(buf)\nend\n`);\n }\n const code = functionName + '(' + text + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_trim'] = function(block) {\n // Trim spaces.\n const OPERATORS = {LEFT: '^%s*(,-)', RIGHT: '(.-)%s*$', BOTH: '^%s*(.-)%s*$'};\n const operator = OPERATORS[block.getFieldValue('MODE')];\n const text = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n const code = 'string.gsub(' + text + ', \"' + operator + '\", \"%1\")';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_print'] = function(block) {\n // Print statement.\n const msg = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n return 'print(' + msg + ')\\n';\n};\n\nLua['text_prompt_ext'] = function(block) {\n // Prompt function.\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = Lua.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n }\n\n const functionName = Lua.provideFunction_('text_prompt', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(msg)\n io.write(msg)\n io.flush()\n return io.read()\nend\n`);\n let code = functionName + '(' + msg + ')';\n\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'tonumber(' + code + ', 10)';\n }\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_prompt'] = Lua['text_prompt_ext'];\n\nLua['text_count'] = function(block) {\n const text = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n const sub = Lua.valueToCode(block, 'SUB', Lua.ORDER_NONE) || \"''\";\n const functionName = Lua.provideFunction_('text_count', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(haystack, needle)\n if #needle == 0 then\n return #haystack + 1\n end\n local i = 1\n local count = 0\n while true do\n i = string.find(haystack, needle, i, true)\n if i == nil then\n break\n end\n count = count + 1\n i = i + #needle\n end\n return count\nend\n`);\n const code = functionName + '(' + text + ', ' + sub + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_replace'] = function(block) {\n const text = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n const from = Lua.valueToCode(block, 'FROM', Lua.ORDER_NONE) || \"''\";\n const to = Lua.valueToCode(block, 'TO', Lua.ORDER_NONE) || \"''\";\n const functionName = Lua.provideFunction_('text_replace', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(haystack, needle, replacement)\n local buf = {}\n local i = 1\n while i <= #haystack do\n if string.sub(haystack, i, i + #needle - 1) == needle then\n for j = 1, #replacement do\n table.insert(buf, string.sub(replacement, j, j))\n end\n i = i + #needle\n else\n table.insert(buf, string.sub(haystack, i, i))\n i = i + 1\n end\n end\n return table.concat(buf)\nend\n`);\n const code = functionName + '(' + text + ', ' + from + ', ' + to + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['text_reverse'] = function(block) {\n const text = Lua.valueToCode(block, 'TEXT', Lua.ORDER_NONE) || \"''\";\n const code = 'string.reverse(' + text + ')';\n return [code, Lua.ORDER_HIGH];\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for procedure blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.procedures');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['procedures_defreturn'] = function(block) {\n // Define a procedure with a return value.\n const funcName =\n Lua.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n let xfix1 = '';\n if (Lua.STATEMENT_PREFIX) {\n xfix1 += Lua.injectId(Lua.STATEMENT_PREFIX, block);\n }\n if (Lua.STATEMENT_SUFFIX) {\n xfix1 += Lua.injectId(Lua.STATEMENT_SUFFIX, block);\n }\n if (xfix1) {\n xfix1 = Lua.prefixLines(xfix1, Lua.INDENT);\n }\n let loopTrap = '';\n if (Lua.INFINITE_LOOP_TRAP) {\n loopTrap = Lua.prefixLines(\n Lua.injectId(Lua.INFINITE_LOOP_TRAP, block), Lua.INDENT);\n }\n let branch = Lua.statementToCode(block, 'STACK');\n let returnValue = Lua.valueToCode(block, 'RETURN', Lua.ORDER_NONE) || '';\n let xfix2 = '';\n if (branch && returnValue) {\n // After executing the function body, revisit this block for the return.\n xfix2 = xfix1;\n }\n if (returnValue) {\n returnValue = Lua.INDENT + 'return ' + returnValue + '\\n';\n } else if (!branch) {\n branch = '';\n }\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = Lua.nameDB_.getName(variables[i], NameType.VARIABLE);\n }\n let code = 'function ' + funcName + '(' + args.join(', ') + ')\\n' + xfix1 +\n loopTrap + branch + xfix2 + returnValue + 'end\\n';\n code = Lua.scrub_(block, code);\n // Add % so as not to collide with helper functions in definitions list.\n Lua.definitions_['%' + funcName] = code;\n return null;\n};\n\n// Defining a procedure without a return value uses the same generator as\n// a procedure with a return value.\nLua['procedures_defnoreturn'] = Lua['procedures_defreturn'];\n\nLua['procedures_callreturn'] = function(block) {\n // Call a procedure with a return value.\n const funcName =\n Lua.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = Lua.valueToCode(block, 'ARG' + i, Lua.ORDER_NONE) || 'nil';\n }\n const code = funcName + '(' + args.join(', ') + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['procedures_callnoreturn'] = function(block) {\n // Call a procedure with no return value.\n // Generated code is for a function call as a statement is the same as a\n // function call as a value, with the addition of line ending.\n const tuple = Lua['procedures_callreturn'](block);\n return tuple[0] + '\\n';\n};\n\nLua['procedures_ifreturn'] = function(block) {\n // Conditionally return value from a procedure.\n const condition =\n Lua.valueToCode(block, 'CONDITION', Lua.ORDER_NONE) || 'false';\n let code = 'if ' + condition + ' then\\n';\n if (Lua.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the return is triggered.\n code +=\n Lua.prefixLines(Lua.injectId(Lua.STATEMENT_SUFFIX, block), Lua.INDENT);\n }\n if (block.hasReturnValue_) {\n const value = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || 'nil';\n code += Lua.INDENT + 'return ' + value + '\\n';\n } else {\n code += Lua.INDENT + 'return\\n';\n }\n code += 'end\\n';\n return code;\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for math blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.math');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['math_number'] = function(block) {\n // Numeric value.\n const code = Number(block.getFieldValue('NUM'));\n const order = code < 0 ? Lua.ORDER_UNARY : Lua.ORDER_ATOMIC;\n return [code, order];\n};\n\nLua['math_arithmetic'] = function(block) {\n // Basic arithmetic operators, and power.\n const OPERATORS = {\n 'ADD': [' + ', Lua.ORDER_ADDITIVE],\n 'MINUS': [' - ', Lua.ORDER_ADDITIVE],\n 'MULTIPLY': [' * ', Lua.ORDER_MULTIPLICATIVE],\n 'DIVIDE': [' / ', Lua.ORDER_MULTIPLICATIVE],\n 'POWER': [' ^ ', Lua.ORDER_EXPONENTIATION],\n };\n const tuple = OPERATORS[block.getFieldValue('OP')];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = Lua.valueToCode(block, 'A', order) || '0';\n const argument1 = Lua.valueToCode(block, 'B', order) || '0';\n const code = argument0 + operator + argument1;\n return [code, order];\n};\n\nLua['math_single'] = function(block) {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n arg = Lua.valueToCode(block, 'NUM', Lua.ORDER_UNARY) || '0';\n return ['-' + arg, Lua.ORDER_UNARY];\n }\n if (operator === 'POW10') {\n arg = Lua.valueToCode(block, 'NUM', Lua.ORDER_EXPONENTIATION) || '0';\n return ['10 ^ ' + arg, Lua.ORDER_EXPONENTIATION];\n }\n if (operator === 'ROUND') {\n arg = Lua.valueToCode(block, 'NUM', Lua.ORDER_ADDITIVE) || '0';\n } else {\n arg = Lua.valueToCode(block, 'NUM', Lua.ORDER_NONE) || '0';\n }\n\n let code;\n switch (operator) {\n case 'ABS':\n code = 'math.abs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'math.sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'math.log(' + arg + ')';\n break;\n case 'LOG10':\n code = 'math.log(' + arg + ', 10)';\n break;\n case 'EXP':\n code = 'math.exp(' + arg + ')';\n break;\n case 'ROUND':\n // This rounds up. Blockly does not specify rounding direction.\n code = 'math.floor(' + arg + ' + .5)';\n break;\n case 'ROUNDUP':\n code = 'math.ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'math.floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'math.sin(math.rad(' + arg + '))';\n break;\n case 'COS':\n code = 'math.cos(math.rad(' + arg + '))';\n break;\n case 'TAN':\n code = 'math.tan(math.rad(' + arg + '))';\n break;\n case 'ASIN':\n code = 'math.deg(math.asin(' + arg + '))';\n break;\n case 'ACOS':\n code = 'math.deg(math.acos(' + arg + '))';\n break;\n case 'ATAN':\n code = 'math.deg(math.atan(' + arg + '))';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['math_constant'] = function(block) {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS = {\n 'PI': ['math.pi', Lua.ORDER_HIGH],\n 'E': ['math.exp(1)', Lua.ORDER_HIGH],\n 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', Lua.ORDER_MULTIPLICATIVE],\n 'SQRT2': ['math.sqrt(2)', Lua.ORDER_HIGH],\n 'SQRT1_2': ['math.sqrt(1 / 2)', Lua.ORDER_HIGH],\n 'INFINITY': ['math.huge', Lua.ORDER_HIGH],\n };\n return CONSTANTS[block.getFieldValue('CONSTANT')];\n};\n\nLua['math_number_property'] = function(block) {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES = {\n 'EVEN': [' % 2 == 0', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],\n 'ODD': [' % 2 == 1', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],\n 'WHOLE': [' % 1 == 0', Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],\n 'POSITIVE': [' > 0', Lua.ORDER_RELATIONAL, Lua.ORDER_RELATIONAL],\n 'NEGATIVE': [' < 0', Lua.ORDER_RELATIONAL, Lua.ORDER_RELATIONAL],\n 'DIVISIBLE_BY': [null, Lua.ORDER_MULTIPLICATIVE, Lua.ORDER_RELATIONAL],\n 'PRIME': [null, Lua.ORDER_NONE, Lua.ORDER_HIGH],\n };\n const dropdownProperty = block.getFieldValue('PROPERTY');\n const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck = Lua.valueToCode(block, 'NUMBER_TO_CHECK',\n inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n const functionName = Lua.provideFunction_('math_isPrime', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(n)\n -- https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if n == 2 or n == 3 then\n return true\n end\n -- False if n is NaN, negative, is 1, or not whole.\n -- And false if n is divisible by 2 or 3.\n if not(n > 1) or n % 1 ~= 0 or n % 2 == 0 or n % 3 == 0 then\n return false\n end\n -- Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x = 6, math.sqrt(n) + 1.5, 6 do\n if n % (x - 1) == 0 or n % (x + 1) == 0 then\n return false\n end\n end\n return true\nend\n`);\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor = Lua.valueToCode(block, 'DIVISOR',\n Lua.ORDER_MULTIPLICATIVE) || '0';\n // If 'divisor' is some code that evals to 0, Lua will produce a nan.\n // Let's produce nil if we can determine this at compile-time.\n if (divisor === '0') {\n return ['nil', Lua.ORDER_ATOMIC];\n }\n // The normal trick to implement ?: with and/or doesn't work here:\n // divisor == 0 and nil or number_to_check % divisor == 0\n // because nil is false, so allow a runtime failure. :-(\n code = numberToCheck + ' % ' + divisor + ' == 0';\n } else {\n code = numberToCheck + suffix;\n }\n return [code, outputOrder];\n};\n\nLua['math_change'] = function(block) {\n // Add to a variable in place.\n const argument0 = Lua.valueToCode(block, 'DELTA', Lua.ORDER_ADDITIVE) || '0';\n const varName =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = ' + varName + ' + ' + argument0 + '\\n';\n};\n\n// Rounding functions have a single operand.\nLua['math_round'] = Lua['math_single'];\n// Trigonometry functions have a single operand.\nLua['math_trig'] = Lua['math_single'];\n\nLua['math_on_list'] = function(block) {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n const list = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';\n let functionName;\n\n // Functions needed in more than one case.\n function provideSum() {\n return Lua.provideFunction_('math_sum', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n local result = 0\n for _, v in ipairs(t) do\n result = result + v\n end\n return result\nend\n`);\n }\n\n switch (func) {\n case 'SUM':\n functionName = provideSum();\n break;\n\n case 'MIN':\n // Returns 0 for the empty list.\n functionName = Lua.provideFunction_('math_min', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n if #t == 0 then\n return 0\n end\n local result = math.huge\n for _, v in ipairs(t) do\n if v < result then\n result = v\n end\n end\n return result\nend\n`);\n break;\n\n case 'AVERAGE':\n // Returns 0 for the empty list.\n functionName = Lua.provideFunction_('math_average', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n if #t == 0 then\n return 0\n end\n return ${provideSum()}(t) / #t\nend\n`);\n break;\n\n case 'MAX':\n // Returns 0 for the empty list.\n functionName = Lua.provideFunction_('math_max', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n if #t == 0 then\n return 0\n end\n local result = -math.huge\n for _, v in ipairs(t) do\n if v > result then\n result = v\n end\n end\n return result\nend\n`);\n break;\n\n case 'MEDIAN':\n // This operation excludes non-numbers.\n functionName = Lua.provideFunction_('math_median', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n -- Source: http://lua-users.org/wiki/SimpleStats\n if #t == 0 then\n return 0\n end\n local temp = {}\n for _, v in ipairs(t) do\n if type(v) == 'number' then\n table.insert(temp, v)\n end\n end\n table.sort(temp)\n if #temp % 2 == 0 then\n return (temp[#temp / 2] + temp[(#temp / 2) + 1]) / 2\n else\n return temp[math.ceil(#temp / 2)]\n end\nend\n`);\n break;\n\n case 'MODE':\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // The Lua version includes non-numbers.\n functionName = Lua.provideFunction_('math_modes', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n -- Source: http://lua-users.org/wiki/SimpleStats\n local counts = {}\n for _, v in ipairs(t) do\n if counts[v] == nil then\n counts[v] = 1\n else\n counts[v] = counts[v] + 1\n end\n end\n local biggestCount = 0\n for _, v in pairs(counts) do\n if v > biggestCount then\n biggestCount = v\n end\n end\n local temp = {}\n for k, v in pairs(counts) do\n if v == biggestCount then\n table.insert(temp, k)\n end\n end\n return temp\nend\n`);\n break;\n\n case 'STD_DEV':\n functionName = Lua.provideFunction_('math_standard_deviation', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n local m\n local vm\n local total = 0\n local count = 0\n local result\n m = #t == 0 and 0 or ${provideSum()}(t) / #t\n for _, v in ipairs(t) do\n if type(v) == 'number' then\n vm = v - m\n total = total + (vm * vm)\n count = count + 1\n end\n end\n result = math.sqrt(total / (count-1))\n return result\nend\n`);\n break;\n\n case 'RANDOM':\n functionName = Lua.provideFunction_('math_random_list', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t)\n if #t == 0 then\n return nil\n end\n return t[math.random(#t)]\nend\n`);\n break;\n\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [functionName + '(' + list + ')', Lua.ORDER_HIGH];\n};\n\nLua['math_modulo'] = function(block) {\n // Remainder computation.\n const argument0 =\n Lua.valueToCode(block, 'DIVIDEND', Lua.ORDER_MULTIPLICATIVE) || '0';\n const argument1 =\n Lua.valueToCode(block, 'DIVISOR', Lua.ORDER_MULTIPLICATIVE) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, Lua.ORDER_MULTIPLICATIVE];\n};\n\nLua['math_constrain'] = function(block) {\n // Constrain a number between two limits.\n const argument0 = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || '0';\n const argument1 =\n Lua.valueToCode(block, 'LOW', Lua.ORDER_NONE) || '-math.huge';\n const argument2 =\n Lua.valueToCode(block, 'HIGH', Lua.ORDER_NONE) || 'math.huge';\n const code = 'math.min(math.max(' + argument0 + ', ' + argument1 + '), ' +\n argument2 + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['math_random_int'] = function(block) {\n // Random integer between [X] and [Y].\n const argument0 = Lua.valueToCode(block, 'FROM', Lua.ORDER_NONE) || '0';\n const argument1 = Lua.valueToCode(block, 'TO', Lua.ORDER_NONE) || '0';\n const code = 'math.random(' + argument0 + ', ' + argument1 + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['math_random_float'] = function(block) {\n // Random fraction between 0 and 1.\n return ['math.random()', Lua.ORDER_HIGH];\n};\n\nLua['math_atan2'] = function(block) {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n const argument0 = Lua.valueToCode(block, 'X', Lua.ORDER_NONE) || '0';\n const argument1 = Lua.valueToCode(block, 'Y', Lua.ORDER_NONE) || '0';\n return [\n 'math.deg(math.atan2(' + argument1 + ', ' + argument0 + '))', Lua.ORDER_HIGH\n ];\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for loop blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.loops');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\n/**\n * This is the text used to implement a
    continue
    .\n * It is also used to recognise
    continue
    s in generated code so that\n * the appropriate label can be put at the end of the loop body.\n * @const {string}\n */\nconst CONTINUE_STATEMENT = 'goto continue\\n';\n\n/**\n * If the loop body contains a \"goto continue\" statement, add a continue label\n * to the loop body. Slightly inefficient, as continue labels will be generated\n * in all outer loops, but this is safer than duplicating the logic of\n * blockToCode.\n *\n * @param {string} branch Generated code of the loop body\n * @return {string} Generated label or '' if unnecessary\n */\nconst addContinueLabel = function(branch) {\n if (branch.indexOf(CONTINUE_STATEMENT) !== -1) {\n // False positives are possible (e.g. a string literal), but are harmless.\n return branch + Lua.INDENT + '::continue::\\n';\n } else {\n return branch;\n }\n};\n\nLua['controls_repeat_ext'] = function(block) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(Number(block.getFieldValue('TIMES')));\n } else {\n // External number.\n repeats = Lua.valueToCode(block, 'TIMES', Lua.ORDER_NONE) || '0';\n }\n if (stringUtils.isNumber(repeats)) {\n repeats = parseInt(repeats, 10);\n } else {\n repeats = 'math.floor(' + repeats + ')';\n }\n let branch = Lua.statementToCode(block, 'DO');\n branch = Lua.addLoopTrap(branch, block);\n branch = addContinueLabel(branch);\n const loopVar = Lua.nameDB_.getDistinctName('count', NameType.VARIABLE);\n const code =\n 'for ' + loopVar + ' = 1, ' + repeats + ' do\\n' + branch + 'end\\n';\n return code;\n};\n\nLua['controls_repeat'] = Lua['controls_repeat_ext'];\n\nLua['controls_whileUntil'] = function(block) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 =\n Lua.valueToCode(\n block, 'BOOL', until ? Lua.ORDER_UNARY : Lua.ORDER_NONE) ||\n 'false';\n let branch = Lua.statementToCode(block, 'DO');\n branch = Lua.addLoopTrap(branch, block);\n branch = addContinueLabel(branch);\n if (until) {\n argument0 = 'not ' + argument0;\n }\n return 'while ' + argument0 + ' do\\n' + branch + 'end\\n';\n};\n\nLua['controls_for'] = function(block) {\n // For loop.\n const variable0 =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const startVar = Lua.valueToCode(block, 'FROM', Lua.ORDER_NONE) || '0';\n const endVar = Lua.valueToCode(block, 'TO', Lua.ORDER_NONE) || '0';\n const increment = Lua.valueToCode(block, 'BY', Lua.ORDER_NONE) || '1';\n let branch = Lua.statementToCode(block, 'DO');\n branch = Lua.addLoopTrap(branch, block);\n branch = addContinueLabel(branch);\n let code = '';\n let incValue;\n if (stringUtils.isNumber(startVar) && stringUtils.isNumber(endVar) &&\n stringUtils.isNumber(increment)) {\n // All arguments are simple numbers.\n const up = Number(startVar) <= Number(endVar);\n const step = Math.abs(Number(increment));\n incValue = (up ? '' : '-') + step;\n } else {\n code = '';\n // Determine loop direction at start, in case one of the bounds\n // changes during loop execution.\n incValue =\n Lua.nameDB_.getDistinctName(variable0 + '_inc', NameType.VARIABLE);\n code += incValue + ' = ';\n if (stringUtils.isNumber(increment)) {\n code += Math.abs(increment) + '\\n';\n } else {\n code += 'math.abs(' + increment + ')\\n';\n }\n code += 'if (' + startVar + ') > (' + endVar + ') then\\n';\n code += Lua.INDENT + incValue + ' = -' + incValue + '\\n';\n code += 'end\\n';\n }\n code +=\n 'for ' + variable0 + ' = ' + startVar + ', ' + endVar + ', ' + incValue;\n code += ' do\\n' + branch + 'end\\n';\n return code;\n};\n\nLua['controls_forEach'] = function(block) {\n // For each loop.\n const variable0 =\n Lua.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';\n let branch = Lua.statementToCode(block, 'DO');\n branch = Lua.addLoopTrap(branch, block);\n branch = addContinueLabel(branch);\n const code = 'for _, ' + variable0 + ' in ipairs(' + argument0 + ') do \\n' +\n branch + 'end\\n';\n return code;\n};\n\nLua['controls_flow_statements'] = function(block) {\n // Flow statements: continue, break.\n let xfix = '';\n if (Lua.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += Lua.injectId(Lua.STATEMENT_PREFIX, block);\n }\n if (Lua.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += Lua.injectId(Lua.STATEMENT_SUFFIX, block);\n }\n if (Lua.STATEMENT_PREFIX) {\n const loop = block.getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += Lua.injectId(Lua.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break\\n';\n case 'CONTINUE':\n return xfix + CONTINUE_STATEMENT;\n }\n throw Error('Unknown flow statement.');\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for logic blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.logic');\n\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['controls_if'] = function(block) {\n // If/elseif/else condition.\n let n = 0;\n let code = '';\n if (Lua.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += Lua.injectId(Lua.STATEMENT_PREFIX, block);\n }\n do {\n const conditionCode =\n Lua.valueToCode(block, 'IF' + n, Lua.ORDER_NONE) || 'false';\n let branchCode = Lua.statementToCode(block, 'DO' + n);\n if (Lua.STATEMENT_SUFFIX) {\n branchCode = Lua.prefixLines(\n Lua.injectId(Lua.STATEMENT_SUFFIX, block), Lua.INDENT) + branchCode;\n }\n code +=\n (n > 0 ? 'else' : '') + 'if ' + conditionCode + ' then\\n' + branchCode;\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || Lua.STATEMENT_SUFFIX) {\n let branchCode = Lua.statementToCode(block, 'ELSE');\n if (Lua.STATEMENT_SUFFIX) {\n branchCode = Lua.prefixLines(\n Lua.injectId(Lua.STATEMENT_SUFFIX, block), Lua.INDENT) +\n branchCode;\n }\n code += 'else\\n' + branchCode;\n }\n return code + 'end\\n';\n};\n\nLua['controls_ifelse'] = Lua['controls_if'];\n\nLua['logic_compare'] = function(block) {\n // Comparison operator.\n const OPERATORS =\n {'EQ': '==', 'NEQ': '~=', 'LT': '<', 'LTE': '<=', 'GT': '>', 'GTE': '>='};\n const operator = OPERATORS[block.getFieldValue('OP')];\n const argument0 = Lua.valueToCode(block, 'A', Lua.ORDER_RELATIONAL) || '0';\n const argument1 = Lua.valueToCode(block, 'B', Lua.ORDER_RELATIONAL) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, Lua.ORDER_RELATIONAL];\n};\n\nLua['logic_operation'] = function(block) {\n // Operations 'and', 'or'.\n const operator = (block.getFieldValue('OP') === 'AND') ? 'and' : 'or';\n const order = (operator === 'and') ? Lua.ORDER_AND : Lua.ORDER_OR;\n let argument0 = Lua.valueToCode(block, 'A', order);\n let argument1 = Lua.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'false';\n argument1 = 'false';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = (operator === 'and') ? 'true' : 'false';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nLua['logic_negate'] = function(block) {\n // Negation.\n const argument0 = Lua.valueToCode(block, 'BOOL', Lua.ORDER_UNARY) || 'true';\n const code = 'not ' + argument0;\n return [code, Lua.ORDER_UNARY];\n};\n\nLua['logic_boolean'] = function(block) {\n // Boolean values true and false.\n const code = (block.getFieldValue('BOOL') === 'TRUE') ? 'true' : 'false';\n return [code, Lua.ORDER_ATOMIC];\n};\n\nLua['logic_null'] = function(block) {\n // Null data type.\n return ['nil', Lua.ORDER_ATOMIC];\n};\n\nLua['logic_ternary'] = function(block) {\n // Ternary operator.\n const value_if = Lua.valueToCode(block, 'IF', Lua.ORDER_AND) || 'false';\n const value_then = Lua.valueToCode(block, 'THEN', Lua.ORDER_AND) || 'nil';\n const value_else = Lua.valueToCode(block, 'ELSE', Lua.ORDER_OR) || 'nil';\n const code = value_if + ' and ' + value_then + ' or ' + value_else;\n return [code, Lua.ORDER_OR];\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for list blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.lists');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['lists_create_empty'] = function(block) {\n // Create an empty list.\n return ['{}', Lua.ORDER_HIGH];\n};\n\nLua['lists_create_with'] = function(block) {\n // Create a list with any number of elements of any type.\n const elements = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] = Lua.valueToCode(block, 'ADD' + i, Lua.ORDER_NONE) || 'None';\n }\n const code = '{' + elements.join(', ') + '}';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['lists_repeat'] = function(block) {\n // Create a list with one element repeated.\n const functionName = Lua.provideFunction_('create_list_repeated', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(item, count)\n local t = {}\n for i = 1, count do\n table.insert(t, item)\n end\n return t\nend\n `);\n const element = Lua.valueToCode(block, 'ITEM', Lua.ORDER_NONE) || 'None';\n const repeatCount = Lua.valueToCode(block, 'NUM', Lua.ORDER_NONE) || '0';\n const code = functionName + '(' + element + ', ' + repeatCount + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['lists_length'] = function(block) {\n // String or array length.\n const list = Lua.valueToCode(block, 'VALUE', Lua.ORDER_UNARY) || '{}';\n return ['#' + list, Lua.ORDER_UNARY];\n};\n\nLua['lists_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const list = Lua.valueToCode(block, 'VALUE', Lua.ORDER_UNARY) || '{}';\n const code = '#' + list + ' == 0';\n return [code, Lua.ORDER_RELATIONAL];\n};\n\nLua['lists_indexOf'] = function(block) {\n // Find an item in the list.\n const item = Lua.valueToCode(block, 'FIND', Lua.ORDER_NONE) || \"''\";\n const list = Lua.valueToCode(block, 'VALUE', Lua.ORDER_NONE) || '{}';\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n functionName = Lua.provideFunction_('first_index', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t, elem)\n for k, v in ipairs(t) do\n if v == elem then\n return k\n end\n end\n return 0\nend\n`);\n } else {\n functionName = Lua.provideFunction_('last_index', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(t, elem)\n for i = #t, 1, -1 do\n if t[i] == elem then\n return i\n end\n end\n return 0\nend\n`);\n }\n const code = functionName + '(' + list + ', ' + item + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\n/**\n * Returns an expression calculating the index into a list.\n * @param {string} listName Name of the list, used to calculate length.\n * @param {string} where The method of indexing, selected by dropdown in Blockly\n * @param {string=} opt_at The optional offset when indexing from start/end.\n * @return {string|undefined} Index expression.\n */\nconst getListIndex = function(listName, where, opt_at) {\n if (where === 'FIRST') {\n return '1';\n } else if (where === 'FROM_END') {\n return '#' + listName + ' + 1 - ' + opt_at;\n } else if (where === 'LAST') {\n return '#' + listName;\n } else if (where === 'RANDOM') {\n return 'math.random(#' + listName + ')';\n } else {\n return opt_at;\n }\n};\n\nLua['lists_getIndex'] = function(block) {\n // Get element at index.\n // Note: Until January 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const list = Lua.valueToCode(block, 'VALUE', Lua.ORDER_HIGH) || '({})';\n\n // If `list` would be evaluated more than once (which is the case for LAST,\n // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once.\n if ((where === 'LAST' || where === 'FROM_END' || where === 'RANDOM') &&\n !list.match(/^\\w+$/)) {\n // `list` is an expression, so we may not evaluate it more than once.\n if (mode === 'REMOVE') {\n // We can use multiple statements.\n const atOrder =\n (where === 'FROM_END') ? Lua.ORDER_ADDITIVE : Lua.ORDER_NONE;\n let at = Lua.valueToCode(block, 'AT', atOrder) || '1';\n const listVar =\n Lua.nameDB_.getDistinctName('tmp_list', NameType.VARIABLE);\n at = getListIndex(listVar, where, at);\n const code = listVar + ' = ' + list + '\\n' +\n 'table.remove(' + listVar + ', ' + at + ')\\n';\n return code;\n } else {\n // We need to create a procedure to avoid reevaluating values.\n const at = Lua.valueToCode(block, 'AT', Lua.ORDER_NONE) || '1';\n let functionName;\n if (mode === 'GET') {\n functionName = Lua.provideFunction_('list_get_' + where.toLowerCase(), [\n 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' +\n // The value for 'FROM_END' and'FROM_START' depends on `at` so\n // we add it as a parameter.\n ((where === 'FROM_END' || where === 'FROM_START') ? ', at)' :\n ')'),\n ' return t[' + getListIndex('t', where, 'at') + ']', 'end'\n ]);\n } else { // `mode` === 'GET_REMOVE'\n functionName =\n Lua.provideFunction_('list_remove_' + where.toLowerCase(), [\n 'function ' + Lua.FUNCTION_NAME_PLACEHOLDER_ + '(t' +\n // The value for 'FROM_END' and'FROM_START' depends on `at` so\n // we add it as a parameter.\n ((where === 'FROM_END' || where === 'FROM_START') ? ', at)' :\n ')'),\n ' return table.remove(t, ' + getListIndex('t', where, 'at') +\n ')',\n 'end'\n ]);\n }\n const code = functionName + '(' + list +\n // The value for 'FROM_END' and 'FROM_START' depends on `at` so we\n // pass it.\n ((where === 'FROM_END' || where === 'FROM_START') ? ', ' + at : '') +\n ')';\n return [code, Lua.ORDER_HIGH];\n }\n } else {\n // Either `list` is a simple variable, or we only need to refer to `list`\n // once.\n const atOrder = (mode === 'GET' && where === 'FROM_END') ?\n Lua.ORDER_ADDITIVE :\n Lua.ORDER_NONE;\n let at = Lua.valueToCode(block, 'AT', atOrder) || '1';\n at = getListIndex(list, where, at);\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Lua.ORDER_HIGH];\n } else {\n const code = 'table.remove(' + list + ', ' + at + ')';\n if (mode === 'GET_REMOVE') {\n return [code, Lua.ORDER_HIGH];\n } else { // `mode` === 'REMOVE'\n return code + '\\n';\n }\n }\n }\n};\n\nLua['lists_setIndex'] = function(block) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n let list = Lua.valueToCode(block, 'LIST', Lua.ORDER_HIGH) || '{}';\n const mode = block.getFieldValue('MODE') || 'SET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const at = Lua.valueToCode(block, 'AT', Lua.ORDER_ADDITIVE) || '1';\n const value = Lua.valueToCode(block, 'TO', Lua.ORDER_NONE) || 'None';\n\n let code = '';\n // If `list` would be evaluated more than once (which is the case for LAST,\n // FROM_END, and RANDOM) and is non-trivial, make sure to access it only once.\n if ((where === 'LAST' || where === 'FROM_END' || where === 'RANDOM') &&\n !list.match(/^\\w+$/)) {\n // `list` is an expression, so we may not evaluate it more than once.\n // We can use multiple statements.\n const listVar = Lua.nameDB_.getDistinctName('tmp_list', NameType.VARIABLE);\n code = listVar + ' = ' + list + '\\n';\n list = listVar;\n }\n if (mode === 'SET') {\n code += list + '[' + getListIndex(list, where, at) + '] = ' + value;\n } else { // `mode` === 'INSERT'\n // LAST is a special case, because we want to insert\n // *after* not *before*, the existing last element.\n code += 'table.insert(' + list + ', ' +\n (getListIndex(list, where, at) + (where === 'LAST' ? ' + 1' : '')) +\n ', ' + value + ')';\n }\n return code + '\\n';\n};\n\nLua['lists_getSublist'] = function(block) {\n // Get sublist.\n const list = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const at1 = Lua.valueToCode(block, 'AT1', Lua.ORDER_NONE) || '1';\n const at2 = Lua.valueToCode(block, 'AT2', Lua.ORDER_NONE) || '1';\n\n // The value for 'FROM_END' and'FROM_START' depends on `at` so\n // we add it as a parameter.\n const at1Param =\n (where1 === 'FROM_END' || where1 === 'FROM_START') ? ', at1' : '';\n const at2Param =\n (where2 === 'FROM_END' || where2 === 'FROM_START') ? ', at2' : '';\n const functionName = Lua.provideFunction_(\n 'list_sublist_' + where1.toLowerCase() + '_' + where2.toLowerCase(), `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(source${at1Param}${at2Param})\n local t = {}\n local start = ${getListIndex('source', where1, 'at1')}\n local finish = ${getListIndex('source', where2, 'at2')}\n for i = start, finish do\n table.insert(t, source[i])\n end\n return t\nend\n`);\n const code = functionName + '(' + list +\n // The value for 'FROM_END' and 'FROM_START' depends on `at` so we\n // pass it.\n ((where1 === 'FROM_END' || where1 === 'FROM_START') ? ', ' + at1 : '') +\n ((where2 === 'FROM_END' || where2 === 'FROM_START') ? ', ' + at2 : '') +\n ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['lists_sort'] = function(block) {\n // Block for sorting a list.\n const list = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';\n const direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;\n const type = block.getFieldValue('TYPE');\n\n const functionName = Lua.provideFunction_('list_sort', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(list, typev, direction)\n local t = {}\n for n,v in pairs(list) do table.insert(t, v) end\n local compareFuncs = {\n NUMERIC = function(a, b)\n return (tonumber(tostring(a)) or 0)\n < (tonumber(tostring(b)) or 0) end,\n TEXT = function(a, b)\n return tostring(a) < tostring(b) end,\n IGNORE_CASE = function(a, b)\n return string.lower(tostring(a)) < string.lower(tostring(b)) end\n }\n local compareTemp = compareFuncs[typev]\n local compare = compareTemp\n if direction == -1\n then compare = function(a, b) return compareTemp(b, a) end\n end\n table.sort(t, compare)\n return t\nend\n`);\n\n const code =\n functionName + '(' + list + ',\"' + type + '\", ' + direction + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['lists_split'] = function(block) {\n // Block for splitting text into a list, or joining a list into text.\n let input = Lua.valueToCode(block, 'INPUT', Lua.ORDER_NONE);\n const delimiter = Lua.valueToCode(block, 'DELIM', Lua.ORDER_NONE) || \"''\";\n const mode = block.getFieldValue('MODE');\n let functionName;\n if (mode === 'SPLIT') {\n if (!input) {\n input = \"''\";\n }\n functionName = Lua.provideFunction_('list_string_split', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(input, delim)\n local t = {}\n local pos = 1\n while true do\n next_delim = string.find(input, delim, pos)\n if next_delim == nil then\n table.insert(t, string.sub(input, pos))\n break\n else\n table.insert(t, string.sub(input, pos, next_delim-1))\n pos = next_delim + #delim\n end\n end\n return t\nend\n`);\n } else if (mode === 'JOIN') {\n if (!input) {\n input = '{}';\n }\n functionName = 'table.concat';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n const code = functionName + '(' + input + ', ' + delimiter + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['lists_reverse'] = function(block) {\n // Block for reversing a list.\n const list = Lua.valueToCode(block, 'LIST', Lua.ORDER_NONE) || '{}';\n const functionName = Lua.provideFunction_('list_reverse', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(input)\n local reversed = {}\n for i = #input, 1, -1 do\n table.insert(reversed, input[i])\n end\n return reversed\nend\n`);\n const code = functionName + '(' + list + ')';\n return [code, Lua.ORDER_HIGH];\n};\n","/**\n * @license\n * Copyright 2016 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Lua for colour blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Lua.colour');\n\nconst {luaGenerator: Lua} = goog.require('Blockly.Lua');\n\n\nLua['colour_picker'] = function(block) {\n // Colour picker.\n const code = Lua.quote_(block.getFieldValue('COLOUR'));\n return [code, Lua.ORDER_ATOMIC];\n};\n\nLua['colour_random'] = function(block) {\n // Generate a random colour.\n const code = 'string.format(\"#%06x\", math.random(0, 2^24 - 1))';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['colour_rgb'] = function(block) {\n // Compose a colour from RGB components expressed as percentages.\n const functionName = Lua.provideFunction_('colour_rgb', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(r, g, b)\n r = math.floor(math.min(100, math.max(0, r)) * 2.55 + .5)\n g = math.floor(math.min(100, math.max(0, g)) * 2.55 + .5)\n b = math.floor(math.min(100, math.max(0, b)) * 2.55 + .5)\n return string.format(\"#%02x%02x%02x\", r, g, b)\nend\n`);\n const r = Lua.valueToCode(block, 'RED', Lua.ORDER_NONE) || 0;\n const g = Lua.valueToCode(block, 'GREEN', Lua.ORDER_NONE) || 0;\n const b = Lua.valueToCode(block, 'BLUE', Lua.ORDER_NONE) || 0;\n const code = functionName + '(' + r + ', ' + g + ', ' + b + ')';\n return [code, Lua.ORDER_HIGH];\n};\n\nLua['colour_blend'] = function(block) {\n // Blend two colours together.\n const functionName = Lua.provideFunction_('colour_blend', `\nfunction ${Lua.FUNCTION_NAME_PLACEHOLDER_}(colour1, colour2, ratio)\n local r1 = tonumber(string.sub(colour1, 2, 3), 16)\n local r2 = tonumber(string.sub(colour2, 2, 3), 16)\n local g1 = tonumber(string.sub(colour1, 4, 5), 16)\n local g2 = tonumber(string.sub(colour2, 4, 5), 16)\n local b1 = tonumber(string.sub(colour1, 6, 7), 16)\n local b2 = tonumber(string.sub(colour2, 6, 7), 16)\n local ratio = math.min(1, math.max(0, ratio))\n local r = math.floor(r1 * (1 - ratio) + r2 * ratio + .5)\n local g = math.floor(g1 * (1 - ratio) + g2 * ratio + .5)\n local b = math.floor(b1 * (1 - ratio) + b2 * ratio + .5)\n return string.format(\"#%02x%02x%02x\", r, g, b)\nend\n`);\n const colour1 =\n Lua.valueToCode(block, 'COLOUR1', Lua.ORDER_NONE) || \"'#000000'\";\n const colour2 =\n Lua.valueToCode(block, 'COLOUR2', Lua.ORDER_NONE) || \"'#000000'\";\n const ratio = Lua.valueToCode(block, 'RATIO', Lua.ORDER_NONE) || 0;\n const code =\n functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')';\n return [code, Lua.ORDER_HIGH];\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Complete helper functions for generating Lua for\n * blocks. This is the entrypoint for lua_compressed.js.\n * @suppress {extraRequire}\n */\n'use strict';\n\ngoog.module('Blockly.Lua.all');\n\nconst moduleExports = goog.require('Blockly.Lua');\ngoog.require('Blockly.Lua.colour');\ngoog.require('Blockly.Lua.lists');\ngoog.require('Blockly.Lua.logic');\ngoog.require('Blockly.Lua.loops');\ngoog.require('Blockly.Lua.math');\ngoog.require('Blockly.Lua.procedures');\ngoog.require('Blockly.Lua.texts');\ngoog.require('Blockly.Lua.variables');\ngoog.require('Blockly.Lua.variablesDynamic');\n\nexports = moduleExports;\n"]} \ No newline at end of file diff --git a/msg/js/ar.js b/msg/js/ar.js index 0b62fc5ec66..18db3bac67e 100644 --- a/msg/js/ar.js +++ b/msg/js/ar.js @@ -7,24 +7,24 @@ var Blockly = Blockly || { Msg: Object.create(null) }; Blockly.Msg["ADD_COMMENT"] = "أضف تعليقًا"; Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "لايمكن حذف متغير \"%1\" بسبب انه جزء من الدالة \"%2\""; Blockly.Msg["CHANGE_VALUE_TITLE"] = "تغيير قيمة:"; -Blockly.Msg["CLEAN_UP"] = "ترتيب القطع"; +Blockly.Msg["CLEAN_UP"] = "تنظيف الكتل"; Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "الكتل المطوية تحتوي على تحذيرات."; -Blockly.Msg["COLLAPSE_ALL"] = "إخفاء القطع"; -Blockly.Msg["COLLAPSE_BLOCK"] = "إخفاء القطعة"; +Blockly.Msg["COLLAPSE_ALL"] = "انهيار الكتل"; +Blockly.Msg["COLLAPSE_BLOCK"] = "انهيار الكتلة"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "اللون 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "اللون 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبة"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "دمج"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دمج لونين ببعضهما البعض بنسبة (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ar.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://ar.wikipedia.org/wiki/لون"; Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "اختر لون من اللوحة."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "لون عشوائي"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "اختر لون بشكل عشوائي."; Blockly.Msg["COLOUR_RGB_BLUE"] = "أزرق"; Blockly.Msg["COLOUR_RGB_GREEN"] = "أخضر"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "أحمر"; Blockly.Msg["COLOUR_RGB_TITLE"] = "لون مع"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100."; @@ -60,23 +60,23 @@ Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "اكرّر حتى"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "اكرّر طالما"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "بما ان القيمة خاطئة, نفّذ بعض الأوامر."; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "بما ان القيمة صحيحة, نفّذ بعض الأوامر."; -Blockly.Msg["DELETE_ALL_BLOCKS"] = "حذف %1 قطعة؟"; -Blockly.Msg["DELETE_BLOCK"] = "احذف القطعة"; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "حذف %1 كتلة؟"; +Blockly.Msg["DELETE_BLOCK"] = "حذف كتلة"; Blockly.Msg["DELETE_VARIABLE"] = "حذف المتغير %1"; Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "حذف%1 1 استخدامات المتغير '%2'؟"; -Blockly.Msg["DELETE_X_BLOCKS"] = "احذف %1 قطع"; +Blockly.Msg["DELETE_X_BLOCKS"] = "احذف %1 كتلة"; Blockly.Msg["DIALOG_CANCEL"] = "إلغاء"; Blockly.Msg["DIALOG_OK"] = "موافق"; -Blockly.Msg["DISABLE_BLOCK"] = "عطّل القطعة"; +Blockly.Msg["DISABLE_BLOCK"] = "عطّل كتلة"; Blockly.Msg["DUPLICATE_BLOCK"] = "مكرر"; Blockly.Msg["DUPLICATE_COMMENT"] = "تعليق مكرر"; -Blockly.Msg["ENABLE_BLOCK"] = "أعد تفعيل القطعة"; -Blockly.Msg["EXPAND_ALL"] = "وسٌّع القطع"; -Blockly.Msg["EXPAND_BLOCK"] = "وسٌّع القطعة"; -Blockly.Msg["EXTERNAL_INPUTS"] = "ادخال خارجي"; +Blockly.Msg["ENABLE_BLOCK"] = "تمكين كتلة"; +Blockly.Msg["EXPAND_ALL"] = "وسٌّع الكتل"; +Blockly.Msg["EXPAND_BLOCK"] = "وسٌّع الكتلة"; +Blockly.Msg["EXTERNAL_INPUTS"] = "مدخلات خارجية"; Blockly.Msg["HELP"] = "مساعدة"; -Blockly.Msg["INLINE_INPUTS"] = "ادخال خطي"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["INLINE_INPUTS"] = "مدخلات مضمنة"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "إنشئ قائمة فارغة"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "قائمة"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "يحدد العنصر الأ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "يحدد العنصر في الموضع المحدد في قائمة ما."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "يحدد العنصر الأخير في قائمة."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "يحدد عنصرا عشوائيا في قائمة."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "تصاعديا"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "تنازليا"; Blockly.Msg["LISTS_SORT_TITLE"] = "رتب %1 %2 %3"; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ليس %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "يرجع صحيح إذا كان الإدخال خاطئ . يرجع خاطئ إذا كان الإدخال صحيح."; Blockly.Msg["LOGIC_NULL"] = "فارغ"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "ترجع ملغى."; Blockly.Msg["LOGIC_OPERATION_AND"] = "و"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -187,17 +187,17 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = ":https://ar.wikipedia.org/wiki/%3F"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "إذا كانت العبارة خاطئة"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "إذا كانت العبارة صحيحة"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ar.wikipedia.org/wiki/حسابيات"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "يرجع مجموع الرقمين."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "يرجع حاصل قسمة الرقمين."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "يرجع الفرق بين الرقمين."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "يرجع حاصل ضرب الرقمين."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "يرجع الرقم الأول مرفوع إلى تربيع الرقم الثاني."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 من X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "عودة قوس ظل النقطة (س، ص) بالدرجات من -180 إلى 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "غير %1 بـ %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "إضف رقم إلى متغير '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ar.wikipedia.org/wiki/ثابت رياضي"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "ير جع واحد من الثوابت Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "تقيد %1 منخفض %2 مرتفع %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "تقييد العددليكون بين الحدود المحددة (ضمناً)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "قابل للقسمة"; Blockly.Msg["MATH_IS_EVEN"] = "هو زوجي"; Blockly.Msg["MATH_IS_NEGATIVE"] = "هو سالب"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "هو صحيح"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://tr.wikipedia.org/wiki/عامل_قسمة_مع_باقي"; Blockly.Msg["MATH_MODULO_TITLE"] = "باقي %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "يرجع الباقي من قسمة الرقمين."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ar.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "عدد ما."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "يرجع قائمة من العنصر Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "يرجع عنصر عشوائي من القائمة."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "يرجع الانحراف المعياري للقائمة."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "يرجع مجموع كافة الأرقام الموجودة في القائمة."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://ar.wikipedia.org/wiki/توليد_الأعداد_العشوائية"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "كسر عشوائي"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "يرجع لوغاريتم عدد م Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "يرجع عدد سالب."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "يرجع مضروب الرقم 10 في نفسه ."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "يرجع الجذر التربيعي للرقم."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; diff --git a/msg/js/az.js b/msg/js/az.js index 70543dd5bcf..aad651bf7c3 100644 --- a/msg/js/az.js +++ b/msg/js/az.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Blokları yığ"; Blockly.Msg["COLLAPSE_BLOCK"] = "Bloku yığ"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "rəng 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "rəng 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "nisbət"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "qarışdır"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "İki rəngi verilmiş nisbətdə (0,0 - 1,0) qarışdırır."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "təsadüfi rəng"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Təsadüfi bir rəng seçin."; Blockly.Msg["COLOUR_RGB_BLUE"] = "mavi"; Blockly.Msg["COLOUR_RGB_GREEN"] = "yaşıl"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "qırmızı"; Blockly.Msg["COLOUR_RGB_TITLE"] = "rənglə"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Qırmızı, yaşıl və mavinin göstərilən miqdarı ilə bir rəng düzəlt. Bütün qiymətlər 0 ilə 100 arasında olmalıdır."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Siyahıda birinci elementi t Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Siyahının göstərilən yerdəki elementini təyin edir."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Siyahının sonuncu elementini təyin edir."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Siyahının təsadüfi seçilmiş bir elementini təyin edir."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "artan üzrə"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "azalan üzrə"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 sortlaşdır"; @@ -187,17 +187,17 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "əgər səhvdirsə"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "əgər doğrudursa"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://az.wikipedia.org/wiki/Hesab"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "İki ədədin cəmini qaytarır."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "İki ədədin nisbətini qaytarır."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "İki ədədin fərqini qaytarır."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "İki ədədin hasilini verir."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Birinci ədədin ikinci ədəd dərəcəsindən qüvvətini qaytarır."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "(X,Y) nöqtələrinin -180 - 180 dərəcədə arktangensini hesabla."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "dəyiş: %1 buna: %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "'%1' dəyişəninin üzərinə bir ədəd artır."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://az.wikipedia.org/wiki/Riyazi_sabitlər"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Ümumi sabitlərdən birini qaytarır π Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Bir ədədin verilmiş iki ədəd arasında olmasını tələb edir (sərhədlər də daxil olmaqla)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "bölünür"; Blockly.Msg["MATH_IS_EVEN"] = "cütdür"; Blockly.Msg["MATH_IS_NEGATIVE"] = "mənfidir"; @@ -214,10 +214,10 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "müsbətdir"; Blockly.Msg["MATH_IS_PRIME"] = "sadədir"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Bir ədədin cüt, tək, sadə, tam, müsbət, mənfi olmasını və ya müəyyən bir ədədə bölünməsini yoxlayır. \"Doğru\" və ya \"yalan\" qiymətini qaytarır."; Blockly.Msg["MATH_IS_WHOLE"] = "tamdır"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 bölməsinin qalığı"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "İki ədədin nisbətindən alınan qalığı qaytarır."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://az.wikipedia.org/wiki/Ədəd"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ədəd."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,14 +237,14 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Siyahıdaki ən çox rastlanan elemen Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Siyahıdan təsadüfi bir element qaytarır."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Siyahının standart deviasiyasını qaytarır."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Siyahıdakı bütün ədədlərin cəmini qaytarır."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "təsadüfi kəsr"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (daxil olmaqla) və 1.0 (daxil olmamaqla) ədədlərinin arasından təsadüfi bir kəsr ədəd qaytarır."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1 ilə %2 arasından təsadüfi tam ədəd"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Verilmiş iki ədəd arasından (ədədrlər də daxil olmaqla) təsadüfi bir tam ədəd qaytarır."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "yuvarlaqlaşdır"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "aşağı yuvarlaqlaşdır"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "yuxarı yuvarlaqlaşdır"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Ədədin 10-cu dərəcədən loqarif Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Ədədin əksini qaytarır."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10-un verilmiş ədədə qüvvətini qaytarır."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Ədədin kvadrat kökünü qaytarır."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Yeni dəyişənin tipi:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "operatorlara icazə"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ilə:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Yaradılmış '%1' funksiyasını çalışdır."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ilə:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' yarat"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Bütün uyğunluqlu bəzi mətnlərin dig Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "əksinə dəyiş %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Mətndəki simvolların ardıcıllığını əksinə dəyiş."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Mətndəki hərf, söz və ya sətir."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "boşluqları hər iki tərəfdən pozun"; diff --git a/msg/js/bcc.js b/msg/js/bcc.js index 97b200585b8..d1453022f03 100644 --- a/msg/js/bcc.js +++ b/msg/js/bcc.js @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "با:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "با:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "ساختن «%1»"; @@ -378,9 +378,9 @@ Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "تراشیدن فاصله‌ها از Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "تراشیدن فاصله‌ها از طرف چپ"; Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "کپی از متن با فاصله‌های حذف‌شده از یک یا هر دو پایان باز می‌گرداند."; -Blockly.Msg["TODAY"] = "Today"; // untranslated +Blockly.Msg["TODAY"] = "مرۏچی"; Blockly.Msg["UNDO"] = "Undo"; // untranslated -Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "بدون نام"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "مورد"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "درست‌کردن «تنظیم %1»"; Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/be-tarask.js b/msg/js/be-tarask.js index 33257570961..0b6e66a1d0e 100644 --- a/msg/js/be-tarask.js +++ b/msg/js/be-tarask.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Калі значэньне ісьцін Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Калі значэньне ісьціна, выканаць першы блёк апэрацыяў, інакш выканаць другі блёк."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Калі першае значэньне ісьціна, выканаць першы блёк апэрацыяў. Інакш, калі другое значэньне ісьціна, выканаць другі блёк апэрацыяў. Калі ніводнае з значэньняў не сапраўднае, выканаць апошні блёк апэрацыяў."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "выканаць"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "паўтарыць %1 раз(ы)"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Выконвае апэрацыі некалькі разоў."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Вяртае даўжыню сьпісу. Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "стварыць сьпіс з элемэнту %1, які паўтараецца %2 разоў"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Стварае сьпіс, які ўтрымлівае пададзеную колькасьць копіяў элемэнту."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "адваротна %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Зьмяняе парадак копіі сьпісу на адваротны."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Задае першы эле Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Задае элемэнт у пазначанай пазыцыі ў сьпісе."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Задае апошні элемэнт у сьпісе."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Задае выпадковы элемэнт у сьпісе."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "па павелічэньні"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "па зьмяншэньні"; Blockly.Msg["LISTS_SORT_TITLE"] = "сартаваць %1 %2 %3"; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Вяртае дзель дву Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Вяртае рознасьць двух лікаў."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Вяртае здабытак двух лікаў."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Вяртае першы лік у ступені другога ліку."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ад X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Вяртае арктангенс пункту (X, Y) у градусах ад -180 да 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "зьмяніць %1 на %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Дадае лічбу да зьменнай '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://be-x-old.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D1%8D%D0%BC%D0%B0%D1%82%D1%8B%D1%87%D0%BD%D0%B0%D1%8F_%D0%BA%D0%B0%D0%BD%D1%81%D1%82%D0%B0%D0%BD%D1%82%D0%B0"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "дадатная"; Blockly.Msg["MATH_IS_PRIME"] = "простая"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Правярае, ці зьяўляецца лік парным, няпарным, простым, станоўчым, адмоўным, ці ён дзеліцца на пэўны лік без астатку. Вяртае значэньне ісьціна або няпраўда."; Blockly.Msg["MATH_IS_WHOLE"] = "цэлая"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "рэшта дзяленьня %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Вяртае рэшту дзяленьня двух лікаў."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Вяртае выпадковы э Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Вяртае стандартнае адхіленьне сьпісу."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Вяртае суму ўсіх лікаў у сьпісе."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "выпадковая дроб"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "выпадковая цэлая з %1 для %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "акругліць"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "акругліць да меншага"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "акругліць да большага"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Новы тып зьменнай:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дазволіць зацьвярджэньне"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Запусьціць функцыю вызначаную карыстальнікам '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "з:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Стварыць '%1'"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "вярнуць"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Стварае функцыю з вынікам."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Увага: гэтая функцыя мае парамэтры-дублікаты."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Падсьвяціць вызначэньне функцыі"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Калі значэньне ісьціна, вярнуць другое значэньне."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "назва парамэтру:"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "узяць выпадковую літар Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "у тэксьце %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Вяртае літару ў пазначанай пазыцыі."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "падлічыць %1 сярод %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Падлічвае колькі разоў нейкі тэкст сустракаецца ўнутры нейкага іншага тэксту."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Дадаць элемэнт да тэксту."; @@ -365,13 +365,13 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запытаць у карыста Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запытаць у карыстальніка тэкст."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запытаць лічбу з падказкай"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запытаць тэкст з падказкай"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замяніць %1 на %2 у %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замяняе ўсе выпадкі нейкага тэксту на іншы тэкст."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "адваротна %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Мяняе парадак сымбаляў у тэксьце на адваротны."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Літара, слова ці радок тэксту."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "абрэзаць прабелы з абодвух бакоў"; diff --git a/msg/js/be.js b/msg/js/be.js index 4762d2680f5..9f5dcf658fb 100644 --- a/msg/js/be.js +++ b/msg/js/be.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Прысабечвае зн Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Прысабечвае значэнне элемента ва ўказанай пазіцыі спіса."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Прысабечвае значэнне элемента спісу."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Прысабечвае значэнне элемента спісу."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "па ўзрастанню"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "па спаданню"; Blockly.Msg["LISTS_SORT_TITLE"] = "сартаваць %1 %2 %3"; @@ -283,9 +283,9 @@ Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дазволіць аператары"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://be.wikipedia.org/wiki/Падпраграма"; -Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Выконвае вызначаную карыстальнікам працэдуру '%1'."; +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Выконвае вызначаную карыстальнікам функцыю '%1'."; Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://be.wikipedia.org/wiki/Падпраграма"; -Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Выконвае вызначаную карыстальнікам працэдуру '%1' і вяртае вылічанае значэнне."; +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Выконвае вызначаную карыстальнікам функцыю '%1' і ўжыць яе значэнне."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "з:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Стварыць выклік '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Апішыце гэтую функцыю..."; @@ -293,12 +293,12 @@ Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "выканаць нешта"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "каб"; -Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Стварыць працэдуру, якая ня вяртае значэнне."; +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Стварыць функцыю, якая не вяртае значэнне."; Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "вярнуць"; -Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Стварыць працэдуру, якая вяртае значэнне."; +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Стварыць функцыю, якая вяртае значэнне."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Папярэджанне: гэтая функцыя мае паўтаральныя параметры."; -Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Вылучыць вызначэнне працэдуры"; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Вылучыць вызначэнне функцыі"; Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Калі першае значэнне ісцінае, вяртае другое значэнне."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Папярэджанне: гэты блок можа выкарыстоўвацца толькі ўнутры вызначэння функцыі."; diff --git a/msg/js/bg.js b/msg/js/bg.js index 605f8777079..770d5065aff 100644 --- a/msg/js/bg.js +++ b/msg/js/bg.js @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Връща дължината на спи Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "създай списък от %1 повторен %2 пъти"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Създава списък, състоящ се от определен брой копия на елемента."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "промени реда на обратно %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Промени реда на списъка на обратно."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Променя първия Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Променя елемента на определена позиция в списък."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Променя последния елемент в списък."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Променя случаен елемент от списък."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "възходящо"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "низходящо"; Blockly.Msg["LISTS_SORT_TITLE"] = "сортиране по %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "невярно"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Връща вярно или невярно."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "вярно"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Върни вярно, ако двата параметъра са еднакви."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Върни истина, ако първия параметър е по-голям от втория."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Върни истина, ако първия параметър е по-голям или равен на втория."; @@ -194,7 +194,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Върни частното н Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Върни разликата на двете числа."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Върни произведението на двете числа."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Върни първото число, повдигнато на степен на второто число."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 от X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Връща аркустангенс на точка (X, Y) в градуси от -180 до 180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://bg.wikipedia.org/wiki/Събиране"; @@ -244,12 +244,12 @@ Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Върни случайно дроб Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://bg.wikipedia.org/wiki/Генератор_на_случайни_числа"; Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "случайно цяло число между %1 и %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Върни случайно число в определените граници (включително)."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "закръгли"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "закръгли надолу"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "закръгли нагоре"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Закръгли число нагоре или надолу."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "абсолютна"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "корен квадратен"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Връща абсолютната стойност на число."; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "върни"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Създава функция, която връща резултат."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Предупреждение: Тази функция има дублиращи се параметри."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Покажи дефиницията на функцията"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ако стойността е вярна, върни втората стойност."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Предупреждение: Този блок може да се използва само във функция."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "име на параметър:"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "вземи произволна буква" Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "в текст %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Връща буквата в определена позиция."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "пресмята броя на %1 в %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Преброй колко пъти даден текст се среща в друг текст."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Добави елемент към текста."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Питай потребителя Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Питай потребителя за текст."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "питай за число със съобщение"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "питай за текст със съобщение"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замяна на %1 с %2 в %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замени всички появи на даден текст в друг текст."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "промени реда на обратно %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Промени реда на знаците в текста на обратно."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://bg.wikipedia.org/wiki/Низ"; diff --git a/msg/js/bn.js b/msg/js/bn.js index 439392388c5..0b84f5c4385 100644 --- a/msg/js/bn.js +++ b/msg/js/bn.js @@ -368,7 +368,7 @@ Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "prompt for text with message"; // untra Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 উল্টান"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated diff --git a/msg/js/br.js b/msg/js/br.js index fe318bc6870..914ad1197ab 100644 --- a/msg/js/br.js +++ b/msg/js/br.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ma vez gwir un dalvoudenn, seveniñ urzh Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ma vez gwir un dalvoudenn, seveniñ ar c'henañ bloc'had urzhioù neuze. Anez seveniñ an eil bloc'had urzhioù."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had urzhioù neuze. Anez ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ma vez gwir an dalvoudenn gentañ, seveniñ ar c'hentañ bloc'had. Anez, ma vez gwir an eil talvoudenn, seveniñ an eil bloc'had urzhioù. Ma ne vez gwir talvoudenn ebet, seveniñ ar bloc'had diwezhañ a urzhioù."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ober"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "adober %1 gwech"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Seveniñ urzhioù zo meur a wech"; @@ -81,7 +81,7 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "krouiñ ur roll goullo"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "roll"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h listenn-mañ."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "krouiñ ur roll gant"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ouzhpennañ un elfenn d'ar roll"; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Krouiñ ur roll gant un niver bennak a elfennoù."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Distreiñ hirder ul listenn."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "Krouiñ ul listenn gant an elfenn %1 arreet %2 div wech"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Krouiñ ul listenn a c'hoarvez eus an dalvoudenn roet arreet an niver a wech meneget"; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "eilpennañ %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Eilpennañ un eilskrid eus ur roll."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Termenañ a ra an elfenn gen Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Termenañ a ra an elfenn el lec'h meneget en ul listenn."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Termenañ a ra an elfenn diwezhañ en ul listenn."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Termenañ a ra un elfenn dre zegouezh en ul listenn."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "war gresk"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "war zigresk"; Blockly.Msg["LISTS_SORT_TITLE"] = "Rummañ%1,%2,%3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Rummañ un eilenn eus ar roll"; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "niverel"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "Dre urzh al lizherenneg"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "Krouiñ ul listenn diwar an destenn"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Krouiñ un destenn diwar al listenn"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier."; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "gaou"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Distreiñ pe gwir pe faos"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "gwir"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Distreiñ gwir m'eo par an daou voned."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Distreiñ gwir m'eo brasoc'h ar moned kentañ eget an eil pe par dezhañ."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Distreiñ an niver kentañ lakae Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://fr.wikipedia.org/wiki/Atan2"; Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 eus X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Adkas a ra ark tangent ar poent (X, Y) e derezioù etre -180 ha 180"; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "kemmañ %1 gant %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Ouzhpennañ un niver d'an argemmenn '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "destrizhañ %1 etre %2 ha %3"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "a zo pozitivel"; Blockly.Msg["MATH_IS_PRIME"] = "zo kentañ"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Gwiriañ m'eo par, anpar, kentañ, muiel, leiel un niverenn pe ma c'haller rannañ anezhi dre un niver roet zo. Distreiñ gwir pe faos."; Blockly.Msg["MATH_IS_WHOLE"] = "zo anterin"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "rest eus %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Distreiñ dilerc'h rannadur an div niver"; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Distreiñ un elfenn zargouezhek el Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Distreiñ forc'had standart al listenn."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Distreiñ sammad an holl niveroù zo el listenn."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "Rann dargouezhek"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "anterin dargouezhek etre %1 ha %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "Rontaat"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Rontaat dindan"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Rontaat a-us"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Doare nevez a argemm:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "aotren an disklêriadurioù"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "gant :"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Seveniñ an arc'hwel '%1' termenet gant an implijer."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "gant :"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Krouiñ '%1'"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "Kaout ul lizherenn dre zegouezh"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "en destenn %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Distreiñ al lizherenn d'al lec'h spisaet."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "niver %1 war %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ouzhpennañ un elfenn d'an destenn."; @@ -365,13 +365,13 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Goulenn un niver gant an implijer." Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Goulenn un destenn gant an implijer."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pedadenn evit un niver gant ur c'hemennad"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "goulenn un destenn gant ur gemennadenn"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "erlec'hiañ %1 gant %2 e %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "eilpennañ %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Eilpennañ urzh an arouezennoù en destenn."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Ul lizherenn, ur ger pe ul linennad testenn."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Lemel an esaouennoù en daou du"; diff --git a/msg/js/ca.js b/msg/js/ca.js index 5c4521df649..1d7554ebfbc 100644 --- a/msg/js/ca.js +++ b/msg/js/ca.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Modifica el primer element d Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Modifica l'element de la posició especificada d'una llista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Modifica l'últim element d'una llista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Modifica un element a l'atzar d'una llista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendent"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendent"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; diff --git a/msg/js/cs.js b/msg/js/cs.js index 9df2578ddf7..227dc1ad3e6 100644 --- a/msg/js/cs.js +++ b/msg/js/cs.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastaví první položku v s Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastaví položku na konkrétní místo v seznamu."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Nastaví poslední položku v seznamu."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Nastaví náhodnou položku v seznamu."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "vzestupně"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "sestupně"; Blockly.Msg["LISTS_SORT_TITLE"] = "seřadit %1 %2 %3"; @@ -197,15 +197,15 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vrátí první číslo umocněn Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://cs.wikipedia.org/wiki/Atan2"; Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 z X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Vrací arkustangens bodu (X, Y) ve stupních od -180 do 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "zaměň %1 za %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Přičti číslo k proměnné '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (nekonečno)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "omez %1 na rozmezí od %2 do %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Omezí číslo tak, aby bylo ve stanovených mezích (včetně)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je dělitelné číslem"; Blockly.Msg["MATH_IS_EVEN"] = "je sudé"; Blockly.Msg["MATH_IS_NEGATIVE"] = "je záporné"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "je celé"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://cs.wikipedia.org/wiki/Modul%C3%A1rn%C3%AD_aritmetika"; Blockly.Msg["MATH_MODULO_TITLE"] = "zbytek po dělení %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vrátí zbytek po dělení dvou čísel."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://cs.wikipedia.org/wiki/Číslo"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Číslo."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,14 +237,14 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrátí seznam nejčastějších polo Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vrátí náhodnou položku ze seznamu."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vrátí směrodatnou odchylku seznamu."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vrátí součet všech čísel v seznamu."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "náhodné číslo mezi 0 (včetně) do 1"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vrátí náhodné číslo mezi 0,0 (včetně) až 1,0"; Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://cs.wikipedia.org/wiki/Gener%C3%A1tor_n%C3%A1hodn%C3%BDch_%C4%8D%C3%ADsel"; Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "náhodné celé číslo od %1 do %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vrací náhodné celé číslo mezi dvěma určenými mezemi, včetně mezních hodnot."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokrouhlit"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokrouhlit dolů"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokrouhlit nahoru"; @@ -259,12 +259,12 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vrátí desítkový logaritmus čís Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Vrátí zápornou hodnotu čísla."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Vrátí mocninu čísla 10."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Vrátí druhou odmocninu čísla."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; Blockly.Msg["MATH_TRIG_COS"] = "cos"; -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Vrátí arkus kosinus čísla."; @@ -290,16 +290,16 @@ Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "s:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Vytvořit '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Popište tuto funkci..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "proveď něco"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "k provedení"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Vytvořit funkci bez výstupu."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://cs.wikipedia.org/wiki/Podprogram"; Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "navrátit"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Vytvořit funkci s výstupem."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Upozornění: Tato funkce má duplicitní parametry."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Zvýraznit definici funkce"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Je-li hodnota pravda, pak vrátí druhou hodnotu."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Varování: Tento blok může být použit pouze uvnitř definici funkce."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "vstupní jméno:"; diff --git a/msg/js/da.js b/msg/js/da.js index 09f57ab84f3..9c12d8b05f4 100644 --- a/msg/js/da.js +++ b/msg/js/da.js @@ -8,7 +8,7 @@ Blockly.Msg["ADD_COMMENT"] = "Tilføj Kommentar"; Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Kan ikke slette variablen »%1« da den er en del af definitionen af funktionen »%2«"; Blockly.Msg["CHANGE_VALUE_TITLE"] = "Skift værdi:"; Blockly.Msg["CLEAN_UP"] = "Ryd op i blokke"; -Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Sammenklappede blokke indeholder advarsler."; Blockly.Msg["COLLAPSE_ALL"] = "Fold blokkene sammen"; Blockly.Msg["COLLAPSE_BLOCK"] = "Fold blokken sammen"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "farve 1"; @@ -87,7 +87,7 @@ Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Føj et element til listen."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Opret en liste med et vilkårligt antal elementer."; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "første"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# fra slutningen"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; Blockly.Msg["LISTS_GET_INDEX_GET"] = "hent"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hent og fjern"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "sidste"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sætter det første element Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sætter elementet på den angivne position i en liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Sætter det sidste element i en liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sætter et tilfældigt element i en liste."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigende"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "faldende"; Blockly.Msg["LISTS_SORT_TITLE"] = "sorter %1 %2 %3"; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnere kvotienten af de to t Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returnere forskellen mellem de to tal."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnere produktet af de to tal."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returnere det første tal opløftet til potensen af det andet tal."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 af X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "skift %1 med %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Læg et tal til variablen '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://da.wikipedia.org/wiki/Matematisk_konstant"; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnere negationen af et tal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returnere 10 til potensen af et tal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnere kvadratroden af et tal."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; Blockly.Msg["MATH_TRIG_HELPURL"] = "https://da.wikipedia.org/wiki/Trigonometrisk_funktion"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Returnere arcus cosinus af et tal."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Returnere arcus sinus af et tal."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Returnere arcus tangens af et tal."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltype:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillad erklæringer"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kør den brugerdefinerede funktion '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kør den brugerdefinerede funktion '%1' og brug dens returværdi."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "med:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Opret '%1'"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "returnér"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Opretter en funktion der har en returværdi."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Advarsel: Denne funktion har dublerede parametre."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Markér funktionsdefinitionen"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Hvis en værdi er sand, så returnér en anden værdi."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "parameternavn:"; @@ -391,7 +391,7 @@ Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/V Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Sætter denne variabel til at være lig med input."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "En variabel med navnet »%1« findes allerede."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "En variabel med navnet »%1« findes allerede for en anden type: »%2«."; -Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Sig noget ..."; Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; diff --git a/msg/js/de.js b/msg/js/de.js index 5ba539622db..2d295d635c2 100644 --- a/msg/js/de.js +++ b/msg/js/de.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Alle Bausteine zusammenfalten"; Blockly.Msg["COLLAPSE_BLOCK"] = "Baustein zusammenfalten"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "Farbe 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "und Farbe 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "im Verhältnis"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mische"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "zufällige Farbe"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Erzeugt eine Farbe nach dem Zufallsprinzip."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blau"; Blockly.Msg["COLOUR_RGB_GREEN"] = "grün"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rot"; Blockly.Msg["COLOUR_RGB_TITLE"] = "Farbe aus"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen."; @@ -48,18 +48,18 @@ Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sonst"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sonst falls"; Blockly.Msg["CONTROLS_IF_MSG_IF"] = "falls"; Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Führt eine Anweisung aus, falls eine Bedingung wahr ist."; -Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus."; -Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist."; -Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist."; Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://de.wikipedia.org/wiki/For-Schleife"; Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "mache"; -Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "wiederhole %1 mal:"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "wiederhole %1-mal:"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Eine Anweisung mehrfach ausführen."; Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "wiederhole bis"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "wiederhole solange"; -Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Führt Anweisungen aus solange die Bedingung unwahr ist."; -Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Führt Anweisungen aus solange die Bedingung wahr ist."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Führt Anweisungen aus, solange die Bedingung unwahr ist."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Führt Anweisungen aus, solange die Bedingung wahr ist."; Blockly.Msg["DELETE_ALL_BLOCKS"] = "Alle %1 Bausteine löschen?"; Blockly.Msg["DELETE_BLOCK"] = "Baustein löschen"; Blockly.Msg["DELETE_VARIABLE"] = "Die Variable „%1“ löschen"; @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "Baustein entfalten"; Blockly.Msg["EXTERNAL_INPUTS"] = "externe Eingänge"; Blockly.Msg["HELP"] = "Hilfe"; Blockly.Msg["INLINE_INPUTS"] = "interne Eingänge"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "erzeuge eine leere Liste"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Erzeugt eine leere Liste ohne Inhalt."; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "Liste"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Hinzufügen, entfernen und sortieren von Elementen."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "erzeuge Liste mit"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ein Element zur Liste hinzufügen."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Erzeugt eine Liste aus den angegebenen Elementen."; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Entfernt ein zufälliges Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "bis von hinten"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "bis"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "bis letztes"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "nimm Teilliste ab erstes"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "nimm Teilliste ab von hinten"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "nimm Teilliste ab"; @@ -118,7 +118,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Erstellt eine Kopie mit dem angegebe Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 ist das letzte Element."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ist das erste Element."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "suche erstes Auftreten von"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "suche letztes Auftreten von"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde."; Blockly.Msg["LISTS_INLIST"] = "in der Liste"; @@ -128,13 +128,13 @@ Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Ist wahr, falls die Liste leer ist."; Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "Länge von %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Die Anzahl von Elementen in der Liste."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; -Blockly.Msg["LISTS_REPEAT_TITLE"] = "erzeuge Liste mit %2 mal dem Element %1​"; -Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen"; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "erzeuge Liste mit %2-mal dem Element %1​"; +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Erzeugt eine Liste mit einer variablen Anzahl von Elementen."; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "kehre %1 um"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Kehre eine Kopie einer Liste um."; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "ein"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "füge als"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "setze für"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setzt das erste Element in d Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setzt das Element an der angegebenen Position in der Liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Setzt das letzte Element in die Liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Setzt ein zufälliges Element in der Liste."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "aufsteigend"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "absteigend"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 sortieren"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Eine Kopie einer Liste sortieren."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetisch, Großschreibung ignorieren"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numerisch"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetisch"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "Liste aus Text erstellen"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "Text aus Liste erstellen"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen."; @@ -162,7 +162,7 @@ Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Text in eine Liste mit Texten auftei Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "mit Trennzeichen"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "falsch"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated -Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ist entweder wahr oder falsch"; +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ist entweder wahr oder falsch."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "wahr"; Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://de.wikipedia.org/wiki/Vergleich_%28Zahlen%29"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ist wahr, falls beide Werte gleich sind."; @@ -173,7 +173,7 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ist wahr, falls der erste Wert klein Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ist wahr, falls beide Werte unterschiedlich sind."; Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nicht %1"; -Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist."; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist."; Blockly.Msg["LOGIC_NULL"] = "null"; Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://de.wikipedia.org/wiki/Nullwert"; Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Ist \"null\"."; @@ -186,7 +186,7 @@ Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "prüfe"; Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://de.wikipedia.org/wiki/%3F:#Auswahloperator"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "falls falsch"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "falls wahr"; -Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\"-Wert zurückgegeben, andernfalls der \"falls unwahr\"-Wert"; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://de.wikipedia.org/wiki/Grundrechenart"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Ist die Summe zweier Zahlen."; @@ -212,7 +212,7 @@ Blockly.Msg["MATH_IS_NEGATIVE"] = "ist negativ"; Blockly.Msg["MATH_IS_ODD"] = "ist ungerade"; Blockly.Msg["MATH_IS_POSITIVE"] = "ist positiv"; Blockly.Msg["MATH_IS_PRIME"] = "ist eine Primzahl"; -Blockly.Msg["MATH_IS_TOOLTIP"] = "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder falsch zurück."; +Blockly.Msg["MATH_IS_TOOLTIP"] = "Überprüft, ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder falsch zurück."; Blockly.Msg["MATH_IS_WHOLE"] = "ist eine ganze Zahl"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://de.wikipedia.org/wiki/Modulo"; Blockly.Msg["MATH_MODULO_TITLE"] = "Rest von %1 ÷ %2"; @@ -233,7 +233,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Ist der Durchschnittswert aller Za Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Ist die größte Zahl in einer Liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Ist der Median aller Zahlen in einer Liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Ist die kleinste Zahl in einer Liste."; -Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Findet die Werte mit dem häufigstem Vorkommen in der Liste."; +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Findet die Werte mit dem häufigsten Vorkommen in der Liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Gibt einen zufälligen Wert aus der Liste zurück."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ist die Standardabweichung aller Werte in der Liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ist die Summe aller Zahlen in einer Liste."; @@ -289,17 +289,17 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Rufe einen Funktionsblock mit R Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "mit:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Erzeuge \"Aufruf %1\""; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Beschreibe diese Funktion …"; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "etwas tun"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "um"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ein Funktionsblock ohne Rückgabewert."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://de.wikipedia.org/wiki/Prozedur_(Programmierung)"; Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "gib zurück"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Ein Funktionsblock mit Rückgabewert."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warnung: Dieser Funktionsblock hat zwei gleich benannte Parameter."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Markiere Funktionsblock"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "Variable:"; @@ -309,7 +309,7 @@ Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Die Eingaben zu dieser Fun Blockly.Msg["REDO"] = "Wiederholen"; Blockly.Msg["REMOVE_COMMENT"] = "Kommentar entfernen"; Blockly.Msg["RENAME_VARIABLE"] = "Variable umbenennen …"; -Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Alle \"%1\" Variablen umbenennen in:"; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Alle \"%1\"-Variablen umbenennen in:"; Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "zu %1 Text %2 anhängen"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Text an die Variable \"%1\" anhängen."; @@ -321,13 +321,13 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Wandelt Schreibweise von Texten um, in Blockly.Msg["TEXT_CHARAT_FIRST"] = "nimm ersten"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "nimm von hinten"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "nimm"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "nimm letzten"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "nimm zufälligen"; Blockly.Msg["TEXT_CHARAT_TAIL"] = "Buchstaben"; Blockly.Msg["TEXT_CHARAT_TITLE"] = "im Text %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Extrahiert einen Buchstaben von einer bestimmten Position."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "zähle %1 in %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ein Element zum Text hinzufügen."; @@ -336,22 +336,22 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Hinzufügen, entfernen und sortieren Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "bis von hinten"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "bis"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "bis letzter"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "im Text"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "nimm Teil ab erster"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "nimm Teil ab von hinten"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "nimm Teil ab"; Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "Buchstabe"; Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Gibt den angegebenen Textabschnitt zurück."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "suche erstes Auftreten des Begriffs"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "suche letztes Auftreten des Begriffs"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "im Text %1 %2 %3"; -Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde."; +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde."; Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 ist leer"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Ist wahr, falls der Text keine Zeichen enthält."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = ""; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "erstelle Text aus"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Erstellt einen Text durch das Verbinden von mehreren Textelementen."; Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Fragt den Benutzer nach einer Zahl. Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Fragt den Benutzer nach einem Text."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "frage nach Zahl mit Hinweis"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "frage nach Text mit Hinweis"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "ersetze %1 durch %2 in %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "kehre %1 um"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Kehre die Reihenfolge der Zeichen im Text um."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://de.wikipedia.org/wiki/Zeichenkette"; @@ -383,11 +383,11 @@ Blockly.Msg["UNDO"] = "Rückgängig"; Blockly.Msg["UNNAMED_KEY"] = "unbenannt"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "Element"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Erzeuge \"Schreibe %1\""; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Gibt den Wert der Variable zurück."; Blockly.Msg["VARIABLES_SET"] = "setze %1 auf %2"; -Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Erzeuge \"Lese %1\""; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29"; +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Erzeuge \"Lies %1\""; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Setzt den Wert einer Variable."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Eine Variable namens „%1“ ist bereits vorhanden."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Eine Variable namens „%1“ ist bereits für einen anderen Typ vorhanden: „%2“."; diff --git a/msg/js/diq.js b/msg/js/diq.js index 21e7a6abbb5..76aa9495721 100644 --- a/msg/js/diq.js +++ b/msg/js/diq.js @@ -9,7 +9,7 @@ Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Vurniyaye '%1' nêşeno beste Blockly.Msg["CHANGE_VALUE_TITLE"] = "Erci bıvurne:"; Blockly.Msg["CLEAN_UP"] = "Blokan pak ke"; Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated -Blockly.Msg["COLLAPSE_ALL"] = "Blokan teng ke"; +Blockly.Msg["COLLAPSE_ALL"] = "Kılitkerdışan teng ke"; Blockly.Msg["COLLAPSE_BLOCK"] = "Bloki teng ke"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "reng 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "reng 2"; @@ -23,7 +23,7 @@ Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslat Blockly.Msg["COLOUR_RANDOM_TITLE"] = "rengo rastameye"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Tesadufi yu ren bıweçin"; Blockly.Msg["COLOUR_RGB_BLUE"] = "kewe"; -Blockly.Msg["COLOUR_RGB_GREEN"] = "kıho"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "kesk"; Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "sur"; Blockly.Msg["COLOUR_RGB_TITLE"] = "komponentên rengan"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Eger yew vaye raşto, o taw şıma tayê Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "bıke"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 fıni tekrar ke"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Şıma tayêna reyi akerdışi kerê."; @@ -71,9 +71,9 @@ Blockly.Msg["DISABLE_BLOCK"] = "Çengi devre ra vec"; Blockly.Msg["DUPLICATE_BLOCK"] = "Zewnc"; Blockly.Msg["DUPLICATE_COMMENT"] = "Mışewreyo zewnc"; Blockly.Msg["ENABLE_BLOCK"] = "Bloki feal ke"; -Blockly.Msg["EXPAND_ALL"] = "Blokan hera ke"; +Blockly.Msg["EXPAND_ALL"] = "Kılitkerdışan hera ke"; Blockly.Msg["EXPAND_BLOCK"] = "Bloki hera ke"; -Blockly.Msg["EXTERNAL_INPUTS"] = "Cıkewtışê xarıciy"; +Blockly.Msg["EXTERNAL_INPUTS"] = "Cıkewtışê xarıciyi"; Blockly.Msg["HELP"] = "Peşti"; Blockly.Msg["INLINE_INPUTS"] = "Cıkerdışê xomiyani"; Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Lista de obcey sıfteyıni e Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Lista de obcey peyêni eyar keno"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Lista de obcey raşt ameyayi eyar keno"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "zeydıyen"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Kemeyen"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 weçine"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ğelet"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Raşt yana çep erc dano"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "raşt"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Debiyaye dı erci zey pêyêse ercê \"True\" dane."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised t Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://diq.wikipedia.org/wiki/Atan2"; Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2, X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "%2, keno %1 vurneno"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Sabitanê wertağan ra yew açarne: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêpeyniye)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; // untranslated @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "pozitifo"; Blockly.Msg["MATH_IS_PRIME"] = "bıngehên"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "tamo"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 ra menden"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Mendeyan ra teqsimkerdışê dı amaran açarne."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Liste ra yew elemento rastameye aç Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; // untranslated Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "Raştamaye nimande amor"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "gılor ke"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Loğê cêri ke"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Loğê cori ke"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Yu amorer loğê cêri yana cori ke"; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "mutlaq"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "karekok"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Ercê mutlaqê yew amarer tadê"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tewrê vurriyayoğê neweyi:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ifade rê mısade bıde"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ebe:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ebe:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' vıraze"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "karakteranê %1 weçarne"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Yu herfa, satır yana çekuya metini"; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // untranslated diff --git a/msg/js/dty.js b/msg/js/dty.js index 9e124985e5c..21b1a334e4a 100644 --- a/msg/js/dty.js +++ b/msg/js/dty.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "अनुपात"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "मिश्रण गर"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "दियाका अनुपात (0.0 - 1.0) का साथ दुई रंगहरूको मिश्रण गरन्छ ।"; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "पैलेट बाट एक रंग चुन ।"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "जुनसुकै रङ्ग"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "असत्य"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "सत्य या असत्य फिर्ता अरन्छ।"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "सत्य"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "यदी दुवै इनपुट एक अर्काका बराबर छन् भण्या टु रिटर्न गर ।"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "पैल्लो इनपुट दोसरा इनपुट है ठुलो भया ट्रू फिर्ता अर:।"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "पैल्लो इनपुट दोसरा इनपुट है ठुलो या उइ सित बराबर भया ट्रू फिर्ता अर:।"; diff --git a/msg/js/ee.js b/msg/js/ee.js index d14d7bcd2bf..67f125008b6 100644 --- a/msg/js/ee.js +++ b/msg/js/ee.js @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; // untranslated diff --git a/msg/js/el.js b/msg/js/el.js index 6c6ff0ab34f..4fe3d892a4d 100644 --- a/msg/js/el.js +++ b/msg/js/el.js @@ -13,36 +13,36 @@ Blockly.Msg["COLLAPSE_ALL"] = "Σύμπτυξε Όλα Τα Μπλοκ"; Blockly.Msg["COLLAPSE_BLOCK"] = "Σύμπτυξε Το Μπλοκ"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "χρώμα 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "χρώμα 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "αναλογία"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "μείγμα"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Επιτρέπει επιλογή χρώματος από την παλέτα."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "τυχαίο χρώμα"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Επιλέγει χρώμα τυχαία."; Blockly.Msg["COLOUR_RGB_BLUE"] = "μπλε"; Blockly.Msg["COLOUR_RGB_GREEN"] = "πράσινο"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "κόκκινο"; Blockly.Msg["COLOUR_RGB_TITLE"] = "χρώμα με"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Δημιουργήστε ένα χρώμα με την καθορισμένη ποσότητα κόκκινου, πράσινου και μπλε. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "φεύγει από το μπλοκ επαναλήψεως"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "συνέχισε με την επόμενη επανάληψη του μπλοκ επαναλήψεως"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Ξεφεύγει (βγαίνει έξω) από την επανάληψη."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Παραλείπει το υπόλοιπο τμήμα αυτού του μπλοκ επαναλήψεως, και συνεχίζει με την επόμενη επανάληψη."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο μέσα σε μια επανάληψη."; -Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "για κάθε στοιχείο %1 στη λίστα %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "μέτρησε με %1 από το %2 έως το %3 ανά %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Πρόσθετει μια κατάσταση/συνθήκη στο μπλοκ «εάν»."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν»."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ «εάν»."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "αλλιώς"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "εναλλακτικά εάν"; @@ -51,11 +51,11 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Αν μια τιμή είναι αληθ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Αν μια τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, εκτελεί το δεύτερο τμήμα εντολών."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο μπλοκ εντολών."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο τμήμα εντολών. Αν καμία από τις τιμές δεν είναι αληθής, εκτελεί το τελευταίο τμήμα εντολών."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "κάνε"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "επανάλαβε %1 φορές"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Εκτελεί κάποιες εντολές αρκετές φορές."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "επανάλαβε μέχρι"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "επανάλαβε ενώ"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Εφόσον μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Επέκτεινε Το Μπλοκ"; Blockly.Msg["EXTERNAL_INPUTS"] = "Εξωτερικές προσθήκες"; Blockly.Msg["HELP"] = "Βοήθεια"; Blockly.Msg["INLINE_INPUTS"] = "Εσωτερικές προσθήκες"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "δημιούργησε κενή λίστα"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "λίστα"; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Καταργεί ένα Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "έως # από το τέλος"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "έως #"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "έως το τελευταίο"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "πάρε υπολίστα από την αρχή"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "πάρε υπολίστα από # από το τέλος"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "πάρε υπολίστα από #"; @@ -118,17 +118,17 @@ Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Δημιουργεί ένα αντί Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Το %1 είναι το τελευταίο στοιχείο."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Το %1 είναι το πρώτο στοιχείο."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "βρες την πρώτη εμφάνιση του στοιχείου"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "βρες την τελευταία εμφάνιση του στοιχείου"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί."; Blockly.Msg["LISTS_INLIST"] = "στη λίστα"; Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "το %1 είναι κενό"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Επιστρέφει αληθής αν η λίστα είναι κενή."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "το μήκος του %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Επιστρέφει το μήκος μιας λίστας."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "Blockly"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων."; Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ορίζει το πρώτο Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ορίζει το στοιχείο στην καθορισμένη θέση σε μια λίστα."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ορίζει το τελευταίο στοιχείο σε μια λίστα."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ορίζει ένα τυχαίο στοιχείο σε μια λίστα."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "Αύξουσα"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Φθίνουσα"; Blockly.Msg["LISTS_SORT_TITLE"] = "επιλογή %1 %2 %3"; @@ -161,51 +161,51 @@ Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Ενώστε μια λίστα κει Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Διαίρεση του κειμένου σε μια λίστα κειμένων, με σπάσιμο σε κάθε διαχωριστικό."; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "με διαχωριστικό"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ψευδής"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Επιστρέφει είτε αληθής είτε ψευδής."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "αληθής"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι ίσες μεταξύ τους."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μεγαλύτερη από τη δεύτερη είσοδο."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη ή ίση με τη δεύτερη είσοδο."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από τη δεύτερη είσοδο."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από ή ίση με τη δεύτερη είσοδο."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Επιστρέφει αληθής αν και οι δύο είσοδοι δεν είναι ίσες μεταξύ τους."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "όχι %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Επιστρέφει αληθής αν η είσοδος είναι ψευδής. Επιστρέφει ψευδής αν η είσοδος είναι αληθής."; Blockly.Msg["LOGIC_NULL"] = "κενό"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Επιστρέφει κενό."; Blockly.Msg["LOGIC_OPERATION_AND"] = "και"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "ή"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι αληθής."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Επιστρέφει αληθής αν τουλάχιστον μια από τις εισόδους είναι αληθής."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "έλεγχος"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "εάν είναι ψευδής"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "εάν είναι αληθής"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής»."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CE%B7%CF%84%CE%B9%CE%BA%CE%AE"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Επιστρέφει το άθροισμα των δύο αριθμών."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Επιστρέφει το πηλίκο των δύο αριθμών."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Επιστρέφει τη διαφορά των δύο αριθμών."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Επιστρέφει το γινόμενο των δύο αριθμών."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Επιστρέφει τον πρώτο αριθμό υψωμένο στη δύναμη του δεύτερου αριθμού."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 από X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Επιστρέφει την διαφορά τόξου των σημείων (X, Y) σε μοίρες από -180 σε 180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7"; Blockly.Msg["MATH_CHANGE_TITLE"] = "άλλαξε %1 αυξάνοντας κατά %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Προσθέτει έναν αριθμό στη μεταβλητή «%1»."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Επιστρέφει μία από τις κοινές σταθερές: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...), ή ∞ (άπειρο)."; -Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "περιόρισε %1 χαμηλή %2 υψηλή %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "είναι διαιρετός από το"; Blockly.Msg["MATH_IS_EVEN"] = "είναι άρτιος"; Blockly.Msg["MATH_IS_NEGATIVE"] = "είναι αρνητικός"; @@ -214,10 +214,10 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "είναι θετικός"; Blockly.Msg["MATH_IS_PRIME"] = "είναι πρώτος"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Ελέγχει αν ένας αριθμός είναι άρτιος, περιττός, πρώτος, ακέραιος, θετικός, αρνητικός, ή αν είναι διαιρετός από έναν ορισμένο αριθμό. Επιστρέφει αληθής ή ψευδής."; Blockly.Msg["MATH_IS_WHOLE"] = "είναι ακέραιος"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "υπόλοιπο της %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ένας αριθμός."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -241,10 +241,10 @@ Blockly.Msg["MATH_POWER_SYMBOL"] = "^ ύψωση σε δύναμη"; Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%93%CE%B5%CE%BD%CE%BD%CE%AE%CF%84%CF%81%CE%B9%CE%B1_%CE%A4%CF%85%CF%87%CE%B1%CE%AF%CF%89%CE%BD_%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8E%CE%BD"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "τυχαίο κλάσμα"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "τυχαίος ακέραιος από το %1 έως το %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών)."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "στρογγυλοποίησε"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "στρογγυλοποίησε προς τα κάτω"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "στρογγυλοποίησε προς τα πάνω"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Επιστρέφει τον λογά Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Επιστρέφει την αρνητική ενός αριθμού."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Επιστρέφει το 10 υψωμένο στη δύναμη ενός αριθμού."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Επιστρέφει την τετραγωνική ρίζα ενός αριθμού."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -290,11 +290,11 @@ Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "με:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Δημιούργησε «%1»"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Περιγράψετε αυτήν την ιδιότητα.."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "κάνε κάτι"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "στο"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Δημιουργεί μια συνάρτηση χωρίς έξοδο."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "επέστρεψε"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Δημιουργεί μια συνάρτηση με μια έξοδο."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Προειδοποίηση: Αυτή η συνάρτηση έχει διπλότυπες παραμέτρους."; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "Ακύρωση αναίρεσης"; Blockly.Msg["REMOVE_COMMENT"] = "Αφαίρεση σχολίου"; Blockly.Msg["RENAME_VARIABLE"] = "Μετονόμασε τη μεταβλητή..."; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Μετονόμασε όλες τις μεταβλητές «%1» σε:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "έως %1 ανάθεσε κείμενο %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Αναθέτει κείμενο στη μεταβλητή «%1»."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "σε πεζά"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "σε Λέξεις Με Πρώτα Κεφαλαία"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "σε ΚΕΦΑΛΑΙΑ"; @@ -321,7 +321,7 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Επιστρέφει ένα αντίγ Blockly.Msg["TEXT_CHARAT_FIRST"] = "πάρε το πρώτο γράμμα"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "πάρε το γράμμα # από το τέλος"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "πάρε το γράμμα #"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "πάρε το τελευταίο γράμμα"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "πάρε τυχαίο γράμμα"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated @@ -336,28 +336,28 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Προσθέτει, αφαιρεί ή Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "μέχρι το # γράμμα από το τέλος"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "μέχρι το # γράμμα"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "μέχρι το τελευταίο γράμμα"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "στο κείμενο"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το πρώτο γράμμα"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα"; Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "βρες την πρώτη εμφάνιση του κειμένου"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "βρες την τελευταία εμφάνιση του κειμένου"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "στο κείμενο %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο."; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "το %1 είναι κενό"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "δημιούργησε κείμενο με"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Δημιουργεί ένα κομμάτι κειμένου ενώνοντας έναν απεριόριστο αριθμό αντικειμένων."; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "το μήκος του %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο."; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "εκτύπωσε %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή."; Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated @@ -373,7 +373,7 @@ Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "ανάκληση %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Αναγραμματισμός των χαρακτήρων του κειμένου"; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BC%CE%B2%CE%BF%CE%BB%CE%BF%CF%83%CE%B5%CE%B9%CF%81%CE%AC"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Ένα γράμμα, μια λέξη ή μια γραμμή κειμένου."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "περίκοψε τα κενά και από τις δυο πλευρές του"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "περίκοψε τα κενά από την αριστερή πλευρά του"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "περίκοψε τα κενά από την δεξιά πλευρά του"; diff --git a/msg/js/en-gb.js b/msg/js/en-gb.js index 21c1b8ff860..f32fa99a3d1 100644 --- a/msg/js/en-gb.js +++ b/msg/js/en-gb.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "do"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repeat %1 times"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised t Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "change %1 by %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; Blockly.Msg["MATH_IS_PRIME"] = "is prime"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "A number."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the li Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "random fraction"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // untranslated diff --git a/msg/js/eo.js b/msg/js/eo.js index 8cf1cc619b2..d7def99e113 100644 --- a/msg/js/eo.js +++ b/msg/js/eo.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Difinas la unua elementon en Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Difinas la elementon ĉe la specifita pozicio en listo"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Difinas la lastan elementon en listo."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Difinas hazardan elementon en listo."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "kreskante"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "malkreskante"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordigi %1 %2 liston %3"; @@ -241,10 +241,10 @@ Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://eo.wikipedia.org/wiki/Hazardo"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "hazarda frakcio"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Liveras hazardan frakcion inter 0,0 (inkluzive) kaj 1,0 (ekskluzive)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "hazarda entjero inter %1 kaj %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "rondigi"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rondigi malsupren"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Rondigi supren"; diff --git a/msg/js/es.js b/msg/js/es.js index 6c3fe6ca127..534762a2cfe 100644 --- a/msg/js/es.js +++ b/msg/js/es.js @@ -81,7 +81,7 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "crear lista vacía"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Devuelve una lista, de longitud 0, sin ningún dato"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Agregar, eliminar o reorganizar las secciones para reconfigurar este bloque de lista."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "crear lista con"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Agregar un elemento a la lista."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crear una lista con cualquier número de elementos."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Devuelve la longitud de una lista."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "crear lista con el elemento %1 repetido %2 veces"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crea una lista que consta de un valor dado repetido el número de veces especificado."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "invertir %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Invertir una copia de una lista."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Establece el primer elemento Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Establece el elemento en la posición especificada en una lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Establece el último elemento de una lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Establece un elemento aleatorio en una lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; Blockly.Msg["LISTS_SORT_TITLE"] = "orden %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordenar una copia de una lista."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabético, ignorar mayúscula/minúscula"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérico"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabético"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "hacer lista a partir de texto"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "hacer texto a partir de lista"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Unir una lista de textos en un solo texto, separado por un delimitador."; @@ -197,7 +197,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Devuelve el primer número eleva Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://es.wikipedia.org/wiki/Arcotangente_de_dos_par%C3%A1metros"; Blockly.Msg["MATH_ATAN2_TITLE"] = "Arcotangente de X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Regresar el arcotangente del punto (X,Y) en grados de -180 a 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "añadir %2 a %1"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Añadir un número a la variable «%1»."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://es.wikipedia.org/wiki/Anexo:Constantes_matemáticas"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "es positivo"; Blockly.Msg["MATH_IS_PRIME"] = "es primo"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso."; Blockly.Msg["MATH_IS_WHOLE"] = "es entero"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "resto de %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Devuelve el resto al dividir los dos números."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obtener letra aleatoria"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "en el texto %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Devuelve la letra en la posición especificada."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "contar %1 en %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Cuantas veces aparece un texto dentro de otro texto."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Agregar un elemento al texto."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Solicitar al usuario un número."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Solicitar al usuario un texto."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "solicitar número con el mensaje"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "solicitar texto con el mensaje"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "reemplazar %1 con %2 en %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Reemplazar todas las veces que un texto dentro de otro texto."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "invertir %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Invierte el orden de los caracteres en el texto."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://es.wikipedia.org/wiki/Cadena_de_caracteres"; diff --git a/msg/js/et.js b/msg/js/et.js index 70d667af3e4..8e821833391 100644 --- a/msg/js/et.js +++ b/msg/js/et.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "suhtega"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "segu"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Valitud värv paletist."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "juhuslik värv"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Kui avaldis on tõene, käivita ploki se Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Kui avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul käivita käsud teisest plokist."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Kui esimene avaldis on tõene, käivita käsud esimesest plokist. Vastasel juhul, kui teine avaldis on tõene, käivita käsud teisest plokist. Kui ükski avaldistest pole tõene, käivita käsud viimasest plokist."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "käivita"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 korda"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Plokis olevate käskude käivitamine määratud arv kordi."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Asendab loendis esimese elem Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Asendab loendis määratud kohal oleva elemendi."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Asendab loendis viimase elemendi."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Asendab loendis juhusliku elemendi."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "kasvavalt"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "kahanevalt"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 sorteeritud %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "väär"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Tagastab tõeväärtuse – kas „tõene“ või „väär“."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tõene"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Tagastab „tõene“, kui avaldiste väärtused on võrdsed."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem kui teise väärtus."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Tagastab „tõene“, kui esimese avaldise väärtus on suurem või võrdne teise väärtusega."; @@ -194,13 +194,13 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Tagastab kahe arvu jagatise."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Tagastab kahe arvu vahe."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Tagastab kahe arvu korrutise."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Tagastab esimese arvu teise arvu astmes."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2(X:%1, Y:%2)"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Tagastab punkti (X, Y) arkustangentsit kraadides vahemikus -180 kuni 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "muuda %1 %2 võrra"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lisab arvu muutujale '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 piirang %2 ja %3 vahele"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "on positiivne arv"; Blockly.Msg["MATH_IS_PRIME"] = "on algarv"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“."; Blockly.Msg["MATH_IS_WHOLE"] = "on täisarv"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 jääk"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Tagastab esimese numbri teisega jagamisel tekkiva jäägi."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Tagastab juhusliku elemendi loendis Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Tagastab loendi standardhälbe."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Tagastab kõigi loendis olevate arvude summa."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "juhuslik murdosa"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "juhuslik täisarv %1 ja %2 vahel"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud)."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ümarda"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ümarda alla"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ümarda üles"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Asenda mõne teksti esinemine mõnes muus Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "ümberpöördud %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Pöörab tekstis tähemärkide järjestuse ümber."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Täht, sõna või rida teksti."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "mõlemalt poolt eemaldatud tühikutega"; diff --git a/msg/js/eu.js b/msg/js/eu.js index 7a4a2dc8b86..83d75a94c65 100644 --- a/msg/js/eu.js +++ b/msg/js/eu.js @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "positiboa da"; Blockly.Msg["MATH_IS_PRIME"] = "zenbaki lehena da"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "zenbaki osoa da"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2(r)en oroigarria"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1(e)ri buelta eman"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Letra bat, hitza edo testuko lerroa."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // untranslated diff --git a/msg/js/fa.js b/msg/js/fa.js index c2957c2c40f..bd83d00f1eb 100644 --- a/msg/js/fa.js +++ b/msg/js/fa.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "اولین مورد در ی Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "مورد مشخص‌شده در یک فهرست را قرار می‌دهد."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "آخرین مورد در یک فهرست را تعیین می‌کند."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "یک مورد تصادفی در یک فهرست را تعیین می‌کند."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "صعودی"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "نزولی"; Blockly.Msg["LISTS_SORT_TITLE"] = "مرتب‌سازی%1 %2 %3"; @@ -194,7 +194,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "بازگرداندن باقی Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "بازگرداندن تفاوت دو عدد."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "بازگرداندن حاصلضرب دو عدد."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://fa.wikipedia.org/wiki/%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%E2%80%8C%D9%86%D9%88%DB%8C%D8%B3%DB%8C#.D8.A7.D9.81.D8.B2.D8.A7.DB.8C.D8.B4_.D8.B4.D9.85.D8.A7.D8.B1.D9.86.D8.AF.D9.87"; diff --git a/msg/js/fi.js b/msg/js/fi.js index 3382d56dbea..a2513db9f12 100644 --- a/msg/js/fi.js +++ b/msg/js/fi.js @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "satunnainen väri"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Valitse väri sattumanvaraisesti."; Blockly.Msg["COLOUR_RGB_BLUE"] = "sininen"; Blockly.Msg["COLOUR_RGB_GREEN"] = "vihreä"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "punainen"; Blockly.Msg["COLOUR_RGB_TITLE"] = "väri, jossa on"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Luo väri, jossa on tietty määrä punaista, vihreää ja sinistä. Kaikkien arvojen tulee olla välillä 0 - 100."; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jos arvo on tosi, suorita lauseke."; Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jos arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten suorita toinen lohko lausekkeita."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jos ensimmäinen arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten, jos toinen arvo on tosi, suorita toinen lohko lausekkeita."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jos ensimmäinen arvo on tosi, suorita ensimmäinen lohko lausekkeita. Muuten, jos toinen arvo on tosi, suorita toinen lohko lausekkeita. Jos mikään arvoista ei ole tosi, suorita viimeinen lohko lausekkeita."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "tee"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "toista %1 kertaa"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Suorita joukko lausekkeita useampi kertaa."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Asettaa listan ensimmäisen Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Asettaa kohteen annettuun kohtaan listassa."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Asettaa listan viimeisen kohteen."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Asettaa satunnaisen kohteen listassa."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "nouseva"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "laskeva"; Blockly.Msg["LISTS_SORT_TITLE"] = "lajittele %1 %2 %3"; @@ -187,25 +187,25 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jos epätosi"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jos tosi"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Tarkistaa testin ehdon. Jos ehto on tosi, palauttaa \"jos tosi\" arvon, muuten palauttaa \"jos epätosi\" arvon."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://fi.wikipedia.org/wiki/Aritmetiikka"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Palauttaa kahden luvun summan."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Palauttaa jakolaskun osamäärän."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Palauttaa kahden luvun erotuksen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Palauttaa kertolaskun tulon."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Palauttaa ensimmäisen luvun korotettuna toisen luvun potenssiin."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan(X:%1,Y:%2)"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Palauta pisteen (X,Y) arkustangentti välillä -180–180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://fi.wikipedia.org/wiki/Yhteenlasku"; Blockly.Msg["MATH_CHANGE_TITLE"] = "muuta %1 arvolla %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lisää arvo muuttujaan '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Palauttaa jonkin seuraavista vakioista: π (3.141…), e (2.718…), φ (1.618…), neliöjuuri(2) (1.414…), neliöjuuri(½) (0.707…), or ∞ (ääretön)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "rajoita %1 vähintään %2 enintään %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Rajoittaa arvon annetulle suljetulle välille."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "on jaollinen luvulla"; Blockly.Msg["MATH_IS_EVEN"] = "on parillinen"; Blockly.Msg["MATH_IS_NEGATIVE"] = "on negatiivinen"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "on positiivinen"; Blockly.Msg["MATH_IS_PRIME"] = "on alkuluku"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Tarkistaa onko numero parillinen, pariton, alkuluku, kokonaisluku, positiivinen, negatiivinen, tai jos se on jaollinen toisella luvulla. Palauttaa tosi tai epätosi."; Blockly.Msg["MATH_IS_WHOLE"] = "on kokonaisluku"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 jakojäännös"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Palauttaa jakolaskun jakojäännöksen."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "⋅"; @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Palauttaa luettelon yleisimmistä luv Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Palauttaa satunnaisesti valitun luvun annetuista luvuista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Palauttaa annettujen lukujen keskihajonnan."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Palauttaa kaikkien annettujen lukujen summan."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://fi.wikipedia.org/wiki/Satunnaisluku"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "satunnainen murtoluku"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Palauttaa satunnaisen luvun oikealta puoliavoimesta välistä [0.0, 1.0)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Palauttaa luvun kymmenkantaisen loga Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Palauttaa numeron vastaluvun."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Palauttaa 10 potenssiin luku."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Palauttaa luvun neliöjuuren."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "palauta"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Luo funktio, jolla ei ole tuotosta."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Varoitus: tällä funktiolla on sama parametri useamman kerran."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Korosta funktion määritelmä"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Jos arvo on tosi, palauta toinen arvo."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "syötteen nimi:"; diff --git a/msg/js/fr.js b/msg/js/fr.js index 03d48572786..d3445fd0261 100644 --- a/msg/js/fr.js +++ b/msg/js/fr.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Réduire les blocs"; Blockly.Msg["COLLAPSE_BLOCK"] = "Réduire le bloc"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "couleur 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "couleur 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "taux"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mélanger"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mélange deux couleurs dans une proportion donnée (de 0.0 à 1.0)."; @@ -24,25 +24,25 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "couleur aléatoire"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Choisir une couleur au hasard."; Blockly.Msg["COLOUR_RGB_BLUE"] = "bleu"; Blockly.Msg["COLOUR_RGB_GREEN"] = "vert"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rouge"; Blockly.Msg["COLOUR_RGB_TITLE"] = "colorier en"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Commandes_de_sortie_de_boucle"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "quitter la boucle"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "passer à l’itération de boucle suivante"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Sortir de la boucle englobante."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Attention : ce bloc ne devrait être utilisé que dans une boucle."; -Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Itérateurs"; Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "pour chaque élément %1 dans la liste %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable « %1 », puis exécuter des instructions."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://fr.wikipedia.org/wiki/Boucle_for"; Blockly.Msg["CONTROLS_FOR_TITLE"] = "compter avec %1 de %2 à %3 par %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Faire prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Ajouter une condition au bloc conditionnel."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ajouter une condition finale déclenchée dans tous les autres cas au bloc conditionnel."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Alternatives"; Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Ajouter, supprimer ou réordonner les sections pour reconfigurer ce bloc conditionnel."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sinon"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sinon si"; @@ -55,7 +55,7 @@ Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://fr.wikipedia.org/wiki/Boucle_f Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "faire"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "répéter %1 fois"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Exécuter des instructions plusieurs fois."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://fr.wikipedia.org/wiki/Boucle_while"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "répéter jusqu’à ce que"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "répéter tant que"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Tant qu’une valeur est fausse, alors exécuter des instructions."; @@ -81,7 +81,7 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "créer une liste vide"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement de données"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Ajouter, supprimer, ou réordonner les sections pour reconfigurer ce bloc de liste."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "créer une liste avec"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Ajouter un élément à la liste."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Créer une liste avec un nombre quelconque d’éléments."; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtenir la sous-liste depuis le début"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtenir la sous-liste depuis le n° depuis la fin"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtenir la sous-liste depuis le n°"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Crée une copie de la partie spécifiée d’une liste."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 est le dernier élément."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 est le premier élément."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Renvoie la longueur d’une liste."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "créer une liste avec l’élément %1 répété %2 fois"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Crée une liste consistant en la valeur fournie répétée le nombre de fois indiqué."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverser %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverser la copie d’une liste."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Définit le premier élémen Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Définit l’élément à la position indiquée dans une liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Définit le dernier élément dans une liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Définit un élément au hasard dans une liste."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "croissant"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "décroissant"; Blockly.Msg["LISTS_SORT_TITLE"] = "trier %1 %2 %3"; @@ -154,14 +154,14 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Trier une copie d’une liste."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabétique, en ignorant la casse"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérique"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabétique"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "créer une liste depuis le texte"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "créer un texte depuis la liste"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Réunir une liste de textes en un seul, en les joignant par un séparateur."; Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Couper un texte en une liste de textes, en coupant à chaque séparateur."; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "avec séparateur"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "faux"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://fr.wikipedia.org/wiki/Principe_de_bivalence"; Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Renvoie soit vrai soit faux."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "vrai"; Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://fr.wikipedia.org/wiki/In%C3%A9galit%C3%A9_(math%C3%A9matiques)"; @@ -171,14 +171,14 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Renvoyer true si la première entré Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Renvoyer vrai si la première entrée est plus petite que la seconde."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Renvoyer vrai si les deux entrées sont différentes."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://fr.wikipedia.org/wiki/Négation_logique"; Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie."; Blockly.Msg["LOGIC_NULL"] = "nul"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Renvoie nul."; Blockly.Msg["LOGIC_OPERATION_AND"] = "et"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://fr.wikipedia.org/wiki/Connecteur_logique"; Blockly.Msg["LOGIC_OPERATION_OR"] = "ou"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Renvoyer vrai si les deux entrées sont vraies."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Renvoyer vrai si au moins une des entrées est vraie."; @@ -187,7 +187,7 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F%3A"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si faux"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si vrai"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Vérifie la condition indiquée dans « test ». Si elle est vraie, renvoie la valeur « si vrai » ; sinon renvoie la valeur « si faux »."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://fr.wikipedia.org/wiki/Arithm%C3%A9tique"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Renvoie la somme des deux nombres."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Renvoie le quotient des deux nombres."; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Renvoie une des constantes courantes : Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "contraindre %1 entre %2 et %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Contraindre un nombre à rester entre les limites spécifiées (incluses)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "est divisible par"; Blockly.Msg["MATH_IS_EVEN"] = "est pair"; Blockly.Msg["MATH_IS_NEGATIVE"] = "est négatif"; @@ -217,10 +217,10 @@ Blockly.Msg["MATH_IS_WHOLE"] = "est entier"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://fr.wikipedia.org/wiki/Modulo_(op%C3%A9ration)"; Blockly.Msg["MATH_MODULO_TITLE"] = "reste de %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Renvoyer le reste de la division euclidienne des deux nombres."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://fr.wikipedia.org/wiki/Nombre"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un nombre."; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_HELPURL"] = "https://fr.wikipedia.org/wiki/Fonction_d'agrégation"; Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "moyenne de la liste"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maximum de la liste"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "médiane de la liste"; @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Renvoyer une liste d’un ou plusieur Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Renvoyer un élément au hasard dans la liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Renvoyer l’écart type de la liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Renvoyer la somme de tous les nombres dans la liste."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://fr.wikipedia.org/wiki/G%C3%A9n%C3%A9rateur_de_nombres_al%C3%A9atoires"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraction aléatoire"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Renvoyer une fraction aléatoire entre 0,0 (inclus) et 1,0 (exclus)."; @@ -253,7 +253,7 @@ Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://fr.wikipedia.org/wiki/Racine_carr% Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "valeur absolue"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "racine carrée"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Renvoie la valeur absolue d’un nombre."; -Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Renvoie e à la puissance d’un nombre."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Renvoie e (la constante d’Euler) élevé à la puissance d’un nombre donné, c’est-à-dire l’exponentielle népérienne ou naturelle de ce nombre."; Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Renvoie le logarithme naturel d’un nombre."; Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Renvoie le logarithme décimal d’un nombre."; Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Renvoie l’opposé d’un nombre"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "Créer une variable de chaîne..."; Blockly.Msg["NEW_VARIABLE"] = "Créer une variable..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nom de la nouvelle variable :"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nouveau type de variable :"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "autoriser les ordres"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "avec :"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://fr.wikipedia.org/wiki/Sous-programme"; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Exécuter la fonction « %1  Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "avec :"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Créer « %1 »"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Décrivez cette fonction..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://fr.wikipedia.org/wiki/Sous-programme"; Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "faire quelque chose"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "pour"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retourner"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Crée une fonction avec une sortie."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Attention : cette fonction a des paramètres en doublon."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Surligner la définition de la fonction"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Si une valeur est vraie, alors renvoyer une seconde valeur."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Attention : ce bloc ne peut être utilisé que dans une définition de fonction."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nom de l’entrée :"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obtenir une lettre au hasard"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "%2 dans le texte %1"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Renvoie la lettre à la position indiquée."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "nombre %1 sur %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Compter combien de fois un texte donné apparaît dans un autre."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Ajouter un élément au texte."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Demander un nombre à l’utilisate Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Demander un texte à l’utilisateur."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "demander un nombre avec un message"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "demander un texte avec un message"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "remplacer %1 par %2 dans %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Remplacer toutes les occurrences d’un texte par un autre."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "renverser %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Renverse l’ordre des caractères dans le texte."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res"; diff --git a/msg/js/gor.js b/msg/js/gor.js index 4256f3c8265..38c7f33ab44 100644 --- a/msg/js/gor.js +++ b/msg/js/gor.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "pohutuwa"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulangiya %1 kali"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; // untranslated @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "tala"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "banari"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "wonu tala"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "wonu banari"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated @@ -200,7 +200,7 @@ Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in de Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "change %1 by %2"; // untranslated Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; // untranslated @@ -218,7 +218,7 @@ Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_opera Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Noomoro"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated @@ -249,7 +249,7 @@ Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; // untranslated Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "akar pangkat dua"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; // untranslated @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; // untranslated diff --git a/msg/js/ha.js b/msg/js/ha.js index b22f289886e..3f71c90e759 100644 --- a/msg/js/ha.js +++ b/msg/js/ha.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "lissafi"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "gauraya"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Ana gauraya launuka biyu tare da wani lissafi da aka bayar (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Zaɓi launi daga faifan launuka."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "launuka da aka hargitsa"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Idan kima gaskiya ce, to a yi wasu magan Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Idan kimar gaskiya ce, to a yi bulo na farko na maganganu. Idan ba haka ba, yi bulo na biyu na maganganu."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Idan kimar farko gaskiya ce, to yi bulon farko na maganganun. In ba haka ba, idan kima ta biyu ce gaskiya, yi bolu na biyu na maganganun. Idan babu kimar da take gaskiya, yi bulo na ƙarshe na maganganun."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "yi"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "maimaita sau %1"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Yi wasu bayanai sau da dama."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ya shirya abin farko a cikin Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ya shirya wani abin a wani gurbi da aka fayyace a cikin jeri."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ya shirya abin ƙarshe a cikin jeri."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ya shirya abu mai bazuwa a cikin jeri."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "hawa"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "sauka"; Blockly.Msg["LISTS_SORT_TITLE"] = "ware %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ƙarya"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ya koma kodai gaskiya ko ƙarya."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "gaskiya"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Koma gaskiya idan duk bayanan sun yi dai dai da juna."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Koma gaskiya idan bayanin farko ya fi bayani na biyu yawa."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Koma gaskiya idan bayanin farko ya fi ko ya yi dai dai da bayani na biyu."; @@ -188,19 +188,19 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "idan ƙarya ne"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "idan gaskiya ne"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Duba sharaɗin a cikin 'gwaji'. Idan sharaɗin gaskiya ne, mayar da kimar 'idan gaskiya ne'; idan ba haka ba mayar da kimar 'idan ƙarya ne'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Dawo da jumlar lambobin guda biyu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Dawo da sakamakon lambobin guda biyu bayan an raba su da juna."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Dawo da bambancin lambobin guda biyu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Dawo da ruɓin lambobin guda biyu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Dawo da lambar farko wadda aka ɗaga ta zuwa ƙarfin lamba ta biyu."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 na X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Dawo da arctangent na tsinin (X, Y) a gwargwado daga -180 zuwa 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "canza %1 da %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Daɗa wata lamba zuwa siffa '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Dawo da ɗaya daga cikin sanannen zaunannen lissafi: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ko ∞ (maras iyaka)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ƙarfi %1 ƙasa %2 sama %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "lamba ce da tafi sufuli"; Blockly.Msg["MATH_IS_PRIME"] = "lamba ce da kawai za a iya rabawa da kanta"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Duba idan lamba ce da za a iya rabawa da biyu, lamba wadda ba za a iya rabawa da biyu ba, lamba ce kawai da za a iya rabawa da kanta, lamba ce cikakkiya,lamba ce da tafi sufuli, lamba ce da bata kai sufuli ba, lamba ce da za a iya rabawa da wata lamba. Ta dawo da gaskiya ko ƙarya."; Blockly.Msg["MATH_IS_WHOLE"] = "lamba ce cikakkiya"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "saura daga raba %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Dawo da saura daga raba lambobin guda biyu."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Lambda."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "Tsaka-tsaki na jeri"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Dawo da bazuwar kaya daga jerin."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Dawo da matakan bambance-bambance na jeri."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Dawo da jumlar duk lambobi na cikin jerin."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "ɓangare mai buzuwa"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Dawo da ɓangare mai bazuwa tsakanin 0.0 (haɗawa) da 1.0 (rabewa)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "bazuwar cikakkiyar lamba daga %1 zuwa %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Dawo da bazuwar cikakkiyar lamba tsakanin wani gwargwado da aka fayyace, haɗawa."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "cika"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "cika ƙasa"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "cika sama"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Cika lamba sama ko ƙasa."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "cikakkiya"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "lamba da ta ruɓanya kanta"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Dawo da cikakkiyar kima na wata lamba."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Dawo da arccosine na wata lamba."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Irin sabuwar siffa:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ƙyale bayanai"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "tare da:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Gudanar da aiki '%1' wanda mai amfani ya ayyana."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Gudanar da aiki '%1' kuma a yi amfani da sakamakon sa."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "tare da:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ƙirƙiri '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Maye gurbin duk afkuwa na wani rubutu a c Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "juya %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ya juya tsari na haruffa a cikin rubutu."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Harafi, kalma, ko layi na rubutu."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "datse sarari daga ɓangarori guda biyu na"; diff --git a/msg/js/he.js b/msg/js/he.js index a52f88b5dd9..f10ad39fab2 100644 --- a/msg/js/he.js +++ b/msg/js/he.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "מגדיר את הפריט Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "מגדיר את הפריט במיקום שצוין ברשימה."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "מגדיר את הפריט האחרון ברשימה."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "מגדיר פריט אקראי ברשימה."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "סדר עולה"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "סדר יורד"; Blockly.Msg["LISTS_SORT_TITLE"] = "מיון %1 %2 %3"; @@ -187,7 +187,7 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "אם שגוי"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "אם נכון"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://he.wikipedia.org/wiki/ארבע_פעולות_החשבון"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "תחזיר את סכום שני המספרים."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "החזרת המנה של שני המספרים."; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "החזרת אחד מהקבועים המ Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "הגבל %1 בין %2 ל %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "הגבלת מספר כך שיהיה בין המגבלות שמוגדרות (כולל)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "מתחלק ב"; Blockly.Msg["MATH_IS_EVEN"] = "זוגי"; Blockly.Msg["MATH_IS_NEGATIVE"] = "שלילי"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "שלם"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://he.wikipedia.org/wiki/חשבון_מודולרי"; Blockly.Msg["MATH_MODULO_TITLE"] = "שארית החילוק %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "החזרת השארית מחלוקת שני המספרים."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://he.wikipedia.org/wiki/מספר_ממשי"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "מספר."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "החזרת רשימה של הפריט Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "תחזיר רכיב אקראי מרשימה."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "מחזיר את סטיית התקן של הרשימה."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "החזרת הסכום של המספרים ברשימה."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://he.wikipedia.org/wiki/מחולל_מספרים_אקראיים"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "שבר אקראי"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "מחזיר שבר אקראי בין 0.0 (כולל) עד 1.0 (כולל)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "החזרת הלוגריתם לפי Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "החזרת הערך הנגדי של מספר."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "החזרת 10 בחזקת מספר."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "החזרת השורש הריבועי של מספר."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -298,7 +298,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Sub Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "להחזיר"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "יצירת פונקציה עם פלט."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "אזהרה: לפונקציה זו יש פרמטרים כפולים."; -Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "הדגש הגדרה של פונקציה"; +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "להדגיש הגדרה של פונקציה"; Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "אם ערך נכון, אז להחזיר ערך שני."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "אזהרה: קוביה זו עשויה לשמש רק בתוך הגדרה של פונקציה."; diff --git a/msg/js/hi.js b/msg/js/hi.js index 89938774d12..91a2aa07007 100644 --- a/msg/js/hi.js +++ b/msg/js/hi.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "अनुपात"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "मिश्रण करें"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "दिए गए अनुपात (0.0 - 1.0) के साथ दो रंगों का मिश्रण करता है।"; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "पैलेट से एक रंग चुनें।"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "कोई भी रंग"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "यदी मान सही है, Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "यदि एक मान सत्य है तो कथनों का प्रथम खण्ड बनायें। अन्यथा कथनों का दूसरा भाग निर्मित करें।"; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "यदि पहले मान सही है, तो बयानों का पहला खंड करें। अन्यथा, यदि दूसरा मान सत्य है, तो बयानों का दूसरा खंड करें।"; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "यदि पहला मान सही है, तो बयानों का पहला खंड करें। अन्यथा, यदि दूसरा मान सत्य है, तो बयानों का दूसरा खंड करें। यदि कोई भी मान सही नहीं है, तो बयानों का अंतिम खंड करें।"; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "करें"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 बार दोहराएँ"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "कुछ विवरण कई बार चलाएँ।"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "सूची में प Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "सूची मे बताए गये स्थान में आइटम सैट करता है।"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "सूची में आखरी आइटम सैट करता है।"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "सूची में रैन्डम आइटम सैट करता है।"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "बढ़ते क्रम"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "बढ़ते क्रम में"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 को छांटे"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "गलत"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "ट्रू या फॉल्स रिटर्न करता है।"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "सही"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "ट्रू रिटर्न करें यदि दोनो इनपुट इक दूसरे के बराबर हों।"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से बड़ा हो।"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से बड़ा हो या बराबर हो।"; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "यदि गलत है"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "यदि सही है"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'परीक्षण' में हालत की जांच करें। यदि स्थिति सही है, तो 'सच' मान लौटाता है; अन्यथा वापस लौटता 'अगर झूठा'मान देता है।"; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "दो संख्याओं का योग रिटर्न करें।"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "दो संख्याओं का भागफल रिटर्न करें।"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "दो संख्याओं का अंतर रिटर्न करें।"; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "दूसरे नंबर क Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 को %2 से बदलें"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "संख्या को चर '%1' से जोड़ें।"; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "सामान्य स्थिरांक में से एक को वापस लौटें:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)।"; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 कम %2 उच्च %3 बाधित करें"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "धनात्मक है"; Blockly.Msg["MATH_IS_PRIME"] = "अभाज्य है"; Blockly.Msg["MATH_IS_TOOLTIP"] = "जांचें कि क्या कोई संख्या एक सम, विषम, मुख्य, संपूर्ण, सकारात्मक, नकारात्मक है या यदि वह निश्चित संख्या से विभाजित है। वास्तविक या गलत रिटर्न देता है।"; Blockly.Msg["MATH_IS_WHOLE"] = "पूर्णांक है"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 का शेषफल"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "दो संख्याओं के भाग का शेषफल रिटर्न करें।"; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "एक संख्या।"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "सूची का औसत मान"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "सूची से एक रै Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "सूची का मानक विचलन रिटर्न करें।"; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "सूची की सभी संख्याओं का योग रिटर्न करें।"; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "रैन्डम अंश"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (समावेशी) और 1.0 (विशिष्ट) के बीच एक यादृच्छिक अंश पर लौटें।"; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "%1 से %2 तक रैन्डम पूर्णांक"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "दो निर्दिष्ट सीमाओं, समावेशी के बीच एक यादृच्छिक पूर्णांक लौटें।"; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "पूर्णांक बनाएँ"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "घटा के पूर्णांक बनाएँ"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "बड़ा के पूर्णांक बनाएँ"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "संख्या को बड़ा या घटा के पूर्णांक बनाएँ।"; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "परम"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "वर्गमूल"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "संख्या का परम मान रिटर्न करें।"; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "संख्या का आर्ककोसाइन रिटर्न करें।"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "नए चर का नाम:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "बयानों की अनुमति दें"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = ": के साथ"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।"; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ और उसका आउटपुट इस्तेमाल करें।"; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = ": के साथ"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' बनाएँ"; @@ -368,10 +368,10 @@ Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "सूचना के साथ टे Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%1 को %2 के साथ %3 में बदलें"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "कुछ अन्य पाठ के अंदर कुछ पाठ की सभी जगहों को बदलें।"; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 को बदल दें"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "पाठ में वर्णों के क्रम को उलट देता है।"; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "एक अक्षर, शब्द, या टेक्स्ट की पंक्ति।"; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "रिक्त स्थान को इस टेक्स्ट के दोनों तरफ से निकालें"; diff --git a/msg/js/hr.js b/msg/js/hr.js index 53b8e4f361f..d46f8694a0b 100644 --- a/msg/js/hr.js +++ b/msg/js/hr.js @@ -44,7 +44,7 @@ Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Dodaj uvjet bloku."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Dodaj završni, \"vrijedi za sve\" uvjet bloku."; Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Dodaj, ukloni ili promijeni redoslijed kako biste presložili ovaj blok."; -Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "onda"; +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "inače"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "inače ako"; Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ako"; Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ako je vrijednost istinita izvrši neke naredbe"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Postavlja prvi član u listi Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Postavlja član na odabrano mjesto u listi."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Postavlja zadnji član u listi."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Postavlja slučajno odabrani član u listi."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "uzlazno"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "silazno"; Blockly.Msg["LISTS_SORT_TITLE"] = "Sortiraj %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "laž"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vraća ili istina ili laž."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "istina"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vraća istina ako su obje ulazne vrijednosti jednake jedna drugoj."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Vraća istina ako je prva ulazna vrijednost veća od druge."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vraća istina ako je prva ulazna vrijednost veća ili jednaka od druge."; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vraća kvocijent dvaju brojeva. Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Vraća razliku dvaju brojeva."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Vraća umnožak dvaju brojeva."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vraća prvi broj podignut na potenciju drugog broja."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 od X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Vraća vrijednost arkus tangensa točke (X, Y) u stupnjevima od -180 do 180"; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "promijeni %1 za %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Dodaj broj varijabli '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://hr.wikipedia.org/wiki/Matemati%C4%8Dka_konstanta"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "je pozitivan"; Blockly.Msg["MATH_IS_PRIME"] = "je prost broj"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Provjerava je li broj paran, neparan, prim, cijeli, pozitivan, negativan ili je djeljiv određenim brojem. Vraća istina ili laž."; Blockly.Msg["MATH_IS_WHOLE"] = "je cijeli broj"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "ostatak pri dijeljenju %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vraća ostatak pri dijeljenju dvaju brojeva."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vraća slučajan član liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vraća standardnu devijaciju liste."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vraća zbroj svih brojeva u listi."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "slučajan razlomak"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vraća slučajan razlomak vrijednosti između 0.0 (uključivo) i 1.0 (isključivo)"; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "slučajan cijeli broj između %1 i %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vraća slučajan cijeli broj između dviju zadanih vrijednosti, uključivši i rubne vrijednosti."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokružiti"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokružiti na manje"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokružiti na više"; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Vraća arkus kosinus broja."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Novi tip varijable:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "Dopustite izjave"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "s:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Pokrenite korisnički definiranu funkciju '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Pokrenite korisnički definiranu funkciju '%1' i upotrijebite njenu izlaznu vrijednost"; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "s:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Stvori '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zamijeni sva pojavljivanja nekog teksta u Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "obrnuto %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Okreće redoslijed znakova u tekstu"; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Slovo, riječ ili linija teksta"; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "ukloni razmake s obje strane od"; diff --git a/msg/js/hrx.js b/msg/js/hrx.js index 43dc296e82a..58b998cd6a7 100644 --- a/msg/js/hrx.js +++ b/msg/js/hrx.js @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "mit:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ruf en Funktionsblock ohne Rückgäweart uff."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Ruf en Funktionsblock mit Rückgäbweart uff."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "mit:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Generier/erzeich \"Uffruf %1\""; diff --git a/msg/js/hu.js b/msg/js/hu.js index 7039a761a11..3fc559a3ba5 100644 --- a/msg/js/hu.js +++ b/msg/js/hu.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Az első elem cseréje a lis Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "A megadott sorszámú elem cseréje a listában."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Az utolsó elem cseréje a listában."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Véletlenszerűen választott elem cseréje a listában."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "növekvő"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "csökkenő"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 rendezés"; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Meghívja a függvényt."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "paraméterlistaː"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "„%1” létrehozása"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Írj erről a funkcióról..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "név"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "Eljárás"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "eredménye"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Függvény eredménnyel."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Figyelem: Az eljárásban azonos elnevezésű paramétert adtál meg."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Függvénydefiníció kiemelése"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ha az érték igaz, akkor visszatér a függvény értékével."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Figyelem: Ez a blokk csak függvénydefiníción belül használható."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "változó:"; diff --git a/msg/js/hy.js b/msg/js/hy.js index f02da62aade..ca601d454f1 100644 --- a/msg/js/hy.js +++ b/msg/js/hy.js @@ -249,7 +249,7 @@ Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "կլորացնել"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "կլորացնել ցած"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "կլորացնել վեր"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Կլորացնում է թիվը վերև կամ ներքև:"; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "բացարձակ"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Քառակուսի արմատ"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Վերադարձնում է թվի բացարձակ արժեքը:"; diff --git a/msg/js/ia.js b/msg/js/ia.js index a241cf4ad3e..80a18191d41 100644 --- a/msg/js/ia.js +++ b/msg/js/ia.js @@ -87,7 +87,7 @@ Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Adder un elemento al lista."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Crear un lista con un numero qualcunque de elementos."; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prime"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "№ ab fin"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; Blockly.Msg["LISTS_GET_INDEX_GET"] = "prender"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "prender e remover"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ultime"; @@ -253,20 +253,20 @@ Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://ia.wikipedia.org/wiki/Radice_quadr Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolute"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "radice quadrate"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Retornar le valor absolute de un numero."; -Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retornar e elevate al potentia de un numero."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "Retornar e elevate al potentia de un numero."; Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "Retornar le logarithmo natural de un numero."; Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retornar le logarithmo in base 10 de un numero."; Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retornar le negation de un numero."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retornar 10 elevate al potentia de un numero."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retornar le radice quadrate de un numero."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Retornar le arcocosino de un numero."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Retornar le arcosino de un numero."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Retornar le arcotangente de un numero."; diff --git a/msg/js/id.js b/msg/js/id.js index 5fc26f70b17..1ecb8d44372 100644 --- a/msg/js/id.js +++ b/msg/js/id.js @@ -13,18 +13,18 @@ Blockly.Msg["COLLAPSE_ALL"] = "Ciutkan Blok"; Blockly.Msg["COLLAPSE_BLOCK"] = "Ciutkan Blok"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "warna 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "warna 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "rasio"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "campur"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Campur dua warna secara bersamaan dengan perbandingan (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Pilih warna dari daftar warna."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "Warna acak"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Pilih warna secara acak."; Blockly.Msg["COLOUR_RGB_BLUE"] = "biru"; Blockly.Msg["COLOUR_RGB_GREEN"] = "hijau"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "merah"; Blockly.Msg["COLOUR_RGB_TITLE"] = "Dengan warna"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100."; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jika nilainya benar, maka lakukan bebera Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jika nilainya benar, maka kerjakan perintah blok pertama. Jika tidak, kerjakan perintah blok kedua."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jika nilai pertama benar, maka kerjakan perintah blok pertama. Sebaliknya, jika nilai kedua benar, kerjakan perintah blok kedua. Jika dua-duanya tidak benar, kerjakan perintah blok terakhir."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "kerjakan"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulangi %1 kali"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Lakukan beberapa perintah beberapa kali."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Kembangkan Blok"; Blockly.Msg["EXTERNAL_INPUTS"] = "Input Eksternal"; Blockly.Msg["HELP"] = "Bantuan"; Blockly.Msg["INLINE_INPUTS"] = "Input Inline"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "buat list kosong"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Kembalikan list, dengan panjang 0, tidak berisi data"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "list"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Tetapkan item pertama di dal Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Tetapkan item ke dalam posisi yang telah ditentukan di dalam list."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Menetapkan item terakhir dalam list."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Tetapkan secara acak sebuah item dalam list."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "menaik"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "menurun"; Blockly.Msg["LISTS_SORT_TITLE"] = "urutkan %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "salah"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Kembalikan benar atau salah."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "benar"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Kembalikan benar jika kedua input sama satu dengan lainnya."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Kembalikan benar jika input pertama lebih besar dari input kedua."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Kembalikan benar jika input pertama lebih besar dari atau sama dengan input kedua."; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "bukan (not) %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Kembalikan benar jika input salah. Kembalikan salah jika input benar."; Blockly.Msg["LOGIC_NULL"] = "null"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Kembalikan null."; Blockly.Msg["LOGIC_OPERATION_AND"] = "dan"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,29 +183,29 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "atau"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Kembalikan benar jika kedua input adalah benar."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Kembalikan benar jika minimal satu input nilainya benar."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jika salah"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jika benar"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://id.wikipedia.org/wiki/Aritmetika"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Kembalikan jumlah dari kedua angka."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Kembalikan hasil bagi dari kedua angka."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Kembalikan selisih dari kedua angka."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Kembalikan perkalian dari kedua angka."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Kembalikan angka pertama pangkat angka kedua."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Kembalikan arctangen titik (X, Y) dalam derajat dari -180 hingga 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "ubah %1 oleh %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Tambahkan angka kedalam variabel '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "Batasi %1 rendah %2 tinggi %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Batasi angka antara batas yang ditentukan (inklusif)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "dapat dibagi oleh"; Blockly.Msg["MATH_IS_EVEN"] = "adalah bilangan genap"; Blockly.Msg["MATH_IS_NEGATIVE"] = "adalah bilangan negatif"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "adalah bilangan positif"; Blockly.Msg["MATH_IS_PRIME"] = "adalah bilangan pokok"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Periksa apakah angka adalah bilangan genap, bilangan ganjil, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Kembalikan benar atau salah."; Blockly.Msg["MATH_IS_WHOLE"] = "adalah bilangan bulat"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "sisa dari %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Kembalikan sisa dari pembagian ke dua angka."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Suatu angka."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "rata-rata dari list"; @@ -237,19 +237,19 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Kembalikan list berisi item yang pali Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Kembalikan elemen acak dari list."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Kembalikan standard deviasi dari list."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Kembalikan jumlah dari seluruh bilangan dari list."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "nilai pecahan acak"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "acak bulat dari %1 sampai %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Kembalikan bilangan acak antara dua batas yang ditentukan, inklusif."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "membulatkan"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "membulatkan kebawah"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "membulatkan keatas"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Bulatkan suatu bilangan naik atau turun."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "mutlak"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "akar"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Kembalikan nilai absolut angka."; @@ -259,12 +259,12 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kembalikan dasar logaritma 10 dari a Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kembalikan penyangkalan terhadap angka."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kembalikan 10 pangkat angka."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kembalikan akar dari angka."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; Blockly.Msg["MATH_TRIG_COS"] = "cos"; -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Kembalikan acosine dari angka."; @@ -282,19 +282,19 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tipe variabel baru:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "memungkinkan pernyataan"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "dengan:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Menjalankan fungsi '%1' yang ditetapkan pengguna."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "dengan:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Buat '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Jelaskan fungsi ini..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "buat sesuatu"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "untuk"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Buat sebuah fungsi tanpa output."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "kembali"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Buat sebuah fungsi dengan satu output."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Peringatan: Fungsi ini memiliki parameter duplikat."; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ganti semua kemunculan teks dalam teks la Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "balikkan %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Balikkan urutan huruf dalam teks."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Huruf, kata atau baris teks."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "pangkas ruang dari kedua belah sisi"; diff --git a/msg/js/ig.js b/msg/js/ig.js index 470d97df364..9e2851e62d9 100644 --- a/msg/js/ig.js +++ b/msg/js/ig.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "oke"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ngwakọta"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Na ngwakọta agba abụọ ọnụ na na oke enyere (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Họrọ agba site na palette."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "agba ọbụla"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ọ bụrụ na akara bụ ezịọkwụ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ọ bụrụ na akara bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, mezie ngọngọ nke abụọ nke okwu."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ọ bụrụ na akara mbụ bụ ezịọkwụ, mezie ngọngọ mbụ nke okwu. Ma ọ bụghị ya, ọ bụrụ na akara nke abụọ bụ ezịọkwụ, mee ngọngọ nke abụọ nke okwu. Ọ bụrụ na onweghị akara bụ ezịọkwụ, mee ngọngọ okwu ikpeazụ."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "mee"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "meghachi ụgbọ %1"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Mee ụfọdụ okwu ọtụtụ ugboro."; @@ -87,7 +87,7 @@ Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Tinye ihe na ndepụta."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Mepụta ndepụta na nọmba ọ bụla."; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "mbu"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# site na njedebe"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; Blockly.Msg["LISTS_GET_INDEX_GET"] = "nweta"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "nweta ma wepu"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ikpeazụ"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Debe ihe mbụ n'ime ndepụ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Debe ihe ahụ na ọnọdụ a kapịrị ọnụ na ndepụta."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Debe ihe ikpeazụ n'ime ndepụta."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Debe ihe ọbụla n'ime ndepụta."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "arịgo"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "agbada"; Blockly.Msg["LISTS_SORT_TITLE"] = "hazie %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ụgha"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Weghachitere ezịọkwụ ma ọ bụ ụgha."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ezịọkwụ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye hatara onwe ha."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ntinye nke abụọ."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị ụkwụụ karia ma ọ bụ hatara ntinye nke abụọ."; @@ -188,19 +188,19 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ọ bụrụ ụgha"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ọ bụrụ na eziokwu"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Lelee ọnọdụ na 'ule'. Ọ bụrụ na ọnọdụ ahụ bụ eziokwu, weghachitere akara 'ọ bụrụ na eziokwu’; ma ọ bụghị ya weghachitere akara 'ọ bụrụ ụgha'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Weghachite ngụkọ ọnụ ọgụgụ abụọ ahụ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Weghachite kwenye ọnụ ọgụgụ abụọ ahụ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Weghachite nwepụ ọnụ ọgụgụ abụọ ahụ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Weghachite mụbaa ọnụ ọgụgụ abụọ ahụ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Weghachite nọmba mbu nke emeturu ike nke nọmba nke abụọ."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 nke X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Weghachite aktanjentị nke isi (X, Y) na ogo site na -180 rụọ 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "gbanwee %1 site na %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Tinye nọmba na agbanwe '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Weghachite otu n'ime kọnstant ndị nkịtị: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "gbochịe %1 ala %2 elu %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "bu posịtịf"; Blockly.Msg["MATH_IS_PRIME"] = "bụ praim"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Tụlee ma nọmba ọ bụ ịvụn, ọd, praim, zuru ezu, posịtịf, negetịf, ma e nwere nọmba ga ekenwu ya. Weghachitere eziokwu ma ọ bụ ụgha."; Blockly.Msg["MATH_IS_WHOLE"] = "zuru ezu"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "ihe fọdụrụ nke %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Weghachite ihe fọdụrụ site na nkewa nọmba abụọ."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ọnụọgụgụ."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "agbaetiti nke ndepụta"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Weghachite Ihe ọbụla site na nd Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Weghachite ntughari usoro nke ndepụta."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Weghachite nchịkọta nke nọmba niile na ndepụta."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "nkewa ọbụla"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Weghachite ọnụọgụgụ ọbụla dị n'etiti 0.0 (gụnyere) na 1.0 (agụnyeghị)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ọnụọgụgụ ọbụla site na %1 rụọ %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Weghachite ọnụọgụgụ ọbụla dị n'etiti ihe abụọ a kapịrị ọnụ, agụnyere."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "gbaarịa"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "gbatụọ ala"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "gbaago elu"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Gbaago nọmba n'elu ma ọ bụ ala."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ozụzụ"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "Isi ngụkọ"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Weghachite akara ozụzụ nke nọmba."; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Weghachite njụ nke nọmba."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Weghachite 10 na ike nke nọmba."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Weghachite Isi ngụkọ nke nọmba."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "mmehie"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Weghachite akosaịn nke nọmba."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Weghachite aksaịn nke nọmba."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Weghachite aktanjentị nke nọmba."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ụdị agbanwe ọhụụ:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "kwe ka okwu"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "na:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Gbaa ọrụ a kọwaa onye-ọrụ '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Gbaa ọrụ a kọwaa onye-ọrụ '%1' ma jiri mmepụta ya."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "na:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Mepụta '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Dochie ihe omuma nke ederede ufodu n'ime Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "gbanwe %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Na-agbanwe iwu nke ndị odide na ederede."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Akwụkwọ ozi, okwu, ma ọ bụ akara ederede."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "belata oghere dị mkpụmkpụ si n'akụkụ abụọ nke"; @@ -380,7 +380,7 @@ Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "belata oghere dị mkpụmkpụ si n' Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Weghachite otu ederede ya na oghere ọzọ wepụrụ site n'otu ma ọ bụ akụkụ mechị abụọ."; Blockly.Msg["TODAY"] = "Taa"; Blockly.Msg["UNDO"] = "Me la àzụ"; -Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "enweghị aha"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "ihe"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Mepụta 'dozie %1'"; Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/is.js b/msg/js/is.js index cf2cf75e262..c58f825429b 100644 --- a/msg/js/is.js +++ b/msg/js/is.js @@ -5,7 +5,7 @@ var Blockly = Blockly || { Msg: Object.create(null) }; Blockly.Msg["ADD_COMMENT"] = "Skrifa skýringu"; -Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Get ekki eytt breytunni '%1' vegna þess að hún er hluti af skilgreiningu fallsins '%2'"; Blockly.Msg["CHANGE_VALUE_TITLE"] = "Breyta gildi:"; Blockly.Msg["CLEAN_UP"] = "Hreinsa kubba"; Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated @@ -13,22 +13,22 @@ Blockly.Msg["COLLAPSE_ALL"] = "Loka kubbum"; Blockly.Msg["COLLAPSE_BLOCK"] = "Loka kubbi"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "litur 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "litur 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "hlutfall"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "blöndun"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Velja lit úr litakorti."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "einhver litur"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Velja einhvern lit af handahófi."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blátt"; Blockly.Msg["COLOUR_RGB_GREEN"] = "grænt"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rauður"; Blockly.Msg["COLOUR_RGB_TITLE"] = "litur"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Búa til lit úr tilteknu magni af rauðu, grænu og bláu. Allar tölurnar verða að vera á bilinu 0 til 100."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "fara út úr lykkju"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fara beint í næstu umferð lykkjunnar"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Fara út úr umlykjandi lykkju."; @@ -37,12 +37,12 @@ Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Aðvörun: Þennan kubb má a Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "fyrir hvert %1 í lista %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "telja með %1 frá %2 til %3 um %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Láta breytuna '%1' taka inn gildi frá fyrstu tölu til síðustu tölu, hlaupandi á tiltekna bilinu og gera tilteknu kubbana."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Bæta skilyrði við EF kubbinn."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "annars"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "annars ef"; @@ -51,11 +51,11 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ef gildi er satt skal gera einhverjar sk Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, þá skal gera skipanir í seinni kubbnum."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, skal gera skipanir í seinni kubbnum. Ef hvorugt gildið er satt, skal gera skipanir í síðasta kubbnum."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "gera"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "endurtaka %1 sinnum"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Gera eitthvað aftur og aftur."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "endurtaka þar til"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "endurtaka á meðan"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Endurtaka eitthvað á meðan gildi er ósatt."; @@ -63,7 +63,7 @@ Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "Endurtaka eitthvað á meða Blockly.Msg["DELETE_ALL_BLOCKS"] = "Eyða öllum %1 kubbunum?"; Blockly.Msg["DELETE_BLOCK"] = "Eyða kubbi"; Blockly.Msg["DELETE_VARIABLE"] = "Eyða '%1' breytunni"; -Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Eyða %1 notar breytuna „%2“?"; Blockly.Msg["DELETE_X_BLOCKS"] = "Eyða %1 kubbum"; Blockly.Msg["DIALOG_CANCEL"] = "Hætta við"; Blockly.Msg["DIALOG_OK"] = "Í lagi"; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Opna kubb"; Blockly.Msg["EXTERNAL_INPUTS"] = "Ytri inntök"; Blockly.Msg["HELP"] = "Hjálp"; Blockly.Msg["INLINE_INPUTS"] = "Innri inntök"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "búa til tóman lista"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Skilar lista með lengdina 0 án gagna"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listi"; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Fjarlægir eitthvert atr Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "til # frá enda"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "til #"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "til síðasta"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "sækja undirlista frá fyrsta"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "sækja undirlista frá # frá enda"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "sækja undirlista frá #"; @@ -118,23 +118,23 @@ Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Býr til afrit af tilteknum hluta li Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 er síðasta atriðið."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 er fyrsta atriðið."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "finna fyrsta tilfelli atriðis"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "finna síðasta tilfelli atriðis"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki."; Blockly.Msg["LISTS_INLIST"] = "í lista"; Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 er tómur"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Skilar sönnu ef listinn er tómur."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "lengd %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Skilar lengd lista."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "búa til lista með atriði %1 endurtekið %2 sinnum"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft."; Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "snúa við %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Snúa við afriti lista."; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "sem"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "bæta við"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "setja í"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setur atriðið í fyrsta s Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setur atriðið í tiltekna sætið í listanum."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Setur atriðið í síðasta sæti lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Setur atriðið í eitthvert sæti lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "hækkandi"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "lækkandi"; Blockly.Msg["LISTS_SORT_TITLE"] = "raða %1 %2 %3"; @@ -161,51 +161,51 @@ Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Sameinar lista af textum í einn text Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Skiptir texta í lista af textum, með skil við hvert skiltákn."; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "með skiltákni"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ósatt"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Skilar annað hvort sönnu eða ósönnu."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "satt"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Skila sönnu ef inntökin eru jöfn."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Skila sönnu ef fyrra inntakið er minna en seinna inntakið."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Skila sönnu ef inntökin eru ekki jöfn."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ekki %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt."; Blockly.Msg["LOGIC_NULL"] = "tómagildi"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Skilar tómagildi."; Blockly.Msg["LOGIC_OPERATION_AND"] = "og"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "eða"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Skila sönnu ef bæði inntökin eru sönn."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Skila sönnu ef að minnsta kosti eitt inntak er satt."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "prófun"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ef ósatt"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ef satt"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Skila summu talnanna tveggja."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Skila deilingu talnanna."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Skila mismun talnanna."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Skila margfeldi talnanna."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Skila fyrri tölunni í veldinu seinni talan."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2 (EN)"; Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "breyta %1 um %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Bæta tölu við breytu '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Skila algengum fasta: π (3.141…), e (2.718…), φ (1.618…), kvrót(2) (1.414…), kvrót(½) (0.707…) eða ∞ (óendanleika)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "þröngva %1 lægst %2 hæst %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "er\u00A0deilanleg með"; Blockly.Msg["MATH_IS_EVEN"] = "er\u00A0jöfn tala"; Blockly.Msg["MATH_IS_NEGATIVE"] = "er neikvæð"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "er jákvæð"; Blockly.Msg["MATH_IS_PRIME"] = "er prímtala"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Kanna hvort tala sé jöfn tala, oddatala, jákvæð, neikvæð eða deilanleg með tiltekinni tölu. Skilar sönnu eða ósönnu."; Blockly.Msg["MATH_IS_WHOLE"] = "er heiltala"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "afgangur af %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Skila afgangi deilingar með tölunum."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Tala."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "meðaltal lista"; @@ -237,19 +237,19 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Skila lista yfir tíðustu gildin í Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Skila einhverju atriði úr listanum."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Skila staðalfráviki lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Skila summu allra talna í listanum."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "slembibrot"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Skila broti sem er valið af handahófi úr tölum á bilinu frá og með 0.0 til (en ekki með) 1.0."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "slembitala frá %1 til %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "námunda"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "námunda niður"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "námunda upp"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Námunda tölu upp eða niður."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "algildi"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvaðratrót"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Skila algildi tölu."; @@ -259,12 +259,12 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Skila tugalógaritma tölu."; Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Skila neitun tölu (tölunni með öfugu formerki)."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Skila 10 í veldi tölu."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Skila kvaðratrót tölu."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; Blockly.Msg["MATH_TRIG_COS"] = "cos"; -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Skila arkarkósínusi tölu."; @@ -273,33 +273,33 @@ Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Skila arkartangensi tölu."; Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Skila kósínusi horns gefnu í gráðum."; Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Skila sínusi horns gefnu í gráðum."; Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Skila tangensi horns gefnu í gráðum."; -Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated -Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated -Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Búðu til litabreytu..."; +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Búa til tölubreytu..."; +Blockly.Msg["NEW_STRING_VARIABLE"] = "Búa til strengjabreytu..."; Blockly.Msg["NEW_VARIABLE"] = "Búa til breytu..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Heiti nýrrar breytu:"; -Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ný breytutegund:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "leyfa setningar"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "með:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Keyra heimatilbúna fallið '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Keyra heimatilbúna fallið '%1' og nota úttak þess."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "með:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Búa til '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Lýstu þessari aðgerð/falli..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "gera eitthvað"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "til að"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Býr til fall sem skilar engu."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "skila"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Býr til fall sem skilar úttaki."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Aðvörun: Þetta fall er með tvítekna stika."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Sýna skilgreiningu falls"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Ef gildi er satt, skal skila öðru gildi."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "heiti inntaks:"; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "Endurtaka"; Blockly.Msg["REMOVE_COMMENT"] = "Fjarlægja skýringu"; Blockly.Msg["RENAME_VARIABLE"] = "Endurnefna breytu..."; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Endurnefna allar '%1' breyturnar:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "við %1 bæta texta %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Bæta texta við breytuna '%1'."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "í lágstafi"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "í Upphafstafi"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "í HÁSTAFI"; @@ -321,7 +321,7 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Skila afriti af textanum með annarri Blockly.Msg["TEXT_CHARAT_FIRST"] = "sækja fyrsta staf"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "sækja staf # frá enda"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "sækja staf #"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "sækja síðasta staf"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "sækja einhvern staf"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated @@ -336,31 +336,31 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Bæta við, fjarlægja eða umraða h Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "að staf # frá enda"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "að staf #"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "að síðasta staf"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "í texta"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "sækja textabút frá fyrsta staf"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "sækja textabút frá staf # frá enda"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "sækja textabút frá staf #"; Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Skilar tilteknum hluta textans."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "finna fyrsta tilfelli texta"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "finna síðasta tilfelli texta"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "í texta %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki."; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 er tómur"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Skilar sönnu ef gefni textinn er tómur."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "búa til texta með"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Búa til texta með því að tengja saman einhvern fjölda atriða."; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "lengd %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Skilar fjölda stafa (með bilum) í gefna textanum."; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "prenta %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Prenta tiltekinn texta, tölu eða annað gildi."; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Biðja notandann um tölu."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Biðja notandann um texta."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "biðja um tölu með skilaboðum"; @@ -371,26 +371,26 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "snúa við %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Snýr við röð stafanna í textanum."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Stafur, orð eða textalína."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "eyða bilum báðum megin við"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "eyða bilum vinstra megin við"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "eyða bilum hægra megin við"; Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð."; Blockly.Msg["TODAY"] = "Í dag"; Blockly.Msg["UNDO"] = "Afturkalla"; -Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "ónefnt"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "atriði"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Búa til 'stilla %1'"; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Skilar gildi þessarar breytu."; Blockly.Msg["VARIABLES_SET"] = "stilla %1 á %2"; Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Búa til 'sækja %1'"; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Stillir þessa breytu á innihald inntaksins."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Breyta með heitinu '%1' er þegar til staðar."; -Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Breyta sem heitir „%1“ er þegar til fyrir aðra tegund: „%2“."; Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Segðu eitthvað..."; Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; diff --git a/msg/js/it.js b/msg/js/it.js index e133da5a5df..05260b15d89 100644 --- a/msg/js/it.js +++ b/msg/js/it.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Imposta il primo elemento in Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Imposta l'elemento nella posizione indicata di una lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Imposta l'ultimo elemento in una lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Imposta un elemento casuale in una lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "crescente"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "decrescente"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordinamento %1 %2 %3"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "ritorna"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Crea una funzione con un output."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Attenzioneː Questa funzione ha parametri duplicati."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Evidenzia definizione di funzione"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Se un valore è vero allora restituisce un secondo valore."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nome inputː"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "prendi lettera casuale"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "nel testo %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Restituisce la lettera nella posizione indicata."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "conta %1 in %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Aggiungi un elemento al testo."; @@ -365,7 +365,7 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Richiedi un numero all'utente."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Richiede del testo da parte dell'utente."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "richiedi numero con messaggio"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "richiedi testo con messaggio"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "sostituisci %1 con %2 in %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "sostituisci tutte le occorrenze di un certo testo con qualche altro testo."; Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated diff --git a/msg/js/ja.js b/msg/js/ja.js index 60a79328665..da05836df19 100644 --- a/msg/js/ja.js +++ b/msg/js/ja.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "ブロックを折りたたむ"; Blockly.Msg["COLLAPSE_BLOCK"] = "ブロックを折りたたむ"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "色 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "色 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "比率"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ブレンド"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "2色を与えられた比率(0.0~1.0)で混ぜます。"; @@ -24,25 +24,25 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ランダムな色"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "ランダムに色を選ぶ。"; Blockly.Msg["COLOUR_RGB_BLUE"] = "青"; Blockly.Msg["COLOUR_RGB_GREEN"] = "緑"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "赤"; Blockly.Msg["COLOUR_RGB_TITLE"] = "色:"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。"; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "ループから抜け出す"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "ループの次の反復処理を続行します"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "入っているループから抜け出します。"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "このループの残りの部分をスキップして、ループの繰り返しを続けます。"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "注意: このブロックは、ループ内でのみ使用できます。"; -Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "リスト%2の各項目%1について"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "リストの各項目について、その項目を変数'%1'として、いくつかのステートメントを実行します。"; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "%1 を %2 から %3 まで %4 ずつカウントする"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "変数 '%1' が開始番号から終了番号まで指定した間隔での値をとって、指定したブロックを実行する。"; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "「もしも」のブロックに条件を追加します。"; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Ifブロックに、すべてをキャッチする条件を追加。"; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "追加、削除、またはセクションを順序変更して、ブロックをこれを再構成します。"; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "そうでなければ"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "そうでなくもし"; @@ -55,7 +55,7 @@ Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://ja.wikipedia.org/wiki/for文"; Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "実行"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 回繰り返す"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "いくつかのステートメントを数回実行します。"; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "繰り返す:終わる条件"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "繰り返す:続ける条件"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "値がfalseの間、いくつかのステートメントを実行する。"; @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "ブロックを展開する"; Blockly.Msg["EXTERNAL_INPUTS"] = "外部入力"; Blockly.Msg["HELP"] = "ヘルプ"; Blockly.Msg["INLINE_INPUTS"] = "インライン入力"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "空のリストを作成"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "長さ0でデータ・レコードを含まない空のリストを返す"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "リスト"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "追加、削除、またはセクションの順序変更をして、このリスト・ブロックを再構成する。"; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "以下を使ってリストを作成:"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "リストに項目を追加。"; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "項目数が不定のリストを作成。"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "取得して削除"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "最後"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "ランダム"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "削除"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "リストの最初の項目を返します。"; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "リスト内の指定位置にある項目を返します。"; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "リストの最後の項目を返します。"; @@ -109,32 +109,32 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "リスト内にあるア Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "終了位置:後ろから"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "終了位置:"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "最後まで"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "最初からサブリストを取得する。"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "端から #のサブリストを取得します。"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# からサブディレクトリのリストを取得します。"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "リストの指定された部分のコピーを作成します。"; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 は、最後の項目です。"; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 は、最初の項目です。"; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "で以下のアイテムの最初の出現箇所を検索:"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "で以下のテキストの最後の出現箇所を検索:"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。"; Blockly.Msg["LISTS_INLIST"] = "リスト"; -Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1が空"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "リストが空の場合は、true を返します。"; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1の長さ"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "リストの長さを返します。"; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "項目%1を%2回繰り返したリストを作成"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "与えられた値を指定された回数繰り返してリストを作成。"; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1を逆順に"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "リストのコピーを逆順にする。"; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "値:"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "挿入位置:"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "セット"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "リスト内に最初の項 Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "リスト内の指定された位置に項目を設定します。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "リスト内の最後の項目を設定します。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "リスト内にランダムなアイテムを設定します。"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "昇順"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降順"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 ( %2 ) に %3 を並び替える"; @@ -154,14 +154,14 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "リストのコピーを並べ替え"; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "アルファベット順(大文字・小文字の区別無し)"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "数値順"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "アルファベット順"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "テキストからリストを作る"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "リストからテキストを作る"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "テキストのリストを区切り記号で区切られた一つのテキストにする"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "テキストを区切り記号で分割したリストにする"; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "区切り記号"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "false"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "true または false を返します。"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "true"; Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://ja.wikipedia.org/wiki/不等式"; @@ -171,14 +171,14 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "最初の入力が 2 番目の入力 Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "最初の入力が 2 番目の入力よりも小さい場合は true を返します。"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "最初の入力が 2 番目の入力以下の場合に true を返します。"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "両方の入力が互いに等しくない場合に true を返します。"; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "%1ではない"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "入力が false の場合は、true を返します。入力が true の場合は false を返します。"; Blockly.Msg["LOGIC_NULL"] = "null"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "null を返します。"; Blockly.Msg["LOGIC_OPERATION_AND"] = "かつ"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "または"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "両方の入力が true のときに true を返します。"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "少なくとも 1 つの入力が true のときに true を返します。"; @@ -187,7 +187,7 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://ja.wikipedia.org/wiki/%3F:"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "false の場合"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "true の場合"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。"; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ja.wikipedia.org/wiki/算術"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "2 つの数の合計を返します。"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "2 つの数の商を返します。"; @@ -202,10 +202,10 @@ Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 を %2 増やす"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "変数'%1'に数をたす。"; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ja.wikipedia.org/wiki/数学定数"; Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "いずれかの共通の定数のを返す: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (無限)."; -Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 を %2 以上 %3 以下の範囲に制限"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。"; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "は以下で割りきれる:"; Blockly.Msg["MATH_IS_EVEN"] = "は偶数"; Blockly.Msg["MATH_IS_NEGATIVE"] = "は負"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "は整数"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://ja.wikipedia.org/wiki/剰余演算"; Blockly.Msg["MATH_MODULO_TITLE"] = "%1÷%2の余り"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "2つの数値の割り算の余りを返す。"; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ja.wikipedia.org/wiki/数"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "数です。"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "リスト中の最頻項目のリス Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "リストからランダムに選ばれた要素を返す。"; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "リストの標準偏差を返す。"; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "リストの数値を足して返す。"; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://ja.wikipedia.org/wiki/疑似乱数"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "1未満の正の乱数"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0以上で1.0未満の範囲の乱数を返します。"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "底が10の対数を返す。"; Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "負の数を返す。"; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10の数値乗を返す。"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "平方根を返す。"; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -289,17 +289,17 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "ユーザー定義関数 '%1' Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "引数:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' を作成"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "この関数の説明…"; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "何かする"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "関数"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "出力なしの関数を作成します。"; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "返す"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "一つの出力を持つ関数を作成します。"; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "警告: この関数には重複するパラメーターがあります。"; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "関数の内容を強調表示します。"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "1番目の値が true の場合、2番目の値を返します。"; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "警告: このブロックは、関数定義内でのみ使用できます。"; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "入力名:"; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "やり直す"; Blockly.Msg["REMOVE_COMMENT"] = "コメントを削除"; Blockly.Msg["RENAME_VARIABLE"] = "変数の名前を変える…"; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "選択した%1個すべての変数の名前を変える:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "項目 %1 へテキストを追加 %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "変数 '%1' にテキストを追加。"; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "小文字に"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "タイトル ケースに"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "大文字に"; @@ -321,13 +321,13 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "別のケースに、テキストの Blockly.Msg["TEXT_CHARAT_FIRST"] = "最初の文字を得る"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "の、後ろから以下の数字番目の文字:"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "の、以下の数字番目の文字:"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "最後の文字を得る"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "ランダムな文字を得る"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "テキスト %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "指定された位置に文字を返します。"; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%2に含まれる%1の数を数える"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "とある文が別の文のなかに使われた回数を数える。"; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "テキストへ項目を追加。"; @@ -336,44 +336,44 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "セクションを追加、削除、 Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "終了位置:後ろから"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "終了位置:"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "最後の文字"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "テキスト"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "の部分文字列を取得;最初から"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "の部分文字列を取得;開始位置:後ろから"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "の部分文字列を取得;開始位置:"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "テキストの指定部分を返します。"; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "で以下のテキストの最初の出現箇所を検索:"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "で以下のテキストの最後の出現箇所を検索:"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "テキスト %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。"; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1が空"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "与えられたテキストが空の場合は true を返す。"; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; -Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "テキストの作成:"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "テキストを結合して作成:"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "任意の数の項目一部を一緒に接合してテキストを作成。"; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "%1の長さ"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "与えられたテキストの(スペースを含む)文字数を返す。"; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "%1 を表示"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "指定したテキスト、番号または他の値を印刷します。"; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "ユーザーに数値のインプットを求める。"; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "ユーザーにテキスト入力を求める。"; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "メッセージで番号の入力を求める"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "メッセージでテキスト入力を求める"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%3に含まれる%1を%2に置換"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "文に含まれるキーワードを置換する。"; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1を逆順に"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "文の文字を逆順にする。"; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ja.wikipedia.org/wiki/文字列"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "文字、単語、または行のテキスト。"; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "両端のスペースを取り除く"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "左端のスペースを取り除く"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "右端のスペースを取り除く"; @@ -383,11 +383,11 @@ Blockly.Msg["UNDO"] = "取り消す"; Blockly.Msg["UNNAMED_KEY"] = "名前なし"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "項目"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "'セット%1を作成します。"; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "この変数の値を返します。"; Blockly.Msg["VARIABLES_SET"] = "%1 に %2 をセット"; Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "'%1 を取得' を作成します。"; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "この入力を変数と等しくなるように設定します。"; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "変数名 '%1' は既に存在しています。"; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "'%2' 型の '%1' という名前の変数が既に存在します。"; diff --git a/msg/js/ka.js b/msg/js/ka.js index 7eea02012ee..aae2b567f9e 100644 --- a/msg/js/ka.js +++ b/msg/js/ka.js @@ -68,7 +68,7 @@ Blockly.Msg["DELETE_X_BLOCKS"] = "Delete %1 Blocks"; // untranslated Blockly.Msg["DIALOG_CANCEL"] = "Cancel"; // untranslated Blockly.Msg["DIALOG_OK"] = "კარგი"; Blockly.Msg["DISABLE_BLOCK"] = "Disable Block"; // untranslated -Blockly.Msg["DUPLICATE_BLOCK"] = "Duplicate"; // untranslated +Blockly.Msg["DUPLICATE_BLOCK"] = "დუბლიკატი"; Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated Blockly.Msg["ENABLE_BLOCK"] = "ბლოკის ჩართვა"; Blockly.Msg["EXPAND_ALL"] = "Expand Blocks"; // untranslated @@ -378,7 +378,7 @@ Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // u Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "trim spaces from left side of"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "trim spaces from right side of"; // untranslated Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Return a copy of the text with spaces removed from one or both ends."; // untranslated -Blockly.Msg["TODAY"] = "Today"; // untranslated +Blockly.Msg["TODAY"] = "დღეს"; Blockly.Msg["UNDO"] = "Undo"; // untranslated Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; // untranslated diff --git a/msg/js/kab.js b/msg/js/kab.js index 1e428de6ee1..f3f4b4693d7 100644 --- a/msg/js/kab.js +++ b/msg/js/kab.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "mayella azal d idetti, ihi selkem kra n Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Mayella azal d idetti, selkem iḥder amezwaru. Neɣ ma ulac, selkem iḥder wis sin."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ ma azal wis sin d ucciḍ, selkem iḥder wis sin."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Mayella azal amezwaru d idetti, selkem iḥder amezwaru. Neɣ, mayella azal wis sin d idetti, selkem iḥder wis sin. Mayella ula d yiwen seg-sen ur yelli d idetti, selkem iḥder aneggaru."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "eg"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "Ales %1 n tikkal"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Selkem ddeqs n tinaḍin ddeqs n tikal."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ad d-yerr aferdis amezwaru d Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ad yesbadu aferdis n wadig yettwamlen deg tabdart."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ad d-yerr aferdis aneggaru di tebdart."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ad yesbadu aferdis agacuran di tebdart."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "igemmen"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "amnusruy"; Blockly.Msg["LISTS_SORT_TITLE"] = "smizzwer %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ucciḍ"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Ad d-yerr idetti neɣ ucciḍ"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "idetti"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Ad yerr idetti ma yella i sin n yinekcam d imegduya."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer ɣef wis sin."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ad d-yerr idetti ma anekcam amezwaru meqqer neɣ yegda wis sin."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ma d ucciḍ"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ma d idetti"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Senqed tawtilt deg 'sekyed'. Ma d idetti, ad d-yerr azal 'ma idetti', ma ulac ad d-yerr azam 'ma ucciḍ'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Ad d-yerr tmerni n sin n yimiḍanen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Ad d-yerr aful n sin n yimḍanen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Ad d-yerr tmernit n sin n yimiḍanen."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ad d-yerr amḍan amezwaru uzmir Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://kab.wikipedia.org/wiki/Atan2"; Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 seg X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Ad d-yerr arctangent n waggaz (X, Y) s tfesniwin deg -180 ɣer 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "snifel %1 s %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Rnu amḍan i umutti '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Ad d-yerr yiwet seg tmezgiyin yettwasnen : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), neɣ ∞ (ifeḍ)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "Err tamara i %1 gar %2 akked %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "d ufrar"; Blockly.Msg["MATH_IS_PRIME"] = "d amenzu"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Senqed ma amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ubṭay ɣef kra n umḍan. Ad d-yerr idetti neɣ ucciḍ."; Blockly.Msg["MATH_IS_WHOLE"] = "d ummid"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "tasagert n %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Ad d-yerr tasagert n beṭṭu n sin n yimḍanen."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Amḍan."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "talemmast n tebdart"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Ad d-yerr aferdis seg tebdart s wud Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ad d-yerr azza n tebdart."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ad d-yerr timernit n yimḍanen meṛṛa deg tebdart."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "tirẓi tagacurant"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Ad d-yerr tirẓi tagacurant gar 0.0 (yedda) akked 1.0 (ur yeddi ara)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ummid agacuran gar %1 akked %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Ad d-yerr ummid agacuran gar snat n tlisa, ddant."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "Saẓ"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Saẓ d akesser"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Saẓ d asawen"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Saẓ amiḍan d asawen neɣ d akesser."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "azal amagdez"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "aẓar uzmir 2"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Ad d-yerr azal amagdez n umiḍan."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Ad d-yerr taganzi n ukusinus n umḍan."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Anaw amaynut n umutti:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "Sireg asmizzwer"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "s:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Selkem tawuri '%1' i yesbadu useqdac."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Selkem tawuri '%1' i yesbadu useqdac sakin seqdec agmuḍ-is."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "s:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Rnu '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ad isemselsi akk timeḍriwin n uḍris s Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "tti %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ad yetti asmizzwer n yisekkilen deg uḍris."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Asekkil, awal neɣ izirig n uḍris."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Tukksa n yisekkilen imellalen seg sin n yidisan"; diff --git a/msg/js/kbd-cyrl.js b/msg/js/kbd-cyrl.js index 46df09443fc..e938937dc28 100644 --- a/msg/js/kbd-cyrl.js +++ b/msg/js/kbd-cyrl.js @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "пцIы"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Е щыпкъэ е пцIы къуетыж."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "щыпкъэ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "игъусэр:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Функция_%28программирование%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Функция_%28программирование%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "игъусэр:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; // untranslated diff --git a/msg/js/km.js b/msg/js/km.js index ee69d5631d2..fc37817bd72 100644 --- a/msg/js/km.js +++ b/msg/js/km.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ratio"; // untranslated Blockly.Msg["COLOUR_BLEND_TITLE"] = "blend"; // untranslated Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "ជ្រើស​ពណ៌​មួយ​ពី​បន្ទះ​ពណ៌"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "random colour"; // untranslated diff --git a/msg/js/kn.js b/msg/js/kn.js index d899535d893..f61c63c9ac5 100644 --- a/msg/js/kn.js +++ b/msg/js/kn.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ಅನುಪಾತ"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ಮಿಶ್ರಣಮಾಡು"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ಕೊಟ್ಟಿರುವ ಅನುಪಾತದಂತೆ(0.0 - 1.0) ಎರಡು ಬಣ್ಣಗಳನ್ನು ಮಿಶ್ರಣ ಮಾಡುತ್ತದೆ."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "ವರ್ಣಫಲಕದಿಂದ ಬಣ್ಣವನ್ನು ಆರಿಸು."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ಯಾದೃಚ್ಛಿಕ ಬಣ್ಣ"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ಮೌಲ್ಯವು ಸತ್ಯವಾ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "ಮೌಲ್ಯವು ಸತ್ಯ ಆಗಿದ್ದರೆ, ಮೊದಲನೇ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡು, ಇಲ್ಲವಾದರೆ, ಎರಡನೇ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡು."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "ಮೊದಲನೇ ಮೌಲ್ಯವು ಸತ್ಯವಾಗಿದ್ದರೆ, ಮೊದಲ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡಿ. ಇಲ್ಲದಿದ್ದರೆ, ಎರಡನೇ ಮೌಲ್ಯವು ಸತ್ಯವಾಗಿದ್ದರೆ, ಎರಡನೇ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡಿ."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "ಮೊದಲನೆಯ ಮೌಲ್ಯವು ಸತ್ಯ ಆಗಿದ್ದರೆ, ಮೊದಲ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡು. ಇಲ್ಲವಾದರೆ, ಎರಡನೇ ಮೌಲ್ಯವು ಸತ್ಯವಾಗಿದ್ದರೆ, ಎರಡನೇ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡು. ಒಂದುವೇಳೆ ಯಾವುದೇ ಮೌಲ್ಯವೂ ಸತ್ಯವಾಗಿರದಿದ್ದರೆ, ಕೊನೆಯ ವಿಭಾಗದ ಹೇಳಿಕೆಗಳನ್ನು ಮಾಡು."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ಮಾಡು"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 ಬಾರಿ ಪುನರಾವರ್ತಿಸು"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ಕೆಲವು ಹೇಳಿಕೆಗಳನ್ನು ಹಲವಾರು ಬಾರಿ ಮಾಡು."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "ಪಟ್ಟಿಯಲ್ಲ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "ಪಟ್ಟಿಯಲ್ಲಿನ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಸ್ಥಾನದಲ್ಲಿ ಅಂಶವನ್ನು ಗೊತ್ತುಪಡಿಸುತ್ತದೆ."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "ಪಟ್ಟಿಯಲ್ಲಿ ಕೊನೆಯ ಅಂಶವನ್ನು ಗೊತ್ತುಪಡಿಸುತ್ತದೆ."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "ಪಟ್ಟಿಯಲ್ಲಿನ ಯಾದೃಚ್ಛಿಕ ಅಂಶವನ್ನು ಗೊತ್ತುಪಡಿಸುತ್ತದೆ."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ಆರೋಹಣ"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "ಅವರೋಹಣ"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 ವಿಂಗಡಿಸಿ"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ಸುಳ್ಳು"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "ಸತ್ಯ ಅಥವಾ ಸುಳ್ಳು ಎರಡರಲ್ಲಿ ಒಂದನ್ನು ಹಿಂತಿರುಗಿಸುವುದು."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ಸತ್ಯ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "ಎರಡೂ ಒದಗಿಸುವ ಅಂಶಗಳು ಪರಸ್ಪರ ಸಮನಾಗಿದ್ದರೆ, ಸರಿ ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "ಮೊದಲನೇ ಒದಗಿಸುವ ಅಂಶ ಎರಡನೇ ಒದಗಿಸುವ ಅಂಶಕ್ಕಿಂತ ದೊಡ್ಡದಾಗಿದ್ದರೆ ಸರಿ ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "ಮೊದಲನೇ ಒದಗಿಸುವ ಅಂಶ ಎರಡನೇ ಒದಗಿಸುವ ಅಂಶಕ್ಕಿಂತ ದೊಡ್ಡದು ಅಥವಾ ಸಮನಾಗಿದ್ದರೆ ಸರಿ ಹಿಂತಿರುಗಿಸಿ."; @@ -188,19 +188,19 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ಸುಳ್ಳು ಆಗಿದ್ದ Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ಸತ್ಯ ಆಗಿದ್ದರೆ"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'ಪರೀಕ್ಷೆ'ಯಲ್ಲಿನ ಷರತ್ತನ್ನು ಪರಿಶೀಲಿಸಿ. ಷರತ್ತು ಸರಿಯಾಗಿದ್ದರೆ, 'ಸತ್ಯವಾಗಿದ್ದರೆ' ಮೌಲ್ಯವನ್ನು; ಇಲ್ಲದಿದ್ದರೆ 'ಸುಳ್ಳಾಗಿದ್ದರೆ' ಮೌಲ್ಯವನ್ನೂ ಹಿಂತಿರುಗಿಸುವುದು."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "ಎರಡು ಸಂಖ್ಯೆಗಳ ಮೊತ್ತವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "ಎರಡು ಸಂಖ್ಯೆಗಳ ಭಾಗಲಬ್ಧವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "ಎರಡು ಸಂಖ್ಯೆಗಳ ವ್ಯತ್ಯಾಸವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "ಎರಡು ಸಂಖ್ಯೆಗಳ ಗುಣಲಬ್ಧವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "ಮೊದಲ ಸಂಖ್ಯೆಯ ಘಾತಾಂಶ ಎರಡನೇ ಸಂಖ್ಯೆಯಾದಾಗಿನ ಫಲಿತಾಂಶವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "X:%1 Y:%2 ಬಿಂದುವಿನ ಆರ್ಕ್ ಟ್ಯಾನ್"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "ಬಿಂದು (X,Y) ನ ಆರ್ಕ್ ಟ್ಯಾಂಜೆಂಟ್ ನ್ನು -180 ರಿಂದ 180 ರವರೆಗಿನ ಡಿಗ್ರಿಗಳಲ್ಲಿ ಹಿಂತಿರುಗಿಸಿ."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 ಅನ್ನು %2 ರಿಂದ ಬದಲಾಯಿಸಿ"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "ಚರಾಂಶ '%1' ಕ್ಕೆ ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "ಸಾಮಾನ್ಯ ಸ್ಥಿರಾಂಕಗಳಲ್ಲಿ ಒಂದನ್ನು ಹಿಂತಿರುಗಿಸಿ:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1ಅನ್ನು ಕಡಿಮೆ %2 ಹೆಚ್ಚಿನ %3 ಮೌಲ್ಯಗಳ ನಡುವೆ ನಿರ್ಬಂಧಿಸಿ"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "ಧನಾತ್ಮಕವೇ?"; Blockly.Msg["MATH_IS_PRIME"] = "ಅವಿಭಾಜ್ಯ ಸಂಖ್ಯೆಯೇ?"; Blockly.Msg["MATH_IS_TOOLTIP"] = "ಒಂದು ಸಂಖ್ಯೆ ಸಮ, ಬೆಸ, ಅವಿಭಾಜ್ಯ, ಪೂರ್ಣ, ಧನಾತ್ಮಕ, ಋಣಾತ್ಮಕವಾಗಿದೆಯೇ ಅಥವಾ ನಿರ್ದಿಷ್ಟ ಸಂಖ್ಯೆಯಿಂದ ಭಾಗಿಸ ಬಹುದೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ಸತ್ಯ ಅಥವಾ ಸುಳ್ಳು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_IS_WHOLE"] = "ಪೂರ್ಣಸಂಖ್ಯೆಯೇ?"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2 ರ ಶೇಷ"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "ಎರಡು ಸಂಖ್ಯೆಗಳ ವಿಭಜನೆಯ ಶೇಷವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ಒಂದು ಸಂಖ್ಯೆ."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "ಪಟ್ಟಿಯ ಸರಾಸರಿ"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "ಪಟ್ಟಿಯ ಯಾದೃಚ Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "ಪಟ್ಟಿಯ ಪ್ರಮಾಣಿತ ವಿಚಲನವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "ಪಟ್ಟಿಯಲ್ಲಿರುವ ಎಲ್ಲಾ ಸಂಖ್ಯೆಗಳ ಮೊತ್ತವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "ಯಾದೃಚ್ಛಿತ ಭಿನ್ನರಾಶಿ"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (ಒಳಗೊಂಡ) ಮತ್ತು 1.0 (ವಿಶೇಷ) ನಡುವೆ ಯಾದೃಚ್ಛಿತ ಭಿನ್ನರಾಶಿಯನ್ನು ಹಿಂತಿರುಗಿಸಿ."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "ಯಾದೃಚ್ಛಿತ ಪೂರ್ಣಾಂಕ %1 ರಿಂದ %2 ರವರೆಗೆ"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "ಎರಡು ನಿರ್ದಿಷ್ಟ ಮಿತಿಗಳ ನಡುವೆ ಇರುವ ಯಾದೃಚ್ಛಿತ ಪೂರ್ಣಾಂಕವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ಸುತ್ತು"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ಕೆಳಗಿನ ಪೂರ್ಣಾಂಕ ಮಾಡಿ."; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ಮೇಲಿನ ಪೂರ್ಣಾಂಕ ಮಾಡಿ."; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಮೇಲಿನ ಅಥವಾ ಕೆಳಗಿನ ಪೂರ್ಣಾಂಕ ಮಾಡಿ."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ಪರಿಪೂರ್ಣ"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ವರ್ಗಮೂಲ"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "ಸಂಖ್ಯೆಯೊಂದರ ಪರಿಪೂರ್ಣ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಿ."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "ಸಂಖ್ಯೆಯೊಂದರ ಆರ್ಕ್ ಕೊಸೈನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "ಹೊಸ ಚರಾಂಶದ ಡೇಟ Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ಹೇಳಿಕೆಗಳನ್ನು ಅನುಮತಿಸಿ"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ಜೊತೆ:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "ಬಳಕೆದಾರ-ವ್ಯಾಖ್ಯಾನಿತ ಕಾರ್ಯಘಟಕ '%1'ಅನ್ನು ಚಲಾಯಿಸಿ."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "ಬಳಕೆದಾರ-ವ್ಯಾಖ್ಯಾನಿತ ಕಾರ್ಯಘಟಕ '%1'ಅನ್ನು ಚಲಾಯಿಸಿ ಮತ್ತು ಅದರ ಹೊರಾಂಶವನ್ನು ಉಪಯೋಗಿಸಿ"; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ಜೊತೆ:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' ರಚಿಸಿ"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "ಬೇರೆ ಪಠ್ಯದೊಳಗಿ Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 ಅನ್ನು ಹಿಮ್ಮುಖಗೊಳಿಸಿ."; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "ಪಠ್ಯದಲ್ಲಿನ ಅಕ್ಷರಗಳ ಕ್ರಮವನ್ನು ಹಿಮ್ಮುಖಗೊಳಿಸಿ."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "ಒಂದು ಅಕ್ಷರ, ಪದ ಅಥವಾ ಪಠ್ಯದ ಸಾಲು."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "ಎರಡೂ ಕಡೆಯಿಂದ ಖಾಲಿ ಜಾಗಗಳನ್ನು ಕತ್ತರಿಸಿ ಹಾಕಿ"; diff --git a/msg/js/ko.js b/msg/js/ko.js index 1bb624c68ef..d94da91ca79 100644 --- a/msg/js/ko.js +++ b/msg/js/ko.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "블록 축소"; Blockly.Msg["COLLAPSE_BLOCK"] = "블록 축소"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "색 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "색 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "비율"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "혼합"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "두 색을 주어진 비율로 혼합 (0.0 - 1.0)"; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "무작위 색상"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "무작위로 색을 고릅니다."; Blockly.Msg["COLOUR_RGB_BLUE"] = "파랑"; Blockly.Msg["COLOUR_RGB_GREEN"] = "초록"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "빨강"; Blockly.Msg["COLOUR_RGB_TITLE"] = "색"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다."; @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "블록 확장"; Blockly.Msg["EXTERNAL_INPUTS"] = "외부 입력"; Blockly.Msg["HELP"] = "도움말"; Blockly.Msg["INLINE_INPUTS"] = "내부 입력"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "빈 리스트 생성"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "데이터 레코드가 없는, 길이가 0인 목록을 반환합니다."; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "리스트"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "리스트 만들기"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "아이템을 리스트에 추가합니다."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "원하는 수의 항목들로 목록을 생성합니다."; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "잘라 내기"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "마지막"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "임의로"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "삭제"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "첫 번째 아이템을 찾아 돌려줍니다."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "목록에서 특정 위치의 항목을 반환합니다."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "마지막 아이템을 찾아 돌려줍니다."; @@ -109,32 +109,32 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "리스트에서 랜덤 Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "끝에서부터 # 번째로"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "앞에서부터 # 번째로"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "마지막으로"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "첫 번째 위치부터, 서브 리스트 추출"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "마지막부터 # 번째 위치부터, 서브 리스트 추출"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "처음 # 번째 위치부터, 서브 리스트 추출"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "목록의 특정 부분에 대한 복사본을 만듭니다."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1은(는) 마지막 항목입니다."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1은 첫 번째 항목입니다."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "처음으로 나타난 위치"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "마지막으로 나타난 위치"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다."; Blockly.Msg["LISTS_INLIST"] = "리스트"; -Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1이 비어 있습니다"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "목록이 비었을 때 참을 반환합니다."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "%1의 길이"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "목록의 길이를 반환합니다."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "%1을 %2번 넣어, 리스트 생성"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "지정된 값을, 지정된 개수 만큼 넣어, 목록을 생성합니다."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 뒤집기"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "리스트의 복사본을 뒤집습니다."; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "에"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "에서 원하는 위치에 삽입"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "에서 설정"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "첫 번째 위치의 아이 Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "목록의 특정 위치에 있는 항목으로 설정합니다."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "마지막 아이템으로 설정합니다."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "목록에서 임의 위치의 아이템을 설정합니다."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "오름차순"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "내림차순"; Blockly.Msg["LISTS_SORT_TITLE"] = "정렬 %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "목록의 사본을 정렬합니다."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "알파벳순 (대소문자 구분 안 함)"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "숫자순"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "알파벳순"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "텍스트에서 목록 만들기"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "목록에서 텍스트 만들기"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다."; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://ko.wikipedia.org/wiki/%EB%B6%80%E Blockly.Msg["LOGIC_NEGATE_TITLE"] = "%1가 아닙니다"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "입력값이 거짓이라면 참을 반환합니다. 참이라면 거짓을 반환합니다."; Blockly.Msg["LOGIC_NULL"] = "빈 값"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "빈 값을 반환합니다."; Blockly.Msg["LOGIC_OPERATION_AND"] = "그리고"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://ko.wikipedia.org/wiki/%EB%B6%88_%EB%85%BC%EB%A6%AC"; @@ -187,17 +187,17 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://ko.wikipedia.org/wiki/물음표" Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "만약 거짓이라면"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "만약 참이라면"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ko.wikipedia.org/wiki/산술"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "두 수의 합을 반환합니다."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "두 수의 나눈 결과를 반환합니다."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "두 수간의 차이를 반환합니다."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "두 수의 곱을 반환합니다."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "첫 번째 수를 두 번째 수 만큼, 거듭제곱 한 결과값을 돌려줍니다."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "X:%1 Y:%2의 atan2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "점 (X, Y)의 아크탄젠트를 -180에서 180까지 도 단위로 반환합니다."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "바꾸기 %1 만큼 %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ko.wikipedia.org/wiki/수학_상수"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "일반적인 상수 값들 중 하나를 Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://ko.wikipedia.org/wiki/클램핑_(그래픽)"; Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1의 값을, 최소 %2 최대 %3으로 조정"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "가 다음 수로 나누어 떨어지면 :"; Blockly.Msg["MATH_IS_EVEN"] = "가 짝수(even) 이면"; Blockly.Msg["MATH_IS_NEGATIVE"] = "가 음(-)수 이면"; @@ -214,13 +214,13 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "가 양(+)수 이면"; Blockly.Msg["MATH_IS_PRIME"] = "가 소수(prime) 이면"; Blockly.Msg["MATH_IS_TOOLTIP"] = "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌."; Blockly.Msg["MATH_IS_WHOLE"] = "가 정수이면"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2의 나머지"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ko.wikipedia.org/wiki/수_(수학)"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "수"; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "평균값"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "최대값"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "중간값"; @@ -237,11 +237,11 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "리스트에 들어있는 아이템 Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "목록에서 임의의 아이템을 돌려줍니다."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "이 리스트의 표준 편차를 반환합니다."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "임의 분수"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "랜덤정수(%1<= n <=%2)"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다."; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ko.wikipedia.org/wiki/반올림"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "어떤 수의, 기본로그(logarith Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "음(-)/양(+), 부호를 반대로 하여 값을 돌려줍니다."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10의 거듭제곱 값을 반환합니다."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "숫자의 제곱근을 반환합니다."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "문자열 변수 만들기..."; Blockly.Msg["NEW_VARIABLE"] = "변수 만들기..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "새 변수 이름:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "새 변수 유형:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "서술 허가"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "사용:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ko.wikipedia.org/wiki/함수_(프로그래밍)"; @@ -289,17 +289,17 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "미리 정의해 둔 '%1' 함수 Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "사용:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' 생성"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "이 함수를 설명하세요..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "함수 이름"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "함수"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://ko.wikipedia.org/wiki/함수_(컴퓨터_과학)"; Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "다음을 돌려줌"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "실행 후, 결과 값을 돌려주는 함수를 만듭니다."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "경고: 이 함수에는, 같은 이름을 사용하는 매개 변수들이 있습니다."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "함수 정의 찾기"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "값이 참이라면, 두 번째 값을 반환합니다."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "매개 변수:"; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "다시 실행"; Blockly.Msg["REMOVE_COMMENT"] = "주석 제거"; Blockly.Msg["RENAME_VARIABLE"] = "변수 이름 바꾸기:"; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "'%1' 변수 이름을 바꾸기:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "다음 %1 내용 덧붙이기 %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "소문자로"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "첫 문자만 대문자로"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "대문자로"; @@ -321,13 +321,13 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "영문 대소문자 형태를 변경 Blockly.Msg["TEXT_CHARAT_FIRST"] = "에서, 첫 번째 문자 얻기"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "에서, 마지막부터 # 번째 위치의 문자 얻기"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "에서, 앞에서부터 # 번째 위치의 문자 얻기"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "에서, 마지막 문자 얻기"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "에서, 랜덤하게 한 문자 얻기"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "텍스트 %1 %2에서"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "특정 번째 위치에서, 문자를 얻어내 돌려줍니다."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%2에서 %1 숫자 세기"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "다른 어떤 텍스트에서 어떤 텍스트가 나타난 횟수를 셉니다."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "텍스트에 항목을 추가합니다."; @@ -336,44 +336,44 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "섹션을 추가, 제거하거나 순 Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "끝에서부터 # 번째 문자까지"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "# 번째 문자까지"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "마지막 문자까지"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "문장"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "에서, 처음부터 얻어냄"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "에서, 마지막에서 # 번째부터 얻어냄"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "에서, 처음부터 # 번째 문자부터 얻어냄"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "문장 중 일부를 얻어내 돌려줍니다."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "에서 다음 문장이 처음으로 나타난 위치 찾기 :"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "에서 다음 문장이 마지막으로 나타난 위치 찾기 :"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "문장 %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다."; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1이 비어 있습니다"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "텍스트 만들기"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다."; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "다음 문장의 문자 개수 %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)"; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "다음 내용 출력 %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "원하는 문장, 수, 값 등을 출력합니다."; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "수에 대해 사용자의 입력을 받습니다."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "문장에 대해 사용자의 입력을 받습니다."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "메시지를 활용해 수 입력"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "메시지를 활용해 문장 입력"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "%3에서 %2을(를) %1(으)로 바꾸기"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "다른 텍스트 내에서 일부 텍스트의 모든 발생을 치환합니다."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 뒤집기"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "텍스트 안의 문자의 순서를 반전시킵니다."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ko.wikipedia.org/wiki/문자열"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "문자, 단어, 문장."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "양쪽의 공백 문자 제거"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "왼쪽의 공백 문자 제거"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "오른쪽의 공백 문자 제거"; diff --git a/msg/js/ksh.js b/msg/js/ksh.js index d705ac40fd7..92e332dcb28 100644 --- a/msg/js/ksh.js +++ b/msg/js/ksh.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a lis Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Sets the last item in a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sets a random item in a list."; // untranslated -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "opwääts"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "rökwääts zottehre"; Blockly.Msg["LISTS_SORT_TITLE"] = "sort %1 %2 %3"; // untranslated diff --git a/msg/js/ky.js b/msg/js/ky.js index 47d331e14da..e5cd19403f7 100644 --- a/msg/js/ky.js +++ b/msg/js/ky.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "катышы"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "аралаштыруу"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Эки түстү берилген катыш (0.0 - 1.0) менен аралаштыр."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "палитрадан түс танда"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "тушкелди түс"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "жаса"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 жолу кайтала"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Билдирүүнү бир канча жолу кайтала"; diff --git a/msg/js/lb.js b/msg/js/lb.js index 503297699ef..af9deff3248 100644 --- a/msg/js/lb.js +++ b/msg/js/lb.js @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returns the length of a list."; // untra Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "create list with item %1 repeated %2 times"; // untranslated Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 ëmdréinen"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -183,7 +183,7 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "oder"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Return true if both inputs are true."; // untranslated Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Return true if at least one of the inputs is true."; // untranslated Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "Test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "wa falsch"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "wa wouer"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "am Text %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "En Element bei den Text derbäisetzen."; diff --git a/msg/js/lki.js b/msg/js/lki.js index 39b7de5c6e2..3ca98d999fa 100644 --- a/msg/js/lki.js +++ b/msg/js/lki.js @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "نادرست"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "بازگرداندن یکی از صحیح یا ناصحیح."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "درست"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "بازگرداندن صحیح اگر ورودی اول بزرگتر از ورودی دوم باشد."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "بازگرداندن صحیح اگر ورودی اول بزرگتر یا مساوی یا ورودی دوم باشد."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "اگر نادرست"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "اگر درست"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "بازگرداندن مقدار جمع دو عدد."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "بازگرداندن باقی‌ماندهٔ دو عدد."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "بازگرداندن تفاوت دو عدد."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "بازگرداندن اولین Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "تغییر %1 با %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "افزودن یک عدد به متغیر '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "محدودکردن %1 پایین %2 بالا %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "مثبت است"; Blockly.Msg["MATH_IS_PRIME"] = "عدد اول است"; Blockly.Msg["MATH_IS_TOOLTIP"] = "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند."; Blockly.Msg["MATH_IS_WHOLE"] = "کامل است"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "باقی‌ماندهٔ %1 + %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "شؤمارە یەک"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "میانگین فهرست"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "موردی تصادفی از فهر Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "انحراف معیار فهرست را بر می‌گرداند."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "جمع همهٔ عددهای فهرست را باز می‌گرداند."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "کسر تصادفی"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "عدد صحیح تصادفی بین %1 تا %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "گردکردن"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "گرد به پایین"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "گرد به بالا"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "گردکردن یک عدد به بالا یا پایین."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "مطلق"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ریشهٔ دوم"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "قدر مطلق یک عدد را بازمی‌گرداند."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "بازگرداندن آرک‌کسینوس درجه (نه رادیان)."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "اجازه اظهارات"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "با:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1»."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "با:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "ساختن «%1»"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "یک حرف، کلمه یا خطی از متن."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "تراشیدن فاصله‌ها از هر دو طرف"; diff --git a/msg/js/lo.js b/msg/js/lo.js index 3b4cc751fb2..df4942d830b 100644 --- a/msg/js/lo.js +++ b/msg/js/lo.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ຖ້າເງື່ອນໄຂເປ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ເຮັດ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ເຮັດຄືນ %1 ຄັ້ງ"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ເຮັດຄຳສັ່ງບາງຄຳສັ່ງຄືນຫຼາຍໆຄັ້ງ."; diff --git a/msg/js/lrc.js b/msg/js/lrc.js index 7ce381ee7b3..1efd82bd4f2 100644 --- a/msg/js/lrc.js +++ b/msg/js/lrc.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسڤٱت"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "شؽڤسٱ"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "هٱر کوم د رٱنڳؽا ناْ ڤا نسڤٱت داٛئٱ بٱ بٱشؽڤن(0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "یاٛ رٱنڳ د رٱنڳدو اْنتخاو بٱکؽت"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "رٱنڳ بٱختٱکی"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ٱنجوم باٛ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 تکرار کو چٱن بار"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; // untranslated @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ٱر غلٱت بی"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ٱر دۏرس بی"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "ڤاْ ٱندازٱ دۏ شمارٱ ڤرگٱردن."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised t Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "آلشت بٱکؽت %1 وا %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; // untranslated @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "موسبٱتٱ"; Blockly.Msg["MATH_IS_PRIME"] = "ڤٱ ٱڤلٱ"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "همٱشٱ"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "یاٛ شمارٱ."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "مؽنجاگٱ نومگٱ"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the li Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; // untranslated Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "random fraction"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "گرد کردن"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ڤ هار گرد کردن"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ڤ رۉ گرد کردن"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "تموم ۉ کمال"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "چارسوک ریشٱ"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; // untranslated @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; // untranslated @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "نوع آلشتگر تازٱ"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ڤا:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ڤا:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "دۏرس کردن%1"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; // untranslated Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // untranslated diff --git a/msg/js/lt.js b/msg/js/lt.js index b1c49a710b1..242aba093a6 100644 --- a/msg/js/lt.js +++ b/msg/js/lt.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jeigu sąlyga tenkinama, tai atlik veiks Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jei sąlyga tenkinama, atlikti jai priklausančius veiksmus, o jei ne -- atlikti kitus nurodytus veiksmus."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jei pirma sąlyga tenkinama, atlikti jai priklausančius veiksmus, O jei ne, tikrinti antrą sąlygą -- ir jei ši tenkinama, atlikti jos veiksmus. Kitais atvejais -- atlikti paskutinio bloko veiksmus."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "daryti"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "pakartokite %1 kartus"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Leidžia atlikti išvardintus veiksmus kelis kartus."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a lis Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Sets the last item in a list."; // untranslated Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sets a random item in a list."; // untranslated -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "didėjančia tvarka"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "mažėjančia tvarka"; Blockly.Msg["LISTS_SORT_TITLE"] = "rūšiuoti %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "klaidinga"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Reikšmė gali būti \"teisinga\"/\"Taip\" arba \"klaidinga\"/\"Ne\"."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "tiesa"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Tenkinama, jei abu reiškiniai lygūs."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Grįžti tiesa, jei pirmoji įvestis didesnė nei antroji įvestis."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Grįžti tiesa, jei pirma įvestis didesnė arba lygi antrajai įvesčiai."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jei ne"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jei taip"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Grąžina dviejų skaičių sumą."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Grąžina dviejų skaičių dalmenį."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Grąžina dviejų skaičių skirtumą."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Grąžina pirmą skaičių pakel Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "padidink %1 (emptypage) %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Grįžti viena iš pagrindinių konstantų: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (begalybė)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "apribok %1 tarp %2 ir %3"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "yra teigiamas"; Blockly.Msg["MATH_IS_PRIME"] = "yra pirminis"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x."; Blockly.Msg["MATH_IS_WHOLE"] = "yra sveikasis"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "dalybos liekana %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Grįžti likučiu nuo dviejų skaičių dalybos."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,10 +238,10 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Grąžinti atsitiktinį elementą i Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Grįžti standartine pakraipa iš sąrašo."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "didžiausia reikšmė"; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "atsitiktinė trupmena"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "atsitiktinis sveikas sk. nuo %1 iki %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Grįžti atsitiktinį sveikąjį skaičių tarp dviejų nustatytų ribų, imtinai."; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://lt.wikipedia.org/wiki/Apvalinimas"; @@ -249,7 +249,7 @@ Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "apvalink"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "apvalink žemyn"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "apvalink aukštyn"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Suapvalinti skaičių į žemesnę ar aukštesnę reikšmę."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "modulis"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratinė šaknis"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Skaičiaus modulis - reikšmė be ženklo (panaikina minusą)."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Naujas kintamojo tipas:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "leisti vidinius veiksmus"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "pagal:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Vykdyti sukurtą komandą \"%1\"."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "su:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Sukurti \"%1\""; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "gauti atsitiktinę raidę"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Grąžina raidę į tam tikrą poziciją."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "skaičius %1 iš %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Suskaičiuoti, kiek kartų šis tekstas kartojasi kitame tekste."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Pridėti teksto elementą."; @@ -365,13 +365,13 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Prašyti vartotoją įvesti skaiči Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Prašyti vartotoją įvesti tekstą."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "paprašyk įvesti skaičių :"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "paprašyk įvesti tekstą :"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "pakeisti %1 į %2 šiame %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Pašalinti visas teksto dalis kitame tekste."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "atbulai %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Apversti teksto simbolių tvarką."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Tekstas (arba žodis, ar raidė)"; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "išvalyk tarpus šonuose"; diff --git a/msg/js/lv.js b/msg/js/lv.js index 80338ab2cc9..2e8a27958a3 100644 --- a/msg/js/lv.js +++ b/msg/js/lv.js @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Aizvieto elementu saraksta s Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Aizvieto sarakstā elementu norādītajā pozīcijā."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Aizvieto elementu saraksta beigās."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Aizvieto sarakstā elementu nejauši izvēlētā pozīcijā."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "augošā"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "dilstošā"; Blockly.Msg["LISTS_SORT_TITLE"] = "Sakārtot sarakstu no %3 elementiem %2 secībā %1"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "aplams"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Atgriež rezultātu \"patiess\" vai \"aplams\"."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "patiess"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Patiess, ja abas puses ir vienādas."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Patiess, ja kreisā puse ir lielāka par labo pusi."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Patiess, ja kreisā puse ir lielāka vai vienāda ar labo pusi."; @@ -188,19 +188,19 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ja aplams"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ja patiess"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Atgriež divu skaitļu summu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Atgriež divu skaitļu dalījumu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Atgriež divu skaitļu starpību."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Atgriež divu skaitļu reizinājumu."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "ATAN2 no X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Atgriezt arktangensu punktam (X, Y) grādos no -180 līdz 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "izmainīt %1 par %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Pieskaitīt doto skaitli mainīgajam '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ierobežot %1 no %2 līdz %3"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "ir pozitīvs"; Blockly.Msg["MATH_IS_PRIME"] = "ir pirmskaitlis"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\"."; Blockly.Msg["MATH_IS_WHOLE"] = "ir vesels"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "atlikums no %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Atlikums no divu skaitļu dalījuma."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Atgriež nejauši izvēlētu vērt Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Atgriež dotā saraksta standartnovirzi."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Saskaitīt visus skaitļus no dotā saraksta."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "nejaušs skaitlis [0..1)"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "nejaušs vesels skaitlis no %1 līdz %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)"; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "noapaļot"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "apaļot uz leju"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "apaļot uz augšu"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Noapaļot skaitli uz augšu vai uz leju."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolūtā vērtība"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadrātsakne"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Atgriež skaitļa absolūto vērtību."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Arkkosinuss (grādos)."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Jauns mainīgā tips:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "atļaut apakškomandas"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ar:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Izpildīt iepriekš definētu funkcju '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ar:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Izveidot '%1' izsaukumu"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Apmainīt kāda teksta fragmentus citā t Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "apgriezt otrādi %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Apgriež otrādi teksta rakstzīmju kārtu."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Burts, vārds vai jebkāda teksta rinda."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "Dzēst atstarpes no abām pusēm"; diff --git a/msg/js/mk.js b/msg/js/mk.js index cc3d90ac1bc..dedd3e7a8f7 100644 --- a/msg/js/mk.js +++ b/msg/js/mk.js @@ -282,7 +282,7 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Тип на новата промен Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дозволи тврдења"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "со:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://mk.wikipedia.org/wiki/Потпрограма"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated diff --git a/msg/js/mnw.js b/msg/js/mnw.js index a1f1fc78c2b..e27a59644ae 100644 --- a/msg/js/mnw.js +++ b/msg/js/mnw.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ဗၞတ်ဗ္ၜတ်"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ပနှဴ"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ပနှဴ အသာ် ၜါ နကဵု ဗၞတ်ဗ္ၜတ် (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "ရုဲကေတ် အသာ် မွဲ နူကဵု ဖလာတ်"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ဇျောမ်ကေတ် အသာ်"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ပ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ထပ်ဂလိုင်ပတိုန် %1 နာဍဳ"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ကၠောန်ပတိတ် လလောင်တြး မဂၠိုင် ကုအလန်၊၊"; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ယဝ်ဗၠေတ်"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ယဝ်ဍာံ"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated @@ -218,7 +218,7 @@ Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_opera Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "မဂၞန်မွဲ"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated @@ -249,7 +249,7 @@ Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; // untranslated Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ဍာံဍာံ"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "square root"; // untranslated Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Return the absolute value of a number."; // untranslated diff --git a/msg/js/ms.js b/msg/js/ms.js index 5ef7ecd5357..b4e3c4d88f1 100644 --- a/msg/js/ms.js +++ b/msg/js/ms.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jika nilai yang benar, lakukan beberapa Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jika suatu nilai benar, lakukan penyata blok pertama. Jika tidak, bina penyata blok kedua."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jika nilai yang pertama adalah benar, lakukan penyata pertama blok. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jika nilai yang pertama adalah benar, lakukan penyata blok pertama. Sebaliknya, jika nilai kedua adalah benar, lakukan penyata blok kedua. Jika tiada nilai adalah benar, lakukan penyata blok terakhir."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "lakukan"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ulang %1 kali"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Lakukan perintah berulang kali."; @@ -81,7 +81,7 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "Wujudkan senarai kosong"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "senarai"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Tambah, alih keluar, atau susun semula bahagian-bahagian untuk menyusun semula senarai blok."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "wujudkan senarai dengan"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Tambah item ke dalam senarai."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Wujudkan senarai dengan apa jua nombor item."; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sort a copy of a list."; // untranslated Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetic, ignore case"; // untranslated Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeric"; // untranslated Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetic"; // untranslated -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "buat senarai dgn teks"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "buat teks drpd senarai"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Cantumkan senarai teks menjadi satu teks, dipecahkan oleh delimiter."; @@ -187,7 +187,7 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "Jika palsu"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "Jika benar"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ms.wikipedia.org/wiki/Aritmetik"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Kembalikan jumlah kedua-dua bilangan."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Taip balik hasil bahagi dua nombor tersebut."; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π ( Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "Boleh dibahagikan dengan"; Blockly.Msg["MATH_IS_EVEN"] = "Adalah genap"; Blockly.Msg["MATH_IS_NEGATIVE"] = "negatif"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://id.wikipedia.org/wiki/Operasi_modulus"; Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ms.wikipedia.org/wiki/Nombor"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Suatu nombor."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,14 +237,14 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Kembali senarai item yang paling bias Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Kembalikan elemen rawak daripada senarai."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Kembali dengan sisihan piawai daripada senarai."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Kembalikan jumlah semua nombor dalam senarai."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "pecahan rawak"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Kembali sebahagian kecil rawak antara 0.0 (inklusif) dan 1.0 (eksklusif)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "integer rawak dari %1ke %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "pusingan"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "Pusingan ke bawah"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "pusingan ke atas"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kembali logarithm 10 asas nombor."; Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kembalikan nombor yang songsang."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kembalikan 10 kepada kuasa nombor."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kembalikan punca kuasa nombor."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "bolehkan kenyataan"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "dengan:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://ms.wikipedia.org/wiki/Fungsi"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://ms.wikipedia.org/wiki/Fungsi"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "dengan:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Hasilkan '%1'"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "kembali"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Mencipta satu fungsi dengan pengeluaran."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Amaran: Fungsi ini mempunyai parameter yang berganda."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Serlahkan definisi fungsi"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "If a value is true, then return a second value."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "Nama input:"; diff --git a/msg/js/nb.js b/msg/js/nb.js index eeabd65f975..b7182ae510d 100644 --- a/msg/js/nb.js +++ b/msg/js/nb.js @@ -13,18 +13,18 @@ Blockly.Msg["COLLAPSE_ALL"] = "Skjul blokker"; Blockly.Msg["COLLAPSE_BLOCK"] = "Skjul blokk"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "farge 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "farge 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "forhold"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "blande"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blander to farger sammen med et gitt forhold (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Velg en farge fra paletten."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "tilfeldig farge"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Velg en tilfeldig farge."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blå"; Blockly.Msg["COLOUR_RGB_GREEN"] = "grønn"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rød"; Blockly.Msg["COLOUR_RGB_TITLE"] = "farge med"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Lag en farge med angitt verdi av rød, grønn og blå. Alle verdier må være mellom 0 og 100."; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Hvis dette er sant, så gjør følgende. Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Hvis dette er sant, så utfør den første blokken av instruksjoner. Hvis ikke, utfør den andre blokken."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Hvis det første stemmer, så utfør den første blokken av instruksjoner. Ellers, hvis det andre stemmer, utfør den andre blokken av instruksjoner."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Hvis den første verdien er sann, så utfør den første blokken med setninger. Ellers, hvis den andre verdien er sann, så utfør den andre blokken med setninger. Hvis ingen av verdiene er sanne, så utfør den siste blokken med setninger."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "gjør"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "gjenta %1 ganger"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Gjenta noen instruksjoner flere ganger."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Utvid blokk"; Blockly.Msg["EXTERNAL_INPUTS"] = "Eksterne kilder"; Blockly.Msg["HELP"] = "Hjelp"; Blockly.Msg["INLINE_INPUTS"] = "Interne kilder"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "opprett en tom liste"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returnerer en tom liste, altså med lengde 0"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "hent og fjern"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "siste"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "tilfeldig"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "fjern"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returnerer det første elementet i en liste."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returner elementet på den angitte posisjonen i en liste."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returnerer det siste elementet i en liste."; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "Hent en del av listen"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "Hent de siste # elementene"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "Hent del-listen fra #"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Kopiérer en ønsket del av en liste."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 er det siste elementet."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 er det første elementet."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnerer lengden til en liste."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "Lag en liste hvor elementet %1 forekommer %2 ganger"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Lager en liste hvor den gitte verdien gjentas et antall ganger."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverser %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverser en kopi av ei liste."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Angir det første elementet Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setter inn elementet ved den angitte posisjonen i en liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Angir det siste elementet i en liste."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Angir et tilfeldig element i en liste."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigende"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "synkende"; Blockly.Msg["LISTS_SORT_TITLE"] = "sorter %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "usann"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnerer enten sann eller usann."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "sann"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Returnerer sann hvis begge inputene er like hverandre."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Returnerer sant hvis det første argumentet er større enn den andre argumentet."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Returnerer sant hvis det første argumentet er større enn eller likt det andre argumentet."; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ikke %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returnerer sant hvis argumentet er usant. Returnerer usant hvis argumentet er sant."; Blockly.Msg["LOGIC_NULL"] = "null"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returnerer null."; Blockly.Msg["LOGIC_OPERATION_AND"] = "og"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,29 +183,29 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "eller"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Returnerer sant hvis begge argumentene er sanne."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Returnerer sant hvis minst ett av argumentene er sant."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "hvis usant"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "hvis sant"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://no.wikipedia.org/wiki/Aritmetikk"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnerer summen av to tall."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returner kvotienten av to tall."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returner differansen mellom to tall."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returner produktet av to tall."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returner det første tallet opphøyd i den andre tallet."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 av X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "endre %1 ved %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Addere et tall til variabelen '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begrense %1 lav %2 høy %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "er delelig med"; Blockly.Msg["MATH_IS_EVEN"] = "er et partall"; Blockly.Msg["MATH_IS_NEGATIVE"] = "er negativer negativt"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "er positivt"; Blockly.Msg["MATH_IS_PRIME"] = "er et primtall"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Sjekk om et tall er et partall, oddetall, primtall, heltall, positivt, negativt, eller om det er delelig med et annet tall. Returnerer sant eller usant."; Blockly.Msg["MATH_IS_WHOLE"] = "er et heltall"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "resten av %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Returner resten fra delingen av to tall."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Et tall."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "gjennomsnittet av listen"; @@ -237,19 +237,19 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Returner en liste av de vanligste ele Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returner et tilfeldig element fra listen."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Returner listens standardavvik."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Returner summen av alle tallene i listen."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "tilfeldig flyttall"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "Et tilfeldig heltall mellom %1 og %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "avrunding"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rund ned"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rund opp"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Avrund et tall ned eller opp."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absoluttverdi"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "kvadratrot"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returner absoluttverdien av et tall."; @@ -259,12 +259,12 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returner base-10 logaritmen til et t Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returner det negative tallet."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returner 10 opphøyd i et tall."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returner kvadratroten av et tall."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; Blockly.Msg["MATH_TRIG_COS"] = "cos"; -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Returner arccosinus til et tall."; @@ -282,19 +282,19 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltype:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillat uttalelser"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kjør den brukerdefinerte funksjonen '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "med:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Opprett '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Beskriv denne funksjonen…"; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "gjør noe"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "til"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Opprett en funksjon som ikke har noe resultat."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "returner"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Oppretter en funksjon som har et resultat."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Advarsel: Denne funksjonen har duplikate parametere."; @@ -324,10 +324,10 @@ Blockly.Msg["TEXT_CHARAT_FROM_START"] = "hent bokstav #"; Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "hent den siste bokstaven"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hent en tilfeldig bokstav"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "i teksten %1, %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returnerer bokstaven på angitt plassering."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "tell %1 i %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Tell hvor mange ganger noe tekst dukker opp i annen tekst."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Legg til et element til teksten."; @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "i tekst"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "hent delstreng fra første bokstav"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "hent delstreng fra bokstav # fra slutten"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "hent delstreng fra bokstav #"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returnerer den angitte delen av teksten."; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "finn første forekomst av tekst"; @@ -365,13 +365,13 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Be brukeren om et tall."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Spør brukeren om tekst."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "spør om et tall med en melding"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "spør om tekst med en melding"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "erstatt %1 med %2 i %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Erstatter alle forekomster av noe tekst i en annen tekst."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverser %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverserer rekkefølgen på tegnene i teksten."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "En bokstav, ett ord eller en linje med tekst."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "fjern mellomrom fra begge sider av"; diff --git a/msg/js/ne.js b/msg/js/ne.js index 2ef877544d0..176ab4bcef1 100644 --- a/msg/js/ne.js +++ b/msg/js/ne.js @@ -65,7 +65,7 @@ Blockly.Msg["DELETE_BLOCK"] = "ब्लक हटाउने"; Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated Blockly.Msg["DELETE_X_BLOCKS"] = " %1 ब्लकहरू हटाउने"; -Blockly.Msg["DIALOG_CANCEL"] = "रद्द गर्ने"; +Blockly.Msg["DIALOG_CANCEL"] = "रद्द गर्नुहोस्"; Blockly.Msg["DIALOG_OK"] = "हुन्छ"; Blockly.Msg["DISABLE_BLOCK"] = "ब्लकलाई सक्रिय पार्ने"; Blockly.Msg["DUPLICATE_BLOCK"] = "प्रतिलिपी गर्ने"; diff --git a/msg/js/nl.js b/msg/js/nl.js index c7ed375aa13..e7b4e603591 100644 --- a/msg/js/nl.js +++ b/msg/js/nl.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Blokken samenvouwen"; Blockly.Msg["COLLAPSE_BLOCK"] = "Blok samenvouwen"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "kleur 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "kleur 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "verhouding"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mengen"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mengt twee kleuren samen met een bepaalde verhouding (0.0 - 1.0)."; @@ -24,11 +24,11 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "willekeurige kleur"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Kies een willekeurige kleur."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blauw"; Blockly.Msg["COLOUR_RGB_GREEN"] = "groen"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rood"; Blockly.Msg["COLOUR_RGB_TITLE"] = "kleuren met"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "uit lus breken"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "doorgaan met de volgende iteratie van de lus"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Uit de bovenliggende lus breken."; @@ -37,12 +37,12 @@ Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Waarschuwing: dit blok mag al Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "voor ieder item %1 in lijst %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "rekenen met %1 van %2 tot %3 in stappen van %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Voeg een voorwaarde toe aan het als-blok."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Voeg een laatste, vang-alles conditie toe aan het als-statement."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Voeg stukken toe, verwijder of wijzig de volgorde om dit \"als\"-blok te wijzigen."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "anders"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "anders als"; @@ -55,7 +55,7 @@ Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://nl.wikipedia.org/wiki/Repetiti Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "voer uit"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 keer herhalen"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Voer een aantal opdrachten meerdere keren uit."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "herhalen totdat"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "herhalen zolang"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Blok uitvouwen"; Blockly.Msg["EXTERNAL_INPUTS"] = "Externe invoer"; Blockly.Msg["HELP"] = "Hulp"; Blockly.Msg["INLINE_INPUTS"] = "Inline invoer"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "maak een lege lijst"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Geeft een lijst terug met lengte 0, zonder items"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lijst"; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Verwijdert een willekeur Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "naar # vanaf einde"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "naar item"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "naar laatste"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "haal sublijst op vanaf eerste"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "haal sublijst op van positie vanaf einde"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "haal sublijst op vanaf positie"; @@ -118,23 +118,23 @@ Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Maakt een kopie van het opgegeven de Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Item %1 is het laatste item."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Item %1 is het eerste item."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "zoek eerste voorkomen van item"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "zoek laatste voorkomen van item"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden."; Blockly.Msg["LISTS_INLIST"] = "in lijst"; Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is leeg"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Geeft waar terug als de lijst leeg is."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "lengte van %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Geeft de lengte van een lijst terug."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "Maak lijst met item %1, %2 keer herhaald"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald."; Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "%1 omkeren"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Keert een kopie van een lijst om."; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "als"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "tussenvoegen op"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "stel in"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Stelt het eerste item in een Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Zet het item op de opgegeven positie in de lijst."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Stelt het laatste item van een lijst in."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Stelt een willekeurig item uit de lijst in."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "oplopend"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "aflopend"; Blockly.Msg["LISTS_SORT_TITLE"] = "sorteer %1 %2 %3"; @@ -161,7 +161,7 @@ Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Lijst van tekstdelen samenvoegen in Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Tekst splitsen in een lijst van teksten op basis van een scheidingsteken."; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "met scheidingsteken"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "onwaar"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Geeft \"waar\" of \"onwaar\" terug."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "waar"; Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://nl.wikipedia.org/wiki/Ongelijkheid_(wiskunde)"; @@ -171,33 +171,33 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Geeft \"waar\" terug als de eerste i Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Geeft \"waar\" als de eerste invoer kleiner is dan de tweede invoer."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Geeft \"waar\" terug als de waarden niet gelijk zijn aan elkaar."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "niet %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is."; Blockly.Msg["LOGIC_NULL"] = "niets"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Geeft niets terug."; Blockly.Msg["LOGIC_OPERATION_AND"] = "en"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "of"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Geeft waar als beide waarden waar zijn."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Geeft \"waar\" terug als in ieder geval één van de waarden waar is."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "als onwaar"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "als waar"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://nl.wikipedia.org/wiki/Rekenen"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Geeft de som van 2 getallen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Geeft de gedeelde waarde van twee getallen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Geeft het verschil van de twee getallen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Geeft het product terug van de twee getallen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Geeft het eerste getal tot de macht van het tweede getal."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 van X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Geef de boogtangens van punt (X, Y) terug in graden tussen -180 naar 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 wijzigen met %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Voegt een getal toe aan variabele \"%1\"."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://nl.wikipedia.org/wiki/Wiskundige_constante"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Geeft een van de vaak voorkomende consta Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "beperk %1 van minimaal %2 tot maximaal %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Beperk een getal tussen de twee opgegeven limieten (inclusief)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "is deelbaar door"; Blockly.Msg["MATH_IS_EVEN"] = "is even"; Blockly.Msg["MATH_IS_NEGATIVE"] = "is negatief"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "is geheel getal"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://nl.wikipedia.org/wiki/Modulair_rekenen"; Blockly.Msg["MATH_MODULO_TITLE"] = "restgetal van %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Geeft het restgetal van het resultaat van de deling van de twee getallen."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Een getal."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Geeft een lijst van de meest voorkome Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Geeft een willekeurig item uit de lijst terug."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Geeft de standaardafwijking van de lijst."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Geeft de som van alle getallen in de lijst."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://nl.wikipedia.org/wiki/Toevalsgenerator"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "willekeurige fractie"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Geeft het logaritme basis 10 van een Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Geeft de negatief van een getal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Geeft 10 tot de macht van een getal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Geeft de wortel van een getal."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "uitvoeren"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Maakt een functie met een uitvoer."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Waarschuwing: deze functie heeft parameters met dezelfde naam."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Accentueer functiedefinitie"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "invoernaam:"; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "Opnieuw"; Blockly.Msg["REMOVE_COMMENT"] = "Opmerking verwijderen"; Blockly.Msg["RENAME_VARIABLE"] = "Variabele hernoemen..."; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Alle variabelen \"%1\" hernoemen naar:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "voor%1 voeg tekst toe van %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Voeg tekst toe aan de variabele \"%1\"."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "naar kleine letters"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "naar Hoofdletter Per Woord"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "naar HOOFDLETTERS"; @@ -321,7 +321,7 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Geef een kopie van de tekst met verand Blockly.Msg["TEXT_CHARAT_FIRST"] = "haal eerste letter op"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "haal letter # op vanaf einde"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "haal letter # op"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "haal laatste letter op"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "haal willekeurige letter op"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated @@ -336,31 +336,31 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Toevoegen, verwijderen of volgorde wi Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "van letter # tot einde"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "naar letter #"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "naar laatste letter"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "in tekst"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "haal subtekst op van eerste letter"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "haal subtekst op vanaf letter # vanaf einde"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "haal subtekst op vanaf letter #"; Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Geeft het opgegeven onderdeel van de tekst terug."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "zoek eerste voorkomen van tekst"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "zoek het laatste voorkomen van tekst"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in tekst %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is."; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is leeg"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Geeft \"waar\" terug, als de opgegeven tekst leeg is."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "maak tekst met"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Maakt een stuk tekst door één of meer items samen te voegen."; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "lengte van %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst."; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "tekst weergeven: %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Drukt de opgegeven tekst, getal of een andere waarde af."; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Vraagt de gebruiker om een getal in te voeren."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Vraagt de gebruiker om invoer."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "vraagt de gebruiker om een getal met de tekst"; @@ -373,7 +373,7 @@ Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "%1 omkeren"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Keert de volgorde van de tekens in de tekst om."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://nl.wikipedia.org/wiki/String_%28informatica%29"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Een letter, woord of een regel tekst."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "spaties van beide kanten afhalen van"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "spaties van de linkerkant verwijderen van"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "spaties van de rechterkant verwijderen van"; @@ -383,11 +383,11 @@ Blockly.Msg["UNDO"] = "Ongedaan maken"; Blockly.Msg["UNNAMED_KEY"] = "zonder naam"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Maak \"verander %1\""; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Geeft de waarde van deze variabele."; Blockly.Msg["VARIABLES_SET"] = "stel %1 in op %2"; Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Maak 'opvragen van %1'"; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Verandert de waarde van de variabele naar de waarde van de invoer."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Er bestaat al een variabele met de naam \"%1\"."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Een variabele met de naam '%1' bestaat al voor een ander soort variabele: '%2'."; diff --git a/msg/js/oc.js b/msg/js/oc.js index 3ed6505c6d8..40afdbab958 100644 --- a/msg/js/oc.js +++ b/msg/js/oc.js @@ -200,7 +200,7 @@ Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in de Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "incrementar %1 per %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrénher %1 entre %2 e %3"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "es positiu"; Blockly.Msg["MATH_IS_PRIME"] = "es primièr"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "es entièr"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "residú de %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,10 +238,10 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the li Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; // untranslated Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraccion aleatòria"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Renvia l’arccosinus d’un nombre."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Novèl tipe de variabla :"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "autorizar los òrdres"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "amb :"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "amb :"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Crear '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inversar %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una letra, un mot o una linha de tèxte."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "suprimir los espacis dels dos costats"; diff --git a/msg/js/pa.js b/msg/js/pa.js index 80a45616def..a870fdfc350 100644 --- a/msg/js/pa.js +++ b/msg/js/pa.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ਅਨੁਪਾਤ"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ਮਿਸ਼ਰਣ ਕਰੋ"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ਦਿੱਤੇ ਅਨੁਪਾਤ (0.0 - 1.0) ਅਨੁਸਾਰ ਦੋ ਰੰਗ ਮਿਲਾਓ।"; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "ਰੰਗ-ਫੱਟੀ ਵਿੱਚੋਂ ਰੰਗ ਚੁਣੋ"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ਰਲ਼ਵਾਂ ਰੰਗ"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ਕਰੋ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 ਵਾਰੀ ਦੁਹਰਾਉ"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; // untranslated diff --git a/msg/js/pl.js b/msg/js/pl.js index 7872b88bae1..adcc050b762 100644 --- a/msg/js/pl.js +++ b/msg/js/pl.js @@ -13,18 +13,18 @@ Blockly.Msg["COLLAPSE_ALL"] = "Zwiń Bloki"; Blockly.Msg["COLLAPSE_BLOCK"] = "Zwiń Klocek"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "kolor 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "kolor 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporcja"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "wymieszaj"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Miesza dwa kolory w danej proporcji (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Wybierz kolor z palety."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "losowy kolor"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Wybierz kolor w sposób losowy."; Blockly.Msg["COLOUR_RGB_BLUE"] = "niebieski"; Blockly.Msg["COLOUR_RGB_GREEN"] = "zielony"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "czerwony"; Blockly.Msg["COLOUR_RGB_TITLE"] = "kolor z"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Utwórz kolor składający sie z podanej ilości czerwieni, zieleni i błękitu. Zakres wartości: 0 do 100."; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Jeśli warunek jest spełniony, wykonaj Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Jeśli warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, wykonaj drugi blok instrukcji."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok instrukcji. W przeciwnym razie, jeśli drugi warunek jest spełniony, wykonaj drugi blok instrukcji."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Jeśli pierwszy warunek jest spełniony, wykonaj pierwszy blok czynności. W przeciwnym razie jeśli drugi warunek jest spełniony, wykonaj drugi blok czynności. Jeżeli żaden z warunków nie zostanie spełniony, wykonaj ostatni blok czynności."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "wykonaj"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "powtórz %1 razy"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Wykonaj niektóre instrukcje kilka razy."; @@ -68,7 +68,7 @@ Blockly.Msg["DELETE_X_BLOCKS"] = "Usuń %1 Bloki(ów)"; Blockly.Msg["DIALOG_CANCEL"] = "Anuluj"; Blockly.Msg["DIALOG_OK"] = "OK"; Blockly.Msg["DISABLE_BLOCK"] = "Wyłącz Klocek"; -Blockly.Msg["DUPLICATE_BLOCK"] = "Powiel"; +Blockly.Msg["DUPLICATE_BLOCK"] = "Duplikat"; Blockly.Msg["DUPLICATE_COMMENT"] = "Zduplikowany komentarz"; Blockly.Msg["ENABLE_BLOCK"] = "Włącz Blok"; Blockly.Msg["EXPAND_ALL"] = "Rozwiń Bloki"; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Rozwiń Klocek"; Blockly.Msg["EXTERNAL_INPUTS"] = "Zewnętrzne Wejścia"; Blockly.Msg["HELP"] = "Pomoc"; Blockly.Msg["INLINE_INPUTS"] = "Wbudowane Wejścia"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "utwórz pustą listę"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Zwraca listę o długości 0, nie zawierającą danych"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "utwórz listę podrzędną od pierwszego"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "utwórz listę podrzędną z # od końca"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "utwórz listę podrzędną z #"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Tworzy kopię żądanej części listy."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 to ostatni element."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 to pierwszy element."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Ustawia pierwszy element na Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ustawia element w określonym miejscu na liście."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Ustawia ostatni element na liście."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Ustawia losowy element na liście."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "rosnąco"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "malejąco"; Blockly.Msg["LISTS_SORT_TITLE"] = "sortuj %1 %2 %3"; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nie %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Zwraca \"prawda\", jeśli wejściu jest \"fałsz\". Zwraca \"fałsz\", jeśli na wejściu jest \"prawda\"."; Blockly.Msg["LOGIC_NULL"] = "nic"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Zwraca nic."; Blockly.Msg["LOGIC_OPERATION_AND"] = "i"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,21 +183,21 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "lub"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Zwraca \"prawda\" jeśli na obydwóch wejściach jest \"prawda\"."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Zwraca \"prawda\" jeśli co najmniej na jednyk wejściu jest \"prawda\"."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "jeśli fałsz"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "jeśli prawda"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://pl.wikipedia.org/wiki/Arytmetyka"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Zwróć sumę dwóch liczb."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Zwróć iloraz dwóch liczb."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Zwróć różnicę dwóch liczb."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Zwróć iloczyn dwóch liczb."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Zwróć pierwszą liczbę podniesioną do potęgi o wykładniku drugiej liczby."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; -Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 z %X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Zwraca arcus tangens punktu (X, Y) w stopniach od -180 do 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "zmień %1 o %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Dodaj liczbę do zmiennej '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://pl.wikipedia.org/wiki/Stała_(matematyka)"; @@ -217,10 +217,10 @@ Blockly.Msg["MATH_IS_WHOLE"] = "jest liczbą całkowitą"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://pl.wikipedia.org/wiki/Modulo"; Blockly.Msg["MATH_MODULO_TITLE"] = "reszta z dzielenia %1 przez %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Zwróć resztę z dzielenia dwóch liczb przez siebie."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Liczba."; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "średnia elementów listy"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksymalna wartość z listy"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "mediana listy"; @@ -237,11 +237,11 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Zwróć listę najczęściej występu Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Zwróć losowy element z listy."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Zwróć odchylenie standardowe listy."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Zwróć sumę wszystkich liczb z listy."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "losowy ułamek"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "losowa liczba całkowita od %1 do %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie."; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://pl.wikipedia.org/wiki/Zaokrąglanie"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Zwraca logarytm dziesiętny danej li Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Zwróć negację danej liczby."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Zwróć 10 do potęgi danej liczby."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Zwróć pierwiastek kwadratowy danej liczby."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctg"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "Utwórz zmienną typu string"; Blockly.Msg["NEW_VARIABLE"] = "Utwórz zmienną..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Nowa nazwa zmiennej:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Nowy typ zmiennej:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "zezwól na czynności"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "z:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://pl.wikipedia.org/wiki/Podprogram"; @@ -289,12 +289,12 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Uruchom zdefiniowaną przez uży Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "z:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Utwórz '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Opisz tę funkcję..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "zrób coś"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "do"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Tworzy funkcję nie posiadającą wyjścia."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "zwróć"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Tworzy funkcję posiadającą wyjście."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Uwaga: Ta funkcja ma powtórzone parametry."; @@ -324,10 +324,10 @@ Blockly.Msg["TEXT_CHARAT_FROM_START"] = "pobierz literę #"; Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "pobierz ostatnią literę"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "pobierz losową literę"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "w tekście %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Zwraca literę z określonej pozycji."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "policz %1 w %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Liczy ile razy dany tekst występuje w innym tekście."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Dodaj element do tekstu."; @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "w tekście"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "pobierz podciąg od pierwszej litery"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "pobierz podciąg od # litery od końca"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "pobierz podciąg od # litery"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Zwraca określoną część tekstu."; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "znajdź pierwsze wystąpienie tekstu"; @@ -368,7 +368,7 @@ Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "poproś o tekst z tą wiadomością"; Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zamień %1 na %2 w %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zastąp wszystkie wystąpienia danego tekstu innym."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "odwróć %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Odwraca kolejność znaków w tekście."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych"; @@ -391,7 +391,7 @@ Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/V Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Wartości zmiennej i wejście będą identyczne."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Zmienna o nazwie '%1' już istnieje."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Zmienna o nazwie '%1' już istnieje i jest typu '%2'."; -Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Obszar roboczy Blockly"; Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Powiedz coś..."; Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; diff --git a/msg/js/pms.js b/msg/js/pms.js index 21d9c76a14e..fa724d40799 100644 --- a/msg/js/pms.js +++ b/msg/js/pms.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "rapòrt"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mës-cé"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Serne un color ant la taulòssa."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "color a asar"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si un valor a l'é ver, antlora eseguì Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Si un valor a l'é ver, antlora eseguì ël prim blòch d'anstrussion. Dësnò, eseguì ël second blòch d'anstrussion."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòch d'anstrussion."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Si ël prim valor a l'é ver, antlora fé andé ël prim blòch d'anstrussion. Dësnò, si ël second valor a l'é ver, fé andé ël second blòcj d'anstrussion. Si gnun dij valor a l'é ver, fé andé l'ùltim blòch d'anstrussion."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fé"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "arpete %1 vire"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Eseguì chèiche anstrussion vàire vire."; @@ -81,13 +81,13 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "creé na lista veuida"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Gionté, gavé o riordiné le session për configuré torna cost blòch ëd lista."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "creé na lista con"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Gionté n'element a la lista."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Creé na lista con un nùmer qualsëssìa d'element."; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "prim"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# da la fin"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "n."; Blockly.Msg["LISTS_GET_INDEX_GET"] = "oten-e"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "oten-e e eliminé"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "ùltim"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "A smon la longheur ¨d na lista."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "creé na lista con l'element %1 arpetù %2 vire"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "A crea na lista ch'a consist dël valor dàit arpetù ël nùmer ëspessificà ëd vire."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "anversé %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Anversé na còpia ëd na lista"; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "A fissa ël prim element an Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "A fissa l'element a la posission ëspessificà an na lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "A fissa l'ùltim element an na lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "A fissa n'element a l'ancàpit an na lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "chërsent"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "calant"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordiné %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordiné na còpia ëd na lista."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabétich, ignorand ël caràter minùscol o majùscol"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérich"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabétich"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "fé na lista da 'n test"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "fé 'n test da na lista"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Gionze na lista ëd test ant un test sol, separandje con un separator."; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fàuss"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "A rëspond ver o fàuss."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ver"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Rësponde ver si le doe imission a son uguaj."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Rësponde ver si la prima imission a l'é pi granda che la sconda."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Rësponde ver si la prima imission a l'é pi granda o ugual a la sconda."; @@ -188,19 +188,19 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se fàuss"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se ver"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Controlé la condission an 'preuva'. Se la condission a l'é vera, a rëspond con ël valor 'se ver'; dësnò a rëspond con ël valor 'se fàuss'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "A smon la soma ëd doi nùmer."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "A smon ël cossient dij doi nùmer."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "A smon la diferensa dij doi nùmer."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "A smon ël prodot dij doi nùmer."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "A smon ël prim nùmer alvà a la potensa dël second."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ëd X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "A rëspond con l'arch-tangent dël pont (X, Y) an gre da -180 a 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "ancrementé %1 për %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Gionté un nùmer a la variàbil '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "A smon un-a dle costante comun-e π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinì)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "limité %1 antra %2 e %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "a l'é positiv"; Blockly.Msg["MATH_IS_PRIME"] = "a l'é prim"; Blockly.Msg["MATH_IS_TOOLTIP"] = "A contròla si un nùmer a l'é cobi, dëscobi, prim, antreghm positiv, negativ, o s'a l'é divisìbil për un nùmer dàit. A rëspond ver o fàuss."; Blockly.Msg["MATH_IS_WHOLE"] = "a l'é antregh"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "resta ëd %1:%2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "A smon la resta ëd la division dij doi nùmer."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un nùmer."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media dla lista"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "A smon n'element a l'ancàpit da la Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "A smon la deviassion ëstàndard ëd la lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "A smon la soma ëd tuti ij nùmer ant la lista."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "frassion aleatòria"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "antregh aleatòri antra %1 e %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ariondé"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ariondé për difet"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ariondé për ecess"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "A arionda un nùmer për difet o ecess."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "assolù"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "rèis quadra"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "A smon ël valor assolù d'un nùmer."; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "A smon l'opòst d'un nùmer."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "A smon 10 a la potensa d'un nùmer."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "A smon la rèis quadra d'un nùmer."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "A smon l'arch-cosen d'un nùmer."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "A smon l'arch-sen d'un nùmer."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "A smon l'arch-tangenta d'un nùmer."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Neuva sòrt ëd variàbil:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "përmëtte le diciairassion"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Eseguì la fonsion '%1' definìa da l'utent."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "con:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Creé '%1'"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "artorn"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "A crea na fonsion con na surtìa."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Atension: Costa fonsion a l'ha dij paràmeter duplicà."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Sot-ligné la definission dla fonsion"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Se un valor a l'é ver, antlora smon-e un second valor."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nòm ëd l'imission:"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "oten-e na litra a l'ancàpit"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "ant ël test %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "A smon la litra ant la posission ëspessificà."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "nùmer %1 su %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Conté vàire vire un test dàit a compariss an n'àutr test."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Gionté n'element al test."; @@ -365,13 +365,13 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Ciamé un nùmer a l'utent."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Ciamé un test a l'utent."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "anvit për un nùmer con un mëssagi"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "anvit për un test con un mëssagi"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "rampiassé %1 con %2 an %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Rampiassé tute j'ocorense d'un test con n'àutr."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "Anversé %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Anversé l'òrdin dij caràter ant ël test."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Na litra, na paròla o na linia ëd test."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "gavé jë spassi da le doe bande ëd"; diff --git a/msg/js/pt-br.js b/msg/js/pt-br.js index 076fca083b1..0c93e9c71c9 100644 --- a/msg/js/pt-br.js +++ b/msg/js/pt-br.js @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "Expandir bloco"; Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas externas"; Blockly.Msg["HELP"] = "Ajuda"; Blockly.Msg["INLINE_INPUTS"] = "Entradas incorporadas"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "criar lista vazia"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna uma lista, de tamanho 0, contendo nenhum registro"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "criar lista com"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Acrescenta um item à lista."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Cria uma lista com a quantidade de itens informada."; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Remove um item aleatóri Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "até nº a partir do final"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "até nº"; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "até último"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "obtém sublista a partir do primeiro"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "obtém sublista de nº a partir do final"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "obtém sublista de nº"; @@ -122,16 +122,16 @@ Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/ Blockly.Msg["LISTS_INDEX_OF_LAST"] = "encontre a última ocorrência do item"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Retorna o índice da primeira/última ocorrência do item na lista. Retorna %1 se o item não for encontrado."; Blockly.Msg["LISTS_INLIST"] = "na lista"; -Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 é vazia"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Retorna ao verdadeiro se a lista estiver vazia."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "tamanho de %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Retorna o tamanho de uma lista."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "criar lista com item %1 repetido %2 vezes"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Cria uma lista consistindo no valor informado repetido o número de vezes especificado."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Listas#invertendo-uma-lista"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverter %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverter uma cópia da lista."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Define o primeiro item de um Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Define o item da posição especificada de uma lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Define o último item de uma lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Define um item aleatório de uma lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Ordenar uma cópia de uma lista."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabético, ignorar maiúscula/minúscula"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numérico"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabético"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "Fazer uma lista a partir do texto"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "fazer um texto a partir da lista"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Juntar uma lista de textos em um único texto, separado por um delimitador."; @@ -194,7 +194,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna o quociente da divisão Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna a diferença entre os dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna o produto dos dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna o primeiro número elevado à potência do segundo número."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Retorne o arco tangente do ponto (X, Y) em graus de -180 a 180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retorna"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Cria uma função que possui um valor de retorno."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Atenção: Esta função tem parâmetros duplicados."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Destacar definição da função"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Se um valor é verdadeiro, então retorna um valor."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "nome da entrada:"; @@ -313,7 +313,7 @@ Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Renomear todas as variáveis '%1' para:" Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "para %1 anexar texto %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Acrescentar um pedaço de texto à variável \"%1\"."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "para minúsculas"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "para Nomes Próprios"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "para MAIÚSCULAS"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obter letra aleatória"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "no texto %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Retorna a letra na posição especificada."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "Contar %1 em %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Calcule quantas vezes algum texto aparece centro de algum outro texto."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Acrescentar um item ao texto."; @@ -336,7 +336,7 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Acrescenta, remove ou reordena seçõ Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "até letra nº a partir do final"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "até letra nº"; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "até última letra"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "no texto"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "obter trecho de primeira letra"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "obter trecho de letra nº a partir do final"; @@ -357,23 +357,23 @@ Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Criar um pedaço de texto juntando qualquer Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "tamanho de %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Retorna o número de letras (incluindo espaços) no texto fornecido."; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "imprime %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Imprime o texto, número ou valor especificado."; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pede ao usuário um número."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pede ao usuário um texto."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "Pede um número com uma mensagem"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Pede um texto com uma mensagem"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Texto#substituindo-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "substituir %1 por %2 em %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substitua todas as ocorrências de algum texto dentro de algum outro texto."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Texto#invertendo-texto"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverter %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverter a ordem dos caracteres no texto."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Uma letra, palavra ou linha de texto."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "remover espaços de ambos os lados de"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "remover espaços à esquerda de"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "remover espaços à direita de"; @@ -383,11 +383,11 @@ Blockly.Msg["UNDO"] = "Desfazer"; Blockly.Msg["UNNAMED_KEY"] = "Sem título"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "item"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Criar \"definir %1\""; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Retorna o valor desta variável."; Blockly.Msg["VARIABLES_SET"] = "definir %1 para %2"; Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Criar \"obter %1\""; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Define esta variável para o valor da entrada."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variável chamada '%1' já existe."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Já existe uma variável chamada '%1' para outra do tipo: '%2'."; diff --git a/msg/js/pt.js b/msg/js/pt.js index c4104bf6f43..5b92799dfe3 100644 --- a/msg/js/pt.js +++ b/msg/js/pt.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Ocultar Blocos"; Blockly.Msg["COLLAPSE_BLOCK"] = "Ocultar Bloco"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "cor 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "cor 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "proporção"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "misturar"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Mistura duas cores com a proporção indicada (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "cor aleatória"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Escolha uma cor aleatoriamente."; Blockly.Msg["COLOUR_RGB_BLUE"] = "azul"; Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "vermelho"; Blockly.Msg["COLOUR_RGB_TITLE"] = "pinte com"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Expandir Bloco"; Blockly.Msg["EXTERNAL_INPUTS"] = "Entradas Externas"; Blockly.Msg["HELP"] = "Ajuda"; Blockly.Msg["INLINE_INPUTS"] = "Entradas Em Linhas"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "criar lista vazia"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Retorna uma lista, de tamanho 0, contendo nenhum registo"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Retorna o tamanho de uma lista."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "criar lista com o item %1 repetido %2 vezes"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Cria uma lista constituída por um dado valor repetido o número de vezes especificado."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "inverter %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Inverter uma cópia da lista."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Define o primeiro item de um Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Define o item na posição especificada de uma lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Define o último item de uma lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Define um item aleatório de uma lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascendente"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descendente"; Blockly.Msg["LISTS_SORT_TITLE"] = "ordenar %1 %2 %3"; @@ -187,14 +187,14 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "http://en.wikipedia.org/wiki/%3F:"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "se falso"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "se verdadeiro"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\"."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://pt.wikipedia.org/wiki/Aritm%C3%A9tica"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Retorna a soma de dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Retorna o quociente da divisão de dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Retorna a diferença de dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Retorna o produto de dois números."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Retorna o primeiro número elevado à potência do segundo número."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 de X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Devolver o arco tangente do ponto (X, Y) em graus entre -180 e 180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "http://pt.wikipedia.org/wiki/Adi%C3%A7%C3%A3o"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Retorna uma das constantes comuns: π (3 Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "restringe %1 inferior %2 superior %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Restringe um número entre os limites especificados (inclusive)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "é divisível por"; Blockly.Msg["MATH_IS_EVEN"] = "é par"; Blockly.Msg["MATH_IS_NEGATIVE"] = "é negativo"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "é inteiro"; Blockly.Msg["MATH_MODULO_HELPURL"] = "http://pt.wikipedia.org/wiki/Opera%C3%A7%C3%A3o_m%C3%B3dulo"; Blockly.Msg["MATH_MODULO_TITLE"] = "resto da divisão de %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Retorna o resto da divisão de dois números."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "http://pt.wikipedia.org/wiki/N%C3%BAmero"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Um número."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Retorna a lista de item(ns) mais comu Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Retorna um elemento aleatório da lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Retorna o desvio padrão dos números da lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Retorna a soma de todos os números da lista."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fração aleatória"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Insere uma fração aleatória entre 0.0 (inclusive) e 1.0 (exclusive)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Retorna o logarítmo em base 10 de u Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Retorna o oposto de um número."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Retorna 10 elevado à potência de um número."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Retorna a raiz quadrada de um número."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -290,11 +290,11 @@ Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "com:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Criar \"%1\""; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Descreva esta função..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "faz algo"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "para"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Cria uma função que não tem retorno."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "retorna"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Cria uma função que possui um valor de retorno."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Aviso: Esta função tem parâmetros duplicados."; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "obter letra aleatória"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "no texto %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Retorna a letra na posição especificada."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "contar %1 em %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Conte quantas vezes um certo texto aparece dentro de algum outro texto."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Acrescentar um item ao texto."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pede ao utilizador um número."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pede ao utilizador um texto."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pede um número com a mensagem"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "Pede um texto com a mensagem"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "substituir %1 por %2 em %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Substituir todas as ocorrências de um certo texto dentro de algum outro texto."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inverter %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inverte a ordem dos caracteres no texto."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres"; diff --git a/msg/js/ro.js b/msg/js/ro.js index 63dbe5beeaf..aaf19736c4b 100644 --- a/msg/js/ro.js +++ b/msg/js/ro.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Restrange blocurile"; Blockly.Msg["COLLAPSE_BLOCK"] = "Restrange blocul"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "culoare 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "culoare 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "Raport"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "amestec"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Amestecă două culori cu un raport dat (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "culoare aleatorie"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Alege o culoare la întâmplare."; Blockly.Msg["COLOUR_RGB_BLUE"] = "albastru"; Blockly.Msg["COLOUR_RGB_GREEN"] = "verde"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "roșu"; Blockly.Msg["COLOUR_RGB_TITLE"] = "colorează cu"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Creează o culoare cu suma specificată de roșu, verde și albastru. Toate valorile trebuie să fie între 0 și 100."; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Dacă o valoare este adevărată, atunci Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Dacă o valoare este adevărat, atunci face primul bloc de declarații. Altfel, face al doilea bloc de declarații."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Dacă prima valoare este adevărat, atunci face primul bloc de declarații. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declarații."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Dacă prima valoare este adevărat, atunci face primul bloc de declarații. Altfel, dacă a doua valoare este adevărat, face al doilea bloc de declarații. În cazul în care niciuna din valori nu este adevărat, face ultimul bloc de declarații."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fă"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repetă de %1 ori"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Face unele afirmații de mai multe ori."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Extinde bloc"; Blockly.Msg["EXTERNAL_INPUTS"] = "Intrări externe"; Blockly.Msg["HELP"] = "Ajutor"; Blockly.Msg["INLINE_INPUTS"] = "Intrări în linie"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "creează listă goală"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returnează o listă, de lungime 0, care nu conține înregistrări de date"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listă"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Setează primul element înt Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Setează elementul de la poziția specificată dintr-o listă."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Setează ultimul element într-o listă."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Setează un element aleator într-o listă."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "crescător"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descrescător"; Blockly.Msg["LISTS_SORT_TITLE"] = "sortați %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "fals"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returnează adevărat sau fals."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "adevărat"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Returnează adevărat dacă ambele intrări sunt egale."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Returnează adevărat dacă prima intrare este mai mare decât a doua intrare."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Returnează adevărat dacă prima intrare este mai mare sau egală cu a doua intrare."; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "non %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Returnează adevărat dacă intrarea este falsă. Returnează fals dacă intrarea este adevărată."; Blockly.Msg["LOGIC_NULL"] = "nul"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "returnează nul."; Blockly.Msg["LOGIC_OPERATION_AND"] = "și"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,21 +183,21 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "sau"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Returnează adevărat daca ambele intrări sunt adevărate."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Returnează adevărat dacă cel puțin una din intrări este adevărată."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "dacă este fals"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "dacă este adevărat"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Verifică condiția din „test”. Dacă condiția este adevărată, returnează valoarea „în cazul în care adevărat”; în caz contrar întoarce valoarea „în cazul în care e fals”."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://ro.wikipedia.org/wiki/Aritmetic%C4%83"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnează suma a două numere."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnează câtul celor două numere."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returnează diferența dintre cele două numere."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnează produsul celor două numere."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Întoarceți arctangentul punctului (X, Y) în grade de la -180 la 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "schimbă %1 de %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Adaugă un număr variabilei '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ro.wikipedia.org/wiki/Constant%C4%83_matematic%C4%83"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Întoarcă una din constantele comune: Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrânge %1 redus %2 ridicat %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrânge un număr să fie între limitele specificate (inclusiv)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "este divizibil cu"; Blockly.Msg["MATH_IS_EVEN"] = "este par"; Blockly.Msg["MATH_IS_NEGATIVE"] = "este negativ"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "este pozitiv"; Blockly.Msg["MATH_IS_PRIME"] = "este prim"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Verifică dacă un număr este un par, impar, prim, întreg, pozitiv, negativ, sau dacă este divizibil cu un anumit număr. Returnează true sau false."; Blockly.Msg["MATH_IS_WHOLE"] = "este întreg"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "restul la %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Întoarce restul din împărțirea celor două numere."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Un număr."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "media listei"; @@ -237,19 +237,19 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Returnează o listă cu cel(e) mai fr Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returnează un element aleatoriu din listă."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Întoarce deviația standard a listei."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Returnează suma tuturor numerelor din lista."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fracții aleatorii"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Returnează o fracție aleatoare între 0.0 (inclusiv) și 1.0 (exclusiv)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "un număr întreg aleator de la %1 la %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "rotund"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "rotunjit"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "rotunjește în sus"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Rotunjirea unui număr în sus sau în jos."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolută"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "rădăcina pătrată"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Returnează valoarea absolută a unui număr."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returnează logaritmul în baza 10 a Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnează negația unui număr."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Returnează 10 la puterea unui număr."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnează rădăcina pătrată a unui număr."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctg"; @@ -282,15 +282,15 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tip nou de variabilă"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permite declarațiile"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "cu:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Executați funcția '%1 'definită de utilizator."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Executați funcția „%1” definită de utilizator și folosiți producția sa."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "cu:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Creați „%1”"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Descrieți această funcție ..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "fă ceva"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "la"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Crează o funcție cu nicio ieșire."; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Înlocuiți toate aparițiile anumitor te Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "inversă %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Inversează ordinea caracterelor din text."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "O literă, cuvânt sau linie de text."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "taie spațiile de pe ambele părți ale"; diff --git a/msg/js/ru.js b/msg/js/ru.js index 48f7159961c..18115ee58ed 100644 --- a/msg/js/ru.js +++ b/msg/js/ru.js @@ -7,7 +7,7 @@ var Blockly = Blockly || { Msg: Object.create(null) }; Blockly.Msg["ADD_COMMENT"] = "Добавить комментарий"; Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Невозможно удалить переменную '%1', поскольку она является частью определения функции '%2'"; Blockly.Msg["CHANGE_VALUE_TITLE"] = "Измените значение:"; -Blockly.Msg["CLEAN_UP"] = "Очистить блоки"; +Blockly.Msg["CLEAN_UP"] = "Упорядочить блоки"; Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Свёрнутые блоки содержат предупреждения."; Blockly.Msg["COLLAPSE_ALL"] = "Свернуть блоки"; Blockly.Msg["COLLAPSE_BLOCK"] = "Свернуть блок"; @@ -81,13 +81,13 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "создать пустой спис Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Возвращает список длины 0, не содержащий данных"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "список"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Добавьте, удалите, переставьте элементы для переделки блока списка."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "создать список из"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Добавляет элемент к списку."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Создаёт список с любым числом элементов."; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "первый"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "№ с конца"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "№"; Blockly.Msg["LISTS_GET_INDEX_GET"] = "взять"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "взять и удалить"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "последний"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Возвращает длину спис Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "создать список из элемента %1, повторяющегося %2 раз"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Создаёт список, состоящий из заданного числа копий элемента."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "изменить порядок на обратный %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Изменить порядок списка на обратный."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Присваивает зн Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Присваивает значение элементу в указанной позиции списка."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Присваивает значение последнему элементу списка."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Присваивает значение случайному элементу списка."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "по возрастанию"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "по убыванию"; Blockly.Msg["LISTS_SORT_TITLE"] = "сортировать %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Сортировать копию спис Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "по алфавиту, без учёта регистра"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "числовая"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "по алфавиту"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "сделать список из текста"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "собрать текст из списка"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Соединяет список текстов в один текст с разделителями."; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "не %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Возвращает значение истина, если вставка ложна. Возвращает значение ложь, если вставка истинна."; Blockly.Msg["LOGIC_NULL"] = "ничто"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Возвращает ничто."; Blockly.Msg["LOGIC_OPERATION_AND"] = "и"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Возвращает частн Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Возвращает разность двух чисел."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Возвращает произведение двух чисел."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Возвращает первое число, возведённое в степень второго числа."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 от X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Возвращает арктангенс точки (X, Y) в градусах от -180 до 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://ru.wikipedia.org/wiki/Идиома_(программирование)#Инкремент"; Blockly.Msg["MATH_CHANGE_TITLE"] = "увеличить %1 на %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Добавляет число к переменной '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ru.wikipedia.org/wiki/Математическая_константа"; @@ -215,7 +215,7 @@ Blockly.Msg["MATH_IS_PRIME"] = "простое"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь."; Blockly.Msg["MATH_IS_WHOLE"] = "целое"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://ru.wikipedia.org/wiki/Деление_с_остатком"; -Blockly.Msg["MATH_MODULO_TITLE"] = "остаток от %1 : %2"; +Blockly.Msg["MATH_MODULO_TITLE"] = "остаток от %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Возвращает остаток от деления двух чисел."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://ru.wikipedia.org/wiki/Число"; @@ -239,10 +239,10 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Возвращает станда Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Возвращает сумму всех чисел в списке."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; -Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случайное число от 0 (включительно) до 1"; +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случайное число от 0.0 до 1.0 (вкл.)"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Возвращает случайное число от 0.0 (включительно) до 1.0."; Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел"; -Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "случайное целое число от %1 для %2"; +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "случайное целое число от %1 до %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Возвращает случайное число между двумя заданными пределами (включая и их)."; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://ru.wikipedia.org/wiki/Округление"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "округлить"; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Возвращает противоп Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Возвращает 10 в указанной степени."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Возвращает квадратный корень числа."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; Blockly.Msg["MATH_TRIG_HELPURL"] = "https://ru.wikipedia.org/wiki/Тригонометрические_функции"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Возвращает арккосинус (в градусах)."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Возвращает арксинус (в градусах)."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Возвращает арктангенс (в градусах)"; @@ -290,16 +290,16 @@ Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "с:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Создать вызов '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Опишите эту функцию…"; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Подпрограмма"; Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "выполнить что-то"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "чтобы"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Создаёт процедуру, не возвращающую значение."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://ru.wikipedia.org/wiki/Функция_(программирование)"; Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "вернуть"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Создаёт процедуру, возвращающую значение."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Предупреждение: эта функция имеет повторяющиеся параметры."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Выделить определение процедуры"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Если первое значение истинно, возвращает второе значение."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Предупреждение: Этот блок может использоваться только внутри определения функции."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "имя параметра:"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "взять случайную букву"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "в тексте %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Возвращает букву в указанной позиции."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "подсчитать количество %1 в %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Подсчитать, сколько раз отрывок текста появляется в другом тексте."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Добавить элемент к тексту."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Запросить у пользо Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Запросить у пользователя текст."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "запросить число с подсказкой"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "запросить текст с подсказкой"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "заменить %1 на %2 в %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Заменить все вхождения некоторого текста другим текстом."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "изменить порядок на обратный %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Меняет порядок символов в тексте на обратный."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://ru.wikipedia.org/wiki/Строковый_тип"; @@ -390,7 +390,7 @@ Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Создать вставку %1"; Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Присваивает переменной значение вставки."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Переменная с именем '%1' уже существует."; -Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Название переменной '%1' уже используется другой типа: '%2'."; +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Название переменной '%1' уже используется для другого типа: '%2'."; Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Рабочая область Blockly"; Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Напишите здесь что-нибудь..."; Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; diff --git a/msg/js/sc.js b/msg/js/sc.js index 87d9130fe1c..81e9e512721 100644 --- a/msg/js/sc.js +++ b/msg/js/sc.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "raportu"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mestura"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Amestura duus coloris cun unu raportu (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Scebera unu colori de sa tauledda."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "Unu colori a brítiu"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Si su valori est berus, tandu fait parig Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Si su valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, fai su segundu brocu de is cumandus."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Si su primu valori est beridadi, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est beridadi, fai su segundu brocu de is cumandus."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Si su primu valori est berus, tandu fai su primu brocu de is cumandus. Sinuncas, si su segundu valori est berus, fai su segundu brocu de is cumandus. Si mancu unu valori est berus, tandu fai s'urtimu brocu de is cumandus."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "fai"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "repiti %1 bortas"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Fait pariga de cumandus prus bortas."; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "frassu"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Torrat berus o frassu."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "berus"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Torrat berus si is inputs funt unu uguali a s'àteru."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Torrat berus si su primu input est prus mannu de s'àteru."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Torrat berus si su primu input est prus mannu o uguali a s'àteru."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "si frassu"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "si berus"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Torrat sa summa de is duus nùmerus."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Torrat su cuotzienti de is duus nùmerus."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Torrat sa diferèntzia de is duus nùmerus."; @@ -197,10 +197,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Torrat su primu numeru artziau a Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "muda %1 de %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Aciungi unu numeru a sa variabili '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Torrat una de is costantis comunas: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), o ∞ (infiniu)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "custringi %1 de %2 a %3"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "est positivu"; Blockly.Msg["MATH_IS_PRIME"] = "est primu"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Cumprova si unu numeru est paris, dìsparis, primu, intreu, positivu, negativu o si fait a ddu dividi po unu numeru giau. Torrat berus o frassu."; Blockly.Msg["MATH_IS_WHOLE"] = "est intreu"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "arrestu de %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Torrat s'arrestu de sa divisioni de duus numerus."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Unu numeru"; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "mèdia de sa lista"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Torrat unu item a brìtiu de sa lis Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Torrat sa deviadura standard de sa lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Torrat sa suma de totu is numerus de sa lista."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "una fratzioni a brìtiu"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "numeru intreu a brítiu de %1 a %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus)."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "arretunda"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "arretunda faci a bàsciu."; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "Arretunda faci a susu"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Arretunda unu numeru faci a susu o faci a bàsciu."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "assolutu"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "arraxina cuadra"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Torrat su valori assolútu de unu numeru."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Torrat su arccosinu de unu numeru."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "permiti decraratzionis"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "con:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "cun"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ingenerau'%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text withi Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Una lìtera, paràula, o linia de testu."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "bogat spàtzius de ambus càbudus de"; diff --git a/msg/js/sd.js b/msg/js/sd.js index bf3bc54192e..efd06af7046 100644 --- a/msg/js/sd.js +++ b/msg/js/sd.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "تناسب"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "گڏيل"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ڄاڻايل تناسب سان ٻہ رنگ پاڻ ۾ ملايو (0.0-1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "رنگ دٻيءَ مان رنگ چونڊيو."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "بنا ترتيب رنگ"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ڪريو"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "1٪ ڀيرا ورجايو"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; // untranslated @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ڪُوڙ"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "درست يا غير درست وراڻي ٿو."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "سچ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "جيڪڏهن ٻئي ان پُٽس برابر آهن تہ درست وراڻيو"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي تہ درست وراڻيو."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان وڏو آهي يا ٻئي برابر آهن تہ درست وراڻيو."; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "جيڪڏهن ڪوڙو"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "جيڪڏهن سچو"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "ٻن انگن جي جوڙ اپت ڏيو."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "ٻنهي انگن جي ونڊ ڏيو."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "ٻنهي انگن جو تفاوت ڏيو."; diff --git a/msg/js/sk.js b/msg/js/sk.js index 235802712d6..2d678dca0df 100644 --- a/msg/js/sk.js +++ b/msg/js/sk.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "pomer"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "zmiešať"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Zmieša dve farby v danom pomere (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Zvoľte farbu z palety."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "náhodná farba"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Ak je hodnota pravda, vykonaj príkazy." Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Ak je hodnota pravda, vykonaj príkazy v prvom bloku. Inak vykonaj príkazy v druhom bloku."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Ak je prvá hodnota pravda, vykonaj príkazy v prvom bloku. Inak, ak je druhá hodnota pravda, vykonaj príkazy v druhom bloku. Ak ani jedna hodnota nie je pravda, vykonaj príkazy v poslednom bloku."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "rob"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "opakuj %1 krát"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Opakuj určité príkazy viackrát."; @@ -81,7 +81,7 @@ Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "prázdny zoznam"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky."; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "zoznam"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Pridaj, odstráň alebo zmeň poradie v tomto zoznamovom bloku."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "vytvor zoznam s"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Pridaj prvok do zoznamu."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Vytvor zoznam s ľubovoľným počtom prvkov."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastaví prvý prvok v zozna Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastaví prvok na určenej pozícii v zozname."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Nastaví posledný prvok v zozname."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Nastaví posledný prvok v zozname."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "Vzostupne"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "Zostupne"; Blockly.Msg["LISTS_SORT_TITLE"] = "zoradiť %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "nepravda"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vráť buď hodnotu pravda alebo nepravda."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "pravda"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vráť hodnotu pravda, ak sú vstupy rovnaké."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Vráť hodnotu pravda ak prvý vstup je väčší než druhý."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vráť hodnotu pravda ak prvý vstup je väčší alebo rovný druhému."; @@ -188,16 +188,16 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ak nepravda"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ak pravda"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\"."; Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vráť súčet dvoch čísel."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vráť podiel dvoch čísel."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Vráť rozdiel dvoch čísel."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Vráť súčin dvoch čísel."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vráť prvé číslo umocnené druhým."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Vráťte arktangent bodu (X, Y) v stupňoch od -180 do 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "zmeniť %1 o %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Pridaj číslo do premennej \"%1\"."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant‎"; @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "je kladné"; Blockly.Msg["MATH_IS_PRIME"] = "je prvočíslo"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Skontroluj či je číslo párne, nepárne, celé, kladné, záporné alebo deliteľné určitým číslom. Vráť hodnotu pravda alebo nepravda."; Blockly.Msg["MATH_IS_WHOLE"] = "je celé číslo"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "zvyšok po delení %1 + %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vráť zvyšok po delení jedného čísla druhým."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Číslo."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "priemer zoznamu"; @@ -238,18 +238,18 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vráť náhodne zvolený prvok zozn Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vráť smeroddajnú odchýlku zoznamu."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vráť súčet všetkých čísel v zozname."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "náhodné číslo od 0 do 1"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "náhodné celé číslo od %1 do %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vráť náhodné celé číslo z určeného intervalu (vrátane)."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "zaokrúhli"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "zaokrúhli nadol"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "zaokrúhli nahor"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Zaokrúhli číslo nahor alebo nadol."; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "absolútna hodnota"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "druhá odmocnina"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "Vráť absolútnu hodnotu čísla."; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Vráť arkus kosínus čísla."; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zameniť všetky výskyty textu za iný t Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "text odzadu %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrátiť poradie písmen v texte."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Písmeno, slovo alebo riadok textu."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "odstráň medzery z oboch strán"; diff --git a/msg/js/skr-arab.js b/msg/js/skr-arab.js index c540449daa9..410987d7af9 100644 --- a/msg/js/skr-arab.js +++ b/msg/js/skr-arab.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "نسبت"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "مرکب"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; // untranslated Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "بنا ترتيب رنگ"; @@ -69,7 +69,7 @@ Blockly.Msg["DIALOG_CANCEL"] = "منسوخ"; Blockly.Msg["DIALOG_OK"] = "ٹھیک ہے"; Blockly.Msg["DISABLE_BLOCK"] = "بلاک ہٹاؤ"; Blockly.Msg["DUPLICATE_BLOCK"] = "ڈپلیکیٹ"; -Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["DUPLICATE_COMMENT"] = " نقل تبصرہ"; Blockly.Msg["ENABLE_BLOCK"] = "بلاک فعال کرو"; Blockly.Msg["EXPAND_ALL"] = "بلاکوں کوں کھنڈاؤ"; Blockly.Msg["EXPAND_BLOCK"] = "بلاک کھنڈاؤ"; @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "اگر کوڑ ہے"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "اگر سچ ہے"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated @@ -380,7 +380,7 @@ Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "trim spaces from right side of"; // Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Return a copy of the text with spaces removed from one or both ends."; // untranslated Blockly.Msg["TODAY"] = "اڄ"; Blockly.Msg["UNDO"] = "واپس"; -Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "بغیر ناں"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "آئٹم"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Create 'set %1'"; // untranslated Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated diff --git a/msg/js/sl.js b/msg/js/sl.js index 2116fcbf50e..f9f422c2381 100644 --- a/msg/js/sl.js +++ b/msg/js/sl.js @@ -9,11 +9,11 @@ Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Ni mogoče izbrisati spremenl Blockly.Msg["CHANGE_VALUE_TITLE"] = "Spremeni vrednost:"; Blockly.Msg["CLEAN_UP"] = "Ponastavi bloke"; Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Skrčeni bloki vsebujejo opozorila."; -Blockly.Msg["COLLAPSE_ALL"] = "Skrči bloke"; -Blockly.Msg["COLLAPSE_BLOCK"] = "Skrči blok"; +Blockly.Msg["COLLAPSE_ALL"] = "Strni bloke"; +Blockly.Msg["COLLAPSE_BLOCK"] = "Strni blok"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "barva 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "barva 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "razmerje"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "mešanica"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Zmeša dve barvi v določene razmerju (0,0 – 1,0)."; @@ -24,25 +24,25 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "naključna barva"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Izberite naključno barvo."; Blockly.Msg["COLOUR_RGB_BLUE"] = "modra"; Blockly.Msg["COLOUR_RGB_GREEN"] = "zelena"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "rdeča"; Blockly.Msg["COLOUR_RGB_TITLE"] = "določena barva"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "prekini zanko"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "nadaljuj z naslednjo ponovitvijo zanke"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Prekine vsebujočo zanko."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Pozor: Ta blok lahko uporabite znotraj zanke samo enkrat."; -Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "za vsak element %1 v seznamu %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "Za vsak element v seznamu nastavi spremenljivko »%1« na ta element. Pri tem se izvedejo določeni stavki."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "štej s/z %1 od %2 do %3 po %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Vrednost spremenljivke »%1« se v določenem koraku spreminja od začetnega do končnega števila. Pri tem se izvedejo določeni bloki."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Dodajte bloku »če« pogoj."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Dodajte bloku »če« končni pogoj."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Dodajte, odstranite ali spremenite vrstni red odsekov za ponovno nastavitev bloka »če«."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "sicer"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "sicer če"; @@ -55,7 +55,7 @@ Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://sl.wikipedia.org/wiki/Zanka_fo Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "izvedi"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ponovi %1-krat"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Določeni stavki se izvedejo večkrat."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ponavljaj, dokler ni"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ponavljaj, dokler"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Določeni stavki se izvajajo, dokler je vrednost neresnična."; @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "Razširi blok"; Blockly.Msg["EXTERNAL_INPUTS"] = "Zunanji vnosi"; Blockly.Msg["HELP"] = "Pomoč"; Blockly.Msg["INLINE_INPUTS"] = "Vrstični vnosi"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "ustvari prazen seznam"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Vrne seznam dolžine 0, ki ne vsebuje nobenih podatkovnih zapisov."; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "seznam"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Doda, odstrani ali spremeni vrstni red blokov seznama."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "ustvari seznam iz"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Doda element v seznam."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Ustvari seznam s poljubnim številom elementov."; @@ -109,7 +109,7 @@ Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Odstrani naključni elem Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "do mesta št. od konca"; Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "do mesta št."; Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "do zadnjega mesta"; -Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "ustvari podseznam od prvega mesta"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "ustvari podseznam od mesta št. od konca"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "ustvari podseznam od mesta št."; @@ -118,23 +118,23 @@ Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Ustvari kopijo določenega dela sezn Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "Zadnji element je št. %1."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "Prvi element je št. %1."; Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "najdi prvo pojavitev elementa"; -Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated Blockly.Msg["LISTS_INDEX_OF_LAST"] = "najdi zadnjo pojavitev elementa"; Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1."; Blockly.Msg["LISTS_INLIST"] = "v seznamu"; -Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 je prazen"; Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Vrne resnično, če je seznam prazen."; -Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated Blockly.Msg["LISTS_LENGTH_TITLE"] = "dolžina %1"; Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Vrne dolžino seznama."; -Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "ustvari seznam z elementom %1, ki se ponovi %2-krat"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Ustvari seznam iz dane vrednosti z določenim številom ponovitev."; Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "obrni %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Obrne kopijo seznama."; -Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "element"; Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "vstavi na"; Blockly.Msg["LISTS_SET_INDEX_SET"] = "nastavi na"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Nastavi prvi element seznama Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Nastavi element na določenem mestu v seznamu."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Nastavi zadnji element seznama."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Nastavi naključni element seznama."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "naraščajoče"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "padajoče"; Blockly.Msg["LISTS_SORT_TITLE"] = "uredi %1 %2 %3"; @@ -154,40 +154,40 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Uredi kopijo seznama."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "abecedno, prezri velikost črk"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "številsko"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "abecedno"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "ustvari seznam iz besedila"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "ustvari besedilo iz seznama"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Združi seznam besedil v eno besedilo z ločilom med besedili."; Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Razdruži besedilo v seznam besedil s prelomom pri vsakem ločilu."; Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "z ločilom"; Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "neresnično"; -Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Vrne resnično ali neresnično."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "resnično"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Vrne resnično, če sta vnosa enaka."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Vrne resnično, če je prvi vnos večji od drugega."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Vrne resnično, če je prvi vnos večji ali enak drugemu."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Vrne resnično, če je prvi vnos manjši od drugega."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Vrne resnično, če je prvi vnos manjši ali enak drugemu."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Vrne resnično, če vnosa nista enaka."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ne %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen."; Blockly.Msg["LOGIC_NULL"] = "prazno"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Vrne prazno."; Blockly.Msg["LOGIC_OPERATION_AND"] = "in"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "ali"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Vrne resnično, če sta oba vnosa resnična."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Vrne resnično, če je vsaj eden od vnosov resničen."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "če neresnično"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "če resnično"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://sl.wikipedia.org/wiki/Aritmetika"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vrne vsoto dveh števil."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vrne količnik dveh števil."; @@ -202,10 +202,10 @@ Blockly.Msg["MATH_CHANGE_TITLE"] = "spremeni %1 za %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Prišteje število k spremenljivki »%1«."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sl.wikipedia.org/wiki/Matematična_konstanta"; Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Vrne eno izmed pogostih konstant: π (3,141…), e (2,718…), φ (1,618…), sqrt(2) (1,414…), sqrt(½) (0,707 ...) ali ∞ (neskončno)."; -Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29"; +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "omeji %1 na najmanj %2 in največ %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Omeji število, da bo med določenima (vključenima) mejama."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je deljivo s/z"; Blockly.Msg["MATH_IS_EVEN"] = "je sodo"; Blockly.Msg["MATH_IS_NEGATIVE"] = "je negativno"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "je celo"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://sl.wikipedia.org/wiki/Modulo"; Blockly.Msg["MATH_MODULO_TITLE"] = "ostanek pri %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vrne ostanek pri deljenju dveh števil."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://sl.wikipedia.org/wiki/%C5%A0tevilo"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Število."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,11 +237,11 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vrne seznam najpogostejšega(ih) elem Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vrne naključno število izmed števil v seznamu."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vrne standardni odmik elementov v seznamu."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vrne vsoto vseh števil v seznamu."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "naključni ulomek"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vrne naključni ulomek med (vključno) 0,0 in 1,0 (izključno)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "naključno število med %1 in %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Vrne naključno število med dvema določenima mejama, vključno z mejama."; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://sl.wikipedia.org/wiki/Zaokro%C5%BEanje"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vrne desetiški logaritem števila." Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Vrne negacijo števila."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Vrne 10 na potenco števila."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Vrne kvadratni koren števila."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; @@ -290,16 +290,16 @@ Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "s/z:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ustvari »%1«"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Opiši funkcijo ..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "nekaj"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "izvedi"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Ustvari funkcijo brez izhoda."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "vrni"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Ustvari funkcijo z izhodom."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Pozor: Ta funkcija ima podvojene parametre."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Označi blok funkcije"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Če je vrednost resnična, vrne drugo vrednost."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Pozor: Ta blok lahko uporabite samo v bloku funkcije."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "ime vnosa:"; @@ -310,10 +310,10 @@ Blockly.Msg["REDO"] = "Ponovi"; Blockly.Msg["REMOVE_COMMENT"] = "Odstrani komentar"; Blockly.Msg["RENAME_VARIABLE"] = "Preimenuj spremenljivko ..."; Blockly.Msg["RENAME_VARIABLE_TITLE"] = "Preimenuj vse spremenljivke »%1« v:"; -Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_APPEND_TITLE"] = "k %1 dodaj besedilo %2"; Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Doda besedilo k spremenljivki »%1«."; -Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "v male črke"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "v Velike Začetnice"; Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "v VELIKE ČRKE"; @@ -321,7 +321,7 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Vrne kopijo besedila v drugi obliki."; Blockly.Msg["TEXT_CHARAT_FIRST"] = "vrni prvo črko"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "vrni črko št. od konca"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "vrni črko št."; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "vrni zadnjo črko"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "vrni naključno črko"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated @@ -336,31 +336,31 @@ Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Doda, odstrani ali spremeni vrstni re Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "do črke št. od konca"; Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "do črke št."; Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "do zadnje črke"; -Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "iz besedila"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "vrni podniz od prve črke"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "vrni podniz od črke št. od konca"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "vrni podniz od črke št."; Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Vrne določen del besedila."; -Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "najdi prvo pojavitev besedila"; Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "najdi zadnjo pojavitev besedila"; Blockly.Msg["TEXT_INDEXOF_TITLE"] = "v besedilu %1 %2 %3"; Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1."; -Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 je prazno"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Vrne resnično, če je določeno besedilo prazno."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "ustvari besedilo iz"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Ustvari besedilo tako, da združi poljubno število elementov."; -Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated Blockly.Msg["TEXT_LENGTH_TITLE"] = "dolžina %1"; Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Vrne število znakov (vključno s presledki) v določenem besedilu."; -Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated Blockly.Msg["TEXT_PRINT_TITLE"] = "izpiši %1"; Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Izpiše določeno besedilo, številko ali drugo vrednost."; -Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Vpraša uporabnika za vnos številke."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Vpraša uporabnika za vnos besedila."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "vprašaj za številko s sporočilom"; @@ -373,7 +373,7 @@ Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "obrni %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrne vrstni red znakov v besedilu."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sl.wikipedia.org/wiki/Niz"; Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Črka, beseda ali vrstica besedila."; -Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "odstrani presledke z obeh strani"; Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "odstrani presledke z leve strani"; Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "odstrani presledke z desne strani"; @@ -383,11 +383,11 @@ Blockly.Msg["UNDO"] = "Razveljavi"; Blockly.Msg["UNNAMED_KEY"] = "nepoimenovano"; Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "element"; Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Ustvari »nastavi %1«"; -Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Vrne vrednost spremenljivke."; Blockly.Msg["VARIABLES_SET"] = "nastavi %1 na %2"; Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Ustvari »vrni %1«"; -Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Nastavi, da je vrednost spremenljivke enaka vnosu."; Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "Spremenljivka »%1« že obstaja."; Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "Spremenljivka z imenom »%1« za tip »%2« že obstaja."; diff --git a/msg/js/sq.js b/msg/js/sq.js index c86e4d6a3ea..ce76a87862b 100644 --- a/msg/js/sq.js +++ b/msg/js/sq.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Mbyll blloqet"; Blockly.Msg["COLLAPSE_BLOCK"] = "Mbyll bllokun"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "Ngjyra 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "Ngjyra 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "Perpjesetim"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "Përzierje"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Perzien dy ngjyra së bashku me një raport të dhënë (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ngjyre e rastesishme"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Zgjidhni një ngjyrë në mënyrë të rastësishme."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blu"; Blockly.Msg["COLOUR_RGB_GREEN"] = "jeshile"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "e kuqe"; Blockly.Msg["COLOUR_RGB_TITLE"] = "ngjyre me"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Krijo një ngjyrë me shumën e specifikuar te te kuqes, te gjelbëres, dhe bluse. Te gjitha vlerat duhet te jene mes 0 dhe 100."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Zmadho bllokun"; Blockly.Msg["EXTERNAL_INPUTS"] = "Hyrjet e jashtme"; Blockly.Msg["HELP"] = "Ndihmë"; Blockly.Msg["INLINE_INPUTS"] = "Hyrjet e brendshme"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "krijo një listë të zbrazët"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Kthen një listë, te gjatësisë 0, duke mos përmbajtur asnjë regjistrim të të dhënave"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "listë"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Vendos sendin e parë në li Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Vendos sendin në pozicionin e specifikuar në listë."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Vendos sendin e fundit në listë."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Vendos një send të rastësishëm në listë."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ngjitje"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "zbritje"; Blockly.Msg["LISTS_SORT_TITLE"] = "rendit %1 %2 %3"; @@ -187,14 +187,14 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "http://en.wikipedia.org/wiki/%3F:"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "nëse e pasaktë"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "nëse e saktë"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kontrollo kushtin në 'test'. Nëse kushti është i saktë, kthen vlerën 'nëse e saktë'; përndryshe kthen vlerën 'nëse e pasaktë'."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "http://sq.wikipedia.org/wiki/Aritmetika"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Kthen shumën e dy numrave."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Kthen herësin e dy numrave."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Kthen ndryshimin e dy numrave."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Kthen produktin e dy numrave."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Kthen numrin e parë të ngritur në fuqinë e numrit të dytë."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Ktheni arkangjentin e pikës (X, Y) në gradë nga -180 në 180."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "http://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Kthen një nga konstantet e përbashkët Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "detyro %1 e ulët %2 e lartë %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Vëni një numër që të jetë në mes të kufive të specifikuara(përfshirëse)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "është i pjestueshme me"; Blockly.Msg["MATH_IS_EVEN"] = "është çift"; Blockly.Msg["MATH_IS_NEGATIVE"] = "është negativ"; @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Kthe listën e sendit(eve) më të za Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Kthe një element të rastësishëm nga lista."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Kthe devijimin standard të listës."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Kthe shumën e të gjithë numrave të listës."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "http://en.wikipedia.org/wiki/Random_number_generation"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "fraksioni i rastësishëm"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Kthe fraksionin e rastësishëm në mes të 0.0 (përfshirëse) dhe 1.0 (jopërfshirëse)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Kthen 10 logaritmet bazë të një n Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Kthe negacionin e një numri."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Kthen 10 në fuqinë e një numri."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Kthen rrënjën katrore të një numri."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "acosinus"; Blockly.Msg["MATH_TRIG_ASIN"] = "asinus"; Blockly.Msg["MATH_TRIG_ATAN"] = "atangjentë"; @@ -282,19 +282,19 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Tip i ri i variablës:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "lejo deklaratat"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "me:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Lësho funksionin e definuar nga përdoruesi '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Lëho funksionin e definuar nga përdoruesi '%1' dhe përdor daljen e tij."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "me:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Krijo '%1'"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Përshkruaj këtë funksion..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "bëj diqka"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "te"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Krijon një funksion pa dalje."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "rikthe"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Krijon një funksion me një dalje."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Paralajmërim: Ky funksion ka parametra të dyfishuar."; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "merr nje shkronje te rastesishme"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "në tekst %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Kthe nje shkronje nga nje pozicion i caktuar."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "numro %1 në %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Numrin sa herë paraqitet një tekst brenda një teksti tjetër."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Shto nje gje ne tekst"; diff --git a/msg/js/sr-latn.js b/msg/js/sr-latn.js index b37f0e9a0af..9dbc447fd74 100644 --- a/msg/js/sr-latn.js +++ b/msg/js/sr-latn.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Skupi blokove"; Blockly.Msg["COLLAPSE_BLOCK"] = "Skupi blok"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "boja 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "boja 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "odnos"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "pomešaj"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Pomešati dve boje zajedno sa datim odnosom (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "slučajna boja"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Izaberite boju nasumice."; Blockly.Msg["COLOUR_RGB_BLUE"] = "plava"; Blockly.Msg["COLOUR_RGB_GREEN"] = "zelena"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "crvena"; Blockly.Msg["COLOUR_RGB_TITLE"] = "boja sa"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kreiraj boju sa određenom količinom crvene,zelene, i plave. Sve vrednosti moraju biti između 0 i 100."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Proširi blok"; Blockly.Msg["EXTERNAL_INPUTS"] = "Spoljni ulazi"; Blockly.Msg["HELP"] = "Pomoć"; Blockly.Msg["INLINE_INPUTS"] = "Unutrašnji ulazi"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "napravi prazan spisak"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "vraća listu, dužine 0, ne sadržavajući evidenciju podataka"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "spisak"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Vraća dužinu spiska."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "Napraviti listu sa stavkom %1 koja se ponavlja %2 puta"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Pravi listu koja se sastoji od zadane vrednosti koju ponavljamo određeni broj šuta."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "obrnuto %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Obrni kopiju spiska."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Postavlja prvu stavku na spi Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Postavlja stavku na određeni položaj na spisku."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Postavlja poslednju stavku na spisku."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Postavlja slučajnu stavku na spisku."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "rastuće"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "opadajuće"; Blockly.Msg["LISTS_SORT_TITLE"] = "sortiraj %1 %2 %3"; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "nije %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Vraća vrednost „tačno“ ako je ulaz netačan. Vraća vrednost „netačno“ ako je ulaz tačan."; Blockly.Msg["LOGIC_NULL"] = "bez vrednosti"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Vraća „bez vrednosti“."; Blockly.Msg["LOGIC_OPERATION_AND"] = "i"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,12 +183,12 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "ili"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Vraća vrednost „tačno“ ako su oba ulaza tačna."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Vraća vrednost „tačno“ ako je bar jedan od ulaza tačan."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "proba"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ako je netačno"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ako je tačno"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Proveri uslov u 'test'. Ako je uslov tačan, tada vraća 'if true' vrednost; u drugom slučaju vraća 'if false' vrednost."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Vratite zbir dva broja."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Vraća količnik dva broja."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Vraća razliku dva broja."; @@ -197,7 +197,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Vraća prvi broj stepenovan drug Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "promeni %1 za %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Dodajte broj promenljivoj „%1“."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sr.wikipedia.org/wiki/Matematička_konstanta"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "vrati jednu od zajedničkih konstanti: Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ograniči %1 nisko %2 visoko %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ograničava broj na donje i gornje granice (uključivo)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "je deljiv sa"; Blockly.Msg["MATH_IS_EVEN"] = "je paran"; Blockly.Msg["MATH_IS_NEGATIVE"] = "je negativan"; @@ -217,8 +217,8 @@ Blockly.Msg["MATH_IS_WHOLE"] = "je ceo"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://sr.wikipedia.org/wiki/Kongruencija"; Blockly.Msg["MATH_MODULO_TITLE"] = "podsetnik od %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Vraća podsetnik od deljenja dva broja."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Neki broj."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "prosek spiska"; @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Vraća najčešće stavke sa spiska." Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Vraća slučajni element sa spiska."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Vraća standardnu devijaciju spiska."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Vraća zbir svih brojeva sa spiska."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sr.wikipedia.org/wiki/Generator_slučajnih_brojeva"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "slučajni razlomak"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Vraća slučajni razlomak između 0.0 (uključivo) i 1.0 (isključivo)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Vraća logaritam broja sa osnovom 10 Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Vraća negaciju broja."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Vraća 10-ti stepen broja."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Vraća kvadratni koren broja."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "arc cos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arc sin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arc tan"; @@ -282,19 +282,19 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "dozvoliti izreke"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "sa:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Pokrenite prilagođenu funkciju „%1“."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Pokrenite prilagođenu funkciju „%1“ i koristi njen izlaz."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "sa:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Napravi „%1“"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Opisati ovu funkciju..."; Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "uradite nešto"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "da"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Pravi funkciju bez izlaza."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "vrati"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Pravi funkciju sa izlazom."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Upozorenje: Ova funkcija ima duplikate parametara."; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "preuzmi slučajno slovo"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "u tekstu %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Vraća slovo na određeni položaj."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "broj %1 u %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Broji koliko puta se neki tekst pojavljuje unutar nekog drugog teksta."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Dodajte stavku u tekst."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Pitajte korisnika za broj."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Pitajte korisnika za unos teksta."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "pitaj za broj sa porukom"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "pitaj za tekst sa porukom"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "zamena %1 sa %2 u %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Zamena svih pojava nekog teksta unutar nekog drugog teksta."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "obrnuto %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Obrće redosled karaktera u tekstu."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sr.wikipedia.org/wiki/Niska"; diff --git a/msg/js/sr.js b/msg/js/sr.js index 679e9d0cab7..840f17b8250 100644 --- a/msg/js/sr.js +++ b/msg/js/sr.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Скупи блокове"; Blockly.Msg["COLLAPSE_BLOCK"] = "Скупи блок"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "боја 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "боја 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "http://meyerweb.com/eric/tools/color-blend/"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "однос"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "помешај"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Меша две боје заједно са датим односом (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "случајна боја"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Одаберите боју насумично."; Blockly.Msg["COLOUR_RGB_BLUE"] = "плава"; Blockly.Msg["COLOUR_RGB_GREEN"] = "зелена"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "http://www.december.com/html/spec/colorper.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "црвена"; Blockly.Msg["COLOUR_RGB_TITLE"] = "боја са"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Направите боју са одређеном количином црвене, зелене и плаве. Све вредности морају бити између 0 и 100."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Прошири блок"; Blockly.Msg["EXTERNAL_INPUTS"] = "Спољашњи улази"; Blockly.Msg["HELP"] = "Помоћ"; Blockly.Msg["INLINE_INPUTS"] = "Редни улази"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "направи празан списак"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Враћа списак, дужине 0, без података"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "списак"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "преузми и уклони"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "последња"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "случајна"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "уклони"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Враћа прву ставку на списку."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Враћа ставку на одређену позицију на списку."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Враћа последњу ставку са списка."; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "преузми подсписак од прве"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "преузми подсписак из # са краја"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "преузми подсписак од #"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Прави копију одређеног дела списка."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 је последња ставка."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 је прва ставка."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Враћа дужину списка."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "Направити списак са ставком %1 која се понавља %2 пута"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Прави листу која се састоји од задане вредности коју понавлјамо одређени број шута."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "обрнуто %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Обрни копију списка."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Поставља прву с Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Поставља ставку на одређени положај на списку."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Поставља последњу ставку на списку."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Поставља случајну ставку на списку."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "растуће"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "опадајуће"; Blockly.Msg["LISTS_SORT_TITLE"] = "сортирај %1 %2 %3"; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "није %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Враћа вредност „тачно“ ако је унос нетачан. Враћа вредност „нетачно“ ако је унос тачан."; Blockly.Msg["LOGIC_NULL"] = "без вредности"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Враћа „без вредности“."; Blockly.Msg["LOGIC_OPERATION_AND"] = "и"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,21 +183,21 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "или"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Враћа вредност „тачно“ ако су оба уноса тачна."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Враћа вредност „тачно“ ако је бар један од уноса тачан."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "проба"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ако је нетачно"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ако је тачно"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Проверите услов у „проба”. Ако је услов тачан, тада враћа „ако је тачно” вредност; у другом случају враћа „ако је нетачно” вредност."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://sr.wikipedia.org/wiki/Аритметика"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Враћа збир два броја."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Враћа количник два броја."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Враћа разлику два броја."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Враћа производ два броја."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Враћа први број степенован другим."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "атан2 од X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Врати арктангенту тачке (X, Y) у степенима од -180 до 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "промени %1 за %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Додаје број променљивој „%1”."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sr.wikipedia.org/wiki/Математичка_константа"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Враћа једну од заједн Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "ограничи %1 ниско %2 високо %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Ограничава број на доње и горње границе (укључиво)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "је дељив са"; Blockly.Msg["MATH_IS_EVEN"] = "је паран"; Blockly.Msg["MATH_IS_NEGATIVE"] = "је негативан"; @@ -217,10 +217,10 @@ Blockly.Msg["MATH_IS_WHOLE"] = "је цео"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://sr.wikipedia.org/wiki/Конгруенција"; Blockly.Msg["MATH_MODULO_TITLE"] = "подсетник од %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Враћа подсетник од дељења два броја."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://sr.wikipedia.org/wiki/Број"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Број."; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "просек списка"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "макс. списка"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "медијана списка"; @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Враћа списак најчеш Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Враћа случајни елемент са списка."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Враћа стандардну девијацију списка."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Враћа збир свих бројева са списка."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "случајни разломак"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Враћа логаритам бро Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Враћа негацију броја."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Враћа 10-ти степен броја."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Враћа квадратни корен броја."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "арц цос"; Blockly.Msg["MATH_TRIG_ASIN"] = "арц син"; Blockly.Msg["MATH_TRIG_ATAN"] = "арц тан"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "Направи променљиву нис Blockly.Msg["NEW_VARIABLE"] = "Направи променљиву…"; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Име нове променљиве:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Нова врста променљиве:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дозволи изјаве"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "са:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://sr.wikipedia.org/wiki/Потпрограм"; @@ -289,12 +289,12 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Покреће кориснич Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "са:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Направи „%1”"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Опишите ову функцију…"; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; -Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "урадите нешто"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "до"; Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Прави функцију без излаза."; -Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29"; +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "врати"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Прави функцију са излазом."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Упозорење: Ова функција има дуплиране параметре."; @@ -324,10 +324,10 @@ Blockly.Msg["TEXT_CHARAT_FROM_START"] = "преузми слово #"; Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "преузми последње слово"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "преузми случајно слово"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "у тексту %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Враћа слово на одређени положај."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "број %1 у %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Броји колико пута се неки текст појављује унутар неког другог текста."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Додајте ставку у текст."; @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "у тексту"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "преузми подниску из првог слова"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "преузми подниску из слова # са краја"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "преузми подниску из слова #"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Враћа одређени део текста."; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "пронађи прво појављивање текста"; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Питајте корисника Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Питајте корисника за унос текста."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "питај за број са поруком"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "питај за текст са поруком"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "замена %1 са %2 у %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Замена свих појава неког текста унутар неког другог текста."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "обрнуто %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Обрће редослед карактера у тексту."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sr.wikipedia.org/wiki/Ниска"; diff --git a/msg/js/sv.js b/msg/js/sv.js index 529b49ec37f..9f56cfba296 100644 --- a/msg/js/sv.js +++ b/msg/js/sv.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Fäll ihop block"; Blockly.Msg["COLLAPSE_BLOCK"] = "Fäll ihop block"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "färg 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "färg 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "förhållande"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "blanda"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0)."; @@ -24,25 +24,25 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "slumpfärg"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Slumpa fram en färg."; Blockly.Msg["COLOUR_RGB_BLUE"] = "blå"; Blockly.Msg["COLOUR_RGB_GREEN"] = "grön"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "röd"; Blockly.Msg["COLOUR_RGB_TITLE"] = "färg med"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100."; -Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "bryt ut ur loop"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "fortsätta med nästa upprepning av loop"; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "Bryt ut ur den innehållande upprepningen."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "Hoppa över resten av denna loop och fortsätt med nästa loop."; Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "Varning: Detta block kan endast användas i en loop."; -Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "för varje föremål %1 i listan %2"; Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon."; -Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated Blockly.Msg["CONTROLS_FOR_TITLE"] = "räkna med %1 från %2 till %3 med %4"; Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Låt variabeln \"%1\" anta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken."; Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "Lägg till ett villkor blocket \"om\"."; Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "Lägg till ett sista villkor som täcker alla alternativ som är kvar för \"if\"-blocket."; -Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Lägg till, ta bort eller ändra ordningen för sektioner för att omkonfigurera blocket \"om\"."; Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "annars"; Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "annars om"; @@ -51,11 +51,11 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Om ett värde är sant, utför några ko Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Om värdet är sant, utför det första kommandoblocket. Utför annars det andra kommandoblocket."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket. Om ingen av värdena är sanna, utför det sista kommandoblocket."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "utför"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "upprepa %1 gånger"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Utför några kommandon flera gånger."; -Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "upprepa tills"; Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "upprepa så länge"; Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "Medan ett värde är falskt, utför några kommandon."; @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "Fäll ut block"; Blockly.Msg["EXTERNAL_INPUTS"] = "Externa inmatningar"; Blockly.Msg["HELP"] = "Hjälp"; Blockly.Msg["INLINE_INPUTS"] = "Radinmatning"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "skapa tom lista"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Ger tillbaka en lista utan någon data, alltså med längden 0"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "lista"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Lägg till, ta bort eller ändra ordningen på objekten för att göra om det här \"list\"-blocket."; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "skapa lista med"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Lägg till ett föremål till listan."; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Skapa en lista med valfritt antal föremål."; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returnerar längden på en lista."; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "skapa lista med föremålet %1 upprepat %2 gånger"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Skapar en lista som innehåller ett valt värde upprepat ett bestämt antalet gånger."; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "vänd på %1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Vänd på en kopia av en lista."; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Anger det första objektet i Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sätter in objektet vid en specificerad position i en lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Anger det sista elementet i en lista."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sätter in ett slumpat objekt i en lista."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "stigande"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "fallande"; Blockly.Msg["LISTS_SORT_TITLE"] = "sortera %1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sortera en kopia av en lista."; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alfabetiskt, ignorera skiftläge"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeriskt"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alfabetiskt"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "skapa lista från text"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "skapa text från lista"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Sammanfoga en textlista till en text, som separeras av en avgränsare."; @@ -171,33 +171,33 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Ger tillbaka sant om det första vä Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "Ger tillbaka sant om det första värdet är mindre än det andra."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "Ger tillbaka sant om båda värdena inte är lika med varandra."; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "inte %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann."; Blockly.Msg["LOGIC_NULL"] = "null"; Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://sv.wikipedia.org/wiki/Null"; Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Returnerar null."; Blockly.Msg["LOGIC_OPERATION_AND"] = "och"; -Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated Blockly.Msg["LOGIC_OPERATION_OR"] = "eller"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Ger tillbaka sant om båda värdena är sanna."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Ger tillbaka sant om minst ett av värdena är sant."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "test"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "om falskt"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "om sant"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://sv.wikipedia.org/wiki/Aritmetik"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Returnerar summan av de två talen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Returnerar kvoten av de två talen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Returnerar differensen mellan de två talen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Returnerar produkten av de två talen."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Ger tillbaka det första talet upphöjt till det andra talet."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 av X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Returnerar arcustangens av punkt (X, Y) i grader från -180 till 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "ändra %1 med %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Lägg till ett tal till variabeln '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://sv.wikipedia.org/wiki/Matematisk_konstant"; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Returnerar en av de vanliga konstanterna Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "begränsa %1 till mellan %2 och %3"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Begränsa ett tal till att mellan de angivna gränsvärden (inkluderande)."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "är delbart med"; Blockly.Msg["MATH_IS_EVEN"] = "är jämnt"; Blockly.Msg["MATH_IS_NEGATIVE"] = "är negativt"; @@ -217,7 +217,7 @@ Blockly.Msg["MATH_IS_WHOLE"] = "är helt"; Blockly.Msg["MATH_MODULO_HELPURL"] = "https://sv.wikipedia.org/wiki/Modulär_aritmetik"; Blockly.Msg["MATH_MODULO_TITLE"] = "resten av %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Returnerar kvoten från divisionen av de två talen."; -Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://sv.wikipedia.org/wiki/Tal"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Ett tal."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated @@ -237,7 +237,7 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Ger tillbaka en lista med de(t) vanli Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Returnerar ett slumpmässigt element från listan."; Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Ger tillbaka standardavvikelsen i listan."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Ger tillbaka summan av alla talen i listan."; -Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://sv.wikipedia.org/wiki/Slumptalsgenerator"; Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "slumpat decimaltal"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat)."; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Returnerar logaritmen för bas 10 av Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Returnerar negationen av ett tal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Ger tillbaka 10 upphöjt i ett tal."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Returnerar kvadratroten av ett tal."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "arccos"; Blockly.Msg["MATH_TRIG_ASIN"] = "arcsin"; Blockly.Msg["MATH_TRIG_ATAN"] = "arctan"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Ny variabeltyp:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "tillåta uttalanden"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "med:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Kör den användardefinierade funktionen \"%1\"."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "med:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Skapa '%1'"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "returnera"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Skapar en funktion med output."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Varning: Denna funktion har dubbla parametrar."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Markera funktionsdefinition"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Om ett värde är sant returneras ett andra värde."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Varning: Detta block får användas endast i en funktionsdefinition."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "inmatningsnamn:"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "hämta slumpad bokstav"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "i texten %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Ger tillbaka bokstaven på den specificerade positionen."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "räkna %1 i %2"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Räkna hur många gånger en text förekommer inom en annan text."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Lägg till ett föremål till texten."; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Fråga användaren efter ett tal."; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Fråga användaren efter lite text."; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "fråga efter ett tal med meddelande"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "fråga efter text med meddelande"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "ersätt %1 med %2 i %3"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ersätt alla förekomster av en text inom en annan text."; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "vänd på %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Vänder på teckenordningen i texten."; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29"; diff --git a/msg/js/ta.js b/msg/js/ta.js index d7c88e2ac0e..c3f61f027e5 100644 --- a/msg/js/ta.js +++ b/msg/js/ta.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "விகிதம்"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "கலப்பு (வண்ணம்)"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "கொடுக்கப்பட்ட விகதத்தில் (0.0 - 1.0) இரு நிறங்களை கலக்குக."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "வண்ண தட்டிலிருந்து ஒரு நிறத்தைத் தேர்ந்தெடுக்கவும்."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "தற்போக்கு நிறம்"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "மாறி உண்மை ஆக உ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை இயக்கு."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை தொகுப்பு இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை தொகுப்பு இயக்கு."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "மாறி உண்மை ஆக உள்ள வரை, கட்டளைகளை தொகுப்பு இயக்கு. அல்லது மற்ற (அடுத்த) கட்டளைகளை தொகுப்பு இயக்கு. இரண்டும் இல்லை என்றால் கடைசி தொகுப்பு இயக்கு."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "செய்க"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "'%1' முரை திரும்ப செய்"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "கட்டளைகளை பல முரை செய்ய"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "பொய்"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "மெய், அல்லது பொய் பின்கொடு."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "மெய்"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "இரண்டு மாறியும் ஈடானால், மெய் பின்கொடு."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "முதல் உள்ளீடு இரண்டாவதைவிட அதிகமாக இருந்தால், மெய் பின்கொடு."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "முதல் உள்ளீடு இரண்டாவதைவிட அதிகமாக அல்ல சமமாக இருந்தால், மெய் பின்கொடு."; @@ -197,7 +197,7 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "முதல் உள்ளீ Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "மாற்று %1 மூலம் %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "எண்னை '%1' மதிப்பால் கூட்டு,"; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://ta.wikipedia.org/wiki/%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A4_%E0%AE%AE%E0%AE%BE%E0%AE%B1%E0%AE%BF%E0%AE%B2%E0%AE%BF"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "எண் நேர்ம முழுதா Blockly.Msg["MATH_IS_PRIME"] = "எண் பகாத்தனிதானதா?"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "எண் முழுதானதா?"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "%1 ÷ %2ன் மீதி"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "இரண்டு எண்கள் மூலம் பிரிவில் இருந்து எஞ்சியதை பின்கொடு."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "ஒரு பட்டியலி Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "பட்டியலின் நியமவிலகலை பின்கொடு."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "முழு பட்டியலின் எண் சமம் பின்கொடு,"; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "சீரற்ற எண் பின்னம்"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "சீரற்ற எண் பின்னம், 0.0 இல் இருந்து 1.0 உட்பட, பின்கொடு."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "வீசுகளம் %1 இல் இருந்து %2 உள்ளடங்கிய வாறு சீரற்ற எண்"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "வீசுகளம் இல் இருந்த (உள்ளடங்கிய) வாறு சீரற்ற எண் பின்கொடு."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "முழுமையாக்கு"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "கீழ்வழி முழுமையாக்கு"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "மேல்வழி முழுமையாக்கு"; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "புதிய மாறிலிய Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "வாக்குமூலங்களை அனுமதிக்கவும்"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "இத்துடன்"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "பயனரின் '%1' செயற்கூற்றை ஓட்டு."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "பயனரின் '%1' செயற்கூற்றை ஓட்டி வரும் வெளியீட்டை பயன்படுத்து."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "இத்துடன்:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' உருவாக்குக"; diff --git a/msg/js/tcy.js b/msg/js/tcy.js index 8f1e5934d17..67eaf85798e 100644 --- a/msg/js/tcy.js +++ b/msg/js/tcy.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ಮೌಲ್ಯ ನಿಜ ಆದಿತ Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "ಮೌಲ್ಯ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಪಾತೆರೊಲೆನ ಸುರುತ್ತ ತಡೆ ಮಲ್ಪು. ಇಜ್ಜಿಂಡ ಪಾತೆರೊಲೆನ ರಡ್ಡನೆ ತಡೆ ಮಲ್ಪು."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "ಸುರುತ್ತ ಮೌಲ್ಯ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಪಾತೆರೊಲೆನ ಸುರುತ್ತ ತಡೆ ಮಲ್ಪು. ಇಜ್ಜಿಂಡ, ರಡ್ಡನೆ ಮೌಲ್ಯ ನಿಜವಾದಿತ್ತ್ಂಡ, ಪಾತೆರೊಲೆನ ರಡ್ಡನೆ ತಡೆ ಮಲ್ಪು."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "ಸುರುತ್ತ ಮೌಲ್ಯೊ ನಿಜವಾದಿತ್ತ್‌ಂಡ, ಪಾತೆರೊಲೆನ ಸುರುತ್ತ ತಡೆ ಮಲ್ಪು. ಇಜ್ಜಿಂಡ, ರಡ್ಡನೆದ ಮೌಲ್ಯ ನಿಜವಾದಿತ್ತ್ಂಡ, ಪಾತೆರೊಲೆನ ರಡ್ಡನೆ ತಡೆ ಮಲ್ಪು. ಒಂಜೇಲೆ ಒವ್ವೇ ಮೌಲ್ಯ ನಿಜವಾದಿತ್ತಿಜಿಂಡ, ಪಾತೆರೊಲೆನ ಕಡೆತ್ತ ತಡೆ ಮಲ್ಪು."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ಮಲ್ಪುಲೆ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = " %1 ಸರ್ತಿ ಕೂಡೊರ ಮಲ್ಪು"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ಕೆಲವು ಪಾತೆರೊಲೆನ್ ಮಸ್ತ್ ಸರ್ತಿ ಮಲ್ಪು"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "ಒಂಜಿ ಪಟ್ಟಿ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ನಿರ್ದಿಷ್ಟ ಸ್ಥಿತಿಡ್ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಅಕೇರಿದ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "ಒಂಜಿ ಪಟ್ಟಿಡ್ ಒವ್ವಾಂಡಲ ಒಂಜಿ ವಿಸಯೊನು ಸೆಟ್ ಮಲ್ಪುಂಡು."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ಏರುನು"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "ಜಪ್ಪುನು"; Blockly.Msg["LISTS_SORT_TITLE"] = "%1 %2 %3 ಇಂಗಡಿಪು"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ಸುಲ್ಲು"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "ಒಂಜೆ ನಿಜ ಅತ್ತಂಡ ಸುಲ್ಲುನ್ ಪಿರಕೊರು"; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ಸತ್ಯೊ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "ರಡ್ದ್ ಇನ್‌ಪುಟ್‌ಲಾ ಸಮ ಇತ್ತ್ಂಡ 'ನಿಜ'ನ್ ಪಿರಕೊರು"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "ಸುರುತ್ತ ಇನ್‌ಪುಟ್ ರಡ್ಡನೆ ಇನ್‌ಪುಟ್‌ಡ್ದ್ ಮಲ್ಲ ಆದಿತ್ತ್ಂಡ, 'ನಿಜ'ನ್ ಪಿರಕೊರು"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "ಸುರುತ್ತ ಇನ್‌ಪುಟ್ ರಡ್ಡನೆ ಇನ್‌ಪುಟ್‌ಡ್ದ್ ಮಲ್ಲ ಅತ್ತಂಡ ಅಯಿಕ್ಕ್ ಸಮ ಆದಿತ್ತ್ಂಡ, 'ನಿಜ'ನ್ ಪಿರಕೊರು"; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "ಸಂಖ್ಯೆದ ಭಾಗ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "ರಡ್ಡ ಸ್ಂಖ್ಯೆದ ವ್ಯತ್ಯಾಸೊನು ಪಿರಕೊರು."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "ಸಂಖ್ಯೆದ ಗುಣಲಬ್ಧೊನು ಪಿರಕೊರು."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "ಸುರುತ್ತ ಸಂಖ್ಯೆದ ಘಾತೊನು ರಡ್ಡನೆ ಸಂಖ್ಯೆಗ್ ಏರ್ಪಾದ್ ಪಿರಕೊರು."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "%1 ನ್ %2 ಟ್ ಬದಲ್ ಮಲ್ಪು"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "'%1' ವ್ಯತ್ಯಯೊಗು ಒಂಜಿ ಸಂಖ್ಯೆನ್ ಸೇರಾವ್"; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/ಗಣಿತ_ನಿರಂತರ"; diff --git a/msg/js/tdd.js b/msg/js/tdd.js new file mode 100644 index 00000000000..8557c30e5b3 --- /dev/null +++ b/msg/js/tdd.js @@ -0,0 +1,425 @@ +// This file was automatically generated. Do not modify. + +'use strict'; + +var Blockly = Blockly || { Msg: Object.create(null) }; + +Blockly.Msg["ADD_COMMENT"] = "ᥔᥬᥱᥑᥩᥲᥑᥭᥲᥓᥬᥴ"; +Blockly.Msg["CANNOT_DELETE_VARIABLE_PROCEDURE"] = "Can't delete the variable '%1' because it's part of the definition of the function '%2'"; // untranslated +Blockly.Msg["CHANGE_VALUE_TITLE"] = "ᥘᥦᥐᥲᥘᥣᥭᥲᥢᥛᥳᥐᥖᥳ:"; +Blockly.Msg["CLEAN_UP"] = "Clean up Blocks"; // untranslated +Blockly.Msg["COLLAPSED_WARNINGS_WARNING"] = "Collapsed blocks contain warnings."; // untranslated +Blockly.Msg["COLLAPSE_ALL"] = "ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰᥓᥫᥰᥘᥦᥝᥴ"; +Blockly.Msg["COLLAPSE_BLOCK"] = "ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰᥘᥦᥝᥴ"; +Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "ᥔᥤᥴ 1"; +Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "ᥔᥤᥴ 2"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated +Blockly.Msg["COLOUR_BLEND_RATIO"] = "ᥔᥦᥢᥰ"; +Blockly.Msg["COLOUR_BLEND_TITLE"] = "ᥘᥩᥰᥘᥦᥰ"; +Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "ᥟᥝᥴᥔᥤᥴᥔᥩᥒᥴᥟᥢᥴᥘᥩᥰᥐᥢᥴ ᥓᥩᥛᥰᥢᥛᥴ ᥔᥦᥢᥰᥟᥢᥴᥙᥢᥴᥝᥭᥳ (0.0 - 1.0)."; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://tdd.wikipedia.org/wiki/ᥔᥤᥴ"; +Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "ᥘᥫᥐᥲᥔᥤᥴ ᥖᥛᥲᥖᥤᥲ ᥚᥣᥰᥘᥦᥖᥳ."; +Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated +Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ᥔᥤᥴᥘᥣᥛᥰᥘᥤᥛᥰ"; +Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "ᥘᥫᥐᥲᥔᥤᥴᥖᥛᥲᥖᥤᥲᥘᥩᥐᥰᥘᥣᥛᥰᥘᥤᥛᥰ."; +Blockly.Msg["COLOUR_RGB_BLUE"] = "ᥔᥩᥛᥱ"; +Blockly.Msg["COLOUR_RGB_GREEN"] = "ᥑᥥᥝᥴ"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated +Blockly.Msg["COLOUR_RGB_RED"] = "ᥘᥤᥒᥴ"; +Blockly.Msg["COLOUR_RGB_TITLE"] = "ᥞᥨᥛᥲᥐᥪᥐᥰᥔᥤᥴ"; +Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "ᥞᥥᥖᥰᥖᥨᥭᥰ ᥔᥤᥴᥟᥢᥴᥢᥪᥒᥲ ᥓᥩᥛᥰᥢᥒᥱᥛᥐᥰᥛᥢᥲᥝᥭᥳ ᥢᥬᥰᥑᥣᥒᥱ ᥔᥤᥴᥘᥦᥒᥴ, ᥑᥥᥝᥴ ᥘᥦᥲ ᥔᥩᥛᥱ. ᥢᥛᥳᥢᥐᥰᥔᥤᥴ ᥖᥥᥴᥘᥭᥲᥛᥤᥰᥢᥬᥰᥝᥨᥒᥲᥐᥣᥒᥴ 0 ᥖᥩᥱ 100."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks"; // untranslated +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK"] = "ᥟᥩᥐᥱᥖᥤᥲᥑᥩᥙᥱᥛᥨᥢᥰ"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE"] = "ᥔᥪᥙᥱᥙᥢᥱᥗᥦᥒᥲ ᥑᥩᥙᥱᥛᥨᥢᥰᥖᥣᥒᥱᥟᥢᥴ"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK"] = "ᥐᥪᥖᥰᥙᥦᥖᥲ ᥑᥩᥙᥱᥛᥨᥢᥰ ᥟᥢᥴᥛᥤᥰᥝᥭᥳ"; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE"] = "ᥝᥥᥢᥳᥝᥭᥳ ᥑᥩᥙᥱᥛᥨᥢᥰ ᥟᥢᥴᥐᥪᥖᥰᥓᥫᥲᥝᥭᥳ, ᥔᥥᥴ ᥔᥪᥙᥱᥗᥦᥒᥲᥖᥣᥒᥱᥟᥢᥴ."; +Blockly.Msg["CONTROLS_FLOW_STATEMENTS_WARNING"] = "ᥜᥣᥒᥳ: ᥙᥘᥩᥐᥳᥟᥢᥴᥢᥭᥳ ᥐᥨᥭᥰᥓᥬᥳᥘᥨᥭᥲᥖᥣᥱ ᥑᥩᥙᥱᥛᥨᥢᥰᥐᥨᥭᥰ."; +Blockly.Msg["CONTROLS_FOREACH_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#for-each"; // untranslated +Blockly.Msg["CONTROLS_FOREACH_TITLE"] = "ᥖᥣᥱᥐᥧᥲᥟᥢᥴᥟᥢᥴ ᥢᥬᥰ %1 ᥔᥥᥢᥲᥛᥣᥭᥴ %2"; +Blockly.Msg["CONTROLS_FOREACH_TOOLTIP"] = "For each item in a list, set the variable '%1' to the item, and then do some statements."; // untranslated +Blockly.Msg["CONTROLS_FOR_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#count-with"; // untranslated +Blockly.Msg["CONTROLS_FOR_TITLE"] = "ᥖᥦᥱᥟᥣᥢᥱᥐᥪᥐᥰ %1 ᥖᥩᥱ %2 ᥖᥩᥱ %3 ᥘᥨᥭᥲ %4"; +Blockly.Msg["CONTROLS_FOR_TOOLTIP"] = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks."; // untranslated +Blockly.Msg["CONTROLS_IF_ELSEIF_TOOLTIP"] = "ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥔᥬᥱᥙᥢᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰ ᥖᥛᥲ."; +Blockly.Msg["CONTROLS_IF_ELSE_TOOLTIP"] = "ᥔᥬᥱᥐᥛᥰᥘᥪᥢᥰ, ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥟᥝᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰᥖᥒᥰᥔᥥᥒᥲ ᥖᥛᥲ."; +Blockly.Msg["CONTROLS_IF_HELPURL"] = "https://github.com/google/blockly/wiki/IfElse"; // untranslated +Blockly.Msg["CONTROLS_IF_IF_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this if block."; // untranslated +Blockly.Msg["CONTROLS_IF_MSG_ELSE"] = "ᥘᥫᥴᥔᥥᥴᥢᥢᥳ"; +Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"] = "ᥔᥒᥴᥝᥣᥲ ᥘᥫᥴᥔᥥᥴᥢᥢᥳ"; +Blockly.Msg["CONTROLS_IF_MSG_IF"] = "ᥔᥒᥴᥝᥣᥲ"; +Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥳᥢᥪᥒᥲ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥘᥩᥐᥳᥟᥩᥢᥴᥖᥣᥒᥰᥔᥧᥖᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥭᥴᥔᥩᥒᥴᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲ ᥙᥘᥩᥐᥳᥔᥩᥒᥴ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴ."; +Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥭᥴᥢᥪᥒᥲ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥘᥩᥐᥳᥟᥩᥢᥴᥖᥣᥒᥰᥔᥧᥖᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥘᥫᥴᥔᥥᥴᥢᥢᥳ, ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥭᥴᥔᥩᥒᥴ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲ ᥙᥘᥩᥐᥳᥔᥩᥒᥴ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ) ᥟᥛᥱᥛᥤᥰᥘᥩᥒᥲᥛᥣᥢᥱᥛᥦᥢᥲ ᥔᥒᥴᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲᥙᥘᥩᥐᥳ ᥐᥛᥰᥘᥪᥛᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ."; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://tdd.wikipedia.org/wiki/ᥖᥣᥱᥖᥨᥒᥱᥛᥨᥢᥰ"; +Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ᥞᥥᥖᥰ"; +Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ᥙᥢᥱᥑᥪᥢᥰ %1 ᥐᥛᥰ"; +Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ ᥖᥒᥰᥢᥛᥴ."; +Blockly.Msg["CONTROLS_WHILEUNTIL_HELPURL"] = "https://github.com/google/blockly/wiki/Loops#repeat"; // untranslated +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_UNTIL"] = "ᥖᥪᥐᥳᥘᥪᥛᥳᥗᥪᥒᥴ"; +Blockly.Msg["CONTROLS_WHILEUNTIL_OPERATOR_WHILE"] = "ᥑᥣᥝᥰᥖᥪᥐᥳᥘᥪᥛᥳ"; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL"] = "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥟᥛᥱᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴ ᥐᥛᥲᥚᥩᥒᥲ."; +Blockly.Msg["CONTROLS_WHILEUNTIL_TOOLTIP_WHILE"] = "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ."; +Blockly.Msg["DELETE_ALL_BLOCKS"] = "Delete all %1 blocks?"; // untranslated +Blockly.Msg["DELETE_BLOCK"] = "ᥛᥩᥖᥱᥙᥘᥩᥐᥳ"; +Blockly.Msg["DELETE_VARIABLE"] = "Delete the '%1' variable"; // untranslated +Blockly.Msg["DELETE_VARIABLE_CONFIRMATION"] = "Delete %1 uses of the '%2' variable?"; // untranslated +Blockly.Msg["DELETE_X_BLOCKS"] = "ᥛᥩᥖᥱᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ %1"; +Blockly.Msg["DIALOG_CANCEL"] = "Cancel"; // untranslated +Blockly.Msg["DIALOG_OK"] = "OK"; // untranslated +Blockly.Msg["DISABLE_BLOCK"] = "ᥟᥪᥖᥰᥓᥬᥳ ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ"; +Blockly.Msg["DUPLICATE_BLOCK"] = "ᥗᥧᥖᥱ"; +Blockly.Msg["DUPLICATE_COMMENT"] = "Duplicate Comment"; // untranslated +Blockly.Msg["ENABLE_BLOCK"] = "ᥙᥪᥖᥱᥓᥬᥳ ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ"; +Blockly.Msg["EXPAND_ALL"] = "ᥑᥣᥐᥲᥓᥫᥰᥞᥦᥳᥖᥖᥰ"; +Blockly.Msg["EXPAND_BLOCK"] = "ᥑᥣᥐᥲᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ"; +Blockly.Msg["EXTERNAL_INPUTS"] = "ᥑᥫᥒᥲᥟᥢᥴᥘᥧᥐᥳᥖᥣᥒᥰᥢᥩᥐᥲᥑᥝᥲᥛᥣᥰ"; +Blockly.Msg["HELP"] = "ᥓᥩᥭᥲᥗᥦᥛᥴ"; +Blockly.Msg["INLINE_INPUTS"] = "ᥑᥫᥒᥲᥟᥢᥴᥑᥝᥲᥛᥣᥰᥓᥩᥛᥰᥘᥦᥒᥰ"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "create empty list"; // untranslated +Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Returns a list, of length 0, containing no data records"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "list"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this list block."; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "create list with"; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "Add an item to the list."; // untranslated +Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "Create a list with any number of items."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "first"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "# from end"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET"] = "get"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "get and remove"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_LAST"] = "last"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "random"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "remove"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Returns the first item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Returns the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Returns the last item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_RANDOM"] = "Returns a random item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FIRST"] = "Removes and returns the first item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_FROM"] = "Removes and returns the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_LAST"] = "Removes and returns the last item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_REMOVE_RANDOM"] = "Removes and returns a random item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST"] = "Removes the first item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_FROM"] = "Removes the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST"] = "Removes the last item in a list."; // untranslated +Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM"] = "Removes a random item in a list."; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_END"] = "to # from end"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_END_FROM_START"] = "to #"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_END_LAST"] = "to last"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-a-sublist"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "get sub-list from first"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "get sub-list from # from end"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "get sub-list from #"; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated +Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Creates a copy of the specified portion of a list."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 is the last item."; // untranslated +Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 is the first item."; // untranslated +Blockly.Msg["LISTS_INDEX_OF_FIRST"] = "find first occurrence of item"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_LAST"] = "find last occurrence of item"; // untranslated +Blockly.Msg["LISTS_INDEX_OF_TOOLTIP"] = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found."; // untranslated +Blockly.Msg["LISTS_INLIST"] = "in list"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#is-empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["LISTS_ISEMPTY_TOOLTIP"] = "Returns true if the list is empty."; // untranslated +Blockly.Msg["LISTS_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#length-of"; // untranslated +Blockly.Msg["LISTS_LENGTH_TITLE"] = "length of %1"; // untranslated +Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "Returns the length of a list."; // untranslated +Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated +Blockly.Msg["LISTS_REPEAT_TITLE"] = "create list with item %1 repeated %2 times"; // untranslated +Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "Creates a list consisting of the given value repeated the specified number of times."; // untranslated +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated +Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "Reverse a copy of a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INPUT_TO"] = "as"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_INSERT"] = "insert at"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_SET"] = "set"; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST"] = "Inserts the item at the start of a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_FROM"] = "Inserts the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_LAST"] = "Append the item to the end of a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM"] = "Inserts the item randomly in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Sets the first item in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Sets the item at the specified position in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Sets the last item in a list."; // untranslated +Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Sets a random item in a list."; // untranslated +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated +Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "ascending"; // untranslated +Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "descending"; // untranslated +Blockly.Msg["LISTS_SORT_TITLE"] = "sort %1 %2 %3"; // untranslated +Blockly.Msg["LISTS_SORT_TOOLTIP"] = "Sort a copy of a list."; // untranslated +Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "alphabetic, ignore case"; // untranslated +Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "numeric"; // untranslated +Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "alphabetic"; // untranslated +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated +Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "make list from text"; // untranslated +Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "make text from list"; // untranslated +Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "Join a list of texts into one text, separated by a delimiter."; // untranslated +Blockly.Msg["LISTS_SPLIT_TOOLTIP_SPLIT"] = "Split text into a list of texts, breaking at each delimiter."; // untranslated +Blockly.Msg["LISTS_SPLIT_WITH_DELIMITER"] = "with delimiter"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ"; +Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated +Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "ᥛᥣᥢᥱᥛᥦᥢᥲᥘᥦᥲᥔᥒᥴ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴᥘᥦᥲᥔᥒᥴ ᥞᥨᥢᥴᥑᥪᥢᥰ."; +Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ᥛᥣᥢᥱᥛᥦᥢᥲ"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "ᥔᥬᥱᥐᥛᥰᥘᥪᥢᥰ, ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥟᥝᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰᥖᥒᥰᥔᥥᥒᥲ ᥖᥛᥲ. https://tdd.wikipedia.org/wiki/ᥙᥣᥭᥰᥢᥙᥳ"; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴ ᥛᥫᥢᥴᥖᥣᥒᥱᥟᥢᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥕᥬᥱᥘᥫᥴ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥕᥬᥱᥘᥫᥴ ᥟᥛᥱᥢᥢᥴ ᥚᥥᥒᥱᥙᥥᥒᥰ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥛᥫᥢᥴ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥛᥫᥢᥴ ᥟᥛᥱᥢᥢᥴ ᥚᥥᥒᥱᥙᥥᥒᥰ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴ ᥟᥛᥱᥛᥫᥢᥴᥖᥣᥒᥱᥟᥢᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated +Blockly.Msg["LOGIC_NEGATE_TITLE"] = "ᥟᥛᥱᥓᥬᥲ %1"; +Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ. ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥑᥪᥢᥰᥛᥨᥢᥳᥛᥦᥰ ᥞᥬᥲᥢᥦᥢᥲᥢᥣᥴ."; +Blockly.Msg["LOGIC_NULL"] = "ᥟᥛᥱᥑᥝᥲᥑᥣᥒᥱ"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated +Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥛᥱᥑᥝᥲᥑᥣᥒᥱ"; +Blockly.Msg["LOGIC_OPERATION_AND"] = "ᥘᥦᥲ"; +Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated +Blockly.Msg["LOGIC_OPERATION_OR"] = "ᥟᥛᥱᥢᥢᥴ"; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴᥟᥢᥴ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥐᥛᥰᥘᥪᥢᥰᥔᥧᥖᥰ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ."; +Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "ᥓᥣᥛᥰ"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated +Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ᥔᥒᥴᥝᥣᥲ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ"; +Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ᥔᥒᥴᥝᥣᥲ ᥛᥣᥢᥱᥛᥦᥢᥲ"; +Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "ᥓᥣᥛᥰᥐᥨᥖᥱᥖᥨᥭᥰ ᥔᥣᥭᥴᥒᥣᥭᥴ. ᥔᥒᥴᥝᥣᥲ ᥔᥣᥭᥴᥒᥣᥭᥴᥛᥣᥢᥱᥛᥦᥢᥲ, ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) 'ᥔᥒᥴᥛᥣᥢᥱᥛᥦᥢᥲ'; ᥘᥫᥴᥢᥢᥳ ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) 'ᥔᥒᥴᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ'."; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://tdd.wikipedia.org/wiki/ᥙᥣᥭᥰᥢᥙᥳ"; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥖᥣᥒᥰᥢᥛᥴ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥙᥛᥣᥱᥢ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥙᥦᥐᥱᥙᥫᥒᥲ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥟᥝᥴᥟᥩᥐᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ."; +Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥖᥨᥝᥴᥢᥙᥳᥛᥣᥭᥴᥢᥪᥒᥲᥢᥭᥳ ᥓᥩᥭᥲᥞᥦᥒᥰᥙᥢᥴ ᥖᥨᥝᥴᥢᥙᥳᥛᥣᥭᥴᥔᥩᥒᥴ."; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated +Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 of X:%1 Y:%2"; // untranslated +Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated +Blockly.Msg["MATH_CHANGE_TITLE"] = "change %1 by %2"; // untranslated +Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Add a number to variable '%1'."; // untranslated +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated +Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)."; // untranslated +Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "constrain %1 low %2 high %3"; // untranslated +Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Constrain a number to be between the specified limits (inclusive)."; // untranslated +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated +Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "is divisible by"; // untranslated +Blockly.Msg["MATH_IS_EVEN"] = "ᥙᥥᥢᥴᥐᥨᥙᥳ"; +Blockly.Msg["MATH_IS_NEGATIVE"] = "is negative"; // untranslated +Blockly.Msg["MATH_IS_ODD"] = "ᥙᥥᥢᥴᥐᥤᥐᥲ"; +Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated +Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated +Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated +Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; // untranslated +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated +Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated +Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated +Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://tdd.wikipedia.org/wiki/ᥛᥣᥭᥴᥢᥙᥳ"; +Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ᥛᥣᥭᥴᥢᥙᥳ ᥢᥪᥒᥲᥟᥢᥴ."; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "max of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "median of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MIN"] = "min of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_MODE"] = "modes of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_RANDOM"] = "random item of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_STD_DEV"] = "standard deviation of list"; // untranslated +Blockly.Msg["MATH_ONLIST_OPERATOR_SUM"] = "sum of list"; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_AVERAGE"] = "Return the average (arithmetic mean) of the numeric values in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MAX"] = "Return the largest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MEDIAN"] = "Return the median number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MIN"] = "Return the smallest number in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_MODE"] = "Return a list of the most common item(s) in the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Return a random element from the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Return the standard deviation of the list."; // untranslated +Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Return the sum of all the numbers in the list."; // untranslated +Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "random fraction"; // untranslated +Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive)."; // untranslated +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated +Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; // untranslated +Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated +Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; // untranslated +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; // untranslated +Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; // untranslated +Blockly.Msg["MATH_ROUND_TOOLTIP"] = "Round a number up or down."; // untranslated +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://tdd.wikipedia.org/wiki/ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ"; +Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ᥙᥐᥖᥤ"; +Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ"; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥙᥐᥖᥤ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_EXP"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ e ᥐᥣᥱᥖᥤᥲ ᥙᥣᥱᥝᥣᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LN"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥘᥩᥐᥰᥘᥣᥭᥰᥢᥙᥳ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥙᥪᥢᥳᥗᥣᥢᥴ 10 ᥘᥩᥐᥰᥘᥣᥭᥰᥢᥙᥳ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥔᥣᥢᥴᥑᥖᥰ ᥢᥬᥰ ᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ 10 ᥐᥣᥱᥖᥤᥲ ᥙᥣᥱᥝᥣᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ."; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated +Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Return the arcsine of a number."; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Return the arctangent of a number."; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_COS"] = "Return the cosine of a degree (not radian)."; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_SIN"] = "Return the sine of a degree (not radian)."; // untranslated +Blockly.Msg["MATH_TRIG_TOOLTIP_TAN"] = "Return the tangent of a degree (not radian)."; // untranslated +Blockly.Msg["NEW_COLOUR_VARIABLE"] = "Create colour variable..."; // untranslated +Blockly.Msg["NEW_NUMBER_VARIABLE"] = "Create number variable..."; // untranslated +Blockly.Msg["NEW_STRING_VARIABLE"] = "Create string variable..."; // untranslated +Blockly.Msg["NEW_VARIABLE"] = "ᥐᥩᥱᥔᥣᥒᥲ ᥖᥨᥝᥴᥢᥪᥒᥴ..."; +Blockly.Msg["NEW_VARIABLE_TITLE"] = "ᥓᥪᥲᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱ:"; +Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "New variable type:"; // untranslated +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated +Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated +Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "with:"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated +Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "with:"; // untranslated +Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Describe this function..."; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "do something"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "to"; // untranslated +Blockly.Msg["PROCEDURES_DEFNORETURN_TOOLTIP"] = "Creates a function with no output."; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "return"; // untranslated +Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Creates a function with an output."; // untranslated +Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Warning: This function has duplicate parameters."; // untranslated +Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Highlight function definition"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "If a value is true, then return a second value."; // untranslated +Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Warning: This block may be used only within a function definition."; // untranslated +Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "input name:"; // untranslated +Blockly.Msg["PROCEDURES_MUTATORARG_TOOLTIP"] = "Add an input to the function."; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TITLE"] = "inputs"; // untranslated +Blockly.Msg["PROCEDURES_MUTATORCONTAINER_TOOLTIP"] = "Add, remove, or reorder inputs to this function."; // untranslated +Blockly.Msg["REDO"] = "Redo"; // untranslated +Blockly.Msg["REMOVE_COMMENT"] = "ᥗᥩᥢᥴᥙᥦᥖᥲ ᥑᥩᥲᥑᥭᥲᥓᥬᥴ"; +Blockly.Msg["RENAME_VARIABLE"] = "ᥘᥪᥛᥳᥑᥪᥢᥰ ᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱ..."; +Blockly.Msg["RENAME_VARIABLE_TITLE"] = "ᥘᥪᥛᥳᥑᥪᥢᥰ ᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱᥓᥫᥰᥢᥢᥳ '%1' ᥗᥪᥒᥴ:"; +Blockly.Msg["TEXT_APPEND_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_APPEND_TITLE"] = "to %1 append text %2"; // untranslated +Blockly.Msg["TEXT_APPEND_TOOLTIP"] = "Append some text to variable '%1'."; // untranslated +Blockly.Msg["TEXT_CHANGECASE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#adjusting-text-case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_LOWERCASE"] = "to lower case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_TITLECASE"] = "to Title Case"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_OPERATOR_UPPERCASE"] = "to UPPER CASE"; // untranslated +Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "Return a copy of the text in a different case."; // untranslated +Blockly.Msg["TEXT_CHARAT_FIRST"] = "get first letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_FROM_END"] = "get letter # from end"; // untranslated +Blockly.Msg["TEXT_CHARAT_FROM_START"] = "get letter #"; // untranslated +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated +Blockly.Msg["TEXT_CHARAT_LAST"] = "get last letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_RANDOM"] = "get random letter"; // untranslated +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_CHARAT_TITLE"] = "in text %1 %2"; // untranslated +Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Returns the letter at the specified position."; // untranslated +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated +Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "count %1 in %2"; // untranslated +Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Count how many times some text occurs within some other text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Add an item to the text."; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TITLE_JOIN"] = "join"; // untranslated +Blockly.Msg["TEXT_CREATE_JOIN_TOOLTIP"] = "Add, remove, or reorder sections to reconfigure this text block."; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_END"] = "to letter # from end"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_END_FROM_START"] = "to letter #"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_END_LAST"] = "to last letter"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "in text"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "get substring from first letter"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "get substring from letter # from end"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "get substring from letter #"; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated +Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Returns a specified portion of the text."; // untranslated +Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "find first occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_OPERATOR_LAST"] = "find last occurrence of text"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TITLE"] = "in text %1 %2 %3"; // untranslated +Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found."; // untranslated +Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 is empty"; // untranslated +Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Returns true if the provided text is empty."; // untranslated +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated +Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "create text with"; // untranslated +Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Create a piece of text by joining together any number of items."; // untranslated +Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated +Blockly.Msg["TEXT_LENGTH_TITLE"] = "length of %1"; // untranslated +Blockly.Msg["TEXT_LENGTH_TOOLTIP"] = "Returns the number of letters (including spaces) in the provided text."; // untranslated +Blockly.Msg["TEXT_PRINT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#printing-text"; // untranslated +Blockly.Msg["TEXT_PRINT_TITLE"] = "print %1"; // untranslated +Blockly.Msg["TEXT_PRINT_TOOLTIP"] = "Print the specified text, number or other value."; // untranslated +Blockly.Msg["TEXT_PROMPT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user"; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "Prompt for user for a number."; // untranslated +Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "Prompt for user for some text."; // untranslated +Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "prompt for number with message"; // untranslated +Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "prompt for text with message"; // untranslated +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated +Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "replace %1 with %2 in %3"; // untranslated +Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Replace all occurances of some text within some other text."; // untranslated +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated +Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "reverse %1"; // untranslated +Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Reverses the order of the characters in the text."; // untranslated +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated +Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "A letter, word, or line of text."; // untranslated +Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "trim spaces from both sides of"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_LEFT"] = "trim spaces from left side of"; // untranslated +Blockly.Msg["TEXT_TRIM_OPERATOR_RIGHT"] = "trim spaces from right side of"; // untranslated +Blockly.Msg["TEXT_TRIM_TOOLTIP"] = "Return a copy of the text with spaces removed from one or both ends."; // untranslated +Blockly.Msg["TODAY"] = "ᥛᥫᥲᥢᥭᥳ"; +Blockly.Msg["UNDO"] = "Undo"; // untranslated +Blockly.Msg["UNNAMED_KEY"] = "unnamed"; // untranslated +Blockly.Msg["VARIABLES_DEFAULT_NAME"] = "ᥟᥢᥴ"; +Blockly.Msg["VARIABLES_GET_CREATE_SET"] = "Create 'set %1'"; // untranslated +Blockly.Msg["VARIABLES_GET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#get"; // untranslated +Blockly.Msg["VARIABLES_GET_TOOLTIP"] = "Returns the value of this variable."; // untranslated +Blockly.Msg["VARIABLES_SET"] = "set %1 to %2"; // untranslated +Blockly.Msg["VARIABLES_SET_CREATE_GET"] = "Create 'get %1'"; // untranslated +Blockly.Msg["VARIABLES_SET_HELPURL"] = "https://github.com/google/blockly/wiki/Variables#set"; // untranslated +Blockly.Msg["VARIABLES_SET_TOOLTIP"] = "Sets this variable to be equal to the input."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS"] = "A variable named '%1' already exists."; // untranslated +Blockly.Msg["VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE"] = "A variable named '%1' already exists for another type: '%2'."; // untranslated +Blockly.Msg["WORKSPACE_ARIA_LABEL"] = "Blockly Workspace"; // untranslated +Blockly.Msg["WORKSPACE_COMMENT_DEFAULT_TEXT"] = "Say something..."; // untranslated +Blockly.Msg["CONTROLS_FOREACH_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_FOR_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_IF_ELSEIF_TITLE_ELSEIF"] = Blockly.Msg["CONTROLS_IF_MSG_ELSEIF"]; +Blockly.Msg["CONTROLS_IF_ELSE_TITLE_ELSE"] = Blockly.Msg["CONTROLS_IF_MSG_ELSE"]; +Blockly.Msg["CONTROLS_IF_IF_TITLE_IF"] = Blockly.Msg["CONTROLS_IF_MSG_IF"]; +Blockly.Msg["CONTROLS_IF_MSG_THEN"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["CONTROLS_WHILEUNTIL_INPUT_DO"] = Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"]; +Blockly.Msg["LISTS_CREATE_WITH_ITEM_TITLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["LISTS_GET_INDEX_HELPURL"] = Blockly.Msg["LISTS_INDEX_OF_HELPURL"]; +Blockly.Msg["LISTS_GET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_GET_SUBLIST_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_INDEX_OF_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["LISTS_SET_INDEX_INPUT_IN_LIST"] = Blockly.Msg["LISTS_INLIST"]; +Blockly.Msg["MATH_CHANGE_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["PROCEDURES_DEFRETURN_COMMENT"] = Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"]; +Blockly.Msg["PROCEDURES_DEFRETURN_DO"] = Blockly.Msg["PROCEDURES_DEFNORETURN_DO"]; +Blockly.Msg["PROCEDURES_DEFRETURN_PROCEDURE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"]; +Blockly.Msg["PROCEDURES_DEFRETURN_TITLE"] = Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"]; +Blockly.Msg["TEXT_APPEND_VARIABLE"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; +Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TITLE_ITEM"] = Blockly.Msg["VARIABLES_DEFAULT_NAME"]; + +Blockly.Msg["MATH_HUE"] = "230"; +Blockly.Msg["LOOPS_HUE"] = "120"; +Blockly.Msg["LISTS_HUE"] = "260"; +Blockly.Msg["LOGIC_HUE"] = "210"; +Blockly.Msg["VARIABLES_HUE"] = "330"; +Blockly.Msg["TEXTS_HUE"] = "160"; +Blockly.Msg["PROCEDURES_HUE"] = "290"; +Blockly.Msg["COLOUR_HUE"] = "20"; +Blockly.Msg["VARIABLES_DYNAMIC_HUE"] = "310"; \ No newline at end of file diff --git a/msg/js/th.js b/msg/js/th.js index c0f4eafc993..82cbfb5bac4 100644 --- a/msg/js/th.js +++ b/msg/js/th.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "ถ้าเงื่อนไขเป Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "ถ้าเงื่อนไขเป็นจริง ก็จะ \"ทำ\" ตามที่กำหนด แต่ถ้าเงื่อนไขเป็นเท็จก็จะทำ \"นอกเหนือจากนี้\""; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำตามคำสั่งในบล็อกแรก แต่ถ้าไม่ก็จะไปตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามเงื่อนไขในบล็อกที่สองนี้"; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "ถ้าเงื่อนไขแรกเป็นจริง ก็จะทำคำสั่งในบล็อกแรก จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าเงื่อนไขแรกเป็นเท็จ ก็จะทำการตรวจเงื่อนไขที่สอง ถ้าเงื่อนไขที่สองเป็นจริง ก็จะทำตามคำสั่งในบล็อกที่สอง จากนั้นจะข้ามคำสั่งในบล็อกที่เหลือ แต่ถ้าทั้งเงื่อนไขแรกและเงื่อนไขที่สองเป็นเท็จทั้งหมด ก็จะมาทำบล็อกที่สาม"; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ทำ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ทำซ้ำ %1 ครั้ง"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "ทำซ้ำบางคำสั่งหลายครั้ง"; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "กำหนดไอเท Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "กำหนดไอเท็มในตำแหน่งที่ระบุในรายการ"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "กำหนดไอเท็มอันสุดท้ายในรายการ"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "กำหนดไอเท็มแบบสุ่มในรายการ"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "น้อยไปหามาก"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "มากไปหาน้อย"; Blockly.Msg["LISTS_SORT_TITLE"] = "เรียงลำดับ %1 %2 %3"; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "คืนค่าผลหา Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "คืนค่าผลต่างของตัวเลขทั้งสองจำนวน"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "คืนค่าผลคูณของตัวเลขทั้งสองจำนวน"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "คืนค่าผลการยกกำลัง โดยตัวเลขแรกเป็นฐาน และตัวเลขที่สองเป็นเลขชี้กำลัง"; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ของ X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "เปลี่ยนอาร์กแทนเจนต์ของชุด (X, Y) จากองศา 180 เป็น -180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "เปลี่ยนค่า %1 เป็น %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "เพิ่มค่าของตัวแปร \"%1\""; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://th.wikipedia.org/wiki/ค่าคงตัวทางคณิตศาสตร์"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "เป็นเลขบวก"; Blockly.Msg["MATH_IS_PRIME"] = "เป็นจำนวนเฉพาะ"; Blockly.Msg["MATH_IS_TOOLTIP"] = "ตรวจว่าตัวเลขเป็นจำนวนคู่ จำนวนคี่ จำนวนเฉพาะ จำนวนเต็ม เลขบวก เลขติดลบ หรือหารด้วยเลขที่กำหนดลงตัวหรือไม่ คืนค่าเป็นจริงหรือเท็จ"; Blockly.Msg["MATH_IS_WHOLE"] = "เป็นเลขจำนวนเต็ม"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "เศษของ %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน"; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,10 +238,10 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "สุ่มคืนค่าส Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "คืนค่าส่วนเบี่ยงเบนมาตรฐานของรายการ"; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "คืนค่าผลรวมของตัวเลขทั้งหมดในรายการ"; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "สุ่มเลขเศษส่วน"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0"; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด"; Blockly.Msg["MATH_ROUND_HELPURL"] = "https://th.wikipedia.org/wiki/การปัดเศษ"; @@ -249,7 +249,7 @@ Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "ปัดเศษ"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "ปัดเศษลง"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "ปัดเศษขึ้น"; Blockly.Msg["MATH_ROUND_TOOLTIP"] = "ปัดเศษของตัวเลขขึ้นหรือลง"; -Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; +Blockly.Msg["MATH_SINGLE_HELPURL"] = "https://en.wikipedia.org/wiki/Square_root"; // untranslated Blockly.Msg["MATH_SINGLE_OP_ABSOLUTE"] = "ค่าสัมบูรณ์"; Blockly.Msg["MATH_SINGLE_OP_ROOT"] = "รากที่สอง"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ABS"] = "คืนค่าค่าสัมบูรณ์ของตัวเลข"; diff --git a/msg/js/tr.js b/msg/js/tr.js index a4ac9cb819c..87b6f9efe1a 100644 --- a/msg/js/tr.js +++ b/msg/js/tr.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Blokları Daralt"; Blockly.Msg["COLLAPSE_BLOCK"] = "Bloğu Daralt"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "1. renk"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "2. renk"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "oran"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "karıştır"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Verilen bir orana (0.0 - 1.0) bağlı olarak iki rengi karıştırır."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "rastgele renk"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Rastgele bir renk seç."; Blockly.Msg["COLOUR_RGB_BLUE"] = "mavi"; Blockly.Msg["COLOUR_RGB_GREEN"] = "yeşil"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "kırmızı"; Blockly.Msg["COLOUR_RGB_TITLE"] = "renk değerleri"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Kırmızı, yeşil ve mavinin belirli miktarıyla bir renk oluştur. Tüm değerler 0 ile 100 arasında olmalıdır."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Bloğu Genişlet"; Blockly.Msg["EXTERNAL_INPUTS"] = "Harici Girişler"; Blockly.Msg["HELP"] = "Yardım"; Blockly.Msg["INLINE_INPUTS"] = "Satır içi Girişler"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "boş liste oluştur"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Veri kaydı içermeyen 0 uzunluğunda bir liste döndürür"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "liste"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "al ve kaldır"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "son"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "rastgele"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "kaldır"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Listedeki ilk öğeyi döndürür."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Listede belirtilen konumda bulunan öğeyi döndürür."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Listedeki son öğeyi döndürür."; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "ilk önce alt listeyi al"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "# listesinden alt listeyi al"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "# listesinden alt liste al"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Listenin belirtilen bölümünün bir kopyasını oluşturur."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 son öğedir."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 ilk öğedir."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Listedeki ilk öğeyi ayarla Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Öğeyi bir listede belirtilen konuma ayarlar."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Listedeki son öğeyi ayarlar."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Listede rastgele bir öğe ayarlar."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "artan"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "azalan"; Blockly.Msg["LISTS_SORT_TITLE"] = "sıra %1 %2 %3"; @@ -187,7 +187,7 @@ Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://tr.wikipedia.org/wiki/%3F:"; Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "if false"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "if true"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "'test' durumunu kontrol edin. Koşul true olursa, 'if true' değerini döndürür; aksi takdirde 'if false' değerini döndürür."; -Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; +Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://tr.wikipedia.org/wiki/Aritmetik"; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "İki sayının toplamını döndürün."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "İki sayının bölümünü döndürün."; @@ -205,7 +205,7 @@ Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Ortak sabitlerden birini döndür: π (3 Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "%1 en düşük %2 en yüksek %3 ile sınırla"; Blockly.Msg["MATH_CONSTRAIN_TOOLTIP"] = "Bir sayıyı belirtilen sınırlar arasında (dahil) ile sınırlandırın."; -Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; +Blockly.Msg["MATH_DIVISION_SYMBOL"] = "÷"; // untranslated Blockly.Msg["MATH_IS_DIVISIBLE_BY"] = "bölünebilir"; Blockly.Msg["MATH_IS_EVEN"] = "çift"; Blockly.Msg["MATH_IS_NEGATIVE"] = "negatif"; @@ -220,7 +220,7 @@ Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Kalanı iki sayıyı bölmekten döndürü Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "x"; Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://tr.wikipedia.org/wiki/Sayı"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Sayı."; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "liste ortalaması"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "maksimum liste"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "listenin medyanı"; @@ -259,7 +259,7 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_LOG10"] = "Bir sayının 10 logaritmasını ger Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Bir sayının reddini döndür."; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "10'u sayının gücüne döndür."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Bir sayının karekökünü döndürür."; -Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "tire"; +Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated Blockly.Msg["MATH_TRIG_ACOS"] = "akosünüs"; Blockly.Msg["MATH_TRIG_ASIN"] = "asinüs"; Blockly.Msg["MATH_TRIG_ATAN"] = "atanjant"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "Dizi değişkeni oluştur..."; Blockly.Msg["NEW_VARIABLE"] = "Değişken oluştur..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Yeni değişken ismi:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Yeni değişken tipi:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "ifadelere izin ver"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ile:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://tr.wikipedia.org/wiki/Alt_program"; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Kullanıcı tanımlı '%1' işle Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ile:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "'%1' oluştur"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Bu işlevi açıklayın..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://tr.wikipedia.org/wiki/Altyordam"; Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "bir şey yap"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "-"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "dönüş"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Çıkışa sahip bir işlev oluşturur."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Uyarı: Bu işlev yinelenen parametrelere sahiptir."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Vurgulama işlevi tanımı"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Bir değer true ise, ikinci bir değer döndürün."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Uyarı: Bu blok yalnızca bir işlev tanımı içinde kullanılabilir."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "giriş adı:"; @@ -324,10 +324,10 @@ Blockly.Msg["TEXT_CHARAT_FROM_START"] = "# harfini al"; Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "son harfi al"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "rastgele harf al"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "%1 içinde %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Belirtilen konumdaki harfi döndürür."; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "%1 içinde %2 say."; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "Bazı metnin başka bir metnin içinde kaç kez oluştuğunu sayın."; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "Metne bir öğe ekleyin."; @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "metinde"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "ilk harfinden alt dize al"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "# harfinden alt dize al"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "# harfinden alt dize al"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Metnin belirli bir bölümünü döndürür."; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "metnin ilk oluşumunu bul"; diff --git a/msg/js/uk.js b/msg/js/uk.js index 74d5bca7e8d..8a1094958b2 100644 --- a/msg/js/uk.js +++ b/msg/js/uk.js @@ -13,7 +13,7 @@ Blockly.Msg["COLLAPSE_ALL"] = "Згорнути блоки"; Blockly.Msg["COLLAPSE_BLOCK"] = "Згорнути блок"; Blockly.Msg["COLOUR_BLEND_COLOUR1"] = "колір 1"; Blockly.Msg["COLOUR_BLEND_COLOUR2"] = "колір 2"; -Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; +Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-blend/#:::rgbp"; // untranslated Blockly.Msg["COLOUR_BLEND_RATIO"] = "співвідношення"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "змішати"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Змішує два кольори разом у вказаному співвідношені (0.0 - 1.0)."; @@ -24,7 +24,7 @@ Blockly.Msg["COLOUR_RANDOM_TITLE"] = "випадковий колір"; Blockly.Msg["COLOUR_RANDOM_TOOLTIP"] = "Вибрати колір навмання."; Blockly.Msg["COLOUR_RGB_BLUE"] = "синій"; Blockly.Msg["COLOUR_RGB_GREEN"] = "зелений"; -Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; +Blockly.Msg["COLOUR_RGB_HELPURL"] = "https://www.december.com/html/spec/colorpercompact.html"; // untranslated Blockly.Msg["COLOUR_RGB_RED"] = "червоний"; Blockly.Msg["COLOUR_RGB_TITLE"] = "колір з"; Blockly.Msg["COLOUR_RGB_TOOLTIP"] = "Створити колір зі вказаними рівнями червоного, зеленого та синього. Усі значення мають бути від 0 до 100."; @@ -76,7 +76,7 @@ Blockly.Msg["EXPAND_BLOCK"] = "Розгорнути блок"; Blockly.Msg["EXTERNAL_INPUTS"] = "Зовнішні входи"; Blockly.Msg["HELP"] = "Довідка"; Blockly.Msg["INLINE_INPUTS"] = "Вбудовані входи"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "створити порожній список"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "Повертає список, довжиною 0, що не містить записів даних"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "список"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "отримати і вилучит Blockly.Msg["LISTS_GET_INDEX_LAST"] = "останній"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "випадковий"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "вилучити"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = "-ий."; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "Повертає перший елемент списку."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "Повертає елемент у заданій позиції у списку."; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "Повертає останній елемент списку."; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "отримати вкладений список з першого"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "отримати вкладений список від # з кінця"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "отримати вкладений список з #"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "символу."; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "Створює копію вказаної частини списку."; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1 - це останній елемент."; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1 - це перший елемент."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Задає перший ел Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Задає елемент списку у вказаній позиції."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Задає останній елемент списку."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Задає випадковий елемент у списку."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "за зростанням"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "за спаданням"; Blockly.Msg["LISTS_SORT_TITLE"] = "сортувати %3 %1 %2"; @@ -175,7 +175,7 @@ Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Lo Blockly.Msg["LOGIC_NEGATE_TITLE"] = "не %1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "Повертає істину, якщо вхідне значення хибне. Повертає хибність, якщо вхідне значення істинне."; Blockly.Msg["LOGIC_NULL"] = "ніщо"; -Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; +Blockly.Msg["LOGIC_NULL_HELPURL"] = "https://en.wikipedia.org/wiki/Nullable_type"; // untranslated Blockly.Msg["LOGIC_NULL_TOOLTIP"] = "Повертає ніщо."; Blockly.Msg["LOGIC_OPERATION_AND"] = "та"; Blockly.Msg["LOGIC_OPERATION_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#logical-operations"; // untranslated @@ -183,7 +183,7 @@ Blockly.Msg["LOGIC_OPERATION_OR"] = "або"; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_AND"] = "Повертає істину, якщо обидва входи істинні."; Blockly.Msg["LOGIC_OPERATION_TOOLTIP_OR"] = "Повертає істину, якщо принаймні один з входів істинний."; Blockly.Msg["LOGIC_TERNARY_CONDITION"] = "тест"; -Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; +Blockly.Msg["LOGIC_TERNARY_HELPURL"] = "https://en.wikipedia.org/wiki/%3F:"; // untranslated Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "якщо хибність"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "якщо істина"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Перевіряє умову в 'тест'. Якщо умова істинна, то повертає значення 'якщо істина'; в іншому випадку повертає значення 'якщо хибність'."; @@ -194,10 +194,10 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Повертає частку Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Повертає різницю двох чисел."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Повертає добуток двох чисел."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Повертає перше число, піднесене до степеня, вираженого другим числом."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 по X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Повертає арктангенс точки (X, Y) у градусах від -180 до 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "змінити %1 на %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Додати число до змінної '%1'."; Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://uk.wikipedia.org/wiki/Математична_константа"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "Створити рядкову змінн Blockly.Msg["NEW_VARIABLE"] = "Створити змінну..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "Нова назва змінної:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Тип нової змінної:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "-ий."; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "дозволити дії"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "з:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://uk.wikipedia.org/wiki/Підпрограма"; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Запустити корист Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "з:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Створити \"%1\""; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Опишіть цю функцію..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = "блок тексту"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://uk.wikipedia.org/wiki/Підпрограма"; Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "щось зробити"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "до"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "повернути"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "Створює функцію з виводом."; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "Увага: ця функція має дубльовані параметри."; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "Підсвітити визначення функції"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "Якщо значення істинне, то повернути друге значення."; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "Попередження: цей блок може використовуватися лише в межах визначення функції."; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "назва входу:"; @@ -321,10 +321,10 @@ Blockly.Msg["TEXT_CHANGECASE_TOOLTIP"] = "В іншому випадку пов Blockly.Msg["TEXT_CHARAT_FIRST"] = "отримати перший символ"; Blockly.Msg["TEXT_CHARAT_FROM_END"] = "отримати символ # з кінця"; Blockly.Msg["TEXT_CHARAT_FROM_START"] = "отримати символ #"; -Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; +Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "отримати останній символ"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "отримати випадковий символ"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = "-ий."; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "з тексту %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "Повертає символ у зазначеній позиції."; Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "у тексті"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "отримати підрядок від першого символу"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "отримати підрядок від символу # з кінця"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "отримати підрядок від символу #"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "-ого."; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "Повертає заданий фрагмент тексту."; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "знайти перше входження тексту"; @@ -351,7 +351,7 @@ Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Повертає індекс першо Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 є порожнім"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Повертає істину, якщо вказаний текст порожній."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "створити текст з"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Створити фрагмент тексту шляхом з'єднування будь-якого числа елементів."; Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated diff --git a/msg/js/ur.js b/msg/js/ur.js index cfe34c7e503..6634f7c8bd4 100644 --- a/msg/js/ur.js +++ b/msg/js/ur.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ریشیو"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "مرکب"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "دیئے گئے ریشیو میں دو رنگوں کو مرکب کریں (0.0-1.0)"; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "پیلیٹ سے رنگ منتخب کریں"; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "ناسیدھا رنگ"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "اگر ایک ویلیو صحیح ہے، Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "کریں"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "%1 مرتبہ دہرائے"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "کچھ جملوں کو کہیں مرتبہ کریں۔"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "غلط"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "سچ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -188,7 +188,7 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "اگر غلط ہے"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "اگ سچ ہے"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated @@ -218,7 +218,7 @@ Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_opera Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ایک نمبر."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated diff --git a/msg/js/uz.js b/msg/js/uz.js index 92d4988c97d..3aa9b5566e8 100644 --- a/msg/js/uz.js +++ b/msg/js/uz.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ratio"; // untranslated Blockly.Msg["COLOUR_BLEND_TITLE"] = "blend"; // untranslated Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; // untranslated Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "tasodifiy rang"; diff --git a/msg/js/vi.js b/msg/js/vi.js index 4cd062992a0..793ff650ea7 100644 --- a/msg/js/vi.js +++ b/msg/js/vi.js @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Nếu điều kiện đúng, thực hi Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu sai, thực hiện các lệnh sau."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Nếu điều kiện đúng, thực hiện các lệnh đầu. Nếu không, nếu điều kiện thứ hai đúng, thực hiện các lệnh thứ hai. Nếu không điều kiện nào đúng, thực hiện các lệnh cuối cùng."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "thực hiện"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "lặp lại %1 lần"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Thực hiện các lệnh vài lần."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Đặt giá trị của thà Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Đặt giá trị của thành tố ở vị trí ấn định trong một danh sách."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Đặt giá trị của thành tố cuối cùng trong danh sách."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Đặt giá trị của thành tố ngẫu nhiên trong danh sách."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "tăng dần"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "giảm dần"; Blockly.Msg["LISTS_SORT_TITLE"] = "sắp xếp %1 %2 %3"; @@ -194,13 +194,13 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Hoàn trả thương của hai Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Hoàn trả hiệu của hai con số."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Hoàn trả tích của hai con số."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Hoàn trả số lũy thừa với số thứ nhất là cơ số và số thứ hai là số mũ."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 của X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Trả về arctangent của điểm (X, Y) trong khoảng từ -180 độ đến 180 độ."; Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng"; Blockly.Msg["MATH_CHANGE_TITLE"] = "cộng vào %1 giá trị %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Cộng số đầu vào vào biến \"%1\"."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Hoàn trả các đẳng số thường gặp: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (vô cực)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "giới hạn %1 không dưới %2 không hơn %3"; @@ -214,13 +214,13 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "là số dương"; Blockly.Msg["MATH_IS_PRIME"] = "là số nguyên tố"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Kiểm tra con số xem nó có phải là số chẵn, lẻ, nguyên tố, nguyên, dương, âm, hay xem nó có chia hết cho số đầu vào hay không. Hoàn trả đúng hay sai."; Blockly.Msg["MATH_IS_WHOLE"] = "là số nguyên"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "số dư của %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://vi.wikipedia.org/wiki/S%E1%BB%91"; Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "Một con số."; -Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; +Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "giá trị trung bình của một danh sách"; Blockly.Msg["MATH_ONLIST_OPERATOR_MAX"] = "số lớn nhât của một danh sách"; Blockly.Msg["MATH_ONLIST_OPERATOR_MEDIAN"] = "số trung vị của một danh sách"; @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Hoàn trả một số bất kỳ t Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Hoàn trả độ lệch chuẩn của danh sách số."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Hoàn trả tổng số của tất cả các số trong danh sách."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "phân số bất kỳ"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Hoàn trả một phân số bất kỳ không nhỏ hơn 0.0 và không lớn hơn 1.0."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "Một số nguyên bất kỳ từ %1 đến %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Hoàn trả một số nguyên bất kỳ lớn hơn hoặc bằng số đầu và nhỏ hơn hoặc bằng số sau."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "làm tròn"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "làm tròn xuống"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "làm tròn lên"; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "Đổi dấu của số đầu vào: Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "Hoàn trả lũy thừa của số 10 với số mũ đầu vào."; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "Hoàn trả căn bật hai của số đầu vào."; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; +Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; +Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; +Blockly.Msg["MATH_TRIG_COS"] = "cos"; Blockly.Msg["MATH_TRIG_HELPURL"] = "https://vi.wikipedia.org/wiki/H%C3%A0m_l%C6%B0%E1%BB%A3ng_gi%C3%A1c"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "sin"; +Blockly.Msg["MATH_TRIG_TAN"] = "tan"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Hoàn trả Arccos của một góc (theo độ)."; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "Hoàn trả Arcsin của một góc (theo độ)."; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "Hoàn trả Arctang của một góc (theo độ)."; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Chạy một thủ tục có gi Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "với:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Tạo mảnh \"thực hiện %1\""; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "Mô tả hàm này..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "làm gì đó"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "thủ tục để"; @@ -351,7 +351,7 @@ Blockly.Msg["TEXT_INDEXOF_TOOLTIP"] = "Hoàn trả vị trí xuất hiện đầ Blockly.Msg["TEXT_ISEMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text"; // untranslated Blockly.Msg["TEXT_ISEMPTY_TITLE"] = "%1 trống không"; Blockly.Msg["TEXT_ISEMPTY_TOOLTIP"] = "Hoàn trả “đúng nếu văn bản không có ký tự nào."; -Blockly.Msg["TEXT_JOIN_HELPURL"] = ""; +Blockly.Msg["TEXT_JOIN_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-creation"; // untranslated Blockly.Msg["TEXT_JOIN_TITLE_CREATEWITH"] = "tạo văn bản từ"; Blockly.Msg["TEXT_JOIN_TOOLTIP"] = "Tạo một văn bản từ các thành phần."; Blockly.Msg["TEXT_LENGTH_HELPURL"] = "https://github.com/google/blockly/wiki/Text#text-modification"; // untranslated diff --git a/msg/js/yo.js b/msg/js/yo.js index 7feb5fe4f69..720fa6a4ee4 100644 --- a/msg/js/yo.js +++ b/msg/js/yo.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ipin"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "apapọ"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Da awo meji papo pelu ipin (0.0 - 1.0)."; -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Yan awọ kan lati inu patako awọ."; Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "awọ àrìnàkò"; @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "Bi iye yii ba je otito, lẹyinna ṣe a Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "Bi iye yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, ṣe alaye akọkọ bulọọku keji."; Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bibẹẹkọ, Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji."; Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "Bi iye akọkọ yii ba je otito, lẹyinna ṣe alaye bulọọku akọkọ. Bi iye keji yii ba je otito, ṣe alaye akọkọ bulọọku keji. Bi eyikeyi iye naa ko ba je otito, ṣe alaye akọkọ bulọọku ti o gbeyin."; -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ṣe"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "Iye igba %1 ti tun ṣe"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Ṣe awon alaye ni igba pupo."; @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "Fi ohun kan sii ni ibẹrẹ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "Ṣeto ohun akọkọ sii ipo kan pato ti a ti yan ni akojọ."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "Fi ohun kan kun si opin akojọ."; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "Fi ohun kan kun si àrìnàkò akojọ."; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "si oke"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "si isalẹ"; Blockly.Msg["LISTS_SORT_TITLE"] = "to %1 %2 %3"; @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "irọ"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Da pada bi o je otito tabi iro."; Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "otitọ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Da otito pada b iafikun mejeji ba dogba bakanna."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Da otito pada bi afikun akooko ba tobi ju afiku keji lo."; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Da otito pada bi afikun akooko ba tobi ju tabi dogba pelu afiku keji lo."; @@ -194,13 +194,13 @@ Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Da adarọ iye ti awọn nọmb Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Da iyatọ awọn nọmba meji naa pada."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Da abajade awọn nọmba meji naa pada."; Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Da nọmba akọkọ ti a gbe si agbara ti nọmba keji pada."; -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Da ojuami arctangent pada (X, Y) ni awon digiri lati -180 si 180."; -Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; +Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated Blockly.Msg["MATH_CHANGE_TITLE"] = "iyipada %1 nipasẹ %2"; Blockly.Msg["MATH_CHANGE_TOOLTIP"] = "Se afiku si nọmba orisirisi '%1'."; -Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; +Blockly.Msg["MATH_CONSTANT_HELPURL"] = "https://en.wikipedia.org/wiki/Mathematical_constant"; // untranslated Blockly.Msg["MATH_CONSTANT_TOOLTIP"] = "Da ọkan ninu awọn aiyipada ti o wọpọ pada: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (ailopin)."; Blockly.Msg["MATH_CONSTRAIN_HELPURL"] = "https://en.wikipedia.org/wiki/Clamping_(graphics)"; // untranslated Blockly.Msg["MATH_CONSTRAIN_TITLE"] = "atokọ %1 kukuru %2 giga %3"; @@ -214,7 +214,7 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "je di dara"; Blockly.Msg["MATH_IS_PRIME"] = "je nọ́mbà àkọ́kọ́"; Blockly.Msg["MATH_IS_TOOLTIP"] = "Ṣe ayẹwo boya nọmba jẹ eyi to se pin, ai se pin, akori, odidi, ti o dara, ti ko dara, tabi ti o ba se e pin pelu nọmba kan. Pada otitọ tabi irọ."; Blockly.Msg["MATH_IS_WHOLE"] = "je odidi"; -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "iyokù %1 ÷ %2"; Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Da iyokù lati pinpin awọn nọmba meji pada."; Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated @@ -238,13 +238,13 @@ Blockly.Msg["MATH_ONLIST_TOOLTIP_RANDOM"] = "Da àrìnàkò ida ipilẹ nkan lat Blockly.Msg["MATH_ONLIST_TOOLTIP_STD_DEV"] = "Da iṣiro deede ti akojọ pada."; Blockly.Msg["MATH_ONLIST_TOOLTIP_SUM"] = "Da apapo gbogbo awọn nọmba inu akojọ pada."; Blockly.Msg["MATH_POWER_SYMBOL"] = "^"; // untranslated -Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_FLOAT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_FLOAT_TITLE_RANDOM"] = "oniruru ipin"; Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Da àrìnàkò ida pada laarin 0.0 (ini afikun) ati 1.0 (iyasọtọ)."; -Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; +Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "oniruru abala lati %1 si %2"; Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Da àrìnàkò abala laarin awon opin pato meji pada, ini afikun."; -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "pa ju de"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "pa ju de si isalẹ"; Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "pa ju de soke"; @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Da arccosine ti digiri pada."; @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "Iru oniruuru tuntun:"; Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "gba alaye laaye"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "pẹlu:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Ṣe ṣalaye-iṣẹ ti olumulo '%1'."; -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Ṣe ṣalaye-iṣẹ ti olumulo '%1' kii o sii lo iṣagbejade rẹ."; Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "pẹlu:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Ṣe idasile '%1'"; @@ -371,7 +371,7 @@ Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "Ṣe iropo gbogbo awọn iṣẹlẹ ti o Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "Ṣe iyipada %1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "Ṣe iyipada aṣẹ awọn ohun kikọ inu ọrọ naa."; -Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; +Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://en.wikipedia.org/wiki/String_(computer_science)"; // untranslated Blockly.Msg["TEXT_TEXT_TOOLTIP"] = "Lẹta, ọrọ, tabi ila ọrọ."; Blockly.Msg["TEXT_TRIM_HELPURL"] = "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces"; // untranslated Blockly.Msg["TEXT_TRIM_OPERATOR_BOTH"] = "ge awọn alafo lati awọn igun mejeji ti"; diff --git a/msg/js/zgh.js b/msg/js/zgh.js index cb9db9fa8d5..a5284f6aab3 100644 --- a/msg/js/zgh.js +++ b/msg/js/zgh.js @@ -17,7 +17,7 @@ Blockly.Msg["COLOUR_BLEND_HELPURL"] = "https://meyerweb.com/eric/tools/color-ble Blockly.Msg["COLOUR_BLEND_RATIO"] = "ⴰⵙⵙⴰⵖ"; Blockly.Msg["COLOUR_BLEND_TITLE"] = "ⵙⵎⵔⴽⵙ"; Blockly.Msg["COLOUR_BLEND_TOOLTIP"] = "Blends two colours together with a given ratio (0.0 - 1.0)."; // untranslated -Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; +Blockly.Msg["COLOUR_PICKER_HELPURL"] = "https://en.wikipedia.org/wiki/Color"; // untranslated Blockly.Msg["COLOUR_PICKER_TOOLTIP"] = "Choose a colour from the palette."; // untranslated Blockly.Msg["COLOUR_RANDOM_HELPURL"] = "http://randomcolour.com"; // untranslated Blockly.Msg["COLOUR_RANDOM_TITLE"] = "random colour"; // untranslated @@ -51,7 +51,7 @@ Blockly.Msg["CONTROLS_IF_TOOLTIP_1"] = "If a value is true, then do some stateme Blockly.Msg["CONTROLS_IF_TOOLTIP_2"] = "If a value is true, then do the first block of statements. Otherwise, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_3"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements."; // untranslated Blockly.Msg["CONTROLS_IF_TOOLTIP_4"] = "If the first value is true, then do the first block of statements. Otherwise, if the second value is true, do the second block of statements. If none of the values are true, do the last block of statements."; // untranslated -Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; +Blockly.Msg["CONTROLS_REPEAT_HELPURL"] = "https://en.wikipedia.org/wiki/For_loop"; // untranslated Blockly.Msg["CONTROLS_REPEAT_INPUT_DO"] = "ⴳ"; Blockly.Msg["CONTROLS_REPEAT_TITLE"] = "ⴰⵍⵙ %1 ⵜⵉⴽⴽⴰⵍ"; Blockly.Msg["CONTROLS_REPEAT_TOOLTIP"] = "Do some statements several times."; // untranslated @@ -164,7 +164,7 @@ Blockly.Msg["LOGIC_BOOLEAN_FALSE"] = "ⴰⵔⵎⵉⴷⵉ"; Blockly.Msg["LOGIC_BOOLEAN_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#values"; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TOOLTIP"] = "Returns either true or false."; // untranslated Blockly.Msg["LOGIC_BOOLEAN_TRUE"] = "ⴰⵎⵉⴷⵉ"; -Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; +Blockly.Msg["LOGIC_COMPARE_HELPURL"] = "https://en.wikipedia.org/wiki/Inequality_(mathematics)"; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_EQ"] = "Return true if both inputs equal each other."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GT"] = "Return true if the first input is greater than the second input."; // untranslated Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "Return true if the first input is greater than or equal to the second input."; // untranslated @@ -188,13 +188,13 @@ Blockly.Msg["LOGIC_TERNARY_IF_FALSE"] = "ⵎⴽ ⵓⵔ ⵉⴷⵜⵜⵉ"; Blockly.Msg["LOGIC_TERNARY_IF_TRUE"] = "ⵎⴽ ⵉⴷⵜⵜⴰ"; Blockly.Msg["LOGIC_TERNARY_TOOLTIP"] = "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value."; // untranslated Blockly.Msg["MATH_ADDITION_SYMBOL"] = "+"; // untranslated -Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; +Blockly.Msg["MATH_ARITHMETIC_HELPURL"] = "https://en.wikipedia.org/wiki/Arithmetic"; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_ADD"] = "Return the sum of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_DIVIDE"] = "Return the quotient of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MINUS"] = "Return the difference of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_MULTIPLY"] = "Return the product of the two numbers."; // untranslated Blockly.Msg["MATH_ARITHMETIC_TOOLTIP_POWER"] = "Return the first number raised to the power of the second number."; // untranslated -Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; +Blockly.Msg["MATH_ATAN2_HELPURL"] = "https://en.wikipedia.org/wiki/Atan2"; // untranslated Blockly.Msg["MATH_ATAN2_TITLE"] = "atan2 ⵙⴳ X:%1 Y:%2"; Blockly.Msg["MATH_ATAN2_TOOLTIP"] = "Return the arctangent of point (X, Y) in degrees from -180 to 180."; // untranslated Blockly.Msg["MATH_CHANGE_HELPURL"] = "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter"; // untranslated @@ -214,11 +214,11 @@ Blockly.Msg["MATH_IS_POSITIVE"] = "is positive"; // untranslated Blockly.Msg["MATH_IS_PRIME"] = "is prime"; // untranslated Blockly.Msg["MATH_IS_TOOLTIP"] = "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false."; // untranslated Blockly.Msg["MATH_IS_WHOLE"] = "is whole"; // untranslated -Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; +Blockly.Msg["MATH_MODULO_HELPURL"] = "https://en.wikipedia.org/wiki/Modulo_operation"; // untranslated Blockly.Msg["MATH_MODULO_TITLE"] = "remainder of %1 ÷ %2"; // untranslated Blockly.Msg["MATH_MODULO_TOOLTIP"] = "Return the remainder from dividing the two numbers."; // untranslated Blockly.Msg["MATH_MULTIPLICATION_SYMBOL"] = "×"; // untranslated -Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; +Blockly.Msg["MATH_NUMBER_HELPURL"] = "https://en.wikipedia.org/wiki/Number"; // untranslated Blockly.Msg["MATH_NUMBER_TOOLTIP"] = "ⴽⵔⴰ ⵏ ⵓⵎⴹⴰⵏ."; Blockly.Msg["MATH_ONLIST_HELPURL"] = ""; // untranslated Blockly.Msg["MATH_ONLIST_OPERATOR_AVERAGE"] = "average of list"; // untranslated @@ -244,7 +244,7 @@ Blockly.Msg["MATH_RANDOM_FLOAT_TOOLTIP"] = "Return a random fraction between 0.0 Blockly.Msg["MATH_RANDOM_INT_HELPURL"] = "https://en.wikipedia.org/wiki/Random_number_generation"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TITLE"] = "random integer from %1 to %2"; // untranslated Blockly.Msg["MATH_RANDOM_INT_TOOLTIP"] = "Return a random integer between the two specified limits, inclusive."; // untranslated -Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; +Blockly.Msg["MATH_ROUND_HELPURL"] = "https://en.wikipedia.org/wiki/Rounding"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUND"] = "round"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDDOWN"] = "round down"; // untranslated Blockly.Msg["MATH_ROUND_OPERATOR_ROUNDUP"] = "round up"; // untranslated @@ -264,7 +264,7 @@ Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated -Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; +Blockly.Msg["MATH_TRIG_HELPURL"] = "https://en.wikipedia.org/wiki/Trigonometric_functions"; // untranslated Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "Return the arccosine of a number."; // untranslated @@ -282,9 +282,9 @@ Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "ⴰⵏⴰⵡ ⴰⵎⴰⵢⵏⵓ ⵏ Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "allow statements"; // untranslated Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "ⵙ:"; -Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLNORETURN_TOOLTIP"] = "Run the user-defined function '%1'."; // untranslated -Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; +Blockly.Msg["PROCEDURES_CALLRETURN_HELPURL"] = "https://en.wikipedia.org/wiki/Subroutine"; // untranslated Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "Run the user-defined function '%1' and use its output."; // untranslated Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "ⵙ:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "Create '%1'"; // untranslated diff --git a/msg/js/zh-hans.js b/msg/js/zh-hans.js index 3e3ae23410c..18195d66a30 100644 --- a/msg/js/zh-hans.js +++ b/msg/js/zh-hans.js @@ -76,12 +76,12 @@ Blockly.Msg["EXPAND_BLOCK"] = "展开块"; Blockly.Msg["EXTERNAL_INPUTS"] = "外部输入"; Blockly.Msg["HELP"] = "帮助"; Blockly.Msg["INLINE_INPUTS"] = "单行输入"; -Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; +Blockly.Msg["LISTS_CREATE_EMPTY_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-empty-list"; // untranslated Blockly.Msg["LISTS_CREATE_EMPTY_TITLE"] = "创建空列表"; Blockly.Msg["LISTS_CREATE_EMPTY_TOOLTIP"] = "返回一个列表,长度为 0,不包含任何数据记录"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TITLE_ADD"] = "列表"; Blockly.Msg["LISTS_CREATE_WITH_CONTAINER_TOOLTIP"] = "增加、删除或重新排列各部分以此重新配置这个列表块。"; -Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; +Blockly.Msg["LISTS_CREATE_WITH_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_CREATE_WITH_INPUT_WITH"] = "创建列表,内容:"; Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "将一个项添加到列表中。"; Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "建立一个具有任意数量项目的列表。"; @@ -93,7 +93,7 @@ Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "取得并移除"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "最后一项"; Blockly.Msg["LISTS_GET_INDEX_RANDOM"] = "随机的一项"; Blockly.Msg["LISTS_GET_INDEX_REMOVE"] = "移除"; -Blockly.Msg["LISTS_GET_INDEX_TAIL"] = "-"; +Blockly.Msg["LISTS_GET_INDEX_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FIRST"] = "返回列表中的第一项。"; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_FROM"] = "返回在列表中的指定位置的项。"; Blockly.Msg["LISTS_GET_INDEX_TOOLTIP_GET_LAST"] = "返回列表中的最后一项。"; @@ -113,7 +113,7 @@ Blockly.Msg["LISTS_GET_SUBLIST_HELPURL"] = "https://github.com/google/blockly/wi Blockly.Msg["LISTS_GET_SUBLIST_START_FIRST"] = "获取子列表,从第一项"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_END"] = "获取子列表,从倒数第#项"; Blockly.Msg["LISTS_GET_SUBLIST_START_FROM_START"] = "获取子列表,从第#项"; -Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = "-"; +Blockly.Msg["LISTS_GET_SUBLIST_TAIL"] = ""; // untranslated Blockly.Msg["LISTS_GET_SUBLIST_TOOLTIP"] = "复制列表中指定的部分。"; Blockly.Msg["LISTS_INDEX_FROM_END_TOOLTIP"] = "%1是最后一项。"; Blockly.Msg["LISTS_INDEX_FROM_START_TOOLTIP"] = "%1是第一项。"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "返回列表的长度。"; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "建立列表使用项 %1 重复 %2 次"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "建立包含指定重复次数的值的列表。"; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "倒转%1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "倒转一个列表,返回副本。"; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "设置列表中的第一项 Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "设置在列表中指定位置的项。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "设置列表中的最后一项。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "设置列表中的随机一项。"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "升序"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降序"; Blockly.Msg["LISTS_SORT_TITLE"] = "排序%1 %2 %3"; @@ -154,7 +154,7 @@ Blockly.Msg["LISTS_SORT_TOOLTIP"] = "排序一个列表,返回副本。"; Blockly.Msg["LISTS_SORT_TYPE_IGNORECASE"] = "按字母(忽略大小写)"; Blockly.Msg["LISTS_SORT_TYPE_NUMERIC"] = "按数字"; Blockly.Msg["LISTS_SORT_TYPE_TEXT"] = "按字母"; -Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; +Blockly.Msg["LISTS_SPLIT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists"; // untranslated Blockly.Msg["LISTS_SPLIT_LIST_FROM_TEXT"] = "从文本制作列表"; Blockly.Msg["LISTS_SPLIT_TEXT_FROM_LIST"] = "将列表合并为文本"; Blockly.Msg["LISTS_SPLIT_TOOLTIP_JOIN"] = "加入文本列表至一个文本,由分隔符分隔。"; @@ -171,7 +171,7 @@ Blockly.Msg["LOGIC_COMPARE_TOOLTIP_GTE"] = "如果第一个输入结果大于或 Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LT"] = "如果第一个输入结果比第二个小,则返回真。"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_LTE"] = "如果第一个输入结果小于或等于第二个输入结果,则返回真。"; Blockly.Msg["LOGIC_COMPARE_TOOLTIP_NEQ"] = "如果两个输入结果不相等,则返回真。"; -Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; +Blockly.Msg["LOGIC_NEGATE_HELPURL"] = "https://github.com/google/blockly/wiki/Logic#not"; // untranslated Blockly.Msg["LOGIC_NEGATE_TITLE"] = "非%1"; Blockly.Msg["LOGIC_NEGATE_TOOLTIP"] = "如果输入结果为假,则返回真;如果输入结果为真,则返回假。"; Blockly.Msg["LOGIC_NULL"] = "空"; @@ -279,7 +279,7 @@ Blockly.Msg["NEW_STRING_VARIABLE"] = "创建字符串变量..."; Blockly.Msg["NEW_VARIABLE"] = "创建变量..."; Blockly.Msg["NEW_VARIABLE_TITLE"] = "新变量的名称:"; Blockly.Msg["NEW_VARIABLE_TYPE_TITLE"] = "新变量的类型:"; -Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = "-"; +Blockly.Msg["ORDINAL_NUMBER_SUFFIX"] = ""; // untranslated Blockly.Msg["PROCEDURES_ALLOW_STATEMENTS"] = "允许声明"; Blockly.Msg["PROCEDURES_BEFORE_PARAMS"] = "与:"; Blockly.Msg["PROCEDURES_CALLNORETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程序"; @@ -289,7 +289,7 @@ Blockly.Msg["PROCEDURES_CALLRETURN_TOOLTIP"] = "运行用户定义的函数“%1 Blockly.Msg["PROCEDURES_CALL_BEFORE_PARAMS"] = "与:"; Blockly.Msg["PROCEDURES_CREATE_DO"] = "创建“%1”"; Blockly.Msg["PROCEDURES_DEFNORETURN_COMMENT"] = "描述该功能..."; -Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = "-"; +Blockly.Msg["PROCEDURES_DEFNORETURN_DO"] = ""; // untranslated Blockly.Msg["PROCEDURES_DEFNORETURN_HELPURL"] = "https://zh.wikipedia.org/wiki/子程序"; Blockly.Msg["PROCEDURES_DEFNORETURN_PROCEDURE"] = "做点什么"; Blockly.Msg["PROCEDURES_DEFNORETURN_TITLE"] = "至"; @@ -299,7 +299,7 @@ Blockly.Msg["PROCEDURES_DEFRETURN_RETURN"] = "返回"; Blockly.Msg["PROCEDURES_DEFRETURN_TOOLTIP"] = "创建一个有输出值的函数。"; Blockly.Msg["PROCEDURES_DEF_DUPLICATE_WARNING"] = "警告:此函数具有重复参数。"; Blockly.Msg["PROCEDURES_HIGHLIGHT_DEF"] = "突出显示函数定义"; -Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; +Blockly.Msg["PROCEDURES_IFRETURN_HELPURL"] = "http://c2.com/cgi/wiki?GuardClause"; // untranslated Blockly.Msg["PROCEDURES_IFRETURN_TOOLTIP"] = "如果值为真,则返回第二个值。"; Blockly.Msg["PROCEDURES_IFRETURN_WARNING"] = "警告:这个块只能在函数内部使用。"; Blockly.Msg["PROCEDURES_MUTATORARG_TITLE"] = "输入名称:"; @@ -324,10 +324,10 @@ Blockly.Msg["TEXT_CHARAT_FROM_START"] = "获取第#个字符"; Blockly.Msg["TEXT_CHARAT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#extracting-text"; // untranslated Blockly.Msg["TEXT_CHARAT_LAST"] = "获取最后一个字符"; Blockly.Msg["TEXT_CHARAT_RANDOM"] = "获取随机一个字符"; -Blockly.Msg["TEXT_CHARAT_TAIL"] = "-"; +Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "在文本%1 里 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "返回位于指定位置的字符。"; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "计算%1在%2里出现的次数"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "计算在一段文本中,某个部分文本重复出现了多少次。"; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "将一个项添加到文本中。"; @@ -341,7 +341,7 @@ Blockly.Msg["TEXT_GET_SUBSTRING_INPUT_IN_TEXT"] = "从文本"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FIRST"] = "获取子串,从第一个字符"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_END"] = "获取子串,从倒数第#个字符"; Blockly.Msg["TEXT_GET_SUBSTRING_START_FROM_START"] = "获取子串,从第#个字符"; -Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = "-"; +Blockly.Msg["TEXT_GET_SUBSTRING_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_GET_SUBSTRING_TOOLTIP"] = "返回文本中指定的一部分。"; Blockly.Msg["TEXT_INDEXOF_HELPURL"] = "https://github.com/google/blockly/wiki/Text#finding-text"; // untranslated Blockly.Msg["TEXT_INDEXOF_OPERATOR_FIRST"] = "寻找第一次出现的文本"; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "要求用户输入数字。"; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "要求用户输入一些文本。"; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "要求输入数字,并显示提示消息"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "要求输入文本,并显示提示消息"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "把%3中的%1替换为%2"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "在一段文本中,将出现过的某部分文本都替换掉。"; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "倒转文本%1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "将文本中各个字符的顺序倒转。"; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://zh.wikipedia.org/wiki/字符串"; diff --git a/msg/js/zh-hant.js b/msg/js/zh-hant.js index 0ab34e8671a..b31124ec7ab 100644 --- a/msg/js/zh-hant.js +++ b/msg/js/zh-hant.js @@ -87,7 +87,7 @@ Blockly.Msg["LISTS_CREATE_WITH_ITEM_TOOLTIP"] = "添加一個項目到清單裡 Blockly.Msg["LISTS_CREATE_WITH_TOOLTIP"] = "建立一個具備任意數量項目的清單。"; Blockly.Msg["LISTS_GET_INDEX_FIRST"] = "第一筆"; Blockly.Msg["LISTS_GET_INDEX_FROM_END"] = "倒數第 # 筆"; -Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; // untranslated +Blockly.Msg["LISTS_GET_INDEX_FROM_START"] = "#"; Blockly.Msg["LISTS_GET_INDEX_GET"] = "取得"; Blockly.Msg["LISTS_GET_INDEX_GET_REMOVE"] = "取得並移除"; Blockly.Msg["LISTS_GET_INDEX_LAST"] = "最後一筆"; @@ -131,7 +131,7 @@ Blockly.Msg["LISTS_LENGTH_TOOLTIP"] = "返回清單的長度(項目數)。"; Blockly.Msg["LISTS_REPEAT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#create-list-with"; // untranslated Blockly.Msg["LISTS_REPEAT_TITLE"] = "建立清單使用項目 %1 重複 %2 次"; Blockly.Msg["LISTS_REPEAT_TOOLTIP"] = "建立一個清單,項目中包含指定重複次數的值。"; -Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; +Blockly.Msg["LISTS_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#reversing-a-list"; // untranslated Blockly.Msg["LISTS_REVERSE_MESSAGE0"] = "反轉%1"; Blockly.Msg["LISTS_REVERSE_TOOLTIP"] = "反轉清單的複製內容。"; Blockly.Msg["LISTS_SET_INDEX_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#in-list--set"; // untranslated @@ -146,7 +146,7 @@ Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FIRST"] = "設定清單中的第一個 Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_FROM"] = "設定清單中指定位置的項目。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_LAST"] = "設定清單中的最後一個項目。"; Blockly.Msg["LISTS_SET_INDEX_TOOLTIP_SET_RANDOM"] = "設定清單中隨機一個項目。"; -Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; +Blockly.Msg["LISTS_SORT_HELPURL"] = "https://github.com/google/blockly/wiki/Lists#sorting-a-list"; // untranslated Blockly.Msg["LISTS_SORT_ORDER_ASCENDING"] = "升序"; Blockly.Msg["LISTS_SORT_ORDER_DESCENDING"] = "降序"; Blockly.Msg["LISTS_SORT_TITLE"] = "排列 %1 %2 %3"; @@ -260,13 +260,13 @@ Blockly.Msg["MATH_SINGLE_TOOLTIP_NEG"] = "返回指定數字的相反數。"; Blockly.Msg["MATH_SINGLE_TOOLTIP_POW10"] = "返回指定數字指數的10的冪次。"; Blockly.Msg["MATH_SINGLE_TOOLTIP_ROOT"] = "返回指定數字的平方根。"; Blockly.Msg["MATH_SUBTRACTION_SYMBOL"] = "-"; // untranslated -Blockly.Msg["MATH_TRIG_ACOS"] = "acos"; // untranslated -Blockly.Msg["MATH_TRIG_ASIN"] = "asin"; // untranslated -Blockly.Msg["MATH_TRIG_ATAN"] = "atan"; // untranslated -Blockly.Msg["MATH_TRIG_COS"] = "cos"; // untranslated +Blockly.Msg["MATH_TRIG_ACOS"] = "反餘弦"; +Blockly.Msg["MATH_TRIG_ASIN"] = "反正弦"; +Blockly.Msg["MATH_TRIG_ATAN"] = "反正切"; +Blockly.Msg["MATH_TRIG_COS"] = "餘弦"; Blockly.Msg["MATH_TRIG_HELPURL"] = "https://zh.wikipedia.org/wiki/三角函數"; -Blockly.Msg["MATH_TRIG_SIN"] = "sin"; // untranslated -Blockly.Msg["MATH_TRIG_TAN"] = "tan"; // untranslated +Blockly.Msg["MATH_TRIG_SIN"] = "正弦"; +Blockly.Msg["MATH_TRIG_TAN"] = "正切"; Blockly.Msg["MATH_TRIG_TOOLTIP_ACOS"] = "返回指定角度的反餘弦值(非弧度)。"; Blockly.Msg["MATH_TRIG_TOOLTIP_ASIN"] = "返回指定角度的反正弦值(非弧度)。"; Blockly.Msg["MATH_TRIG_TOOLTIP_ATAN"] = "返回指定角度的反正切值。"; @@ -327,7 +327,7 @@ Blockly.Msg["TEXT_CHARAT_RANDOM"] = "取得 任意字元"; Blockly.Msg["TEXT_CHARAT_TAIL"] = ""; // untranslated Blockly.Msg["TEXT_CHARAT_TITLE"] = "在文字 %1 %2"; Blockly.Msg["TEXT_CHARAT_TOOLTIP"] = "返回位於指定位置的字元。"; -Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; +Blockly.Msg["TEXT_COUNT_HELPURL"] = "https://github.com/google/blockly/wiki/Text#counting-substrings"; // untranslated Blockly.Msg["TEXT_COUNT_MESSAGE0"] = "在%2計算%1"; Blockly.Msg["TEXT_COUNT_TOOLTIP"] = "計算某些文字在內容裡的出現次數。"; Blockly.Msg["TEXT_CREATE_JOIN_ITEM_TOOLTIP"] = "添加一個項目到字串中。"; @@ -365,10 +365,10 @@ Blockly.Msg["TEXT_PROMPT_TOOLTIP_NUMBER"] = "輸入數字"; Blockly.Msg["TEXT_PROMPT_TOOLTIP_TEXT"] = "輸入文字"; Blockly.Msg["TEXT_PROMPT_TYPE_NUMBER"] = "輸入 數字 並顯示提示訊息"; Blockly.Msg["TEXT_PROMPT_TYPE_TEXT"] = "輸入 文字 並顯示提示訊息"; -Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; +Blockly.Msg["TEXT_REPLACE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#replacing-substrings"; // untranslated Blockly.Msg["TEXT_REPLACE_MESSAGE0"] = "在%3以%2取代%1"; Blockly.Msg["TEXT_REPLACE_TOOLTIP"] = "取代在內容裡的全部某些文字。"; -Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; +Blockly.Msg["TEXT_REVERSE_HELPURL"] = "https://github.com/google/blockly/wiki/Text#reversing-text"; // untranslated Blockly.Msg["TEXT_REVERSE_MESSAGE0"] = "反轉%1"; Blockly.Msg["TEXT_REVERSE_TOOLTIP"] = "反轉排序在文字裡的字元。"; Blockly.Msg["TEXT_TEXT_HELPURL"] = "https://zh.wikipedia.org/wiki/字串"; diff --git a/msg/json/ar.json b/msg/json/ar.json index f61769639ef..91fc4e01e60 100644 --- a/msg/json/ar.json +++ b/msg/json/ar.json @@ -1,8 +1,10 @@ { "@metadata": { "authors": [ + "Amire80", "Diyariq", "DonAdnan", + "Dr-Taher", "Meno25", "Mido", "Moud hosny", @@ -21,18 +23,18 @@ "ADD_COMMENT": "أضف تعليقًا", "REMOVE_COMMENT": "أزل التعليق", "DUPLICATE_COMMENT": "تعليق مكرر", - "EXTERNAL_INPUTS": "ادخال خارجي", - "INLINE_INPUTS": "ادخال خطي", - "DELETE_BLOCK": "احذف القطعة", - "DELETE_X_BLOCKS": "احذف %1 قطع", - "DELETE_ALL_BLOCKS": "حذف %1 قطعة؟", - "CLEAN_UP": "ترتيب القطع", - "COLLAPSE_BLOCK": "إخفاء القطعة", - "COLLAPSE_ALL": "إخفاء القطع", - "EXPAND_BLOCK": "وسٌّع القطعة", - "EXPAND_ALL": "وسٌّع القطع", - "DISABLE_BLOCK": "عطّل القطعة", - "ENABLE_BLOCK": "أعد تفعيل القطعة", + "EXTERNAL_INPUTS": "مدخلات خارجية", + "INLINE_INPUTS": "مدخلات مضمنة", + "DELETE_BLOCK": "حذف كتلة", + "DELETE_X_BLOCKS": "احذف %1 كتلة", + "DELETE_ALL_BLOCKS": "حذف %1 كتلة؟", + "CLEAN_UP": "تنظيف الكتل", + "COLLAPSE_BLOCK": "انهيار الكتلة", + "COLLAPSE_ALL": "انهيار الكتل", + "EXPAND_BLOCK": "وسٌّع الكتلة", + "EXPAND_ALL": "وسٌّع الكتل", + "DISABLE_BLOCK": "عطّل كتلة", + "ENABLE_BLOCK": "تمكين كتلة", "HELP": "مساعدة", "UNDO": "رجوع", "REDO": "إعادة", @@ -50,17 +52,15 @@ "DELETE_VARIABLE_CONFIRMATION": "حذف%1 1 استخدامات المتغير '%2'؟", "CANNOT_DELETE_VARIABLE_PROCEDURE": "لايمكن حذف متغير \"%1\" بسبب انه جزء من الدالة \"%2\"", "DELETE_VARIABLE": "حذف المتغير %1", - "COLOUR_PICKER_HELPURL": "https://ar.wikipedia.org/wiki/Color", + "COLOUR_PICKER_HELPURL": "https://ar.wikipedia.org/wiki/لون", "COLOUR_PICKER_TOOLTIP": "اختر لون من اللوحة.", "COLOUR_RANDOM_TITLE": "لون عشوائي", "COLOUR_RANDOM_TOOLTIP": "اختر لون بشكل عشوائي.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "لون مع", "COLOUR_RGB_RED": "أحمر", "COLOUR_RGB_GREEN": "أخضر", "COLOUR_RGB_BLUE": "أزرق", "COLOUR_RGB_TOOLTIP": "إنشئ لون بالكمية المحددة من الأحمر, الأخضر والأزرق. بحيث يجب تكون كافة القيم بين 0 و 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "دمج", "COLOUR_BLEND_COLOUR1": "اللون 1", "COLOUR_BLEND_COLOUR2": "اللون 2", @@ -109,7 +109,6 @@ "LOGIC_BOOLEAN_TRUE": "صحيح", "LOGIC_BOOLEAN_FALSE": "خاطئ", "LOGIC_BOOLEAN_TOOLTIP": "يرجع صحيح أو خاطئ.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "فارغ", "LOGIC_NULL_TOOLTIP": "ترجع ملغى.", "LOGIC_TERNARY_HELPURL": ":https://ar.wikipedia.org/wiki/%3F", @@ -119,11 +118,6 @@ "LOGIC_TERNARY_TOOLTIP": "تحقق الشرط في 'الاختبار'. إذا كان الشرط صحيح، يقوم بإرجاع قيمة 'اذا كانت العبارة صحيحة'؛ خلاف ذلك يرجع قيمة 'اذا كانت العبارة خاطئة'.", "MATH_NUMBER_HELPURL": "https://ar.wikipedia.org/wiki/%D8%B9%D8%AF%D8%AF", "MATH_NUMBER_TOOLTIP": "عدد ما.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "جيب", "MATH_TRIG_COS": "جيب تمام", "MATH_TRIG_TAN": "ظل", @@ -163,7 +157,6 @@ "MATH_IS_NEGATIVE": "هو سالب", "MATH_IS_DIVISIBLE_BY": "قابل للقسمة", "MATH_IS_TOOLTIP": "تحقق إذا كان عدد ما زوجيا، فرذيا, أوليا، صحيحا،موجبا أو سالبا، أو إذا كان قابلا للقسمة على عدد معين. يرجع صحيح أو خاطئ.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "غير %1 بـ %2", "MATH_CHANGE_TOOLTIP": "إضف رقم إلى متغير '%1'.", "MATH_ROUND_HELPURL": "https://ar.wikipedia.org/wiki/تقريب_(رياضيات)", @@ -198,7 +191,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://ar.wikipedia.org/wiki/توليد_الأعداد_العشوائية", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "كسر عشوائي", "MATH_RANDOM_FLOAT_TOOLTIP": "يرجع جزء عشوائي بين 0.0 (ضمنياً) و 1.0 (خارجيا).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 من X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "عودة قوس ظل النقطة (س، ص) بالدرجات من -180 إلى 180.", "TEXT_TEXT_HELPURL": "https://ar.wikipedia.org/wiki/سلسلة_(علم_الحاسوب)", @@ -253,7 +245,6 @@ "TEXT_REPLACE_TOOLTIP": "استبدل جميع حالات حدوث بعض النصوص داخل نص آخر.", "TEXT_REVERSE_MESSAGE0": "عكس %1", "TEXT_REVERSE_TOOLTIP": "يعكس ترتيب حروف النص", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "إنشئ قائمة فارغة", "LISTS_CREATE_EMPTY_TOOLTIP": "تقوم بإرجاع قائمة، طولها 0, لا تحتوي على أية سجلات البيانات", "LISTS_CREATE_WITH_TOOLTIP": "أنشىء قائمة من أي عدد من العناصر.", @@ -311,7 +302,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "إلى # من نهاية", "LISTS_GET_SUBLIST_END_LAST": "إلى الأخير", "LISTS_GET_SUBLIST_TOOLTIP": "يقوم بإنشاء نسخة من الجزء المحدد من قائمة ما.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "رتب %1 %2 %3", "LISTS_SORT_TOOLTIP": "فرز نسخة من القائمة.", "LISTS_SORT_ORDER_ASCENDING": "تصاعديا", diff --git a/msg/json/az.json b/msg/json/az.json index 32097cc3b79..b9b03f1687b 100644 --- a/msg/json/az.json +++ b/msg/json/az.json @@ -48,13 +48,11 @@ "COLOUR_PICKER_TOOLTIP": "Palitradan bir rəng seçin.", "COLOUR_RANDOM_TITLE": "təsadüfi rəng", "COLOUR_RANDOM_TOOLTIP": "Təsadüfi bir rəng seçin.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "rənglə", "COLOUR_RGB_RED": "qırmızı", "COLOUR_RGB_GREEN": "yaşıl", "COLOUR_RGB_BLUE": "mavi", "COLOUR_RGB_TOOLTIP": "Qırmızı, yaşıl və mavinin göstərilən miqdarı ilə bir rəng düzəlt. Bütün qiymətlər 0 ilə 100 arasında olmalıdır.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "qarışdır", "COLOUR_BLEND_COLOUR1": "rəng 1", "COLOUR_BLEND_COLOUR2": "rəng 2", @@ -111,11 +109,6 @@ "LOGIC_TERNARY_TOOLTIP": "'Yoxla' əmrindəki şərtə nəzər yetirin. Əgər şərt \"doğru\"-dursa \"əgər doğru\", əks halda isə \"əgər yalan\" cavabını qaytarır.", "MATH_NUMBER_HELPURL": "https://az.wikipedia.org/wiki/Ədəd", "MATH_NUMBER_TOOLTIP": "Ədəd.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tg", @@ -155,10 +148,8 @@ "MATH_IS_NEGATIVE": "mənfidir", "MATH_IS_DIVISIBLE_BY": "bölünür", "MATH_IS_TOOLTIP": "Bir ədədin cüt, tək, sadə, tam, müsbət, mənfi olmasını və ya müəyyən bir ədədə bölünməsini yoxlayır. \"Doğru\" və ya \"yalan\" qiymətini qaytarır.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "dəyiş: %1 buna: %2", "MATH_CHANGE_TOOLTIP": "'%1' dəyişəninin üzərinə bir ədəd artır.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Ədədi aşağı və ya yuxari yuvarlaqşdır.", "MATH_ROUND_OPERATOR_ROUND": "yuvarlaqlaşdır", "MATH_ROUND_OPERATOR_ROUNDUP": "yuxarı yuvarlaqlaşdır", @@ -179,20 +170,15 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Siyahının standart deviasiyasını qaytarır.", "MATH_ONLIST_OPERATOR_RANDOM": "siyahıdan təsadüfi seçilmiş bir element", "MATH_ONLIST_TOOLTIP_RANDOM": "Siyahıdan təsadüfi bir element qaytarır.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 bölməsinin qalığı", "MATH_MODULO_TOOLTIP": "İki ədədin nisbətindən alınan qalığı qaytarır.", "MATH_CONSTRAIN_TITLE": "%1 üçün ən aşağı %2, ən yuxarı %3 olmağı tələb et", "MATH_CONSTRAIN_TOOLTIP": "Bir ədədin verilmiş iki ədəd arasında olmasını tələb edir (sərhədlər də daxil olmaqla).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "%1 ilə %2 arasından təsadüfi tam ədəd", "MATH_RANDOM_INT_TOOLTIP": "Verilmiş iki ədəd arasından (ədədrlər də daxil olmaqla) təsadüfi bir tam ədəd qaytarır.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "təsadüfi kəsr", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (daxil olmaqla) və 1.0 (daxil olmamaqla) ədədlərinin arasından təsadüfi bir kəsr ədəd qaytarır.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TOOLTIP": "(X,Y) nöqtələrinin -180 - 180 dərəcədə arktangensini hesabla.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Mətndəki hərf, söz və ya sətir.", "TEXT_JOIN_TITLE_CREATEWITH": "Verilmişlərlə mətn yarat", "TEXT_JOIN_TOOLTIP": "İxtiyari sayda elementlərinin birləşməsi ilə mətn parçası yarat.", @@ -301,7 +287,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "sondan # nömrəliyə", "LISTS_GET_SUBLIST_END_LAST": "Sonuncuya", "LISTS_GET_SUBLIST_TOOLTIP": "Siyahının təyin olunmuş hissəsinin surətini yaradın.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 sortlaşdır", "LISTS_SORT_TOOLTIP": "Siyahının nüsxəsini sortlaşdır.", "LISTS_SORT_ORDER_ASCENDING": "artan üzrə", @@ -331,9 +316,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Nəticəsi olan funksiya yaradır.", "PROCEDURES_ALLOW_STATEMENTS": "operatorlara icazə", "PROCEDURES_DEF_DUPLICATE_WARNING": "Xəbərdarlıq: Bu funksiyanın təkrar olunmuş parametrləri var.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Yaradılmış '%1' funksiyasını çalışdır və nəticəni istifadə et.", "PROCEDURES_MUTATORCONTAINER_TITLE": "girişlər", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bu funksiyanın giriş parametrləri üçün əlavə et, sil, və ya yenilə.", diff --git a/msg/json/bcc.json b/msg/json/bcc.json index c8794faba77..86f3d2dfa2f 100644 --- a/msg/json/bcc.json +++ b/msg/json/bcc.json @@ -2,10 +2,13 @@ "@metadata": { "authors": [ "Baloch Afghanistan", + "StarrySky", "Sultanselim baloch" ] }, "VARIABLES_DEFAULT_NAME": "مورد", + "UNNAMED_KEY": "بدون نام", + "TODAY": "مرۏچی", "DUPLICATE_BLOCK": "تکراری", "ADD_COMMENT": "افزودن نظر", "REMOVE_COMMENT": "حذف نظر", @@ -273,9 +276,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D9%88%DB%8C%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", diff --git a/msg/json/be-tarask.json b/msg/json/be-tarask.json index f11f5917cad..26db3ce6900 100644 --- a/msg/json/be-tarask.json +++ b/msg/json/be-tarask.json @@ -57,7 +57,6 @@ "COLOUR_BLEND_COLOUR2": "колер 2", "COLOUR_BLEND_RATIO": "дзеля", "COLOUR_BLEND_TOOLTIP": "Зьмешвае два колеры ў дадзенай прапорцыі (0.0 — 1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "паўтарыць %1 раз(ы)", "CONTROLS_REPEAT_INPUT_DO": "выканаць", "CONTROLS_REPEAT_TOOLTIP": "Выконвае апэрацыі некалькі разоў.", @@ -141,10 +140,8 @@ "MATH_IS_NEGATIVE": "адмоўная", "MATH_IS_DIVISIBLE_BY": "дзеліцца на", "MATH_IS_TOOLTIP": "Правярае, ці зьяўляецца лік парным, няпарным, простым, станоўчым, адмоўным, ці ён дзеліцца на пэўны лік без астатку. Вяртае значэньне ісьціна або няпраўда.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "зьмяніць %1 на %2", "MATH_CHANGE_TOOLTIP": "Дадае лічбу да зьменнай '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Акругленьне ліку да большага ці меншага.", "MATH_ROUND_OPERATOR_ROUND": "акругліць", "MATH_ROUND_OPERATOR_ROUNDUP": "акругліць да большага", @@ -165,21 +162,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Вяртае стандартнае адхіленьне сьпісу.", "MATH_ONLIST_OPERATOR_RANDOM": "выпадковы элемэнт сьпісу", "MATH_ONLIST_TOOLTIP_RANDOM": "Вяртае выпадковы элемэнт сьпісу.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "рэшта дзяленьня %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Вяртае рэшту дзяленьня двух лікаў.", "MATH_CONSTRAIN_TITLE": "абмежаваць %1 зьнізу %2 зьверху %3", "MATH_CONSTRAIN_TOOLTIP": "Абмяжоўвае колькасьць ніжняй і верхняй межамі (уключна).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "выпадковая цэлая з %1 для %2", "MATH_RANDOM_INT_TOOLTIP": "Вяртае выпадковы цэлы лік паміж двума зададзенымі абмежаваньнямі ўключна.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "выпадковая дроб", "MATH_RANDOM_FLOAT_TOOLTIP": "Вяртае выпадковую дроб у дыяпазоне ад 0,0 (уключна) да 1,0.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 ад X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Вяртае арктангенс пункту (X, Y) у градусах ад -180 да 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Літара, слова ці радок тэксту.", "TEXT_JOIN_TITLE_CREATEWITH": "стварыць тэкст з", "TEXT_JOIN_TOOLTIP": "Стварае фрагмэнт тэксту аб’яднаньнем любой колькасьці элемэнтаў.", @@ -226,13 +218,10 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Запытаць у карыстальніка лічбу.", "TEXT_PROMPT_TOOLTIP_TEXT": "Запытаць у карыстальніка тэкст.", "TEXT_COUNT_MESSAGE0": "падлічыць %1 сярод %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Падлічвае колькі разоў нейкі тэкст сустракаецца ўнутры нейкага іншага тэксту.", "TEXT_REPLACE_MESSAGE0": "замяніць %1 на %2 у %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Замяняе ўсе выпадкі нейкага тэксту на іншы тэкст.", "TEXT_REVERSE_MESSAGE0": "адваротна %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Мяняе парадак сымбаляў у тэксьце на адваротны.", "LISTS_CREATE_EMPTY_TITLE": "стварыць пусты сьпіс", "LISTS_CREATE_EMPTY_TOOLTIP": "Вяртае сьпіс даўжынёй 0, які ня ўтрымлівае запісаў зьвестак", @@ -290,7 +279,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "па № з канца", "LISTS_GET_SUBLIST_END_LAST": "да апошняга", "LISTS_GET_SUBLIST_TOOLTIP": "Стварае копію пазначанай часткі сьпісу.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сартаваць %1 %2 %3", "LISTS_SORT_TOOLTIP": "Сартаваць копію сьпісу.", "LISTS_SORT_ORDER_ASCENDING": "па павелічэньні", @@ -303,7 +291,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "з падзяляльнікам", "LISTS_SPLIT_TOOLTIP_SPLIT": "Падзяліць тэкст у сьпіс тэкстаў, па падзяляльніках.", "LISTS_SPLIT_TOOLTIP_JOIN": "Аб’ядноўвае сьпіс тэкстаў у адзін тэкст па падзяляльніках.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "адваротна %1", "LISTS_REVERSE_TOOLTIP": "Зьмяняе парадак копіі сьпісу на адваротны.", "VARIABLES_GET_TOOLTIP": "Вяртае значэньне гэтай зьменнай.", @@ -321,9 +308,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Стварае функцыю з вынікам.", "PROCEDURES_ALLOW_STATEMENTS": "дазволіць зацьвярджэньне", "PROCEDURES_DEF_DUPLICATE_WARNING": "Увага: гэтая функцыя мае парамэтры-дублікаты.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Запусьціць функцыю вызначаную карыстальнікам '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Запусьціць функцыю вызначаную карыстальнікам '%1' і выкарыстаць яе вынік.", "PROCEDURES_MUTATORCONTAINER_TITLE": "парамэтры", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Дадаць, выдаліць ці запісаць чаргу ўваходных парамэтраў для гэтай функцыі.", @@ -332,7 +317,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Падсьвяціць вызначэньне функцыі", "PROCEDURES_CREATE_DO": "Стварыць '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Калі значэньне ісьціна, вярнуць другое значэньне.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Папярэджаньне: гэты блёк можа выкарыстоўвацца толькі ў вызначанай функцыі.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Напішыце што-небудзь…", "WORKSPACE_ARIA_LABEL": "Працоўная прастора Blockly", diff --git a/msg/json/be.json b/msg/json/be.json index a4d197de24d..42db4ac1d6e 100644 --- a/msg/json/be.json +++ b/msg/json/be.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "No Sleep till Krupki", "SimondR", "ZlyiLev" ] @@ -276,7 +277,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "па # з канца", "LISTS_GET_SUBLIST_END_LAST": "па апошні", "LISTS_GET_SUBLIST_TOOLTIP": "Стварае копію ўказанай частцы спісу.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сартаваць %1 %2 %3", "LISTS_SORT_TOOLTIP": "Сартаваць копію спісу.", "LISTS_SORT_ORDER_ASCENDING": "па ўзрастанню", @@ -300,21 +300,21 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "выканаць нешта", "PROCEDURES_BEFORE_PARAMS": "з:", "PROCEDURES_CALL_BEFORE_PARAMS": "з:", - "PROCEDURES_DEFNORETURN_TOOLTIP": "Стварыць працэдуру, якая ня вяртае значэнне.", + "PROCEDURES_DEFNORETURN_TOOLTIP": "Стварыць функцыю, якая не вяртае значэнне.", "PROCEDURES_DEFNORETURN_COMMENT": "Апішыце гэтую функцыю...", "PROCEDURES_DEFRETURN_RETURN": "вярнуць", - "PROCEDURES_DEFRETURN_TOOLTIP": "Стварыць працэдуру, якая вяртае значэнне.", + "PROCEDURES_DEFRETURN_TOOLTIP": "Стварыць функцыю, якая вяртае значэнне.", "PROCEDURES_ALLOW_STATEMENTS": "дазволіць аператары", "PROCEDURES_DEF_DUPLICATE_WARNING": "Папярэджанне: гэтая функцыя мае паўтаральныя параметры.", "PROCEDURES_CALLNORETURN_HELPURL": "https://be.wikipedia.org/wiki/Падпраграма", - "PROCEDURES_CALLNORETURN_TOOLTIP": "Выконвае вызначаную карыстальнікам працэдуру '%1'.", + "PROCEDURES_CALLNORETURN_TOOLTIP": "Выконвае вызначаную карыстальнікам функцыю '%1'.", "PROCEDURES_CALLRETURN_HELPURL": "https://be.wikipedia.org/wiki/Падпраграма", - "PROCEDURES_CALLRETURN_TOOLTIP": "Выконвае вызначаную карыстальнікам працэдуру '%1' і вяртае вылічанае значэнне.", + "PROCEDURES_CALLRETURN_TOOLTIP": "Выконвае вызначаную карыстальнікам функцыю '%1' і ўжыць яе значэнне.", "PROCEDURES_MUTATORCONTAINER_TITLE": "параметры", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Дадаць, выдаліць або змяніць парадак уваходных параметраў для гэтай функцыі.", "PROCEDURES_MUTATORARG_TITLE": "імя параметра:", "PROCEDURES_MUTATORARG_TOOLTIP": "Дадаць уваходны параметр ў функцыю.", - "PROCEDURES_HIGHLIGHT_DEF": "Вылучыць вызначэнне працэдуры", + "PROCEDURES_HIGHLIGHT_DEF": "Вылучыць вызначэнне функцыі", "PROCEDURES_CREATE_DO": "Стварыць выклік '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Калі першае значэнне ісцінае, вяртае другое значэнне.", "PROCEDURES_IFRETURN_WARNING": "Папярэджанне: гэты блок можа выкарыстоўвацца толькі ўнутры вызначэння функцыі.", diff --git a/msg/json/bg.json b/msg/json/bg.json index eade47e5ff3..af46cf20657 100644 --- a/msg/json/bg.json +++ b/msg/json/bg.json @@ -88,7 +88,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Добави, премахни или пренареди частите, за да промениш този „ако“ блок.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Добави условие към „ако“ блока.", "CONTROLS_IF_ELSE_TOOLTIP": "Добави окончателно, прихващащо всички останали случаи условие към блок „ако“.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Върни вярно, ако двата параметъра са еднакви.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Върни вярно, ако двата параметъра са различни.", "LOGIC_COMPARE_TOOLTIP_LT": "Върни вярно, ако първият параметър е по-малък от втория.", @@ -118,7 +117,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Върни произведението на двете числа.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Върни частното на двете числа.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Върни първото число, повдигнато на степен на второто число.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "корен квадратен", "MATH_SINGLE_TOOLTIP_ROOT": "Връща корен квадратен от число.", "MATH_SINGLE_OP_ABSOLUTE": "абсолютна", @@ -148,7 +146,6 @@ "MATH_CHANGE_HELPURL": "https://bg.wikipedia.org/wiki/Събиране", "MATH_CHANGE_TITLE": "промени %1 на %2", "MATH_CHANGE_TOOLTIP": "Добави число към променлива „%1“.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Закръгли число нагоре или надолу.", "MATH_ROUND_OPERATOR_ROUND": "закръгли", "MATH_ROUND_OPERATOR_ROUNDUP": "закръгли нагоре", @@ -180,7 +177,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://bg.wikipedia.org/wiki/Генератор_на_случайни_числа", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случайно дробно число", "MATH_RANDOM_FLOAT_TOOLTIP": "Върни случайно дробно число между 0.0 (включително) и 1.0 (без да го включва)", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 от X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Връща аркустангенс на точка (X, Y) в градуси от -180 до 180.", "TEXT_TEXT_HELPURL": "https://bg.wikipedia.org/wiki/Низ", @@ -230,13 +226,10 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Питай потребителя за число.", "TEXT_PROMPT_TOOLTIP_TEXT": "Питай потребителя за текст.", "TEXT_COUNT_MESSAGE0": "пресмята броя на %1 в %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Преброй колко пъти даден текст се среща в друг текст.", "TEXT_REPLACE_MESSAGE0": "замяна на %1 с %2 в %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Замени всички появи на даден текст в друг текст.", "TEXT_REVERSE_MESSAGE0": "промени реда на обратно %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Промени реда на знаците в текста на обратно.", "LISTS_CREATE_EMPTY_TITLE": "създай празен списък", "LISTS_CREATE_EMPTY_TOOLTIP": "Връща списък с дължина 0, не съдържащ данни", @@ -294,7 +287,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "до № открая", "LISTS_GET_SUBLIST_END_LAST": "до края", "LISTS_GET_SUBLIST_TOOLTIP": "Копира част от списък.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сортиране по %1 %2 %3", "LISTS_SORT_TOOLTIP": "Подреди копие на списъка.", "LISTS_SORT_ORDER_ASCENDING": "възходящо", @@ -307,7 +299,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "с разделител", "LISTS_SPLIT_TOOLTIP_SPLIT": "Разделя текст в списък на текстове, по всеки разделител.", "LISTS_SPLIT_TOOLTIP_JOIN": "Събира списък от текстове в един текст, раделени с разделител.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "промени реда на обратно %1", "LISTS_REVERSE_TOOLTIP": "Промени реда на списъка на обратно.", "VARIABLES_GET_TOOLTIP": "Връща стойността на тази променлива.", @@ -336,7 +327,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Покажи дефиницията на функцията", "PROCEDURES_CREATE_DO": "Създай '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Ако стойността е вярна, върни втората стойност.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Този блок може да се използва само във функция.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Коментирайте нещо...", "WORKSPACE_ARIA_LABEL": "Работна област на Blockly", diff --git a/msg/json/bn.json b/msg/json/bn.json index 722f2092d51..6590d6f3cd9 100644 --- a/msg/json/bn.json +++ b/msg/json/bn.json @@ -143,7 +143,6 @@ "TEXT_TRIM_OPERATOR_RIGHT": "ডানপাশ থেকে খালি অংশ ছাটাই", "TEXT_PRINT_TITLE": "%1 মুদ্রণ করুন", "TEXT_REVERSE_MESSAGE0": "%1 উল্টান", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "LISTS_CREATE_EMPTY_TITLE": "খালি তালিকা তৈরি করুন", "LISTS_CREATE_EMPTY_TOOLTIP": "পাঠাবে একটি তালিকা, দের্ঘ্য হবে ০, কোন উপাত্ত থাকবে না", "LISTS_CREATE_WITH_TOOLTIP": "যেকোন সংখ্যক পদ নিয়ে একটি তালিকা তৈরি করুন।", diff --git a/msg/json/br.json b/msg/json/br.json index 886c149fc00..a152d9fc1cc 100644 --- a/msg/json/br.json +++ b/msg/json/br.json @@ -58,7 +58,6 @@ "COLOUR_BLEND_COLOUR2": "liv 2", "COLOUR_BLEND_RATIO": "feur", "COLOUR_BLEND_TOOLTIP": "a gemmesk daou liv gant ur feur roet(0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "adober %1 gwech", "CONTROLS_REPEAT_INPUT_DO": "ober", "CONTROLS_REPEAT_TOOLTIP": "Seveniñ urzhioù zo meur a wech", @@ -85,7 +84,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Ouzhpennañ, lemel pe adurzhiañ ar rannoù evit kefluniañ ar bloc'h ma.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Ouzhpennañ un amplegad d'ar bloc'h ma.", "CONTROLS_IF_ELSE_TOOLTIP": "Ouzhpennañ un amplegad dibenn lak-pep-tra d'ar bloc'h ma.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Distreiñ gwir m'eo par an daou voned.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Distreiñ gwir ma n'eo ket par an daou voned.", "LOGIC_COMPARE_TOOLTIP_LT": "Distreiñ gwir m'eo bihanoc'h ar moned kentañ eget an eil.", @@ -132,7 +130,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Distreiñ ark sinuz un niver", "MATH_TRIG_TOOLTIP_ACOS": "Distreiñ ark kosinuz un niver", "MATH_TRIG_TOOLTIP_ATAN": "Distreiñ ark tangent un niver", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Distreiñ unan eus digemmennoù red : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (anvevenn).", "MATH_IS_EVEN": "zo par", "MATH_IS_ODD": "zo ampar", @@ -142,10 +139,8 @@ "MATH_IS_NEGATIVE": "a zo negativel", "MATH_IS_DIVISIBLE_BY": "a zo rannadus dre", "MATH_IS_TOOLTIP": "Gwiriañ m'eo par, anpar, kentañ, muiel, leiel un niverenn pe ma c'haller rannañ anezhi dre un niver roet zo. Distreiñ gwir pe faos.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "kemmañ %1 gant %2", "MATH_CHANGE_TOOLTIP": "Ouzhpennañ un niver d'an argemmenn '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Rontaat un niver dindan pe a-us", "MATH_ROUND_OPERATOR_ROUND": "Rontaat", "MATH_ROUND_OPERATOR_ROUNDUP": "Rontaat a-us", @@ -166,21 +161,17 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Distreiñ forc'had standart al listenn.", "MATH_ONLIST_OPERATOR_RANDOM": "Elfennn eus al listenn tennet d'ar sord", "MATH_ONLIST_TOOLTIP_RANDOM": "Distreiñ un elfenn zargouezhek el listenn", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "rest eus %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Distreiñ dilerc'h rannadur an div niver", "MATH_CONSTRAIN_TITLE": "destrizhañ %1 etre %2 ha %3", "MATH_CONSTRAIN_TOOLTIP": "Destrizhañ un niver da vezañ etre ar bevennoù spisaet (enlakaet)", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "anterin dargouezhek etre %1 ha %2", "MATH_RANDOM_INT_TOOLTIP": "Distreiñ un anterin dargouezhek etre an div vevenn spisaet, endalc'het.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Rann dargouezhek", "MATH_RANDOM_FLOAT_TOOLTIP": "Distreiñ ur rann dargouezhek etre 0.0 (enkaelat) hag 1.0 (ezkaelat).", "MATH_ATAN2_HELPURL": "https://fr.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 eus X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Adkas a ra ark tangent ar poent (X, Y) e derezioù etre -180 ha 180", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Ul lizherenn, ur ger pe ul linennad testenn.", "TEXT_JOIN_TITLE_CREATEWITH": "krouiñ un destenn gant", "TEXT_JOIN_TOOLTIP": "Krouit un tamm testenn en ur gevelstrollañ un niver bennak a elfennoù", @@ -227,17 +218,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Goulenn un niver gant an implijer.", "TEXT_PROMPT_TOOLTIP_TEXT": "Goulenn un destenn gant an implijer.", "TEXT_COUNT_MESSAGE0": "niver %1 war %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Kontañ pet gwech e c'hoarvez un destenn bennak en un destenn bennak all.", "TEXT_REPLACE_MESSAGE0": "erlec'hiañ %1 gant %2 e %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Erlec'hiañ holl reveziadennoù un destenn bennak gant un destenn all.", "TEXT_REVERSE_MESSAGE0": "eilpennañ %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Eilpennañ urzh an arouezennoù en destenn.", "LISTS_CREATE_EMPTY_TITLE": "krouiñ ur roll goullo", "LISTS_CREATE_EMPTY_TOOLTIP": "Distreiñ ul listenn, 0 a hirder, n'eus enrolladenn ebet enni", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Krouiñ ur roll gant un niver bennak a elfennoù.", "LISTS_CREATE_WITH_INPUT_WITH": "krouiñ ur roll gant", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "roll", @@ -292,7 +279,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "betek # adalek an dibenn", "LISTS_GET_SUBLIST_END_LAST": "betek ar fin", "LISTS_GET_SUBLIST_TOOLTIP": "Krouiñ un eilad eus lodenn spisaet ul listenn.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_SORT_TITLE": "Rummañ%1,%2,%3", "LISTS_SORT_TOOLTIP": "Rummañ un eilenn eus ar roll", "LISTS_SORT_ORDER_ASCENDING": "war gresk", @@ -300,13 +286,11 @@ "LISTS_SORT_TYPE_NUMERIC": "niverel", "LISTS_SORT_TYPE_TEXT": "Dre urzh al lizherenneg", "LISTS_SORT_TYPE_IGNORECASE": "Dre urzh al lizherenneg, hep derc'hel kont eus an direnneg", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "Krouiñ ul listenn diwar an destenn", "LISTS_SPLIT_TEXT_FROM_LIST": "Krouiñ un destenn diwar al listenn", "LISTS_SPLIT_WITH_DELIMITER": "gant an dispartier", "LISTS_SPLIT_TOOLTIP_SPLIT": "Troc'hañ un destenn en ul listennad testennoù, o troc'hañ e pep dispartier.", "LISTS_SPLIT_TOOLTIP_JOIN": "Bodañ ul listennad testennoù en ul listenn hepken, o tispartiañ anezho gant un dispartier.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "eilpennañ %1", "LISTS_REVERSE_TOOLTIP": "Eilpennañ un eilskrid eus ur roll.", "VARIABLES_GET_TOOLTIP": "Distreiñ talvoud an argemm-mañ.", @@ -324,9 +308,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Kouiñ un arc'hwel gant ur mont er-maez", "PROCEDURES_ALLOW_STATEMENTS": "aotren an disklêriadurioù", "PROCEDURES_DEF_DUPLICATE_WARNING": "Diwallit : an arc'hwel-mañ en deus arventennoù eiladet.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Seveniñ an arc'hwel '%1' termenet gant an implijer hag implijout e zisoc'h.", "PROCEDURES_MUTATORCONTAINER_TITLE": "Monedoù", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Ouzhpennañ, lemel, pe adkempenn monedoù an arc'hwel-mañ.", diff --git a/msg/json/ca.json b/msg/json/ca.json index 132abc57791..e3ed2c52eb7 100644 --- a/msg/json/ca.json +++ b/msg/json/ca.json @@ -292,7 +292,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "fins # des del final", "LISTS_GET_SUBLIST_END_LAST": "fins l'últim", "LISTS_GET_SUBLIST_TOOLTIP": "Crea una còpia de la part especificada d'una llista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordenar %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordena la còpia d'una llista.", "LISTS_SORT_ORDER_ASCENDING": "ascendent", diff --git a/msg/json/cs.json b/msg/json/cs.json index 6cc5825c864..1855d9752c6 100644 --- a/msg/json/cs.json +++ b/msg/json/cs.json @@ -1,6 +1,7 @@ { "@metadata": { "authors": [ + "Amire80", "Chmee2", "Clon", "Dita", @@ -121,10 +122,6 @@ "LOGIC_TERNARY_TOOLTIP": "Zkontroluje podmínku v \"testu\". Když je podmínka pravda, vrátí hodnotu \"pokud pravda\"; v opačném případě vrátí hodnotu \"pokud nepravda\".", "MATH_NUMBER_HELPURL": "https://cs.wikipedia.org/wiki/Číslo", "MATH_NUMBER_TOOLTIP": "Číslo.", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -147,14 +144,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Vrátí desítkový logaritmus čísla.", "MATH_SINGLE_TOOLTIP_EXP": "Vrátí mocninu čísla e.", "MATH_SINGLE_TOOLTIP_POW10": "Vrátí mocninu čísla 10.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Vrátí sinus úhlu ve stupních.", "MATH_TRIG_TOOLTIP_COS": "Vrátí kosinus úhlu ve stupních.", "MATH_TRIG_TOOLTIP_TAN": "Vrátí tangens úhlu ve stupních.", "MATH_TRIG_TOOLTIP_ASIN": "Vrátí arkus sinus čísla.", "MATH_TRIG_TOOLTIP_ACOS": "Vrátí arkus kosinus čísla.", "MATH_TRIG_TOOLTIP_ATAN": "Vrátí arkus tangens čísla.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Vraťte jednu z následujících konstant: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (nekonečno).", "MATH_IS_EVEN": "je sudé", "MATH_IS_ODD": "je liché", @@ -164,10 +159,8 @@ "MATH_IS_NEGATIVE": "je záporné", "MATH_IS_DIVISIBLE_BY": "je dělitelné číslem", "MATH_IS_TOOLTIP": "Kontrola, zda je číslo sudé, liché, prvočíslo, celé, kladné, záporné nebo zda je dělitelné daným číslem. Vrací pravdu nebo nepravdu.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "zaměň %1 za %2", "MATH_CHANGE_TOOLTIP": "Přičti číslo k proměnné '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Zaokrouhlit číslo nahoru nebo dolů.", "MATH_ROUND_OPERATOR_ROUND": "zaokrouhlit", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrouhlit nahoru", @@ -305,7 +298,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "do # od konce", "LISTS_GET_SUBLIST_END_LAST": "jako poslední", "LISTS_GET_SUBLIST_TOOLTIP": "Vytvoří kopii určené části seznamu.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "seřadit %1 %2 %3", "LISTS_SORT_TOOLTIP": "Seřadit kopii seznamu.", "LISTS_SORT_ORDER_ASCENDING": "vzestupně", @@ -323,14 +315,13 @@ "VARIABLES_SET": "nastavit %1 na %2", "VARIABLES_SET_TOOLTIP": "Nastaví tuto proměnnou, aby se rovnala vstupu.", "VARIABLES_SET_CREATE_GET": "Vytvořit \"získat %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", "PROCEDURES_DEFNORETURN_TITLE": "k provedení", "PROCEDURES_DEFNORETURN_PROCEDURE": "proveď něco", "PROCEDURES_BEFORE_PARAMS": "s:", "PROCEDURES_CALL_BEFORE_PARAMS": "s:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Vytvořit funkci bez výstupu.", "PROCEDURES_DEFNORETURN_COMMENT": "Popište tuto funkci...", - "PROCEDURES_DEFRETURN_HELPURL": "https://cs.wikipedia.org/w/index.php?title=Funkce_(programování)", + "PROCEDURES_DEFRETURN_HELPURL": "https://cs.wikipedia.org/wiki/Podprogram", "PROCEDURES_DEFRETURN_RETURN": "navrátit", "PROCEDURES_DEFRETURN_TOOLTIP": "Vytvořit funkci s výstupem.", "PROCEDURES_ALLOW_STATEMENTS": "povolit příkazy", @@ -346,7 +337,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Zvýraznit definici funkce", "PROCEDURES_CREATE_DO": "Vytvořit '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Je-li hodnota pravda, pak vrátí druhou hodnotu.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varování: Tento blok může být použit pouze uvnitř definici funkce.", "DIALOG_OK": "OK", "DIALOG_CANCEL": "Zrušit" diff --git a/msg/json/da.json b/msg/json/da.json index fa4198c233e..2795a69c601 100644 --- a/msg/json/da.json +++ b/msg/json/da.json @@ -6,6 +6,7 @@ "JonNPoulsen", "MGA73", "Mads Haupt", + "Peterleth", "RickiRunge", "Saederup92", "Tjernobyl" @@ -113,6 +114,12 @@ "MATH_NUMBER_HELPURL": "https://da.wikipedia.org/wiki/Tal", "MATH_NUMBER_TOOLTIP": "Et tal.", "MATH_DIVISION_SYMBOL": ":", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://da.wikipedia.org/wiki/Aritmetik", "MATH_ARITHMETIC_TOOLTIP_ADD": "Returnere summen af de to tal.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Returnere forskellen mellem de to tal.", @@ -146,7 +153,6 @@ "MATH_IS_NEGATIVE": "er negativt", "MATH_IS_DIVISIBLE_BY": "er deleligt med", "MATH_IS_TOOLTIP": "Kontrollere, om et tal er lige, ulige, primtal, helt, positivt, negativt, eller om det er deleligt med bestemt tal. Returnere sandt eller falskt.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "skift %1 med %2", "MATH_CHANGE_TOOLTIP": "Læg et tal til variablen '%1'.", "MATH_ROUND_HELPURL": "https://da.wikipedia.org/wiki/Afrunding", @@ -181,7 +187,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://da.wikipedia.org/wiki/Tilfældighedsgenerator", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tilfældigt decimaltal (mellem 0 og 1)", "MATH_RANDOM_FLOAT_TOOLTIP": "Returner et tilfældigt decimaltal mellem 0,0 (inklusiv) og 1,0 (eksklusiv).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 af X:%1 Y:%2", "TEXT_TEXT_HELPURL": "https://da.wikipedia.org/wiki/Tekststreng", "TEXT_TEXT_TOOLTIP": "En bogstav, et ord eller en linje med tekst.", @@ -255,6 +260,7 @@ "LISTS_GET_INDEX_GET": "hent", "LISTS_GET_INDEX_GET_REMOVE": "hent og fjern", "LISTS_GET_INDEX_REMOVE": "fjern", + "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "# fra slutningen", "LISTS_GET_INDEX_FIRST": "første", "LISTS_GET_INDEX_LAST": "sidste", @@ -291,7 +297,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "til # fra slutningen", "LISTS_GET_SUBLIST_END_LAST": "til sidste", "LISTS_GET_SUBLIST_TOOLTIP": "Opretter en kopi af den angivne del af en liste.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sorter %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sorter en kopi af en liste.", "LISTS_SORT_ORDER_ASCENDING": "stigende", @@ -321,9 +326,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Opretter en funktion der har en returværdi.", "PROCEDURES_ALLOW_STATEMENTS": "tillad erklæringer", "PROCEDURES_DEF_DUPLICATE_WARNING": "Advarsel: Denne funktion har dublerede parametre.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kør den brugerdefinerede funktion '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Kør den brugerdefinerede funktion '%1' og brug dens returværdi.", "PROCEDURES_MUTATORCONTAINER_TITLE": "parametre", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tilføje, fjerne eller ændre rækkefølgen af parametre til denne funktion.", @@ -332,9 +335,10 @@ "PROCEDURES_HIGHLIGHT_DEF": "Markér funktionsdefinitionen", "PROCEDURES_CREATE_DO": "Opret '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Hvis en værdi er sand, så returnér en anden værdi.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Advarsel: Denne blok kan kun anvendes inden for en funktionsdefinition.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sig noget ...", + "WORKSPACE_ARIA_LABEL": "Blockly Workspace", + "COLLAPSED_WARNINGS_WARNING": "Sammenklappede blokke indeholder advarsler.", "DIALOG_OK": "OK", "DIALOG_CANCEL": "Afbryd" } diff --git a/msg/json/de.json b/msg/json/de.json index 73ecf96f305..bc2edc51115 100644 --- a/msg/json/de.json +++ b/msg/json/de.json @@ -1,6 +1,8 @@ { "@metadata": { "authors": [ + "Amire80", + "Brettchenweber", "Cvanca", "Dan-yell", "M165437", @@ -39,7 +41,7 @@ "REDO": "Wiederholen", "CHANGE_VALUE_TITLE": "Wert ändern:", "RENAME_VARIABLE": "Variable umbenennen …", - "RENAME_VARIABLE_TITLE": "Alle \"%1\" Variablen umbenennen in:", + "RENAME_VARIABLE_TITLE": "Alle \"%1\"-Variablen umbenennen in:", "NEW_VARIABLE": "Variable erstellen …", "NEW_STRING_VARIABLE": "Zeichenfolgenvariable erstellen …", "NEW_NUMBER_VARIABLE": "Zahlenvariable erstellen …", @@ -55,27 +57,25 @@ "COLOUR_PICKER_TOOLTIP": "Wählt eine Farbe aus der Palette aus.", "COLOUR_RANDOM_TITLE": "zufällige Farbe", "COLOUR_RANDOM_TOOLTIP": "Erzeugt eine Farbe nach dem Zufallsprinzip.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "Farbe aus", "COLOUR_RGB_RED": "rot", "COLOUR_RGB_GREEN": "grün", "COLOUR_RGB_BLUE": "blau", "COLOUR_RGB_TOOLTIP": "Erzeugt eine Farbe mit selbst definierten Rot-, Grün- und Blauwerten. Alle Werte müssen zwischen 0 und 100 liegen.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "mische", "COLOUR_BLEND_COLOUR1": "Farbe 1", "COLOUR_BLEND_COLOUR2": "und Farbe 2", "COLOUR_BLEND_RATIO": "im Verhältnis", "COLOUR_BLEND_TOOLTIP": "Vermischt 2 Farben mit konfigurierbarem Farbverhältnis (0.0 - 1.0).", "CONTROLS_REPEAT_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", - "CONTROLS_REPEAT_TITLE": "wiederhole %1 mal:", + "CONTROLS_REPEAT_TITLE": "wiederhole %1-mal:", "CONTROLS_REPEAT_INPUT_DO": "mache", "CONTROLS_REPEAT_TOOLTIP": "Eine Anweisung mehrfach ausführen.", "CONTROLS_WHILEUNTIL_HELPURL": "https://de.wikipedia.org/wiki/Schleife_%28Programmierung%29", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "wiederhole solange", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "wiederhole bis", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führt Anweisungen aus solange die Bedingung wahr ist.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führt Anweisungen aus solange die Bedingung unwahr ist.", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Führt Anweisungen aus, solange die Bedingung wahr ist.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Führt Anweisungen aus, solange die Bedingung unwahr ist.", "CONTROLS_FOR_HELPURL": "https://de.wikipedia.org/wiki/For-Schleife", "CONTROLS_FOR_TOOLTIP": "Zählt die Variable \"%1\" von einem Startwert bis zu einem Endwert und führt für jeden Wert eine Anweisung aus.", "CONTROLS_FOR_TITLE": "zähle %1 von %2 bis %3 in Schritten von %4", @@ -89,9 +89,9 @@ "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Diese Anweisung abbrechen und mit dem nächsten Schleifendurchlauf fortfahren.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Warnung: Dieser Baustein kann nur in einer Schleife verwendet werden.", "CONTROLS_IF_TOOLTIP_1": "Führt eine Anweisung aus, falls eine Bedingung wahr ist.", - "CONTROLS_IF_TOOLTIP_2": "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.", - "CONTROLS_IF_TOOLTIP_3": "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.", - "CONTROLS_IF_TOOLTIP_4": "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist", + "CONTROLS_IF_TOOLTIP_2": "Führt die erste Anweisung aus, falls eine Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus.", + "CONTROLS_IF_TOOLTIP_3": "Führt die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist.", + "CONTROLS_IF_TOOLTIP_4": "Führe die erste Anweisung aus, falls die erste Bedingung wahr ist. Führt ansonsten die zweite Anweisung aus, falls die zweite Bedingung wahr ist. Führt die dritte Anweisung aus, falls keine der beiden Bedingungen wahr ist.", "CONTROLS_IF_MSG_IF": "falls", "CONTROLS_IF_MSG_ELSEIF": "sonst falls", "CONTROLS_IF_MSG_ELSE": "sonst", @@ -110,10 +110,10 @@ "LOGIC_OPERATION_TOOLTIP_OR": "Ist wahr, falls einer der beiden Werte wahr ist.", "LOGIC_OPERATION_OR": "oder", "LOGIC_NEGATE_TITLE": "nicht %1", - "LOGIC_NEGATE_TOOLTIP": "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.", + "LOGIC_NEGATE_TOOLTIP": "Ist wahr, falls der Eingabewert unwahr ist. Ist unwahr, falls der Eingabewert wahr ist.", "LOGIC_BOOLEAN_TRUE": "wahr", "LOGIC_BOOLEAN_FALSE": "falsch", - "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr oder falsch", + "LOGIC_BOOLEAN_TOOLTIP": "Ist entweder wahr oder falsch.", "LOGIC_NULL_HELPURL": "https://de.wikipedia.org/wiki/Nullwert", "LOGIC_NULL": "null", "LOGIC_NULL_TOOLTIP": "Ist \"null\".", @@ -121,7 +121,7 @@ "LOGIC_TERNARY_CONDITION": "prüfe", "LOGIC_TERNARY_IF_TRUE": "falls wahr", "LOGIC_TERNARY_IF_FALSE": "falls falsch", - "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\" Wert zurückgegeben, andernfalls der \"falls unwahr\" Wert", + "LOGIC_TERNARY_TOOLTIP": "Überprüft eine Bedingung \"prüfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\"-Wert zurückgegeben, andernfalls der \"falls unwahr\"-Wert", "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", "MATH_NUMBER_TOOLTIP": "Eine Zahl.", "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", @@ -156,7 +156,7 @@ "MATH_IS_POSITIVE": "ist positiv", "MATH_IS_NEGATIVE": "ist negativ", "MATH_IS_DIVISIBLE_BY": "ist teilbar durch", - "MATH_IS_TOOLTIP": "Überprüft ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder falsch zurück.", + "MATH_IS_TOOLTIP": "Überprüft, ob eine Zahl gerade, ungerade, eine Primzahl, ganzzahlig, positiv, negativ oder durch eine zweite Zahl teilbar ist. Gibt wahr oder falsch zurück.", "MATH_CHANGE_HELPURL": "https://de.wikipedia.org/wiki/Inkrement_und_Dekrement", "MATH_CHANGE_TITLE": "erhöhe %1 um %2", "MATH_CHANGE_TOOLTIP": "Addiert eine Zahl zu \"%1\".", @@ -177,7 +177,7 @@ "MATH_ONLIST_OPERATOR_MEDIAN": "Median der Liste", "MATH_ONLIST_TOOLTIP_MEDIAN": "Ist der Median aller Zahlen in einer Liste.", "MATH_ONLIST_OPERATOR_MODE": "am häufigsten in der Liste", - "MATH_ONLIST_TOOLTIP_MODE": "Findet die Werte mit dem häufigstem Vorkommen in der Liste.", + "MATH_ONLIST_TOOLTIP_MODE": "Findet die Werte mit dem häufigsten Vorkommen in der Liste.", "MATH_ONLIST_OPERATOR_STD_DEV": "Standardabweichung der Liste", "MATH_ONLIST_TOOLTIP_STD_DEV": "Ist die Standardabweichung aller Werte in der Liste.", "MATH_ONLIST_OPERATOR_RANDOM": "Zufallswert aus der Liste", @@ -198,7 +198,6 @@ "MATH_ATAN2_TOOLTIP": "Gibt den Arkustangens des Punktes (X, Y) in Grad von -180 bis 180 zurück.", "TEXT_TEXT_HELPURL": "https://de.wikipedia.org/wiki/Zeichenkette", "TEXT_TEXT_TOOLTIP": "Ein Buchstabe, Text oder Satz.", - "TEXT_JOIN_HELPURL": "", "TEXT_JOIN_TITLE_CREATEWITH": "erstelle Text aus", "TEXT_JOIN_TOOLTIP": "Erstellt einen Text durch das Verbinden von mehreren Textelementen.", "TEXT_CREATE_JOIN_TITLE_JOIN": "verbinden", @@ -210,12 +209,10 @@ "TEXT_LENGTH_TOOLTIP": "Die Anzahl von Zeichen in einem Text (inkl. Leerzeichen).", "TEXT_ISEMPTY_TITLE": "%1 ist leer", "TEXT_ISEMPTY_TOOLTIP": "Ist wahr, falls der Text keine Zeichen enthält.", - "TEXT_INDEXOF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.", + "TEXT_INDEXOF_TOOLTIP": "Findet das erste / letzte Auftreten eines Suchbegriffs in einem Text. Gibt die Position des Begriffs zurück oder %1 falls der Suchbegriff nicht gefunden wurde.", "TEXT_INDEXOF_TITLE": "im Text %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "suche erstes Auftreten des Begriffs", "TEXT_INDEXOF_OPERATOR_LAST": "suche letztes Auftreten des Begriffs", - "TEXT_CHARAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", "TEXT_CHARAT_TITLE": "im Text %1 %2", "TEXT_CHARAT_FROM_START": "nimm", "TEXT_CHARAT_FROM_END": "nimm von hinten", @@ -225,7 +222,6 @@ "TEXT_CHARAT_TAIL": "Buchstaben", "TEXT_CHARAT_TOOLTIP": "Extrahiert einen Buchstaben von einer bestimmten Position.", "TEXT_GET_SUBSTRING_TOOLTIP": "Gibt den angegebenen Textabschnitt zurück.", - "TEXT_GET_SUBSTRING_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "im Text", "TEXT_GET_SUBSTRING_START_FROM_START": "nimm Teil ab", "TEXT_GET_SUBSTRING_START_FROM_END": "nimm Teil ab von hinten", @@ -249,32 +245,25 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Fragt den Benutzer nach einer Zahl.", "TEXT_PROMPT_TOOLTIP_TEXT": "Fragt den Benutzer nach einem Text.", "TEXT_COUNT_MESSAGE0": "zähle %1 in %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Zähle, wie oft ein Text innerhalb eines anderen Textes vorkommt.", "TEXT_REPLACE_MESSAGE0": "ersetze %1 durch %2 in %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Ersetze alle Vorkommen eines Textes innerhalb eines anderen Textes.", "TEXT_REVERSE_MESSAGE0": "kehre %1 um", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Kehre die Reihenfolge der Zeichen im Text um.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "erzeuge eine leere Liste", "LISTS_CREATE_EMPTY_TOOLTIP": "Erzeugt eine leere Liste ohne Inhalt.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Erzeugt eine Liste aus den angegebenen Elementen.", "LISTS_CREATE_WITH_INPUT_WITH": "erzeuge Liste mit", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "Liste", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Hinzufügen, entfernen und sortieren von Elementen.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Ein Element zur Liste hinzufügen.", - "LISTS_REPEAT_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", - "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen", - "LISTS_REPEAT_TITLE": "erzeuge Liste mit %2 mal dem Element %1​", + "LISTS_REPEAT_TOOLTIP": "Erzeugt eine Liste mit einer variablen Anzahl von Elementen.", + "LISTS_REPEAT_TITLE": "erzeuge Liste mit %2-mal dem Element %1​", "LISTS_LENGTH_TITLE": "Länge von %1", "LISTS_LENGTH_TOOLTIP": "Die Anzahl von Elementen in der Liste.", "LISTS_ISEMPTY_TITLE": "%1 ist leer", "LISTS_ISEMPTY_TOOLTIP": "Ist wahr, falls die Liste leer ist.", "LISTS_INLIST": "in der Liste", - "LISTS_INDEX_OF_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", "LISTS_INDEX_OF_FIRST": "suche erstes Auftreten von", "LISTS_INDEX_OF_LAST": "suche letztes Auftreten von", "LISTS_INDEX_OF_TOOLTIP": "Sucht die Position (Index) eines Elementes in der Liste. Gibt %1 zurück, falls kein Element gefunden wurde.", @@ -301,7 +290,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Entfernt das erste Element aus der Liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Entfernt das letzte Element aus der Liste.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Entfernt ein zufälliges Element aus der Liste.", - "LISTS_SET_INDEX_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", "LISTS_SET_INDEX_SET": "setze für", "LISTS_SET_INDEX_INSERT": "füge als", "LISTS_SET_INDEX_INPUT_TO": "ein", @@ -313,7 +301,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Fügt das Element an den Anfang der Liste an.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Fügt das Element ans Ende der Liste an.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Fügt das Element zufällig in die Liste ein.", - "LISTS_GET_SUBLIST_HELPURL": "http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Farsubex.htm", "LISTS_GET_SUBLIST_START_FROM_START": "nimm Teilliste ab", "LISTS_GET_SUBLIST_START_FROM_END": "nimm Teilliste ab von hinten", "LISTS_GET_SUBLIST_START_FIRST": "nimm Teilliste ab erstes", @@ -322,7 +309,6 @@ "LISTS_GET_SUBLIST_END_LAST": "bis letztes", "LISTS_GET_SUBLIST_TAIL": "Element", "LISTS_GET_SUBLIST_TOOLTIP": "Erstellt eine Kopie mit dem angegebenen Abschnitt der Liste.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 sortieren", "LISTS_SORT_TOOLTIP": "Eine Kopie einer Liste sortieren.", "LISTS_SORT_ORDER_ASCENDING": "aufsteigend", @@ -330,32 +316,26 @@ "LISTS_SORT_TYPE_NUMERIC": "numerisch", "LISTS_SORT_TYPE_TEXT": "alphabetisch", "LISTS_SORT_TYPE_IGNORECASE": "alphabetisch, Großschreibung ignorieren", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "Liste aus Text erstellen", "LISTS_SPLIT_TEXT_FROM_LIST": "Text aus Liste erstellen", "LISTS_SPLIT_WITH_DELIMITER": "mit Trennzeichen", "LISTS_SPLIT_TOOLTIP_SPLIT": "Text in eine Liste mit Texten aufteilen, unterbrochen bei jedem Trennzeichen.", "LISTS_SPLIT_TOOLTIP_JOIN": "Liste mit Texten in einen Text vereinen, getrennt durch ein Trennzeichen.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "kehre %1 um", "LISTS_REVERSE_TOOLTIP": "Kehre eine Kopie einer Liste um.", "ORDINAL_NUMBER_SUFFIX": ".", - "VARIABLES_GET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", "VARIABLES_GET_TOOLTIP": "Gibt den Wert der Variable zurück.", "VARIABLES_GET_CREATE_SET": "Erzeuge \"Schreibe %1\"", - "VARIABLES_SET_HELPURL": "https://de.wikipedia.org/wiki/Variable_%28Programmierung%29", "VARIABLES_SET": "setze %1 auf %2", "VARIABLES_SET_TOOLTIP": "Setzt den Wert einer Variable.", - "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lese %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "VARIABLES_SET_CREATE_GET": "Erzeuge \"Lies %1\"", "PROCEDURES_DEFNORETURN_TITLE": "um", "PROCEDURES_DEFNORETURN_PROCEDURE": "etwas tun", "PROCEDURES_BEFORE_PARAMS": "mit:", "PROCEDURES_CALL_BEFORE_PARAMS": "mit:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Ein Funktionsblock ohne Rückgabewert.", "PROCEDURES_DEFNORETURN_COMMENT": "Beschreibe diese Funktion …", - "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_%28Programmierung%29", + "PROCEDURES_DEFRETURN_HELPURL": "https://de.wikipedia.org/wiki/Prozedur_(Programmierung)", "PROCEDURES_DEFRETURN_RETURN": "gib zurück", "PROCEDURES_DEFRETURN_TOOLTIP": "Ein Funktionsblock mit Rückgabewert.", "PROCEDURES_ALLOW_STATEMENTS": "Anweisungen erlauben", @@ -371,7 +351,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Markiere Funktionsblock", "PROCEDURES_CREATE_DO": "Erzeuge \"Aufruf %1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Gibt den zweiten Wert zurück und verlässt die Funktion, falls der erste Wert wahr ist.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Warnung: Dieser Block darf nur innerhalb eines Funktionsblocks genutzt werden.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Teile etwas mit…", "WORKSPACE_ARIA_LABEL": "Blockly Arbeitsbereich", diff --git a/msg/json/diq.json b/msg/json/diq.json index f20562ebd7b..b3b0dcad583 100644 --- a/msg/json/diq.json +++ b/msg/json/diq.json @@ -16,16 +16,16 @@ "ADD_COMMENT": "Tefsir cı ke", "REMOVE_COMMENT": "Tefsiri Wedare", "DUPLICATE_COMMENT": "Mışewreyo zewnc", - "EXTERNAL_INPUTS": "Cıkewtışê xarıciy", + "EXTERNAL_INPUTS": "Cıkewtışê xarıciyi", "INLINE_INPUTS": "Cıkerdışê xomiyani", "DELETE_BLOCK": "Bloki bestere", "DELETE_X_BLOCKS": "%1 blokan bestere", "DELETE_ALL_BLOCKS": "Pêro %1 bloki besteriyê?", "CLEAN_UP": "Blokan pak ke", "COLLAPSE_BLOCK": "Bloki teng ke", - "COLLAPSE_ALL": "Blokan teng ke", + "COLLAPSE_ALL": "Kılitkerdışan teng ke", "EXPAND_BLOCK": "Bloki hera ke", - "EXPAND_ALL": "Blokan hera ke", + "EXPAND_ALL": "Kılitkerdışan hera ke", "DISABLE_BLOCK": "Çengi devre ra vec", "ENABLE_BLOCK": "Bloki feal ke", "HELP": "Peşti", @@ -51,14 +51,13 @@ "COLOUR_RANDOM_TOOLTIP": "Tesadufi yu ren bıweçin", "COLOUR_RGB_TITLE": "komponentên rengan", "COLOUR_RGB_RED": "sur", - "COLOUR_RGB_GREEN": "kıho", + "COLOUR_RGB_GREEN": "kesk", "COLOUR_RGB_BLUE": "kewe", "COLOUR_RGB_TOOLTIP": "Şıma renganê sûr, aşıl u kohoy ra rengê do spesifik vırazê. Gani ê pêro 0 u 100 miyan de bıbê.", "COLOUR_BLEND_TITLE": "tewde", "COLOUR_BLEND_COLOUR1": "reng 1", "COLOUR_BLEND_COLOUR2": "reng 2", "COLOUR_BLEND_RATIO": "nısbet", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 fıni tekrar ke", "CONTROLS_REPEAT_INPUT_DO": "bıke", "CONTROLS_REPEAT_TOOLTIP": "Şıma tayêna reyi akerdışi kerê.", @@ -78,7 +77,6 @@ "CONTROLS_IF_MSG_ELSEIF": "eke nêyo", "CONTROLS_IF_MSG_ELSE": "eke çıniyo", "CONTROLS_IF_ELSEIF_TOOLTIP": "Bloq da if'i rê yu şert dekerê de.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Debiyaye dı erci zey pêyêse ercê \"True\" dane.", "LOGIC_OPERATION_TOOLTIP_AND": "Eger her dı cıkewtışi zi raştê, şıma ageyrê.", "LOGIC_OPERATION_AND": "û", @@ -100,7 +98,6 @@ "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ferqê dı amara tadê", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Reyina dı amara tadê", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Letey iya dı amara tadê", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "karekok", "MATH_SINGLE_TOOLTIP_ROOT": "Karerêçê yew amarer tadê", "MATH_SINGLE_OP_ABSOLUTE": "mutlaq", @@ -117,7 +114,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Arksinusê yew amari açarne.", "MATH_TRIG_TOOLTIP_ACOS": "Arkkosinusê yew amari açarne.", "MATH_TRIG_TOOLTIP_ATAN": "Arktangensê yew amari açarne.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Sabitanê wertağan ra yew açarne: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (bêpeyniye).", "MATH_IS_EVEN": "zewnco", "MATH_IS_ODD": "kıto", @@ -126,9 +122,7 @@ "MATH_IS_POSITIVE": "pozitifo", "MATH_IS_NEGATIVE": "negatifo", "MATH_IS_DIVISIBLE_BY": "Leteyêno", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%2, keno %1 vurneno", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Yu amorer loğê cêri yana cori ke", "MATH_ROUND_OPERATOR_ROUND": "gılor ke", "MATH_ROUND_OPERATOR_ROUNDUP": "Loğê cori ke", @@ -145,15 +139,11 @@ "MATH_ONLIST_OPERATOR_STD_DEV": "Standart ferqıziya lista", "MATH_ONLIST_OPERATOR_RANDOM": "Raştamaye objeya lista", "MATH_ONLIST_TOOLTIP_RANDOM": "Liste ra yew elemento rastameye açarne.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 ra menden", "MATH_MODULO_TOOLTIP": "Mendeyan ra teqsimkerdışê dı amaran açarne.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "Raştamaye nimande amor", "MATH_ATAN2_HELPURL": "https://diq.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2, X:%1 Y:%2", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Yu herfa, satır yana çekuya metini", "TEXT_JOIN_TITLE_CREATEWITH": "ya metin vıraz", "TEXT_CREATE_JOIN_TITLE_JOIN": "gıre de", @@ -224,7 +214,6 @@ "LISTS_GET_SUBLIST_END_FROM_START": "#'ya", "LISTS_GET_SUBLIST_END_FROM_END": "Peyni # ra hetana", "LISTS_GET_SUBLIST_END_LAST": "Hetana pey", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 weçine", "LISTS_SORT_TOOLTIP": "Kopyay yew lista rêz kerê", "LISTS_SORT_ORDER_ASCENDING": "zeydıyen", @@ -251,8 +240,6 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Yew fonksiyono çap daye vırazeno", "PROCEDURES_ALLOW_STATEMENTS": "ifade rê mısade bıde", "PROCEDURES_DEF_DUPLICATE_WARNING": "Tembe: Nê fonksiyoni de parametreyê dıleti estê.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_MUTATORCONTAINER_TITLE": "cıkewtışi", "PROCEDURES_MUTATORARG_TITLE": "namey cıkewtışi:", "PROCEDURES_MUTATORARG_TOOLTIP": "Funksiyoni rê yew cıkewtış ilawe ke.", diff --git a/msg/json/dty.json b/msg/json/dty.json index 92518f6a86b..7356477504d 100644 --- a/msg/json/dty.json +++ b/msg/json/dty.json @@ -35,7 +35,6 @@ "VARIABLE_ALREADY_EXISTS": "'%1' नाउँ अरियाऽ भेरिएबल पैली बठेइ छ।", "DELETE_VARIABLE_CONFIRMATION": "'%2' भेरिएबला %1 प्रयोग मेट्ट्या?", "DELETE_VARIABLE": "'%1' भेरिएबल मेट:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "पैलेट बाट एक रंग चुन ।", "COLOUR_RANDOM_TITLE": "जुनसुकै रङ्ग", "COLOUR_RANDOM_TOOLTIP": "रैन्डम्ली एक रंग चयन गर ।", @@ -76,7 +75,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Add, remove, or reorder sections to reconfigure this if block.", "CONTROLS_IF_ELSEIF_TOOLTIP": "यदि ब्लकमा एक शर्त जोडौं ।", "CONTROLS_IF_ELSE_TOOLTIP": "Add a final, catch-all condition to the if block.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "यदी दुवै इनपुट एक अर्काका बराबर छन् भण्या टु रिटर्न गर ।", "LOGIC_COMPARE_TOOLTIP_NEQ": "यदी दुवै इनपुट एक अर्काको बराबर नाइथिन् भणया टु रिटर्न गर ।", "LOGIC_COMPARE_TOOLTIP_LT": "पैल्लो इनपुट दोसरा इनपुट है नानो भया ट्रू फिर्ता अर:।", diff --git a/msg/json/ee.json b/msg/json/ee.json index dbe546167c6..7d6b20aec2d 100644 --- a/msg/json/ee.json +++ b/msg/json/ee.json @@ -121,7 +121,6 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Nebu zigbɔzi neni 10-teƒe-10 awɔ xexlẽdzesia.", "MATH_SINGLE_TOOLTIP_EXP": "Nebu e-teƒe-e zigbɔzi xexlẽdzesia.", "MATH_SINGLE_TOOLTIP_POW10": " Nebu ewo-teƒe-ewo zigbɔzi xexlẽdzesia.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Nebu dzogɔe le digri me (menye radiã o).", "MATH_IS_EVEN": "enye eve ƒomevi", "MATH_IS_ODD": "enye etɔ̃ ƒomevi", diff --git a/msg/json/el.json b/msg/json/el.json index dd570537884..5522c9dbb89 100644 --- a/msg/json/el.json +++ b/msg/json/el.json @@ -60,44 +60,35 @@ "DELETE_VARIABLE_CONFIRMATION": "Θέλετε να διαγράψετε το %1 που χρησιμοποιείτε από την μεταβλητή '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Δεν μπορώ να διαγράψω την μεταβλητή '%1' διότι είναι μέρος του ορισμού της λειτουργίας '%2'", "DELETE_VARIABLE": "Διαγράψτε την μεταβλητή '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Επιτρέπει επιλογή χρώματος από την παλέτα.", "COLOUR_RANDOM_TITLE": "τυχαίο χρώμα", "COLOUR_RANDOM_TOOLTIP": "Επιλέγει χρώμα τυχαία.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "χρώμα με", "COLOUR_RGB_RED": "κόκκινο", "COLOUR_RGB_GREEN": "πράσινο", "COLOUR_RGB_BLUE": "μπλε", "COLOUR_RGB_TOOLTIP": "Δημιουργήστε ένα χρώμα με την καθορισμένη ποσότητα κόκκινου, πράσινου και μπλε. Όλες οι τιμές πρέπει να είναι μεταξύ 0 και 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "μείγμα", "COLOUR_BLEND_COLOUR1": "χρώμα 1", "COLOUR_BLEND_COLOUR2": "χρώμα 2", "COLOUR_BLEND_RATIO": "αναλογία", "COLOUR_BLEND_TOOLTIP": "Συνδυάζει δύο χρώματα μαζί με μια δεδομένη αναλογία (0.0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "επανάλαβε %1 φορές", "CONTROLS_REPEAT_INPUT_DO": "κάνε", "CONTROLS_REPEAT_TOOLTIP": "Εκτελεί κάποιες εντολές αρκετές φορές.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "επανάλαβε ενώ", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "επανάλαβε μέχρι", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Εφόσον μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Εφόσον μια τιμή είναι ψευδής, τότε εκτελεί κάποιες εντολές.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Η μεταβλητή «%1» παίρνει τιμές ξεκινώντας από τον αριθμό έναρξης μέχρι τον αριθμό τέλους αυξάνοντας κάθε φορά με το καθορισμένο βήμα και εκτελώντας το καθορισμένο μπλοκ.", "CONTROLS_FOR_TITLE": "μέτρησε με %1 από το %2 έως το %3 ανά %4", - "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", "CONTROLS_FOREACH_TITLE": "για κάθε στοιχείο %1 στη λίστα %2", "CONTROLS_FOREACH_TOOLTIP": "Για κάθε στοιχείο σε μια λίστα, ορίζει τη μεταβλητή «%1» στο στοιχείο και, στη συνέχεια, εκτελεί κάποιες εντολές.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "φεύγει από το μπλοκ επαναλήψεως", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "συνέχισε με την επόμενη επανάληψη του μπλοκ επαναλήψεως", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Ξεφεύγει (βγαίνει έξω) από την επανάληψη.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Παραλείπει το υπόλοιπο τμήμα αυτού του μπλοκ επαναλήψεως, και συνεχίζει με την επόμενη επανάληψη.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Προειδοποίηση: Αυτό το μπλοκ μπορεί να χρησιμοποιηθεί μόνο μέσα σε μια επανάληψη.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Αν μια τιμή είναι αληθής, τότε εκτελεί κάποιες εντολές.", "CONTROLS_IF_TOOLTIP_2": "Αν μια τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, εκτελεί το δεύτερο τμήμα εντολών.", "CONTROLS_IF_TOOLTIP_3": "Αν η πρώτη τιμή είναι αληθής, τότε εκτελεί το πρώτο τμήμα εντολών. Διαφορετικά, αν η δεύτερη τιμή είναι αληθής, εκτελεί το δεύτερο μπλοκ εντολών.", @@ -108,39 +99,29 @@ "CONTROLS_IF_IF_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ «εάν».", "CONTROLS_IF_ELSEIF_TOOLTIP": "Πρόσθετει μια κατάσταση/συνθήκη στο μπλοκ «εάν».", "CONTROLS_IF_ELSE_TOOLTIP": "Προσθέτει μια τελική κατάσταση/συνθήκη, που πιάνει όλες τις άλλες περιπτώσεις, στο μπλοκ «εάν».", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι ίσες μεταξύ τους.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Επιστρέφει αληθής αν και οι δύο είσοδοι δεν είναι ίσες μεταξύ τους.", "LOGIC_COMPARE_TOOLTIP_LT": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από τη δεύτερη είσοδο.", "LOGIC_COMPARE_TOOLTIP_LTE": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη από ή ίση με τη δεύτερη είσοδο.", "LOGIC_COMPARE_TOOLTIP_GT": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μεγαλύτερη από τη δεύτερη είσοδο.", "LOGIC_COMPARE_TOOLTIP_GTE": "Επιστρέφει αληθής αν η πρώτη είσοδος είναι μικρότερη ή ίση με τη δεύτερη είσοδο.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Επιστρέφει αληθής αν και οι δύο είσοδοι είναι αληθής.", "LOGIC_OPERATION_AND": "και", "LOGIC_OPERATION_TOOLTIP_OR": "Επιστρέφει αληθής αν τουλάχιστον μια από τις εισόδους είναι αληθής.", "LOGIC_OPERATION_OR": "ή", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "όχι %1", "LOGIC_NEGATE_TOOLTIP": "Επιστρέφει αληθής αν η είσοδος είναι ψευδής. Επιστρέφει ψευδής αν η είσοδος είναι αληθής.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", "LOGIC_BOOLEAN_TRUE": "αληθής", "LOGIC_BOOLEAN_FALSE": "ψευδής", "LOGIC_BOOLEAN_TOOLTIP": "Επιστρέφει είτε αληθής είτε ψευδής.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "κενό", "LOGIC_NULL_TOOLTIP": "Επιστρέφει κενό.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "έλεγχος", "LOGIC_TERNARY_IF_TRUE": "εάν είναι αληθής", "LOGIC_TERNARY_IF_FALSE": "εάν είναι ψευδής", "LOGIC_TERNARY_TOOLTIP": "Ελέγχει την κατάσταση/συνθήκη στον «έλεγχο». Αν η κατάσταση/συνθήκη είναι αληθής, επιστρέφει την τιμή «εάν αληθής», διαφορετικά επιστρέφει την τιμή «εάν ψευδής».", "MATH_NUMBER_HELPURL": "https://el.wikipedia.org/wiki/%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8C%CF%82", "MATH_NUMBER_TOOLTIP": "Ένας αριθμός.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", "MATH_POWER_SYMBOL": "^ ύψωση σε δύναμη", "MATH_TRIG_SIN": "ημ", "MATH_TRIG_COS": "συν", @@ -171,7 +152,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Επιστρέφει το τόξο ημίτονου ενός αριθμού.", "MATH_TRIG_TOOLTIP_ACOS": "Επιστρέφει το τόξο συνημίτονου ενός αριθμού.", "MATH_TRIG_TOOLTIP_ATAN": "Επιστρέφει το τόξο εφαπτομένης ενός αριθμού.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Επιστρέφει μία από τις κοινές σταθερές: π (3.141...), e (2.718...), φ (1.618...), sqrt(2) (1.414...), sqrt(½) (0.707...), ή ∞ (άπειρο).", "MATH_IS_EVEN": "είναι άρτιος", "MATH_IS_ODD": "είναι περιττός", @@ -184,7 +164,6 @@ "MATH_CHANGE_HELPURL": "https://el.wikipedia.org/wiki/%CE%A0%CF%81%CF%8C%CF%83%CE%B8%CE%B5%CF%83%CE%B7", "MATH_CHANGE_TITLE": "άλλαξε %1 αυξάνοντας κατά %2", "MATH_CHANGE_TOOLTIP": "Προσθέτει έναν αριθμό στη μεταβλητή «%1».", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Στρογγυλοποιεί έναν αριθμό προς τα πάνω ή προς τα κάτω.", "MATH_ROUND_OPERATOR_ROUND": "στρογγυλοποίησε", "MATH_ROUND_OPERATOR_ROUNDUP": "στρογγυλοποίησε προς τα πάνω", @@ -205,44 +184,34 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Επιστρέφει την τυπική απόκλιση της λίστας.", "MATH_ONLIST_OPERATOR_RANDOM": "τυχαίο στοιχείο λίστας", "MATH_ONLIST_TOOLTIP_RANDOM": "Επιστρέφει ένα τυχαίο στοιχείο από τη λίστα.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "υπόλοιπο της %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Επιστρέφει το υπόλοιπο της διαίρεσης των δύο αριθμών.", - "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_(graphics)", "MATH_CONSTRAIN_TITLE": "περιόρισε %1 χαμηλή %2 υψηλή %3", "MATH_CONSTRAIN_TOOLTIP": "Περιορίζει έναν αριθμό μεταξύ των προβλεπόμενων ορίων (χωρίς αποκλεισμούς).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "τυχαίος ακέραιος από το %1 έως το %2", "MATH_RANDOM_INT_TOOLTIP": "Επιστρέφει έναν τυχαίο ακέραιο αριθμό μεταξύ δύο συγκεκριμένων ορίων (εντός - συμπεριλαμβανομένων και των ακραίων τιμών).", "MATH_RANDOM_FLOAT_HELPURL": "https://el.wikipedia.org/wiki/%CE%93%CE%B5%CE%BD%CE%BD%CE%AE%CF%84%CF%81%CE%B9%CE%B1_%CE%A4%CF%85%CF%87%CE%B1%CE%AF%CF%89%CE%BD_%CE%91%CF%81%CE%B9%CE%B8%CE%BC%CF%8E%CE%BD", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "τυχαίο κλάσμα", "MATH_RANDOM_FLOAT_TOOLTIP": "Επιστρέψει ένα τυχαία κλάσμα μεταξύ 0,0 (κλειστό) και 1,0 (ανοικτό).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 από X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Επιστρέφει την διαφορά τόξου των σημείων (X, Y) σε μοίρες από -180 σε 180.", "TEXT_TEXT_HELPURL": "https://el.wikipedia.org/wiki/%CE%A3%CF%85%CE%BC%CE%B2%CE%BF%CE%BB%CE%BF%CF%83%CE%B5%CE%B9%CF%81%CE%AC", "TEXT_TEXT_TOOLTIP": "Ένα γράμμα, μια λέξη ή μια γραμμή κειμένου.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "δημιούργησε κείμενο με", "TEXT_JOIN_TOOLTIP": "Δημιουργεί ένα κομμάτι κειμένου ενώνοντας έναν απεριόριστο αριθμό αντικειμένων.", "TEXT_CREATE_JOIN_TITLE_JOIN": "ένωσε", "TEXT_CREATE_JOIN_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τους τομείς για να αναδιαμορφώσει αυτό το μπλοκ κειμένου.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Προσθέτει ένα στοιχείο στο κείμενο.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "έως %1 ανάθεσε κείμενο %2", "TEXT_APPEND_TOOLTIP": "Αναθέτει κείμενο στη μεταβλητή «%1».", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "το μήκος του %1", "TEXT_LENGTH_TOOLTIP": "Επιστρέφει το πλήθος των γραμμάτων (συμπεριλαμβανομένων και των κενών διαστημάτων) στο παρεχόμενο κείμενο.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "το %1 είναι κενό", "TEXT_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν το παρεχόμενο κείμενο είναι κενό.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του πρώτου κειμένου στο δεύτερο κείμενο. Επιστρέφει τιμή %1, αν δε βρει το κείμενο.", "TEXT_INDEXOF_TITLE": "στο κείμενο %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "βρες την πρώτη εμφάνιση του κειμένου", "TEXT_INDEXOF_OPERATOR_LAST": "βρες την τελευταία εμφάνιση του κειμένου", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "στο κείμενο %1 %2", "TEXT_CHARAT_FROM_START": "πάρε το γράμμα #", "TEXT_CHARAT_FROM_END": "πάρε το γράμμα # από το τέλος", @@ -251,7 +220,6 @@ "TEXT_CHARAT_RANDOM": "πάρε τυχαίο γράμμα", "TEXT_CHARAT_TOOLTIP": "Επιστρέφει το γράμμα στην καθορισμένη θέση.", "TEXT_GET_SUBSTRING_TOOLTIP": "Επιστρέφει ένα συγκεκριμένο τμήμα του κειμένου.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "στο κείμενο", "TEXT_GET_SUBSTRING_START_FROM_START": "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα", "TEXT_GET_SUBSTRING_START_FROM_END": "πάρε τη δευτερεύουσα συμβολοσειρά από το # γράμμα από το τέλος", @@ -259,17 +227,14 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "μέχρι το # γράμμα", "TEXT_GET_SUBSTRING_END_FROM_END": "μέχρι το # γράμμα από το τέλος", "TEXT_GET_SUBSTRING_END_LAST": "μέχρι το τελευταίο γράμμα", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "Επιστρέφει ένα αντίγραφο του κειμένου σε διαφορετική μορφή γραμμάτων.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "σε ΚΕΦΑΛΑΙΑ", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "σε πεζά", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "σε Λέξεις Με Πρώτα Κεφαλαία", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "Επιστρέφει ένα αντίγραφο του κειμένου με αφαιρεμένα τα κενά από το ένα ή και τα δύο άκρα.", "TEXT_TRIM_OPERATOR_BOTH": "περίκοψε τα κενά και από τις δυο πλευρές του", "TEXT_TRIM_OPERATOR_LEFT": "περίκοψε τα κενά από την αριστερή πλευρά του", "TEXT_TRIM_OPERATOR_RIGHT": "περίκοψε τα κενά από την δεξιά πλευρά του", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "εκτύπωσε %1", "TEXT_PRINT_TOOLTIP": "Εκτυπώνει το καθορισμένο κείμενο, αριθμό ή άλλη τιμή.", "TEXT_PROMPT_TYPE_TEXT": "πρότρεψε με μήνυμα για να δοθεί κείμενο", @@ -282,7 +247,6 @@ "TEXT_REPLACE_TOOLTIP": "Αντικαταστήστε όλα τα ήδη υπάρχοντα στοιχεία μέρους του κειμένου με κάποιο άλλο κείμενο", "TEXT_REVERSE_MESSAGE0": "ανάκληση %1", "TEXT_REVERSE_TOOLTIP": "Αναγραμματισμός των χαρακτήρων του κειμένου", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "δημιούργησε κενή λίστα", "LISTS_CREATE_EMPTY_TOOLTIP": "Επιστρέφει μια λίστα, με μήκος 0, η οποία δεν περιέχει εγγραφές δεδομένων", "LISTS_CREATE_WITH_TOOLTIP": "Δημιουργεί λίστα με οποιονδήποτε αριθμό αντικειμένων.", @@ -290,16 +254,13 @@ "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "λίστα", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Προσθέτει, αφαιρεί ή αναδιατάσσει τα τμήματα για να αναδιαμορφώσει αυτό το μπλοκ λίστας.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Προσθέτει αντικείμενο στη λίστα.", - "LISTS_REPEAT_HELPURL": "Blockly", "LISTS_REPEAT_TOOLTIP": "Δημιουργεί μια λίστα που αποτελείται από την δεδομένη τιμή που επαναλαμβάνεται για συγκεκριμένο αριθμό επαναλήψεων.", "LISTS_REPEAT_TITLE": "δημιούργησε λίστα με το στοιχείο %1 να επαναλαμβάνεται %2 φορές", - "LISTS_LENGTH_HELPURL": "Blockly", "LISTS_LENGTH_TITLE": "το μήκος του %1", "LISTS_LENGTH_TOOLTIP": "Επιστρέφει το μήκος μιας λίστας.", "LISTS_ISEMPTY_TITLE": "το %1 είναι κενό", "LISTS_ISEMPTY_TOOLTIP": "Επιστρέφει αληθής αν η λίστα είναι κενή.", "LISTS_INLIST": "στη λίστα", - "LISTS_INDEX_OF_HELPURL": "Blockly", "LISTS_INDEX_OF_FIRST": "βρες την πρώτη εμφάνιση του στοιχείου", "LISTS_INDEX_OF_LAST": "βρες την τελευταία εμφάνιση του στοιχείου", "LISTS_INDEX_OF_TOOLTIP": "Επιστρέφει τον δείκτη της πρώτης/τελευταίας εμφάνισης του στοιχείου στη λίστα. Επιστρέφει τιμή %1, αν το στοιχείο δεν βρεθεί.", @@ -336,7 +297,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Εισάγει το στοιχείο στην αρχή μιας λίστας.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Αναθέτει το στοιχείο στο τέλος μιας λίστας.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Εισάγει το στοιχείο τυχαία σε μια λίστα.", - "LISTS_GET_SUBLIST_HELPURL": "Blockly", "LISTS_GET_SUBLIST_START_FROM_START": "πάρε υπολίστα από #", "LISTS_GET_SUBLIST_START_FROM_END": "πάρε υπολίστα από # από το τέλος", "LISTS_GET_SUBLIST_START_FIRST": "πάρε υπολίστα από την αρχή", @@ -344,7 +304,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "έως # από το τέλος", "LISTS_GET_SUBLIST_END_LAST": "έως το τελευταίο", "LISTS_GET_SUBLIST_TOOLTIP": "Δημιουργεί ένα αντίγραφο του καθορισμένου τμήματος μιας λίστας.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "επιλογή %1 %2 %3", "LISTS_SORT_TOOLTIP": "Επιλέξετε ένα αντίγραφο της λίστας.", "LISTS_SORT_ORDER_ASCENDING": "Αύξουσα", @@ -364,14 +323,12 @@ "VARIABLES_SET": "ανάθεσε στην %1 το %2", "VARIABLES_SET_TOOLTIP": "Ορίζει αυτή τη μεταβλητή να είναι ίση με την είσοδο.", "VARIABLES_SET_CREATE_GET": "Δημιούργησε «πάρε %1»", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "στο", "PROCEDURES_DEFNORETURN_PROCEDURE": "κάνε κάτι", "PROCEDURES_BEFORE_PARAMS": "με:", "PROCEDURES_CALL_BEFORE_PARAMS": "με:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση χωρίς έξοδο.", "PROCEDURES_DEFNORETURN_COMMENT": "Περιγράψετε αυτήν την ιδιότητα..", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "επέστρεψε", "PROCEDURES_DEFRETURN_TOOLTIP": "Δημιουργεί μια συνάρτηση με μια έξοδο.", "PROCEDURES_ALLOW_STATEMENTS": "να επιτρέπονται οι δηλώσεις", diff --git a/msg/json/en-gb.json b/msg/json/en-gb.json index ae7d81b1385..6bd8eccf9fe 100644 --- a/msg/json/en-gb.json +++ b/msg/json/en-gb.json @@ -52,7 +52,6 @@ "COLOUR_BLEND_COLOUR2": "colour 2", "COLOUR_BLEND_RATIO": "ratio", "COLOUR_BLEND_TOOLTIP": "Blends two colours together with a given ratio (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "repeat %1 times", "CONTROLS_REPEAT_INPUT_DO": "do", "CONTROLS_REPEAT_TOOLTIP": "Do some statements several times.", @@ -79,7 +78,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Add, remove, or reorder sections to reconfigure this if block.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Add a condition to the if block.", "CONTROLS_IF_ELSE_TOOLTIP": "Add a final, catch-all condition to the if block.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Return true if both inputs equal each other.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Return true if both inputs are not equal to each other.", "LOGIC_COMPARE_TOOLTIP_LT": "Return true if the first input is smaller than the second input.", @@ -101,15 +99,12 @@ "LOGIC_TERNARY_IF_TRUE": "if true", "LOGIC_TERNARY_IF_FALSE": "if false", "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "A number.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Return the sum of the two numbers.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Return the difference of the two numbers.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Return the product of the two numbers.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Return the quotient of the two numbers.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Return the first number raised to the power of the second number.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "square root", "MATH_SINGLE_TOOLTIP_ROOT": "Return the square root of a number.", "MATH_SINGLE_OP_ABSOLUTE": "absolute", @@ -119,14 +114,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Return the base 10 logarithm of a number.", "MATH_SINGLE_TOOLTIP_EXP": "Return e to the power of a number.", "MATH_SINGLE_TOOLTIP_POW10": "Return 10 to the power of a number.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Return the sine of a degree (not radian).", "MATH_TRIG_TOOLTIP_COS": "Return the cosine of a degree (not radian).", "MATH_TRIG_TOOLTIP_TAN": "Return the tangent of a degree (not radian).", "MATH_TRIG_TOOLTIP_ASIN": "Return the arcsine of a number.", "MATH_TRIG_TOOLTIP_ACOS": "Return the arccosine of a number.", "MATH_TRIG_TOOLTIP_ATAN": "Return the arctangent of a number.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", "MATH_IS_EVEN": "is even", "MATH_IS_ODD": "is odd", @@ -136,10 +129,8 @@ "MATH_IS_NEGATIVE": "is negative", "MATH_IS_DIVISIBLE_BY": "is divisible by", "MATH_IS_TOOLTIP": "Check if a number is an even, odd, prime, whole, positive, negative, or if it is divisible by certain number. Returns true or false.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "change %1 by %2", "MATH_CHANGE_TOOLTIP": "Add a number to variable '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Round a number up or down.", "MATH_ROUND_OPERATOR_ROUND": "round", "MATH_ROUND_OPERATOR_ROUNDUP": "round up", @@ -160,18 +151,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Return the standard deviation of the list.", "MATH_ONLIST_OPERATOR_RANDOM": "random item of list", "MATH_ONLIST_TOOLTIP_RANDOM": "Return a random element from the list.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "remainder of %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Return the remainder from dividing the two numbers.", "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "random integer from %1 to %2", "MATH_RANDOM_INT_TOOLTIP": "Return a random integer between the two specified limits, inclusive.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "random fraction", "MATH_RANDOM_FLOAT_TOOLTIP": "Return a random fraction between 0.0 (inclusive) and 1.0 (exclusive).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "A letter, word, or line of text.", "TEXT_JOIN_TITLE_CREATEWITH": "create text with", "TEXT_JOIN_TOOLTIP": "Create a piece of text by joining together any number of items.", diff --git a/msg/json/eo.json b/msg/json/eo.json index fa03930c56c..d7b76c0eaef 100644 --- a/msg/json/eo.json +++ b/msg/json/eo.json @@ -147,7 +147,6 @@ "MATH_CHANGE_HELPURL": "https://eo.wikipedia.org/wiki/Kremento", "MATH_CHANGE_TITLE": "krementi %1 per %2", "MATH_CHANGE_TOOLTIP": "Aldoni nombron al variablo '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Rondigi nombroj, supren aŭ malsupren.", "MATH_ROUND_OPERATOR_ROUND": "rondigi", "MATH_ROUND_OPERATOR_ROUNDUP": "Rondigi supren", @@ -173,7 +172,6 @@ "MATH_MODULO_TOOLTIP": "Liveri la reston de la divido de la du nombroj.", "MATH_CONSTRAIN_TITLE": "limigi %1 inter %2 kaj %3", "MATH_CONSTRAIN_TOOLTIP": "La nombro estos limigita tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "hazarda entjero inter %1 kaj %2", "MATH_RANDOM_INT_TOOLTIP": "Nombro estos hazarde liverita, tiel ke ĝi egalas la limojn aŭ troviĝas inter ili.", "MATH_RANDOM_FLOAT_HELPURL": "https://eo.wikipedia.org/wiki/Hazardo", @@ -290,7 +288,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ĝis elemento de inversa numero", "LISTS_GET_SUBLIST_END_LAST": "ĝis la lasta elemento", "LISTS_GET_SUBLIST_TOOLTIP": "Kreas kopion de la specifita parto de listo.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordigi %1 %2 liston %3", "LISTS_SORT_TOOLTIP": "Ordigas kopion de listo.", "LISTS_SORT_ORDER_ASCENDING": "kreskante", diff --git a/msg/json/es.json b/msg/json/es.json index 88c05ef7e3b..c45cf4e4cce 100644 --- a/msg/json/es.json +++ b/msg/json/es.json @@ -153,7 +153,6 @@ "MATH_IS_NEGATIVE": "es negativo", "MATH_IS_DIVISIBLE_BY": "es divisible por", "MATH_IS_TOOLTIP": "Comprueba si un número es par, impar, primo, entero, positivo, negativo, o si es divisible por un número determinado. Devuelve verdadero o falso.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "añadir %2 a %1", "MATH_CHANGE_TOOLTIP": "Añadir un número a la variable «%1».", "MATH_ROUND_HELPURL": "https://es.wikipedia.org/wiki/Redondeo", @@ -177,7 +176,6 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Devuelve la desviación estándar de la lista.", "MATH_ONLIST_OPERATOR_RANDOM": "elemento aleatorio de la lista", "MATH_ONLIST_TOOLTIP_RANDOM": "Devuelve un elemento aleatorio de la lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "resto de %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Devuelve el resto al dividir los dos números.", "MATH_CONSTRAIN_TITLE": "limitar %1 entre %2 y %3", @@ -238,17 +236,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Solicitar al usuario un número.", "TEXT_PROMPT_TOOLTIP_TEXT": "Solicitar al usuario un texto.", "TEXT_COUNT_MESSAGE0": "contar %1 en %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Cuantas veces aparece un texto dentro de otro texto.", "TEXT_REPLACE_MESSAGE0": "reemplazar %1 con %2 en %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Reemplazar todas las veces que un texto dentro de otro texto.", "TEXT_REVERSE_MESSAGE0": "invertir %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Invierte el orden de los caracteres en el texto.", "LISTS_CREATE_EMPTY_TITLE": "crear lista vacía", "LISTS_CREATE_EMPTY_TOOLTIP": "Devuelve una lista, de longitud 0, sin ningún dato", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Crear una lista con cualquier número de elementos.", "LISTS_CREATE_WITH_INPUT_WITH": "crear lista con", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", @@ -303,7 +297,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "hasta # del final", "LISTS_GET_SUBLIST_END_LAST": "hasta el último", "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia de la parte especificada de una lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "orden %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordenar una copia de una lista.", "LISTS_SORT_ORDER_ASCENDING": "ascendente", @@ -311,13 +304,11 @@ "LISTS_SORT_TYPE_NUMERIC": "numérico", "LISTS_SORT_TYPE_TEXT": "alfabético", "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar mayúscula/minúscula", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "hacer lista a partir de texto", "LISTS_SPLIT_TEXT_FROM_LIST": "hacer texto a partir de lista", "LISTS_SPLIT_WITH_DELIMITER": "con delimitador", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir el texto en una lista de textos, separando en cada delimitador.", "LISTS_SPLIT_TOOLTIP_JOIN": "Unir una lista de textos en un solo texto, separado por un delimitador.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "invertir %1", "LISTS_REVERSE_TOOLTIP": "Invertir una copia de una lista.", "VARIABLES_GET_TOOLTIP": "Devuelve el valor de esta variable.", diff --git a/msg/json/et.json b/msg/json/et.json index 596928b03e5..91af281c567 100644 --- a/msg/json/et.json +++ b/msg/json/et.json @@ -44,7 +44,6 @@ "DELETE_VARIABLE_CONFIRMATION": "Kas kustutada %1 kohas kasutatav muutuja '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Muutujat '%1' ei saa kustutada, sest see on osa funktsiooni '%2' määratlusest", "DELETE_VARIABLE": "Kustuta muutuja '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Valitud värv paletist.", "COLOUR_RANDOM_TITLE": "juhuslik värv", "COLOUR_RANDOM_TOOLTIP": "Juhuslikult valitud värv.", @@ -58,7 +57,6 @@ "COLOUR_BLEND_COLOUR2": "2. värvist", "COLOUR_BLEND_RATIO": "suhtega", "COLOUR_BLEND_TOOLTIP": "Segab kaks värvi määratud suhtega (0.0 - 1.0) kokku.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 korda", "CONTROLS_REPEAT_INPUT_DO": "käivita", "CONTROLS_REPEAT_TOOLTIP": "Plokis olevate käskude käivitamine määratud arv kordi.", @@ -85,7 +83,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Selle „kui“ ploki muutmine sektsioonide lisamise, eemaldamise ja järjestamisega.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Lisab „kui“ plokile tingimuse.", "CONTROLS_IF_ELSE_TOOLTIP": "Lisab „kui“ plokile lõpliku tingimuseta koodiploki.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Tagastab „tõene“, kui avaldiste väärtused on võrdsed.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Tagastab „tõene“, kui avaldiste väärtused pole võrdsed.", "LOGIC_COMPARE_TOOLTIP_LT": "Tagastab „tõene“, kui esimese avaldise väärtus on väiksem kui teise väärtus.", @@ -132,7 +129,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Tagastab arvu arkussiinuse.", "MATH_TRIG_TOOLTIP_ACOS": "Tagastab arvu arkuskoosiinuse.", "MATH_TRIG_TOOLTIP_ATAN": "Tagastab arvu arkustangensi.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Tagastab ühe konstantidest: π (3,141…), e (2,718…), φ (1.618…), √2) (1,414…), √½ (0,707…), või ∞ (infinity).", "MATH_IS_EVEN": "on paarisarv", "MATH_IS_ODD": "on paaritu arv", @@ -142,10 +138,8 @@ "MATH_IS_NEGATIVE": "on negatiivne arv", "MATH_IS_DIVISIBLE_BY": "jagub arvuga", "MATH_IS_TOOLTIP": "Kontrollib kas arv on paarisarv, paaritu arv, algarv, täisarv, positiivne, negatiivne või jagub kindla arvuga. Tagastab „tõene“ või „väär“.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "muuda %1 %2 võrra", "MATH_CHANGE_TOOLTIP": "Lisab arvu muutujale '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Ümardab arvu üles või alla.", "MATH_ROUND_OPERATOR_ROUND": "ümarda", "MATH_ROUND_OPERATOR_ROUNDUP": "ümarda üles", @@ -166,21 +160,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Tagastab loendi standardhälbe.", "MATH_ONLIST_OPERATOR_RANDOM": "juhuslik element loendist", "MATH_ONLIST_TOOLTIP_RANDOM": "Tagastab juhusliku elemendi loendist.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 jääk", "MATH_MODULO_TOOLTIP": "Tagastab esimese numbri teisega jagamisel tekkiva jäägi.", "MATH_CONSTRAIN_TITLE": "%1 piirang %2 ja %3 vahele", "MATH_CONSTRAIN_TOOLTIP": "Piirab arvu väärtuse toodud piiridesse (piirarvud kaasa arvatud).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "juhuslik täisarv %1 ja %2 vahel", "MATH_RANDOM_INT_TOOLTIP": "Tagastab juhusliku täisarvu toodud piiride vahel (piirarvud kaasa arvatud).", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "juhuslik murdosa", "MATH_RANDOM_FLOAT_TOOLTIP": "Tagastab juhusliku murdosa 0.0 (kaasa arvatud) and 1.0 (välja arvatud) vahel.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2(X:%1, Y:%2)", "MATH_ATAN2_TOOLTIP": "Tagastab punkti (X, Y) arkustangentsit kraadides vahemikus -180 kuni 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Täht, sõna või rida teksti.", "TEXT_JOIN_TITLE_CREATEWITH": "tekita tekst", "TEXT_JOIN_TOOLTIP": "Tekitab teksti ühendades mistahes arvu elemente.", @@ -289,7 +278,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "elemendini # (lõpust)", "LISTS_GET_SUBLIST_END_LAST": "lõpuni", "LISTS_GET_SUBLIST_TOOLTIP": "Tekitab loendi määratud osast koopia.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 sorteeritud %3", "LISTS_SORT_TOOLTIP": "Loendi koopia sorteerimine.", "LISTS_SORT_ORDER_ASCENDING": "kasvavalt", diff --git a/msg/json/eu.json b/msg/json/eu.json index 2a4e5b8578f..36d8651b6d2 100644 --- a/msg/json/eu.json +++ b/msg/json/eu.json @@ -141,10 +141,8 @@ "MATH_ONLIST_OPERATOR_STD_DEV": "zerrendako deribazio estandarra", "MATH_ONLIST_OPERATOR_RANDOM": "zerrendako artikulu aleatorioa", "MATH_ONLIST_TOOLTIP_RANDOM": "Itzuli zerrendako elementu aleatorioa.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2(r)en oroigarria", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "zatiki aleatorioa", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Letra bat, hitza edo testuko lerroa.", "TEXT_JOIN_TITLE_CREATEWITH": "Testua sortu hurrengoarekin", "TEXT_CREATE_JOIN_TITLE_JOIN": "elkartu", diff --git a/msg/json/fa.json b/msg/json/fa.json index 75bc968241d..101026f3e08 100644 --- a/msg/json/fa.json +++ b/msg/json/fa.json @@ -186,7 +186,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%AA%D9%88%D9%84%DB%8C%D8%AF_%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF_%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "TEXT_TEXT_HELPURL": "https://fa.wikipedia.org/wiki/%D8%B1%D8%B4%D8%AA%D9%87_%28%D8%B9%D9%84%D9%88%D9%85_%D8%B1%D8%A7%DB%8C%D8%A7%D9%86%D9%87%29", "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", @@ -295,7 +294,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "به # از انتها", "LISTS_GET_SUBLIST_END_LAST": "به آخرین", "LISTS_GET_SUBLIST_TOOLTIP": "کپی از قسمت مشخص‌شدهٔ لیست درست می‌کند.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "مرتب‌سازی%1 %2 %3", "LISTS_SORT_TOOLTIP": "یک کپی از لیست را مرتب کنید.", "LISTS_SORT_ORDER_ASCENDING": "صعودی", diff --git a/msg/json/fi.json b/msg/json/fi.json index 936c6930d15..6e8dc079e01 100644 --- a/msg/json/fi.json +++ b/msg/json/fi.json @@ -57,7 +57,6 @@ "COLOUR_PICKER_TOOLTIP": "Valitse väri paletista.", "COLOUR_RANDOM_TITLE": "satunnainen väri", "COLOUR_RANDOM_TOOLTIP": "Valitse väri sattumanvaraisesti.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "väri, jossa on", "COLOUR_RGB_RED": "punainen", "COLOUR_RGB_GREEN": "vihreä", @@ -68,7 +67,6 @@ "COLOUR_BLEND_COLOUR2": "väri 2", "COLOUR_BLEND_RATIO": "suhde", "COLOUR_BLEND_TOOLTIP": "Sekoittaa kaksi väriä keskenään annetussa suhteessa (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "toista %1 kertaa", "CONTROLS_REPEAT_INPUT_DO": "tee", "CONTROLS_REPEAT_TOOLTIP": "Suorita joukko lausekkeita useampi kertaa.", @@ -119,11 +117,7 @@ "LOGIC_TERNARY_TOOLTIP": "Tarkistaa testin ehdon. Jos ehto on tosi, palauttaa \"jos tosi\" arvon, muuten palauttaa \"jos epätosi\" arvon.", "MATH_NUMBER_HELPURL": "https://fi.wikipedia.org/wiki/Luku", "MATH_NUMBER_TOOLTIP": "Luku.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", "MATH_MULTIPLICATION_SYMBOL": "⋅", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -153,7 +147,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Palauttaa luvun arkussinin.", "MATH_TRIG_TOOLTIP_ACOS": "Palauttaa luvun arkuskosinin.", "MATH_TRIG_TOOLTIP_ATAN": "Palauttaa luvun arkustangentin.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Palauttaa jonkin seuraavista vakioista: π (3.141…), e (2.718…), φ (1.618…), neliöjuuri(2) (1.414…), neliöjuuri(½) (0.707…), or ∞ (ääretön).", "MATH_IS_EVEN": "on parillinen", "MATH_IS_ODD": "on pariton", @@ -187,7 +180,6 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Palauttaa annettujen lukujen keskihajonnan.", "MATH_ONLIST_OPERATOR_RANDOM": "satunnainen valinta luvuista", "MATH_ONLIST_TOOLTIP_RANDOM": "Palauttaa satunnaisesti valitun luvun annetuista luvuista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 jakojäännös", "MATH_MODULO_TOOLTIP": "Palauttaa jakolaskun jakojäännöksen.", "MATH_CONSTRAIN_TITLE": "rajoita %1 vähintään %2 enintään %3", @@ -198,7 +190,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://fi.wikipedia.org/wiki/Satunnaisluku", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "satunnainen murtoluku", "MATH_RANDOM_FLOAT_TOOLTIP": "Palauttaa satunnaisen luvun oikealta puoliavoimesta välistä [0.0, 1.0).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan(X:%1,Y:%2)", "MATH_ATAN2_TOOLTIP": "Palauta pisteen (X,Y) arkustangentti välillä -180–180.", "TEXT_TEXT_HELPURL": "https://fi.wikipedia.org/wiki/Merkkijono", @@ -310,7 +301,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "päättyen kohtaan (lopusta laskien)", "LISTS_GET_SUBLIST_END_LAST": "viimeinen", "LISTS_GET_SUBLIST_TOOLTIP": "Luo kopio määrätystä kohden listaa.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "lajittele %1 %2 %3", "LISTS_SORT_TOOLTIP": "Lajittele kopio luettelosta.", "LISTS_SORT_ORDER_ASCENDING": "nouseva", @@ -351,7 +341,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Korosta funktion määritelmä", "PROCEDURES_CREATE_DO": "Luo '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Jos arvo on tosi, palauta toinen arvo.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varoitus: tätä lohkoa voi käyttää vain funktion määrityksessä.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Sano jotakin...", "WORKSPACE_ARIA_LABEL": "Blocklyn työnäkymä", diff --git a/msg/json/fr.json b/msg/json/fr.json index 3b0913f7d60..60a422eae18 100644 --- a/msg/json/fr.json +++ b/msg/json/fr.json @@ -61,13 +61,11 @@ "COLOUR_PICKER_TOOLTIP": "Choisir une couleur dans la palette.", "COLOUR_RANDOM_TITLE": "couleur aléatoire", "COLOUR_RANDOM_TOOLTIP": "Choisir une couleur au hasard.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "colorier en", "COLOUR_RGB_RED": "rouge", "COLOUR_RGB_GREEN": "vert", "COLOUR_RGB_BLUE": "bleu", "COLOUR_RGB_TOOLTIP": "Créer une couleur avec la quantité spécifiée de rouge, vert et bleu. Les valeurs doivent être comprises entre 0 et 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "mélanger", "COLOUR_BLEND_COLOUR1": "couleur 1", "COLOUR_BLEND_COLOUR2": "couleur 2", @@ -77,20 +75,24 @@ "CONTROLS_REPEAT_TITLE": "répéter %1 fois", "CONTROLS_REPEAT_INPUT_DO": "faire", "CONTROLS_REPEAT_TOOLTIP": "Exécuter des instructions plusieurs fois.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", + "CONTROLS_WHILEUNTIL_HELPURL": "https://fr.wikipedia.org/wiki/Boucle_while", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "répéter tant que", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "répéter jusqu’à ce que", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Tant qu’une valeur est vraie, alors exécuter des instructions.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Tant qu’une valeur est fausse, alors exécuter des instructions.", + "CONTROLS_FOR_HELPURL": "https://fr.wikipedia.org/wiki/Boucle_for", "CONTROLS_FOR_TOOLTIP": "Faire prendre successivement à la variable « %1 » les valeurs entre deux nombres de début et de fin par incrément du pas spécifié et exécuter les instructions spécifiées.", "CONTROLS_FOR_TITLE": "compter avec %1 de %2 à %3 par %4", + "CONTROLS_FOREACH_HELPURL": "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Itérateurs", "CONTROLS_FOREACH_TITLE": "pour chaque élément %1 dans la liste %2", "CONTROLS_FOREACH_TOOLTIP": "Pour chaque élément d’une liste, assigner la valeur de l’élément à la variable « %1 », puis exécuter des instructions.", + "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Commandes_de_sortie_de_boucle", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "quitter la boucle", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "passer à l’itération de boucle suivante", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Sortir de la boucle englobante.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sauter le reste de cette boucle, et poursuivre avec l’itération suivante.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Attention : ce bloc ne devrait être utilisé que dans une boucle.", + "CONTROLS_IF_HELPURL": "https://fr.wikipedia.org/wiki/Structure_de_contrôle#Alternatives", "CONTROLS_IF_TOOLTIP_1": "Si une valeur est vraie, alors exécuter certaines instructions.", "CONTROLS_IF_TOOLTIP_2": "Si une valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, exécuter le second bloc d’instructions.", "CONTROLS_IF_TOOLTIP_3": "Si la première valeur est vraie, alors exécuter le premier bloc d’instructions. Sinon, si la seconde valeur est vraie, exécuter le second bloc d’instructions.", @@ -108,16 +110,18 @@ "LOGIC_COMPARE_TOOLTIP_LTE": "Renvoyer vrai si la première entrée est plus petite ou égale à la seconde.", "LOGIC_COMPARE_TOOLTIP_GT": "Renvoyer vrai si la première entrée est plus grande que la seconde.", "LOGIC_COMPARE_TOOLTIP_GTE": "Renvoyer true si la première entrée est supérieure ou égale à la seconde.", + "LOGIC_OPERATION_HELPURL": "https://fr.wikipedia.org/wiki/Connecteur_logique", "LOGIC_OPERATION_TOOLTIP_AND": "Renvoyer vrai si les deux entrées sont vraies.", "LOGIC_OPERATION_AND": "et", "LOGIC_OPERATION_TOOLTIP_OR": "Renvoyer vrai si au moins une des entrées est vraie.", "LOGIC_OPERATION_OR": "ou", + "LOGIC_NEGATE_HELPURL": "https://fr.wikipedia.org/wiki/Négation_logique", "LOGIC_NEGATE_TITLE": "non %1", "LOGIC_NEGATE_TOOLTIP": "Renvoie vrai si l’entrée est fausse. Renvoie faux si l’entrée est vraie.", + "LOGIC_BOOLEAN_HELPURL": "https://fr.wikipedia.org/wiki/Principe_de_bivalence", "LOGIC_BOOLEAN_TRUE": "vrai", "LOGIC_BOOLEAN_FALSE": "faux", "LOGIC_BOOLEAN_TOOLTIP": "Renvoie soit vrai soit faux.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "nul", "LOGIC_NULL_TOOLTIP": "Renvoie nul.", "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F%3A", @@ -127,11 +131,7 @@ "LOGIC_TERNARY_TOOLTIP": "Vérifie la condition indiquée dans « test ». Si elle est vraie, renvoie la valeur « si vrai » ; sinon renvoie la valeur « si faux ».", "MATH_NUMBER_HELPURL": "https://fr.wikipedia.org/wiki/Nombre", "MATH_NUMBER_TOOLTIP": "Un nombre.", - "MATH_ADDITION_SYMBOL": "+", "MATH_SUBTRACTION_SYMBOL": "−", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -152,7 +152,7 @@ "MATH_SINGLE_TOOLTIP_NEG": "Renvoie l’opposé d’un nombre", "MATH_SINGLE_TOOLTIP_LN": "Renvoie le logarithme naturel d’un nombre.", "MATH_SINGLE_TOOLTIP_LOG10": "Renvoie le logarithme décimal d’un nombre.", - "MATH_SINGLE_TOOLTIP_EXP": "Renvoie e à la puissance d’un nombre.", + "MATH_SINGLE_TOOLTIP_EXP": "Renvoie e (la constante d’Euler) élevé à la puissance d’un nombre donné, c’est-à-dire l’exponentielle népérienne ou naturelle de ce nombre.", "MATH_SINGLE_TOOLTIP_POW10": "Renvoie 10 à la puissance d’un nombre.", "MATH_TRIG_HELPURL": "https://fr.wikipedia.org/wiki/Fonction_trigonom%C3%A9trique", "MATH_TRIG_TOOLTIP_SIN": "Renvoie le sinus d’un angle en degrés (pas en radians).", @@ -179,6 +179,7 @@ "MATH_ROUND_OPERATOR_ROUND": "arrondir", "MATH_ROUND_OPERATOR_ROUNDUP": "arrondir par excès (à l’entier supérieur le plus proche)", "MATH_ROUND_OPERATOR_ROUNDDOWN": "arrondir par défaut (à l’entier inférieur le plus proche)", + "MATH_ONLIST_HELPURL": "https://fr.wikipedia.org/wiki/Fonction_d'agrégation", "MATH_ONLIST_OPERATOR_SUM": "somme de la liste", "MATH_ONLIST_TOOLTIP_SUM": "Renvoyer la somme de tous les nombres dans la liste.", "MATH_ONLIST_OPERATOR_MIN": "minimum de la liste", @@ -256,17 +257,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Demander un nombre à l’utilisateur.", "TEXT_PROMPT_TOOLTIP_TEXT": "Demander un texte à l’utilisateur.", "TEXT_COUNT_MESSAGE0": "nombre %1 sur %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Compter combien de fois un texte donné apparaît dans un autre.", "TEXT_REPLACE_MESSAGE0": "remplacer %1 par %2 dans %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Remplacer toutes les occurrences d’un texte par un autre.", "TEXT_REVERSE_MESSAGE0": "renverser %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Renverse l’ordre des caractères dans le texte.", "LISTS_CREATE_EMPTY_TITLE": "créer une liste vide", "LISTS_CREATE_EMPTY_TOOLTIP": "Renvoyer une liste, de longueur 0, ne contenant aucun enregistrement de données", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Créer une liste avec un nombre quelconque d’éléments.", "LISTS_CREATE_WITH_INPUT_WITH": "créer une liste avec", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "liste", @@ -321,9 +318,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "jusqu’au n°", "LISTS_GET_SUBLIST_END_FROM_END": "jusqu’au n° depuis la fin", "LISTS_GET_SUBLIST_END_LAST": "jusqu’à la fin", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Crée une copie de la partie spécifiée d’une liste.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "trier %1 %2 %3", "LISTS_SORT_TOOLTIP": "Trier une copie d’une liste.", "LISTS_SORT_ORDER_ASCENDING": "croissant", @@ -331,16 +326,13 @@ "LISTS_SORT_TYPE_NUMERIC": "numérique", "LISTS_SORT_TYPE_TEXT": "alphabétique", "LISTS_SORT_TYPE_IGNORECASE": "alphabétique, en ignorant la casse", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "créer une liste depuis le texte", "LISTS_SPLIT_TEXT_FROM_LIST": "créer un texte depuis la liste", "LISTS_SPLIT_WITH_DELIMITER": "avec séparateur", "LISTS_SPLIT_TOOLTIP_SPLIT": "Couper un texte en une liste de textes, en coupant à chaque séparateur.", "LISTS_SPLIT_TOOLTIP_JOIN": "Réunir une liste de textes en un seul, en les joignant par un séparateur.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "inverser %1", "LISTS_REVERSE_TOOLTIP": "Inverser la copie d’une liste.", - "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Renvoie la valeur de cette variable.", "VARIABLES_GET_CREATE_SET": "Créer « définir %1 »", "VARIABLES_SET": "définir %1 à %2", @@ -351,7 +343,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "faire quelque chose", "PROCEDURES_BEFORE_PARAMS": "avec :", "PROCEDURES_CALL_BEFORE_PARAMS": "avec :", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Crée une fonction sans sortie.", "PROCEDURES_DEFNORETURN_COMMENT": "Décrivez cette fonction...", "PROCEDURES_DEFRETURN_HELPURL": "https://fr.wikipedia.org/wiki/Sous-programme", @@ -370,7 +361,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Surligner la définition de la fonction", "PROCEDURES_CREATE_DO": "Créer « %1 »", "PROCEDURES_IFRETURN_TOOLTIP": "Si une valeur est vraie, alors renvoyer une seconde valeur.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Attention : ce bloc ne peut être utilisé que dans une définition de fonction.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Expliquez quelque chose...", "WORKSPACE_ARIA_LABEL": "Espace de travail de Blocky", diff --git a/msg/json/gor.json b/msg/json/gor.json index 2128e88b0cf..84f08d896b4 100644 --- a/msg/json/gor.json +++ b/msg/json/gor.json @@ -43,7 +43,6 @@ "COLOUR_BLEND_COLOUR2": "laku 2", "COLOUR_BLEND_RATIO": "rasio", "COLOUR_BLEND_TOOLTIP": "Mongulawu dulo laku pe'eenta wolo rasio (0.0-1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ulangiya %1 kali", "CONTROLS_REPEAT_INPUT_DO": "pohutuwa", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "Ulangiya wonu", @@ -54,7 +53,6 @@ "CONTROLS_IF_MSG_IF": "wonu", "CONTROLS_IF_MSG_ELSEIF": "wonu uweewo", "CONTROLS_IF_MSG_ELSE": "uweewo", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_OPERATION_AND": "wawu", "LOGIC_OPERATION_OR": "meyalo", "LOGIC_NEGATE_TITLE": "diila %1", @@ -64,13 +62,8 @@ "LOGIC_TERNARY_CONDITION": "yimontalo", "LOGIC_TERNARY_IF_TRUE": "wonu banari", "LOGIC_TERNARY_IF_FALSE": "wonu tala", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Noomoro", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "akar pangkat dua", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", "TEXT_CREATE_JOIN_TITLE_JOIN": "wayito", "TEXT_CREATE_JOIN_TOOLTIP": "Duhengi, yinggila, meyalo susungiya ulangi tuladu blok.", diff --git a/msg/json/ha.json b/msg/json/ha.json index 9f11230c773..7bf61441a15 100644 --- a/msg/json/ha.json +++ b/msg/json/ha.json @@ -39,7 +39,6 @@ "DELETE_VARIABLE_CONFIRMATION": "A goge amfanunnukan %1 na siffar '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "An kasa goge siffa '%1' sabo da tana daga sashi na bayanin aikin '%2'", "DELETE_VARIABLE": "A goge siffar '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Zaɓi launi daga faifan launuka.", "COLOUR_RANDOM_TITLE": "launuka da aka hargitsa", "COLOUR_RANDOM_TOOLTIP": "Zaɓi launi daga wanɗanda aka hargitsa.", @@ -53,7 +52,6 @@ "COLOUR_BLEND_COLOUR2": "launi na 2", "COLOUR_BLEND_RATIO": "lissafi", "COLOUR_BLEND_TOOLTIP": "Ana gauraya launuka biyu tare da wani lissafi da aka bayar (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "maimaita sau %1", "CONTROLS_REPEAT_INPUT_DO": "yi", "CONTROLS_REPEAT_TOOLTIP": "Yi wasu bayanai sau da dama.", @@ -80,7 +78,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Daɗa, cire, ko sake tsarin ɓangarori domin sake fasalin wannan idan bulo.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Daɗa sharaɗi zuwa idan bulo.", "CONTROLS_IF_ELSE_TOOLTIP": "Daɗa na ƙarshe, sharaɗin kama-duk zuwa idan bulo.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Koma gaskiya idan duk bayanan sun yi dai dai da juna.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Koma gaskiya idan duk bayanan ba su yi dai dai da juna ba.", "LOGIC_COMPARE_TOOLTIP_LT": "Koma gaskiya idan bayanin farko ya fi na biyu ƙanƙanta.", @@ -102,15 +99,12 @@ "LOGIC_TERNARY_IF_TRUE": "idan gaskiya ne", "LOGIC_TERNARY_IF_FALSE": "idan ƙarya ne", "LOGIC_TERNARY_TOOLTIP": "Duba sharaɗin a cikin 'gwaji'. Idan sharaɗin gaskiya ne, mayar da kimar 'idan gaskiya ne'; idan ba haka ba mayar da kimar 'idan ƙarya ne'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Lambda.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Dawo da jumlar lambobin guda biyu.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Dawo da bambancin lambobin guda biyu.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Dawo da ruɓin lambobin guda biyu.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Dawo da sakamakon lambobin guda biyu bayan an raba su da juna.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Dawo da lambar farko wadda aka ɗaga ta zuwa ƙarfin lamba ta biyu.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "lamba da ta ruɓanya kanta", "MATH_SINGLE_TOOLTIP_ROOT": "Dawo da wata lamba da ta ruɓanya kanta.", "MATH_SINGLE_OP_ABSOLUTE": "cikakkiya", @@ -120,14 +114,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Dawo da tushe 10 na jerin lambobi da aka tara ko aka ɗebe na wata lamba.", "MATH_SINGLE_TOOLTIP_EXP": "Dawo da e zuwa ƙarfin wata lamba.", "MATH_SINGLE_TOOLTIP_POW10": "Dawo da 10 zuwa ƙarfin wata lamba.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Dawo da sine na wani gwargwado (banda layin kusurwar waje).", "MATH_TRIG_TOOLTIP_COS": "Dawo da cosine na wani gwargwado (banda layin kusurwar waje).", "MATH_TRIG_TOOLTIP_TAN": "Dawo da tangent na wani gwargwado (banda layin kusurwar waje).", "MATH_TRIG_TOOLTIP_ASIN": "Dawo da arcsine na wata lamba.", "MATH_TRIG_TOOLTIP_ACOS": "Dawo da arccosine na wata lamba.", "MATH_TRIG_TOOLTIP_ATAN": "Dawo da arctangent na wata lamba.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Dawo da ɗaya daga cikin sanannen zaunannen lissafi: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), ko ∞ (maras iyaka).", "MATH_IS_EVEN": "lamba da za a iya rabawa da biyu", "MATH_IS_ODD": "lamba ce da ba za a iya rabawa da biyu ba", @@ -137,10 +129,8 @@ "MATH_IS_NEGATIVE": "lamba ce da bata kai sufuli ba", "MATH_IS_DIVISIBLE_BY": "lamba ce da za a iya rabawa da", "MATH_IS_TOOLTIP": "Duba idan lamba ce da za a iya rabawa da biyu, lamba wadda ba za a iya rabawa da biyu ba, lamba ce kawai da za a iya rabawa da kanta, lamba ce cikakkiya,lamba ce da tafi sufuli, lamba ce da bata kai sufuli ba, lamba ce da za a iya rabawa da wata lamba. Ta dawo da gaskiya ko ƙarya.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "canza %1 da %2", "MATH_CHANGE_TOOLTIP": "Daɗa wata lamba zuwa siffa '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Cika lamba sama ko ƙasa.", "MATH_ROUND_OPERATOR_ROUND": "cika", "MATH_ROUND_OPERATOR_ROUNDUP": "cika sama", @@ -161,21 +151,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Dawo da matakan bambance-bambance na jeri.", "MATH_ONLIST_OPERATOR_RANDOM": "bazuwar kaya na jeri", "MATH_ONLIST_TOOLTIP_RANDOM": "Dawo da bazuwar kaya daga jerin.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "saura daga raba %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Dawo da saura daga raba lambobin guda biyu.", "MATH_CONSTRAIN_TITLE": "ƙarfi %1 ƙasa %2 sama %3", "MATH_CONSTRAIN_TOOLTIP": "Tsare lamba tsakanin lambobi da aka fayyace masu ƙarama da babbar kima (haɗawa).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "bazuwar cikakkiyar lamba daga %1 zuwa %2", "MATH_RANDOM_INT_TOOLTIP": "Dawo da bazuwar cikakkiyar lamba tsakanin wani gwargwado da aka fayyace, haɗawa.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ɓangare mai buzuwa", "MATH_RANDOM_FLOAT_TOOLTIP": "Dawo da ɓangare mai bazuwa tsakanin 0.0 (haɗawa) da 1.0 (rabewa).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 na X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Dawo da arctangent na tsinin (X, Y) a gwargwado daga -180 zuwa 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Harafi, kalma, ko layi na rubutu.", "TEXT_JOIN_TITLE_CREATEWITH": "ƙirƙiri rubutu da", "TEXT_JOIN_TOOLTIP": "Ƙirƙiri guntun rubutu ta haɗa kowace lamba ta kayayyaki.", @@ -283,7 +268,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "zuwa # daga ƙarshe", "LISTS_GET_SUBLIST_END_LAST": "zuwa ƙarshe", "LISTS_GET_SUBLIST_TOOLTIP": "Ƙirƙiri kwafi na ɓangaren da aka fayyace daga wani jeri.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ware %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ware kwafi na jeri.", "LISTS_SORT_ORDER_ASCENDING": "hawa", @@ -313,9 +297,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Ya ƙirƙiri wani aiki ba tare da wani sakamako ba.", "PROCEDURES_ALLOW_STATEMENTS": "ƙyale bayanai", "PROCEDURES_DEF_DUPLICATE_WARNING": "Gardaɗi: Wannan aikin yana da ruɓi na gazawa.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Gudanar da aiki '%1' wanda mai amfani ya ayyana.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Gudanar da aiki '%1' kuma a yi amfani da sakamakon sa.", "PROCEDURES_MUTATORCONTAINER_TITLE": "bayani", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Daɗa, cire, ko sake tsarin bayani na wannan aiki.", diff --git a/msg/json/he.json b/msg/json/he.json index 808458e5d94..00826635c61 100644 --- a/msg/json/he.json +++ b/msg/json/he.json @@ -120,11 +120,6 @@ "LOGIC_TERNARY_TOOLTIP": "בדוק את התנאי ב'מבחן'. אם התנאי נכון, תחזיר את הערך 'אם נכון'; אחרת תחזיר את הערך 'אם שגוי'.", "MATH_NUMBER_HELPURL": "https://he.wikipedia.org/wiki/מספר_ממשי", "MATH_NUMBER_TOOLTIP": "מספר.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -309,7 +304,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ל # מהסוף", "LISTS_GET_SUBLIST_END_LAST": "לאחרון", "LISTS_GET_SUBLIST_TOOLTIP": "יוצרת עותק של חלק מסוים מהרשימה.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "מיון %1 %2 %3", "LISTS_SORT_TOOLTIP": "מיון עותק של הרשימה.", "LISTS_SORT_ORDER_ASCENDING": "סדר עולה", @@ -347,7 +341,7 @@ "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "הוסף, הסר או סדר מחדש קלטים לפונקציה זו", "PROCEDURES_MUTATORARG_TITLE": "שם הקלט:", "PROCEDURES_MUTATORARG_TOOLTIP": "הוסף קלט לפונקציה", - "PROCEDURES_HIGHLIGHT_DEF": "הדגש הגדרה של פונקציה", + "PROCEDURES_HIGHLIGHT_DEF": "להדגיש הגדרה של פונקציה", "PROCEDURES_CREATE_DO": "ליצור '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "אם ערך נכון, אז להחזיר ערך שני.", "PROCEDURES_IFRETURN_WARNING": "אזהרה: קוביה זו עשויה לשמש רק בתוך הגדרה של פונקציה.", diff --git a/msg/json/hi.json b/msg/json/hi.json index d8289c53d6a..c3a8eeacaf7 100644 --- a/msg/json/hi.json +++ b/msg/json/hi.json @@ -46,7 +46,6 @@ "DELETE_VARIABLE_CONFIRMATION": "'%2' चर के %1 उपयोग को हटाएँ?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "चर '%1' को नहीं हटा सकता क्योंकि यह फ़ंक्शन '%2' की परिभाषा का हिस्सा है", "DELETE_VARIABLE": "'%1' चर को हटाएँ", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "पैलेट से एक रंग चुनें।", "COLOUR_RANDOM_TITLE": "कोई भी रंग", "COLOUR_RANDOM_TOOLTIP": "कोई भी एक रंग का चयन करें।", @@ -60,7 +59,6 @@ "COLOUR_BLEND_COLOUR2": "रंग 2", "COLOUR_BLEND_RATIO": "अनुपात", "COLOUR_BLEND_TOOLTIP": "दिए गए अनुपात (0.0 - 1.0) के साथ दो रंगों का मिश्रण करता है।", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 बार दोहराएँ", "CONTROLS_REPEAT_INPUT_DO": "करें", "CONTROLS_REPEAT_TOOLTIP": "कुछ विवरण कई बार चलाएँ।", @@ -87,7 +85,6 @@ "CONTROLS_IF_IF_TOOLTIP": "भाग को समनरूप बनाने के लिए जोङें, हटाएं, या पुनः व्यवस्थित करें यदि यह बंद है।", "CONTROLS_IF_ELSEIF_TOOLTIP": "एक शर्त जोड़ें यदि ब्लॉक है।", "CONTROLS_IF_ELSE_TOOLTIP": "यदि ब्लॉक है तो इसके लिए एक अंतिम, कैच-सभी स्थिति जोड़ें।", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "ट्रू रिटर्न करें यदि दोनो इनपुट इक दूसरे के बराबर हों।", "LOGIC_COMPARE_TOOLTIP_NEQ": "ट्रू रिटर्न करें यदि दोनो इनपुट इक दूसरे के बराबर नहीं हों।", "LOGIC_COMPARE_TOOLTIP_LT": "ट्रू रिटर्न करें यदि पहला इनपुट दूसरे इनपुट से छोटा हो।", @@ -109,15 +106,12 @@ "LOGIC_TERNARY_IF_TRUE": "यदि सही है", "LOGIC_TERNARY_IF_FALSE": "यदि गलत है", "LOGIC_TERNARY_TOOLTIP": "'परीक्षण' में हालत की जांच करें। यदि स्थिति सही है, तो 'सच' मान लौटाता है; अन्यथा वापस लौटता 'अगर झूठा'मान देता है।", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "एक संख्या।", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "दो संख्याओं का योग रिटर्न करें।", "MATH_ARITHMETIC_TOOLTIP_MINUS": "दो संख्याओं का अंतर रिटर्न करें।", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "दो संख्याओं का गुणन रिटर्न करें।", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "दो संख्याओं का भागफल रिटर्न करें।", "MATH_ARITHMETIC_TOOLTIP_POWER": "दूसरे नंबर की शक्ति को उठाए गए पहले नंबर पर लौटें", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "वर्गमूल", "MATH_SINGLE_TOOLTIP_ROOT": "संख्या का वर्गमूल रिटर्न करें।", "MATH_SINGLE_OP_ABSOLUTE": "परम", @@ -127,14 +121,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "संख्या का मूल 10 लघुगणक रिटर्न करें।", "MATH_SINGLE_TOOLTIP_EXP": "किसी संख्या की शक्ति को वापस ई करें।", "MATH_SINGLE_TOOLTIP_POW10": "किसी संख्या की शक्ति पर 10 लौटें।", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "डिग्री का साइन रिटर्न करें (रेडियन नही)", "MATH_TRIG_TOOLTIP_COS": "डिग्री का कोसाइन रिटर्न करें (रेडियन नही)", "MATH_TRIG_TOOLTIP_TAN": "डिग्री का टैन्जन्ट रिटर्न करें (रेडियन नही)", "MATH_TRIG_TOOLTIP_ASIN": "संख्या का आर्कसाइन रिटर्न करें।", "MATH_TRIG_TOOLTIP_ACOS": "संख्या का आर्ककोसाइन रिटर्न करें।", "MATH_TRIG_TOOLTIP_ATAN": "संख्या का आर्कटैन्जन्ट रिटर्न करें।", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "सामान्य स्थिरांक में से एक को वापस लौटें:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity)।", "MATH_IS_EVEN": "सम है", "MATH_IS_ODD": "विषम है", @@ -144,10 +136,8 @@ "MATH_IS_NEGATIVE": "ऋणात्मक है", "MATH_IS_DIVISIBLE_BY": "इसके द्वारा विभाज्य है", "MATH_IS_TOOLTIP": "जांचें कि क्या कोई संख्या एक सम, विषम, मुख्य, संपूर्ण, सकारात्मक, नकारात्मक है या यदि वह निश्चित संख्या से विभाजित है। वास्तविक या गलत रिटर्न देता है।", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%1 को %2 से बदलें", "MATH_CHANGE_TOOLTIP": "संख्या को चर '%1' से जोड़ें।", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "संख्या को बड़ा या घटा के पूर्णांक बनाएँ।", "MATH_ROUND_OPERATOR_ROUND": "पूर्णांक बनाएँ", "MATH_ROUND_OPERATOR_ROUNDUP": "बड़ा के पूर्णांक बनाएँ", @@ -168,18 +158,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "सूची का मानक विचलन रिटर्न करें।", "MATH_ONLIST_OPERATOR_RANDOM": "सूची का रैन्डम आइटम", "MATH_ONLIST_TOOLTIP_RANDOM": "सूची से एक रैन्डम आइटम रिटर्न करें।", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 का शेषफल", "MATH_MODULO_TOOLTIP": "दो संख्याओं के भाग का शेषफल रिटर्न करें।", "MATH_CONSTRAIN_TITLE": "%1 कम %2 उच्च %3 बाधित करें", "MATH_CONSTRAIN_TOOLTIP": "एक संख्या को निर्दिष्ट सीमा (सम्मिलित) के बीच बाधित करें।", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "%1 से %2 तक रैन्डम पूर्णांक", "MATH_RANDOM_INT_TOOLTIP": "दो निर्दिष्ट सीमाओं, समावेशी के बीच एक यादृच्छिक पूर्णांक लौटें।", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "रैन्डम अंश", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (समावेशी) और 1.0 (विशिष्ट) के बीच एक यादृच्छिक अंश पर लौटें।", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "एक अक्षर, शब्द, या टेक्स्ट की पंक्ति।", "TEXT_JOIN_TITLE_CREATEWITH": "इसके साथ टेक्स्ट बनाएँ", "TEXT_JOIN_TOOLTIP": "किसी भी संख्या के मदों को एक साथ जोड़ कर पाठ का एक टुकड़ा बनाएं।", @@ -230,7 +216,6 @@ "TEXT_REPLACE_MESSAGE0": "%1 को %2 के साथ %3 में बदलें", "TEXT_REPLACE_TOOLTIP": "कुछ अन्य पाठ के अंदर कुछ पाठ की सभी जगहों को बदलें।", "TEXT_REVERSE_MESSAGE0": "%1 को बदल दें", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "पाठ में वर्णों के क्रम को उलट देता है।", "LISTS_CREATE_EMPTY_TITLE": "खाली सूची बनाएँ", "LISTS_CREATE_EMPTY_TOOLTIP": "0 लंबाई की, कोई भी डेटा ना रखने वाली एक सूची लौटती है", @@ -288,7 +273,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "अंतिम से # को", "LISTS_GET_SUBLIST_END_LAST": "अंत से", "LISTS_GET_SUBLIST_TOOLTIP": "सूची के बताए गये भाग की कॉपी बनता है।", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "LISTS_SORT_TITLE": "%1 %2 %3 को छांटे", "LISTS_SORT_TOOLTIP": "एक सूची की एक प्रति को छांटे।", "LISTS_SORT_ORDER_ASCENDING": "बढ़ते क्रम", @@ -318,9 +302,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "आउटपुट वाला एक फ़ंक्शन बनाता है।", "PROCEDURES_ALLOW_STATEMENTS": "बयानों की अनुमति दें", "PROCEDURES_DEF_DUPLICATE_WARNING": "सावधान: इस फ़ंक्शन मे डुप्लिकेट पैरामीटर हैं।", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ।", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "यूज़र द्वारा वर्णन किया गया फ़ंक्शन '%1' चलाएँ और उसका आउटपुट इस्तेमाल करें।", "PROCEDURES_MUTATORCONTAINER_TITLE": "इनपुट", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "इस फ़ंक्शन में इनपुट जोड़ें, निकालें, या पुन: क्रमित करें।", diff --git a/msg/json/hr.json b/msg/json/hr.json index 52e0fa38de2..a82644d746b 100644 --- a/msg/json/hr.json +++ b/msg/json/hr.json @@ -82,11 +82,10 @@ "CONTROLS_IF_TOOLTIP_4": "Ako je prva vrijednost istina, tada izvrši prvi blok naredbi. Inače, ako je druga vrijednost istina izvrši drugi blok naredbi. Ako niti jedna vrijednost nije istina, izvrši zadnji blok naredbi.", "CONTROLS_IF_MSG_IF": "ako", "CONTROLS_IF_MSG_ELSEIF": "inače ako", - "CONTROLS_IF_MSG_ELSE": "onda", + "CONTROLS_IF_MSG_ELSE": "inače", "CONTROLS_IF_IF_TOOLTIP": "Dodaj, ukloni ili promijeni redoslijed kako biste presložili ovaj blok.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodaj uvjet bloku.", "CONTROLS_IF_ELSE_TOOLTIP": "Dodaj završni, \"vrijedi za sve\" uvjet bloku.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Vraća istina ako su obje ulazne vrijednosti jednake jedna drugoj.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Vraća istina ako obje ulazne vrijednosti nisu jednake jedna drugoj.", "LOGIC_COMPARE_TOOLTIP_LT": "Vraća istina ako je prva ulazna vrijednost manja od druge.", @@ -126,7 +125,6 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Vraća logaritam po bazi 10 zadanog broja.", "MATH_SINGLE_TOOLTIP_EXP": "Vraća e na potenciju broja.", "MATH_SINGLE_TOOLTIP_POW10": "Vraća 10 na potenciju broja.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Vraća sinus stupnjeva (ne radijana).", "MATH_TRIG_TOOLTIP_COS": "Vraća kosinus stupnjeva (ne radijana).", "MATH_TRIG_TOOLTIP_TAN": "Vraća tangens stupnjeva (ne radijana).", @@ -143,10 +141,8 @@ "MATH_IS_NEGATIVE": "je negativan", "MATH_IS_DIVISIBLE_BY": "je djeljiv s", "MATH_IS_TOOLTIP": "Provjerava je li broj paran, neparan, prim, cijeli, pozitivan, negativan ili je djeljiv određenim brojem. Vraća istina ili laž.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "promijeni %1 za %2", "MATH_CHANGE_TOOLTIP": "Dodaj broj varijabli '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Zaokružuje broj na više ili manje", "MATH_ROUND_OPERATOR_ROUND": "zaokružiti", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokružiti na više", @@ -167,21 +163,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Vraća standardnu devijaciju liste.", "MATH_ONLIST_OPERATOR_RANDOM": "slučajno odabran član liste", "MATH_ONLIST_TOOLTIP_RANDOM": "Vraća slučajan član liste.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "ostatak pri dijeljenju %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Vraća ostatak pri dijeljenju dvaju brojeva.", "MATH_CONSTRAIN_TITLE": "ograniči %1 od %2 do %3", "MATH_CONSTRAIN_TOOLTIP": "Ograničava broj da bude unutar zadanih granica (uključivši rubne vrijednosti)", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "slučajan cijeli broj između %1 i %2", "MATH_RANDOM_INT_TOOLTIP": "Vraća slučajan cijeli broj između dviju zadanih vrijednosti, uključivši i rubne vrijednosti.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slučajan razlomak", "MATH_RANDOM_FLOAT_TOOLTIP": "Vraća slučajan razlomak vrijednosti između 0.0 (uključivo) i 1.0 (isključivo)", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 od X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Vraća vrijednost arkus tangensa točke (X, Y) u stupnjevima od -180 do 180", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Slovo, riječ ili linija teksta", "TEXT_JOIN_TITLE_CREATEWITH": "stvori tekst od", "TEXT_JOIN_TOOLTIP": "Stvara tekst povezivanjem bilo kojeg broja dijelova", @@ -289,7 +280,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "do # od kraja", "LISTS_GET_SUBLIST_END_LAST": "do zadnjeg", "LISTS_GET_SUBLIST_TOOLTIP": "Stvara kopiju odabranog dijela liste", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "Sortiraj %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortiraj kopiju liste", "LISTS_SORT_ORDER_ASCENDING": "uzlazno", @@ -319,9 +309,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Stvara funkciju s izlaznom vrijednošću", "PROCEDURES_ALLOW_STATEMENTS": "Dopustite izjave", "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozorenje: Ova funkcija ima varijable istog imena", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Pokrenite korisnički definiranu funkciju '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Pokrenite korisnički definiranu funkciju '%1' i upotrijebite njenu izlaznu vrijednost", "PROCEDURES_MUTATORCONTAINER_TITLE": "Ulazne varijable", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Dodajte, uklonite ili promijenite redoslijed ulaznih varijabli funkcije", diff --git a/msg/json/hrx.json b/msg/json/hrx.json index ef3e93e7904..3d700dd5974 100644 --- a/msg/json/hrx.json +++ b/msg/json/hrx.json @@ -272,9 +272,7 @@ "PROCEDURES_DEFRETURN_RETURN": "geb zurück", "PROCEDURES_DEFRETURN_TOOLTIP": "En Funktionsblock mit Rückgäbweart.", "PROCEDURES_DEF_DUPLICATE_WARNING": "Warnung: die Funktionsblock hot doppelt Parameter.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "Ruf en Funktionsblock ohne Rückgäweart uff.", - "PROCEDURES_CALLRETURN_HELPURL": "https://hrx.wikipedia.org/wiki/Prozedur_%28Programmierung%29", "PROCEDURES_CALLRETURN_TOOLTIP": "Ruf en Funktionsblock mit Rückgäbweart uff.", "PROCEDURES_MUTATORCONTAINER_TITLE": "Parameter", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Variable:", diff --git a/msg/json/hu.json b/msg/json/hu.json index c85fee543ff..0124e5fe571 100644 --- a/msg/json/hu.json +++ b/msg/json/hu.json @@ -299,7 +299,6 @@ "LISTS_GET_SUBLIST_END_LAST": "és az utolsó", "LISTS_GET_SUBLIST_TAIL": "elem között", "LISTS_GET_SUBLIST_TOOLTIP": "A lista adott részéről másolat.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 rendezés", "LISTS_SORT_TOOLTIP": "Egy lista egy másolatának rendezése.", "LISTS_SORT_ORDER_ASCENDING": "növekvő", @@ -324,7 +323,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "név", "PROCEDURES_BEFORE_PARAMS": "paraméterlistaː", "PROCEDURES_CALL_BEFORE_PARAMS": "paraméterlistaː", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Eljárás (nem ad vissza eredményt).", "PROCEDURES_DEFNORETURN_COMMENT": "Írj erről a funkcióról...", "PROCEDURES_DEFRETURN_RETURN": "eredménye", @@ -342,7 +340,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Függvénydefiníció kiemelése", "PROCEDURES_CREATE_DO": "„%1” létrehozása", "PROCEDURES_IFRETURN_TOOLTIP": "Ha az érték igaz, akkor visszatér a függvény értékével.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Figyelem: Ez a blokk csak függvénydefiníción belül használható.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Mondj valamit...", "WORKSPACE_ARIA_LABEL": "Blockly munkaterület", diff --git a/msg/json/hy.json b/msg/json/hy.json index e71fd0b6fed..1094bff2908 100644 --- a/msg/json/hy.json +++ b/msg/json/hy.json @@ -114,7 +114,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Վերադարձնում է երկու թվերի արտադրյալը", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Վերադարձնում է քանորդը", "MATH_ARITHMETIC_TOOLTIP_POWER": "Վերադարձնում է առաջին թիվի աստիճանը", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "Քառակուսի արմատ", "MATH_SINGLE_TOOLTIP_ROOT": "Վերադարձնում է թվի քառակուսի աստիճանը", "MATH_SINGLE_OP_ABSOLUTE": "բացարձակ", diff --git a/msg/json/ia.json b/msg/json/ia.json index 98ddab6124d..0921c912f3e 100644 --- a/msg/json/ia.json +++ b/msg/json/ia.json @@ -3,7 +3,8 @@ "authors": [ "Fanjiayi", "Karmwiki", - "McDutchie" + "McDutchie", + "Zauzolkov" ] }, "VARIABLES_DEFAULT_NAME": "cosa", @@ -107,6 +108,12 @@ "LOGIC_TERNARY_TOOLTIP": "Verificar le condition in 'test'. Si le condition es ver, retorna le valor de 'si ver'; si non, retorna le valor de 'si false'.", "MATH_NUMBER_HELPURL": "https://ia.wikipedia.org/wiki/Numero", "MATH_NUMBER_TOOLTIP": "Un numero.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://ia.wikipedia.org/wiki/Arithmetica", "MATH_ARITHMETIC_TOOLTIP_ADD": "Retornar le summa del duo numeros.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Retornar le differentia del duo numeros.", @@ -121,7 +128,7 @@ "MATH_SINGLE_TOOLTIP_NEG": "Retornar le negation de un numero.", "MATH_SINGLE_TOOLTIP_LN": "Retornar le logarithmo natural de un numero.", "MATH_SINGLE_TOOLTIP_LOG10": "Retornar le logarithmo in base 10 de un numero.", - "MATH_SINGLE_TOOLTIP_EXP": "Retornar e elevate al potentia de un numero.", + "MATH_SINGLE_TOOLTIP_EXP": "Retornar e elevate al potentia de un numero.", "MATH_SINGLE_TOOLTIP_POW10": "Retornar 10 elevate al potentia de un numero.", "MATH_TRIG_TOOLTIP_SIN": "Retornar le sino de un grado (non radiano).", "MATH_TRIG_TOOLTIP_COS": "Retornar le cosino de un grado (non radiano).", @@ -243,6 +250,7 @@ "LISTS_GET_INDEX_GET": "prender", "LISTS_GET_INDEX_GET_REMOVE": "prender e remover", "LISTS_GET_INDEX_REMOVE": "remover", + "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "№ ab fin", "LISTS_GET_INDEX_FIRST": "prime", "LISTS_GET_INDEX_LAST": "ultime", diff --git a/msg/json/id.json b/msg/json/id.json index 60cbc362609..23a93ab2dd1 100644 --- a/msg/json/id.json +++ b/msg/json/id.json @@ -48,23 +48,19 @@ "DELETE_VARIABLE_CONFIRMATION": "Hapus %1 yang digunakan pada variabel '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Tidak bisa menghapus variabel '%1' karena variabel ini bagian dari sebuah definisi dari fungsi '%2'", "DELETE_VARIABLE": "Hapus variabel '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Pilih warna dari daftar warna.", "COLOUR_RANDOM_TITLE": "Warna acak", "COLOUR_RANDOM_TOOLTIP": "Pilih warna secara acak.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "Dengan warna", "COLOUR_RGB_RED": "merah", "COLOUR_RGB_GREEN": "hijau", "COLOUR_RGB_BLUE": "biru", "COLOUR_RGB_TOOLTIP": "Buatlah warna dengan jumlah yang ditentukan dari merah, hijau dan biru. Semua nilai harus antarai 0 sampai 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "campur", "COLOUR_BLEND_COLOUR1": "warna 1", "COLOUR_BLEND_COLOUR2": "warna 2", "COLOUR_BLEND_RATIO": "rasio", "COLOUR_BLEND_TOOLTIP": "Campur dua warna secara bersamaan dengan perbandingan (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ulangi %1 kali", "CONTROLS_REPEAT_INPUT_DO": "kerjakan", "CONTROLS_REPEAT_TOOLTIP": "Lakukan beberapa perintah beberapa kali.", @@ -91,7 +87,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Tambahkan, hapus, atau susun kembali bagian untuk mengkonfigurasi blok IF ini.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Tambahkan prasyarat ke dalam blok IF.", "CONTROLS_IF_ELSE_TOOLTIP": "Terakhir, tambahkan kondisi tangkap-semua kedalam blok IF.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Kembalikan benar jika kedua input sama satu dengan lainnya.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Kembalikan benar jika kedua input tidak sama satu dengan lainnya.", "LOGIC_COMPARE_TOOLTIP_LT": "Kembalikan benar jika input pertama lebih kecil dari input kedua.", @@ -107,21 +102,13 @@ "LOGIC_BOOLEAN_TRUE": "benar", "LOGIC_BOOLEAN_FALSE": "salah", "LOGIC_BOOLEAN_TOOLTIP": "Kembalikan benar atau salah.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "null", "LOGIC_NULL_TOOLTIP": "Kembalikan null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "jika benar", "LOGIC_TERNARY_IF_FALSE": "jika salah", "LOGIC_TERNARY_TOOLTIP": "Periksa kondisi di 'test'. Jika kondisi benar, kembalikan nilai 'if true'; jika sebaliknya kembalikan nilai 'if false'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Suatu angka.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -134,7 +121,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Kembalikan perkalian dari kedua angka.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Kembalikan hasil bagi dari kedua angka.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Kembalikan angka pertama pangkat angka kedua.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "akar", "MATH_SINGLE_TOOLTIP_ROOT": "Kembalikan akar dari angka.", "MATH_SINGLE_OP_ABSOLUTE": "mutlak", @@ -144,14 +130,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Kembalikan dasar logaritma 10 dari angka.", "MATH_SINGLE_TOOLTIP_EXP": "Kembalikan 10 pangkat angka.", "MATH_SINGLE_TOOLTIP_POW10": "Kembalikan 10 pangkat angka.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Kembalikan sinus dari derajat (bukan radian).", "MATH_TRIG_TOOLTIP_COS": "Kembalikan cosinus dari derajat (bukan radian).", "MATH_TRIG_TOOLTIP_TAN": "Kembalikan tangen dari derajat (bukan radian).", "MATH_TRIG_TOOLTIP_ASIN": "Kembalikan asin dari angka.", "MATH_TRIG_TOOLTIP_ACOS": "Kembalikan acosine dari angka.", "MATH_TRIG_TOOLTIP_ATAN": "Kembalikan atan dari angka.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Kembalikan salah satu konstanta: π (3,141…), e (2,718…), φ (1,618…), akar(2) (1,414…), akar(½) (0.707…), atau ∞ (tak terhingga).", "MATH_IS_EVEN": "adalah bilangan genap", "MATH_IS_ODD": "adalah bilangan ganjil", @@ -161,10 +145,8 @@ "MATH_IS_NEGATIVE": "adalah bilangan negatif", "MATH_IS_DIVISIBLE_BY": "dapat dibagi oleh", "MATH_IS_TOOLTIP": "Periksa apakah angka adalah bilangan genap, bilangan ganjil, bilangan pokok, bilangan bulat, bilangan positif, bilangan negatif, atau apakan bisa dibagi oleh angka tertentu. Kembalikan benar atau salah.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "ubah %1 oleh %2", "MATH_CHANGE_TOOLTIP": "Tambahkan angka kedalam variabel '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Bulatkan suatu bilangan naik atau turun.", "MATH_ROUND_OPERATOR_ROUND": "membulatkan", "MATH_ROUND_OPERATOR_ROUNDUP": "membulatkan keatas", @@ -185,21 +167,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Kembalikan standard deviasi dari list.", "MATH_ONLIST_OPERATOR_RANDOM": "item acak dari list", "MATH_ONLIST_TOOLTIP_RANDOM": "Kembalikan elemen acak dari list.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "sisa dari %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Kembalikan sisa dari pembagian ke dua angka.", "MATH_CONSTRAIN_TITLE": "Batasi %1 rendah %2 tinggi %3", "MATH_CONSTRAIN_TOOLTIP": "Batasi angka antara batas yang ditentukan (inklusif).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "acak bulat dari %1 sampai %2", "MATH_RANDOM_INT_TOOLTIP": "Kembalikan bilangan acak antara dua batas yang ditentukan, inklusif.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nilai pecahan acak", "MATH_RANDOM_FLOAT_TOOLTIP": "Kembalikan nilai pecahan acak antara 0.0 (inklusif) dan 1.0 (eksklusif).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Kembalikan arctangen titik (X, Y) dalam derajat dari -180 hingga 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Huruf, kata atau baris teks.", "TEXT_JOIN_TITLE_CREATEWITH": "buat teks dengan", "TEXT_JOIN_TOOLTIP": "Buat teks dengan cara gabungkan sejumlah item.", @@ -251,7 +228,6 @@ "TEXT_REPLACE_TOOLTIP": "Ganti semua kemunculan teks dalam teks lain.", "TEXT_REVERSE_MESSAGE0": "balikkan %1", "TEXT_REVERSE_TOOLTIP": "Balikkan urutan huruf dalam teks.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "buat list kosong", "LISTS_CREATE_EMPTY_TOOLTIP": "Kembalikan list, dengan panjang 0, tidak berisi data", "LISTS_CREATE_WITH_TOOLTIP": "Buat sebuah list dengan sejumlah item.", @@ -309,7 +285,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", "LISTS_GET_SUBLIST_END_LAST": "ke yang paling akhir", "LISTS_GET_SUBLIST_TOOLTIP": "Buat salinan bagian tertentu dari list.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "urutkan %1 %2 %3", "LISTS_SORT_TOOLTIP": "Urutkan salinan dari daftar", "LISTS_SORT_ORDER_ASCENDING": "menaik", @@ -329,21 +304,17 @@ "VARIABLES_SET": "tetapkan %1 untuk %2", "VARIABLES_SET_TOOLTIP": "tetapkan variabel ini dengan input yang sama.", "VARIABLES_SET_CREATE_GET": "Buat 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "untuk", "PROCEDURES_DEFNORETURN_PROCEDURE": "buat sesuatu", "PROCEDURES_BEFORE_PARAMS": "dengan:", "PROCEDURES_CALL_BEFORE_PARAMS": "dengan:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Buat sebuah fungsi tanpa output.", "PROCEDURES_DEFNORETURN_COMMENT": "Jelaskan fungsi ini...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "kembali", "PROCEDURES_DEFRETURN_TOOLTIP": "Buat sebuah fungsi dengan satu output.", "PROCEDURES_ALLOW_STATEMENTS": "memungkinkan pernyataan", "PROCEDURES_DEF_DUPLICATE_WARNING": "Peringatan: Fungsi ini memiliki parameter duplikat.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Menjalankan fungsi '%1' yang ditetapkan pengguna dan menggunakan outputnya.", "PROCEDURES_MUTATORCONTAINER_TITLE": "input", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Menambah, menghapus, atau menyusun ulang masukan untuk fungsi ini.", diff --git a/msg/json/ig.json b/msg/json/ig.json index 93865baec45..229acf3eab0 100644 --- a/msg/json/ig.json +++ b/msg/json/ig.json @@ -2,10 +2,12 @@ "@metadata": { "authors": [ "Mapmeld", + "Timzy D'Great", "Ukabia" ] }, "VARIABLES_DEFAULT_NAME": "ihe", + "UNNAMED_KEY": "enweghị aha", "TODAY": "Taa", "DUPLICATE_BLOCK": "Ntụgharị", "ADD_COMMENT": "Tịnye okwu", @@ -40,7 +42,6 @@ "DELETE_VARIABLE_CONFIRMATION": "Kpochapụ %1 ojịjị nke agbanwe '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Agaghị ekpochapụlị agbanwe '%1' maka nsonye ya na nkọwa nke ọrụ ahụ '%2'", "DELETE_VARIABLE": "Kpochapụ agbanwe ‘%1' ahu", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Họrọ agba site na palette.", "COLOUR_RANDOM_TITLE": "agba ọbụla", "COLOUR_RANDOM_TOOLTIP": "Họrọ agba na-nke ọbụla.", @@ -54,7 +55,6 @@ "COLOUR_BLEND_COLOUR2": "agba 2", "COLOUR_BLEND_RATIO": "oke", "COLOUR_BLEND_TOOLTIP": "Na ngwakọta agba abụọ ọnụ na na oke enyere (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "meghachi ụgbọ %1", "CONTROLS_REPEAT_INPUT_DO": "mee", "CONTROLS_REPEAT_TOOLTIP": "Mee ụfọdụ okwu ọtụtụ ugboro.", @@ -81,7 +81,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Tinye, wepu, ma ọ bụ megharia ngalaba iji haziearịa nke a ma ọ bụrụ na ngọngọ.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Tinye ọnọdụ na ngọngọ ma ọ bụrụ.", "CONTROLS_IF_ELSE_TOOLTIP": "Tinye ngwucha, ọnọdụ jide-niile na ngọngọ ma ọ bụrụ.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye hatara onwe ha.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye aghataghị onwe ha.", "LOGIC_COMPARE_TOOLTIP_LT": "Weghachi ezịọkwụ ma ọ bụrụ na ntinye mbu dị obere karia ntinye nke abụọ.", @@ -103,15 +102,18 @@ "LOGIC_TERNARY_IF_TRUE": "ọ bụrụ na eziokwu", "LOGIC_TERNARY_IF_FALSE": "ọ bụrụ ụgha", "LOGIC_TERNARY_TOOLTIP": "Lelee ọnọdụ na 'ule'. Ọ bụrụ na ọnọdụ ahụ bụ eziokwu, weghachitere akara 'ọ bụrụ na eziokwu’; ma ọ bụghị ya weghachitere akara 'ọ bụrụ ụgha'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Ọnụọgụgụ.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_TRIG_SIN": "mmehie", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_TOOLTIP_ADD": "Weghachite ngụkọ ọnụ ọgụgụ abụọ ahụ.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Weghachite nwepụ ọnụ ọgụgụ abụọ ahụ.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Weghachite mụbaa ọnụ ọgụgụ abụọ ahụ.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Weghachite kwenye ọnụ ọgụgụ abụọ ahụ.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Weghachite nọmba mbu nke emeturu ike nke nọmba nke abụọ.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "Isi ngụkọ", "MATH_SINGLE_TOOLTIP_ROOT": "Weghachite Isi ngụkọ nke nọmba.", "MATH_SINGLE_OP_ABSOLUTE": "ozụzụ", @@ -121,14 +123,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Weghachite isi lọgarịdịm 10 nke nọmba.", "MATH_SINGLE_TOOLTIP_EXP": "Weghachite na ike nke nọmba.", "MATH_SINGLE_TOOLTIP_POW10": "Weghachite 10 na ike nke nọmba.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Weghachite saịn nke ogo (ọ bụghị redian).", "MATH_TRIG_TOOLTIP_COS": "Weghachite kosaịn nke ogo (ọ bụghị redian).", "MATH_TRIG_TOOLTIP_TAN": "Weghachite tanjentị nke ogo (ọ bụghị redian).", "MATH_TRIG_TOOLTIP_ASIN": "Weghachite aksaịn nke nọmba.", "MATH_TRIG_TOOLTIP_ACOS": "Weghachite akosaịn nke nọmba.", "MATH_TRIG_TOOLTIP_ATAN": "Weghachite aktanjentị nke nọmba.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Weghachite otu n'ime kọnstant ndị nkịtị: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", "MATH_IS_EVEN": "bụ ịvụn", "MATH_IS_ODD": "bụ ọd", @@ -138,10 +138,8 @@ "MATH_IS_NEGATIVE": "bụ negetịf", "MATH_IS_DIVISIBLE_BY": "ga ekenwụ", "MATH_IS_TOOLTIP": "Tụlee ma nọmba ọ bụ ịvụn, ọd, praim, zuru ezu, posịtịf, negetịf, ma e nwere nọmba ga ekenwu ya. Weghachitere eziokwu ma ọ bụ ụgha.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "gbanwee %1 site na %2", "MATH_CHANGE_TOOLTIP": "Tinye nọmba na agbanwe '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Gbaago nọmba n'elu ma ọ bụ ala.", "MATH_ROUND_OPERATOR_ROUND": "gbaarịa", "MATH_ROUND_OPERATOR_ROUNDUP": "gbaago elu", @@ -162,21 +160,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Weghachite ntughari usoro nke ndepụta.", "MATH_ONLIST_OPERATOR_RANDOM": "Ihe ọbụla nke ndepụta", "MATH_ONLIST_TOOLTIP_RANDOM": "Weghachite Ihe ọbụla site na ndepụta.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "ihe fọdụrụ nke %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Weghachite ihe fọdụrụ site na nkewa nọmba abụọ.", "MATH_CONSTRAIN_TITLE": "gbochịe %1 ala %2 elu %3", "MATH_CONSTRAIN_TOOLTIP": "Gbochịe ọnụọgụgụ dị n'etiti nọmba dị oke ala na nọmba dị oke elu (gụnyere).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "ọnụọgụgụ ọbụla site na %1 rụọ %2", "MATH_RANDOM_INT_TOOLTIP": "Weghachite ọnụọgụgụ ọbụla dị n'etiti ihe abụọ a kapịrị ọnụ, agụnyere.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nkewa ọbụla", "MATH_RANDOM_FLOAT_TOOLTIP": "Weghachite ọnụọgụgụ ọbụla dị n'etiti 0.0 (gụnyere) na 1.0 (agụnyeghị).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 nke X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Weghachite aktanjentị nke isi (X, Y) na ogo site na -180 rụọ 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Akwụkwọ ozi, okwu, ma ọ bụ akara ederede.", "TEXT_JOIN_TITLE_CREATEWITH": "mepụta ederede na", "TEXT_JOIN_TOOLTIP": "Mepụta otu ederede site na ijikọta ọnụ ọgụgụ ihe ọ bụla.", @@ -248,6 +241,7 @@ "LISTS_GET_INDEX_GET": "nweta", "LISTS_GET_INDEX_GET_REMOVE": "nweta ma wepu", "LISTS_GET_INDEX_REMOVE": "wepu", + "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "# site na njedebe", "LISTS_GET_INDEX_FIRST": "mbu", "LISTS_GET_INDEX_LAST": "ikpeazụ", @@ -284,7 +278,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "rụọ # site na njedebe", "LISTS_GET_SUBLIST_END_LAST": "rụọ na ngwụcha", "LISTS_GET_SUBLIST_TOOLTIP": "Na-emepụta otu akụkụ a kapịrị ọnụ nke ndepụta.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "hazie %1 %2 %3", "LISTS_SORT_TOOLTIP": "Tọọ otu akụkụ ndepụta ahụ.", "LISTS_SORT_ORDER_ASCENDING": "arịgo", @@ -314,9 +307,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Na emepụta ọrụ nwere mmepụta.", "PROCEDURES_ALLOW_STATEMENTS": "kwe ka okwu", "PROCEDURES_DEF_DUPLICATE_WARNING": "Ịdọ aka ná ntị: Ọrụ a nwere ọnụọgụ abụọ.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Gbaa ọrụ a kọwaa onye-ọrụ '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Gbaa ọrụ a kọwaa onye-ọrụ '%1' ma jiri mmepụta ya.", "PROCEDURES_MUTATORCONTAINER_TITLE": "ntinye", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tinye, wepu, ma ọ bụ tugharịa ntinye na ọrụ a.", diff --git a/msg/json/is.json b/msg/json/is.json index 2e420a69a5d..1bdf6e1e6f1 100644 --- a/msg/json/is.json +++ b/msg/json/is.json @@ -3,12 +3,14 @@ "authors": [ "Gaddi00", "Jonbg", + "LoveIceLang", "Sveinki", "Sveinn í Felli", "아라" ] }, "VARIABLES_DEFAULT_NAME": "atriði", + "UNNAMED_KEY": "ónefnt", "TODAY": "Í dag", "DUPLICATE_BLOCK": "Afrita", "ADD_COMMENT": "Skrifa skýringu", @@ -33,46 +35,45 @@ "RENAME_VARIABLE": "Endurnefna breytu...", "RENAME_VARIABLE_TITLE": "Endurnefna allar '%1' breyturnar:", "NEW_VARIABLE": "Búa til breytu...", + "NEW_STRING_VARIABLE": "Búa til strengjabreytu...", + "NEW_NUMBER_VARIABLE": "Búa til tölubreytu...", + "NEW_COLOUR_VARIABLE": "Búðu til litabreytu...", + "NEW_VARIABLE_TYPE_TITLE": "Ný breytutegund:", "NEW_VARIABLE_TITLE": "Heiti nýrrar breytu:", "VARIABLE_ALREADY_EXISTS": "Breyta með heitinu '%1' er þegar til staðar.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Breyta sem heitir „%1“ er þegar til fyrir aðra tegund: „%2“.", + "DELETE_VARIABLE_CONFIRMATION": "Eyða %1 notar breytuna „%2“?", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "Get ekki eytt breytunni '%1' vegna þess að hún er hluti af skilgreiningu fallsins '%2'", "DELETE_VARIABLE": "Eyða '%1' breytunni", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Velja lit úr litakorti.", "COLOUR_RANDOM_TITLE": "einhver litur", "COLOUR_RANDOM_TOOLTIP": "Velja einhvern lit af handahófi.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "litur", "COLOUR_RGB_RED": "rauður", "COLOUR_RGB_GREEN": "grænt", "COLOUR_RGB_BLUE": "blátt", "COLOUR_RGB_TOOLTIP": "Búa til lit úr tilteknu magni af rauðu, grænu og bláu. Allar tölurnar verða að vera á bilinu 0 til 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "blöndun", "COLOUR_BLEND_COLOUR1": "litur 1", "COLOUR_BLEND_COLOUR2": "litur 2", "COLOUR_BLEND_RATIO": "hlutfall", "COLOUR_BLEND_TOOLTIP": "Blandar tveimur litum í gefnu hlutfalli (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "endurtaka %1 sinnum", "CONTROLS_REPEAT_INPUT_DO": "gera", "CONTROLS_REPEAT_TOOLTIP": "Gera eitthvað aftur og aftur.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "endurtaka á meðan", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "endurtaka þar til", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Endurtaka eitthvað á meðan gildi er satt.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Endurtaka eitthvað á meðan gildi er ósatt.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Láta breytuna '%1' taka inn gildi frá fyrstu tölu til síðustu tölu, hlaupandi á tiltekna bilinu og gera tilteknu kubbana.", "CONTROLS_FOR_TITLE": "telja með %1 frá %2 til %3 um %4", "CONTROLS_FOREACH_TITLE": "fyrir hvert %1 í lista %2", "CONTROLS_FOREACH_TOOLTIP": "Fyrir hvert atriði í lista er breyta '%1' stillt á atriðið og skipanir gerðar.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "fara út úr lykkju", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fara beint í næstu umferð lykkjunnar", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Fara út úr umlykjandi lykkju.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Sleppa afganginum af lykkjunni og fara beint í næstu umferð hennar.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Aðvörun: Þennan kubb má aðeins nota innan lykkju.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Ef gildi er satt skal gera einhverjar skipanir.", "CONTROLS_IF_TOOLTIP_2": "Ef gildi er satt skal gera skipanir í fyrri kubbnum. Annars skal gera skipanir í seinni kubbnum.", "CONTROLS_IF_TOOLTIP_3": "Ef fyrra gildið er satt skal gera skipanir í fyrri kubbnum. Annars, ef seinna gildið er satt, þá skal gera skipanir í seinni kubbnum.", @@ -83,53 +84,39 @@ "CONTROLS_IF_IF_TOOLTIP": "Bæta við, fjarlægja eða umraða til að breyta skipan þessa EF kubbs.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Bæta skilyrði við EF kubbinn.", "CONTROLS_IF_ELSE_TOOLTIP": "Bæta við hluta EF kubbs sem grípur öll tilfelli sem uppfylla ekki hin skilyrðin.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Skila sönnu ef inntökin eru jöfn.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Skila sönnu ef inntökin eru ekki jöfn.", "LOGIC_COMPARE_TOOLTIP_LT": "Skila sönnu ef fyrra inntakið er minna en seinna inntakið.", "LOGIC_COMPARE_TOOLTIP_LTE": "Skila sönnu ef fyrra inntakið er minna en eða jafnt og seinna inntakið.", "LOGIC_COMPARE_TOOLTIP_GT": "Skila sönnu ef fyrra inntakið er stærra en seinna inntakið.", "LOGIC_COMPARE_TOOLTIP_GTE": "Skila sönnu ef fyrra inntakið er stærra en eða jafnt og seinna inntakið.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Skila sönnu ef bæði inntökin eru sönn.", "LOGIC_OPERATION_AND": "og", "LOGIC_OPERATION_TOOLTIP_OR": "Skila sönnu ef að minnsta kosti eitt inntak er satt.", "LOGIC_OPERATION_OR": "eða", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "ekki %1", "LOGIC_NEGATE_TOOLTIP": "Skilar sönnu ef inntakið er ósatt. Skilar ósönnu ef inntakið er satt.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", "LOGIC_BOOLEAN_TRUE": "satt", "LOGIC_BOOLEAN_FALSE": "ósatt", "LOGIC_BOOLEAN_TOOLTIP": "Skilar annað hvort sönnu eða ósönnu.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "tómagildi", "LOGIC_NULL_TOOLTIP": "Skilar tómagildi.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "prófun", "LOGIC_TERNARY_IF_TRUE": "ef satt", "LOGIC_TERNARY_IF_FALSE": "ef ósatt", "LOGIC_TERNARY_TOOLTIP": "Kanna skilyrðið í 'prófun'. Skilar 'ef satt' gildinu ef skilyrðið er satt, en skilar annars 'ef ósatt' gildinu.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Tala.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", "MATH_TRIG_ASIN": "asin", "MATH_TRIG_ACOS": "acos", "MATH_TRIG_ATAN": "atan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Skila summu talnanna tveggja.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Skila mismun talnanna.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Skila margfeldi talnanna.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Skila deilingu talnanna.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Skila fyrri tölunni í veldinu seinni talan.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "kvaðratrót", "MATH_SINGLE_TOOLTIP_ROOT": "Skila kvaðratrót tölu.", "MATH_SINGLE_OP_ABSOLUTE": "algildi", @@ -139,14 +126,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Skila tugalógaritma tölu.", "MATH_SINGLE_TOOLTIP_EXP": "Skila e í veldi tölu.", "MATH_SINGLE_TOOLTIP_POW10": "Skila 10 í veldi tölu.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Skila sínusi horns gefnu í gráðum.", "MATH_TRIG_TOOLTIP_COS": "Skila kósínusi horns gefnu í gráðum.", "MATH_TRIG_TOOLTIP_TAN": "Skila tangensi horns gefnu í gráðum.", "MATH_TRIG_TOOLTIP_ASIN": "Skila arkarsínusi tölu.", "MATH_TRIG_TOOLTIP_ACOS": "Skila arkarkósínusi tölu.", "MATH_TRIG_TOOLTIP_ATAN": "Skila arkartangensi tölu.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Skila algengum fasta: π (3.141…), e (2.718…), φ (1.618…), kvrót(2) (1.414…), kvrót(½) (0.707…) eða ∞ (óendanleika).", "MATH_IS_EVEN": "er\\u00A0jöfn tala", "MATH_IS_ODD": "er oddatala", @@ -156,10 +141,8 @@ "MATH_IS_NEGATIVE": "er neikvæð", "MATH_IS_DIVISIBLE_BY": "er\\u00A0deilanleg með", "MATH_IS_TOOLTIP": "Kanna hvort tala sé jöfn tala, oddatala, jákvæð, neikvæð eða deilanleg með tiltekinni tölu. Skilar sönnu eða ósönnu.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "breyta %1 um %2", "MATH_CHANGE_TOOLTIP": "Bæta tölu við breytu '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Námunda tölu upp eða niður.", "MATH_ROUND_OPERATOR_ROUND": "námunda", "MATH_ROUND_OPERATOR_ROUNDUP": "námunda upp", @@ -180,40 +163,31 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Skila staðalfráviki lista.", "MATH_ONLIST_OPERATOR_RANDOM": "eitthvað úr lista", "MATH_ONLIST_TOOLTIP_RANDOM": "Skila einhverju atriði úr listanum.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "afgangur af %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Skila afgangi deilingar með tölunum.", "MATH_CONSTRAIN_TITLE": "þröngva %1 lægst %2 hæst %3", "MATH_CONSTRAIN_TOOLTIP": "Þröngva tölu til að vera innan hinna tilgreindu marka (að báðum meðtöldum).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "slembitala frá %1 til %2", "MATH_RANDOM_INT_TOOLTIP": "Skila heiltölu sem valin er af handahófi og er innan tilgreindra marka, að báðum meðtöldum.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slembibrot", "MATH_RANDOM_FLOAT_TOOLTIP": "Skila broti sem er valið af handahófi úr tölum á bilinu frá og með 0.0 til (en ekki með) 1.0.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", + "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2 (EN)", "TEXT_TEXT_TOOLTIP": "Stafur, orð eða textalína.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "búa til texta með", "TEXT_JOIN_TOOLTIP": "Búa til texta með því að tengja saman einhvern fjölda atriða.", "TEXT_CREATE_JOIN_TITLE_JOIN": "tengja", "TEXT_CREATE_JOIN_TOOLTIP": "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa textakubbs.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Bæta atriði við textann.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "við %1 bæta texta %2", "TEXT_APPEND_TOOLTIP": "Bæta texta við breytuna '%1'.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "lengd %1", "TEXT_LENGTH_TOOLTIP": "Skilar fjölda stafa (með bilum) í gefna textanum.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1 er tómur", "TEXT_ISEMPTY_TOOLTIP": "Skilar sönnu ef gefni textinn er tómur.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "Finnur fyrsta/síðasta tilfelli fyrri textans í seinni textanum og skilar sæti hans. Skilar %1 ef textinn finnst ekki.", "TEXT_INDEXOF_TITLE": "í texta %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "finna fyrsta tilfelli texta", "TEXT_INDEXOF_OPERATOR_LAST": "finna síðasta tilfelli texta", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "í texta %1 %2", "TEXT_CHARAT_FROM_START": "sækja staf #", "TEXT_CHARAT_FROM_END": "sækja staf # frá enda", @@ -222,7 +196,6 @@ "TEXT_CHARAT_RANDOM": "sækja einhvern staf", "TEXT_CHARAT_TOOLTIP": "Skila staf á tilteknum stað.", "TEXT_GET_SUBSTRING_TOOLTIP": "Skilar tilteknum hluta textans.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "í texta", "TEXT_GET_SUBSTRING_START_FROM_START": "sækja textabút frá staf #", "TEXT_GET_SUBSTRING_START_FROM_END": "sækja textabút frá staf # frá enda", @@ -230,20 +203,16 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "að staf #", "TEXT_GET_SUBSTRING_END_FROM_END": "að staf # frá enda", "TEXT_GET_SUBSTRING_END_LAST": "að síðasta staf", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "Skila afriti af textanum með annarri stafastöðu.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "í HÁSTAFI", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "í lágstafi", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "í Upphafstafi", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "Skila afriti af textanum þar sem möguleg bil við báða enda hafa verið fjarlægð.", "TEXT_TRIM_OPERATOR_BOTH": "eyða bilum báðum megin við", "TEXT_TRIM_OPERATOR_LEFT": "eyða bilum vinstra megin við", "TEXT_TRIM_OPERATOR_RIGHT": "eyða bilum hægra megin við", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "prenta %1", "TEXT_PRINT_TOOLTIP": "Prenta tiltekinn texta, tölu eða annað gildi.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "biðja um texta með skilaboðum", "TEXT_PROMPT_TYPE_NUMBER": "biðja um tölu með skilaboðum", "TEXT_PROMPT_TOOLTIP_NUMBER": "Biðja notandann um tölu.", @@ -252,7 +221,6 @@ "TEXT_REPLACE_MESSAGE0": "skipta %1 út með %2 í %3", "TEXT_REVERSE_MESSAGE0": "snúa við %1", "TEXT_REVERSE_TOOLTIP": "Snýr við röð stafanna í textanum.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "búa til tóman lista", "LISTS_CREATE_EMPTY_TOOLTIP": "Skilar lista með lengdina 0 án gagna", "LISTS_CREATE_WITH_TOOLTIP": "Búa til lista með einhverjum fjölda atriða.", @@ -260,16 +228,13 @@ "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listi", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Bæta við, fjarlægja eða umraða hlutum til að breyta skipan þessa listakubbs.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Bæta atriði við listann.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "Býr til lista sem inniheldur tiltekna gildið endurtekið tiltekið oft.", "LISTS_REPEAT_TITLE": "búa til lista með atriði %1 endurtekið %2 sinnum", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "lengd %1", "LISTS_LENGTH_TOOLTIP": "Skilar lengd lista.", "LISTS_ISEMPTY_TITLE": "%1 er tómur", "LISTS_ISEMPTY_TOOLTIP": "Skilar sönnu ef listinn er tómur.", "LISTS_INLIST": "í lista", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "finna fyrsta tilfelli atriðis", "LISTS_INDEX_OF_LAST": "finna síðasta tilfelli atriðis", "LISTS_INDEX_OF_TOOLTIP": "Finnur hvar atriðið kemur fyrir fyrst/síðast í listanum og skilar sæti þess. Skilar %1 ef atriðið finnst ekki.", @@ -295,7 +260,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Fjarlægir fyrsta atriðið í lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Fjarlægir síðasta atriðið í lista.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Fjarlægir eitthvert atriði úr lista.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "setja í", "LISTS_SET_INDEX_INSERT": "bæta við", "LISTS_SET_INDEX_INPUT_TO": "sem", @@ -307,7 +271,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Bætir atriðinu fremst í listann.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Bætir atriðinu aftan við listann.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Bætir atriðinu einhversstaðar við listann.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "sækja undirlista frá #", "LISTS_GET_SUBLIST_START_FROM_END": "sækja undirlista frá # frá enda", "LISTS_GET_SUBLIST_START_FIRST": "sækja undirlista frá fyrsta", @@ -315,7 +278,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "til # frá enda", "LISTS_GET_SUBLIST_END_LAST": "til síðasta", "LISTS_GET_SUBLIST_TOOLTIP": "Býr til afrit af tilteknum hluta lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "raða %1 %2 %3", "LISTS_SORT_TOOLTIP": "Raða afriti lista.", "LISTS_SORT_ORDER_ASCENDING": "hækkandi", @@ -330,28 +292,22 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Sameinar lista af textum í einn texta, með skiltákn á milli.", "LISTS_REVERSE_MESSAGE0": "snúa við %1", "LISTS_REVERSE_TOOLTIP": "Snúa við afriti lista.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Skilar gildi þessarar breytu.", "VARIABLES_GET_CREATE_SET": "Búa til 'stilla %1'", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "stilla %1 á %2", "VARIABLES_SET_TOOLTIP": "Stillir þessa breytu á innihald inntaksins.", "VARIABLES_SET_CREATE_GET": "Búa til 'sækja %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "til að", "PROCEDURES_DEFNORETURN_PROCEDURE": "gera eitthvað", "PROCEDURES_BEFORE_PARAMS": "með:", "PROCEDURES_CALL_BEFORE_PARAMS": "með:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Býr til fall sem skilar engu.", "PROCEDURES_DEFNORETURN_COMMENT": "Lýstu þessari aðgerð/falli...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "skila", "PROCEDURES_DEFRETURN_TOOLTIP": "Býr til fall sem skilar úttaki.", "PROCEDURES_ALLOW_STATEMENTS": "leyfa setningar", "PROCEDURES_DEF_DUPLICATE_WARNING": "Aðvörun: Þetta fall er með tvítekna stika.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Keyra heimatilbúna fallið '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Keyra heimatilbúna fallið '%1' og nota úttak þess.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inntök", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Bæta við, fjarlægja eða umraða inntökum fyrir þetta fall.", @@ -360,7 +316,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Sýna skilgreiningu falls", "PROCEDURES_CREATE_DO": "Búa til '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Ef gildi er satt, skal skila öðru gildi.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Aðvörun: Þennan kubb má aðeins nota í skilgreiningu falls.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Segðu eitthvað...", "DIALOG_OK": "Í lagi", diff --git a/msg/json/it.json b/msg/json/it.json index 1347a45be83..3c066a1804f 100644 --- a/msg/json/it.json +++ b/msg/json/it.json @@ -236,10 +236,8 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Richiedi un numero all'utente.", "TEXT_PROMPT_TOOLTIP_TEXT": "Richiede del testo da parte dell'utente.", "TEXT_COUNT_MESSAGE0": "conta %1 in %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Contare quante volte una parte di testo si ripete all'interno di qualche altro testo.", "TEXT_REPLACE_MESSAGE0": "sostituisci %1 con %2 in %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "sostituisci tutte le occorrenze di un certo testo con qualche altro testo.", "TEXT_REVERSE_MESSAGE0": "inverti %1", "TEXT_REVERSE_TOOLTIP": "Inverte l'ordine dei caratteri nel testo.", @@ -299,7 +297,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "da # dalla fine", "LISTS_GET_SUBLIST_END_LAST": "dagli ultimi", "LISTS_GET_SUBLIST_TOOLTIP": "Crea una copia della porzione specificata di una lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordinamento %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordina una copia di un elenco.", "LISTS_SORT_ORDER_ASCENDING": "crescente", @@ -340,7 +337,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Evidenzia definizione di funzione", "PROCEDURES_CREATE_DO": "Crea '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Se un valore è vero allora restituisce un secondo valore.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Attenzioneː Questo blocco può essere usato solo all'interno di una definizione di funzione.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Scrivi qualcosa...", "WORKSPACE_ARIA_LABEL": "Area di lavoro di Blockly", diff --git a/msg/json/ja.json b/msg/json/ja.json index eb5737d6021..c57368ac8e6 100644 --- a/msg/json/ja.json +++ b/msg/json/ja.json @@ -61,13 +61,11 @@ "COLOUR_PICKER_TOOLTIP": "パレットから色を選んでください。", "COLOUR_RANDOM_TITLE": "ランダムな色", "COLOUR_RANDOM_TOOLTIP": "ランダムに色を選ぶ。", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "色:", "COLOUR_RGB_RED": "赤", "COLOUR_RGB_GREEN": "緑", "COLOUR_RGB_BLUE": "青", "COLOUR_RGB_TOOLTIP": "赤、緑、および青の指定された量で色を作成します。すべての値は 0 ~ 100 の間でなければなりません。", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "ブレンド", "COLOUR_BLEND_COLOUR1": "色 1", "COLOUR_BLEND_COLOUR2": "色 2", @@ -77,24 +75,19 @@ "CONTROLS_REPEAT_TITLE": "%1 回繰り返す", "CONTROLS_REPEAT_INPUT_DO": "実行", "CONTROLS_REPEAT_TOOLTIP": "いくつかのステートメントを数回実行します。", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "繰り返す:続ける条件", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "繰り返す:終わる条件", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "値がtrueの間、いくつかのステートメントを実行する。", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "値がfalseの間、いくつかのステートメントを実行する。", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "変数 '%1' が開始番号から終了番号まで指定した間隔での値をとって、指定したブロックを実行する。", "CONTROLS_FOR_TITLE": "%1 を %2 から %3 まで %4 ずつカウントする", - "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", "CONTROLS_FOREACH_TITLE": "リスト%2の各項目%1について", "CONTROLS_FOREACH_TOOLTIP": "リストの各項目について、その項目を変数'%1'として、いくつかのステートメントを実行します。", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ループから抜け出す", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ループの次の反復処理を続行します", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "入っているループから抜け出します。", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "このループの残りの部分をスキップして、ループの繰り返しを続けます。", "CONTROLS_FLOW_STATEMENTS_WARNING": "注意: このブロックは、ループ内でのみ使用できます。", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "値が true の場合、ステートメントを実行します。", "CONTROLS_IF_TOOLTIP_2": "値が true の場合は、最初のステートメントのブロックを実行します。それ以外の場合は、2番目のステートメントのブロックを実行します。", "CONTROLS_IF_TOOLTIP_3": "最初の値が true の場合は、最初のステートメントのブロックを実行します。それ以外の場合で、2番目の値が true の場合は、2番目のステートメントのブロックを実行します。", @@ -112,19 +105,15 @@ "LOGIC_COMPARE_TOOLTIP_LTE": "最初の入力が 2 番目の入力以下の場合に true を返します。", "LOGIC_COMPARE_TOOLTIP_GT": "最初の入力が 2 番目の入力よりも大きい場合は true を返します。", "LOGIC_COMPARE_TOOLTIP_GTE": "最初の入力が 2 番目の入力以上の場合に true を返します。", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "両方の入力が true のときに true を返します。", "LOGIC_OPERATION_AND": "かつ", "LOGIC_OPERATION_TOOLTIP_OR": "少なくとも 1 つの入力が true のときに true を返します。", "LOGIC_OPERATION_OR": "または", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "%1ではない", "LOGIC_NEGATE_TOOLTIP": "入力が false の場合は、true を返します。入力が true の場合は false を返します。", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", "LOGIC_BOOLEAN_TRUE": "true", "LOGIC_BOOLEAN_FALSE": "false", "LOGIC_BOOLEAN_TOOLTIP": "true または false を返します。", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "null", "LOGIC_NULL_TOOLTIP": "null を返します。", "LOGIC_TERNARY_HELPURL": "https://ja.wikipedia.org/wiki/%3F:", @@ -134,11 +123,6 @@ "LOGIC_TERNARY_TOOLTIP": "'テスト' の条件をチェックします。条件が true の場合、'true' の値を返します。それ以外の場合 'false' のを返します。", "MATH_NUMBER_HELPURL": "https://ja.wikipedia.org/wiki/数", "MATH_NUMBER_TOOLTIP": "数です。", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -205,7 +189,6 @@ "MATH_MODULO_HELPURL": "https://ja.wikipedia.org/wiki/剰余演算", "MATH_MODULO_TITLE": "%1÷%2の余り", "MATH_MODULO_TOOLTIP": "2つの数値の割り算の余りを返す。", - "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_(graphics)", "MATH_CONSTRAIN_TITLE": "%1 を %2 以上 %3 以下の範囲に制限", "MATH_CONSTRAIN_TOOLTIP": "指定した上限と下限の間に値を制限する(上限と下限の値を含む)。", "MATH_RANDOM_INT_HELPURL": "https://ja.wikipedia.org/wiki/疑似乱数", @@ -219,37 +202,29 @@ "MATH_ATAN2_TOOLTIP": "アークタンジェントを用いて、点 (X, Y) の角度を -180度から 180度で返します。", "TEXT_TEXT_HELPURL": "https://ja.wikipedia.org/wiki/文字列", "TEXT_TEXT_TOOLTIP": "文字、単語、または行のテキスト。", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", - "TEXT_JOIN_TITLE_CREATEWITH": "テキストの作成:", + "TEXT_JOIN_TITLE_CREATEWITH": "テキストを結合して作成:", "TEXT_JOIN_TOOLTIP": "任意の数の項目一部を一緒に接合してテキストを作成。", "TEXT_CREATE_JOIN_TITLE_JOIN": "結合", "TEXT_CREATE_JOIN_TOOLTIP": "セクションを追加、削除、または順序変更して、ブロックを再構成。", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "テキストへ項目を追加。", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "項目 %1 へテキストを追加 %2", "TEXT_APPEND_TOOLTIP": "変数 '%1' にテキストを追加。", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "%1の長さ", "TEXT_LENGTH_TOOLTIP": "与えられたテキストの(スペースを含む)文字数を返す。", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1が空", "TEXT_ISEMPTY_TOOLTIP": "与えられたテキストが空の場合は true を返す。", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "二番目のテキストの中で一番目のテキストが最初/最後に出現したインデックスを返す。テキストが見つからない場合は%1を返す。", "TEXT_INDEXOF_TITLE": "テキスト %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "で以下のテキストの最初の出現箇所を検索:", "TEXT_INDEXOF_OPERATOR_LAST": "で以下のテキストの最後の出現箇所を検索:", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "テキスト %1 %2", "TEXT_CHARAT_FROM_START": "の、以下の数字番目の文字:", "TEXT_CHARAT_FROM_END": "の、後ろから以下の数字番目の文字:", "TEXT_CHARAT_FIRST": "最初の文字を得る", "TEXT_CHARAT_LAST": "最後の文字を得る", "TEXT_CHARAT_RANDOM": "ランダムな文字を得る", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "指定された位置に文字を返します。", "TEXT_GET_SUBSTRING_TOOLTIP": "テキストの指定部分を返します。", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "テキスト", "TEXT_GET_SUBSTRING_START_FROM_START": "の部分文字列を取得;開始位置:", "TEXT_GET_SUBSTRING_START_FROM_END": "の部分文字列を取得;開始位置:後ろから", @@ -257,54 +232,40 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "終了位置:", "TEXT_GET_SUBSTRING_END_FROM_END": "終了位置:後ろから", "TEXT_GET_SUBSTRING_END_LAST": "最後の文字", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "別のケースに、テキストのコピーを返します。", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "大文字に", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "小文字に", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "タイトル ケースに", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "スペースを 1 つまたは両方の端から削除したのち、テキストのコピーを返します。", "TEXT_TRIM_OPERATOR_BOTH": "両端のスペースを取り除く", "TEXT_TRIM_OPERATOR_LEFT": "左端のスペースを取り除く", "TEXT_TRIM_OPERATOR_RIGHT": "右端のスペースを取り除く", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "%1 を表示", "TEXT_PRINT_TOOLTIP": "指定したテキスト、番号または他の値を印刷します。", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "メッセージでテキスト入力を求める", "TEXT_PROMPT_TYPE_NUMBER": "メッセージで番号の入力を求める", "TEXT_PROMPT_TOOLTIP_NUMBER": "ユーザーに数値のインプットを求める。", "TEXT_PROMPT_TOOLTIP_TEXT": "ユーザーにテキスト入力を求める。", "TEXT_COUNT_MESSAGE0": "%2に含まれる%1の数を数える", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "とある文が別の文のなかに使われた回数を数える。", "TEXT_REPLACE_MESSAGE0": "%3に含まれる%1を%2に置換", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "文に含まれるキーワードを置換する。", "TEXT_REVERSE_MESSAGE0": "%1を逆順に", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "文の文字を逆順にする。", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "空のリストを作成", "LISTS_CREATE_EMPTY_TOOLTIP": "長さ0でデータ・レコードを含まない空のリストを返す", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "項目数が不定のリストを作成。", "LISTS_CREATE_WITH_INPUT_WITH": "以下を使ってリストを作成:", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "リスト", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "追加、削除、またはセクションの順序変更をして、このリスト・ブロックを再構成する。", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "リストに項目を追加。", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "与えられた値を指定された回数繰り返してリストを作成。", "LISTS_REPEAT_TITLE": "項目%1を%2回繰り返したリストを作成", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "%1の長さ", "LISTS_LENGTH_TOOLTIP": "リストの長さを返します。", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1が空", "LISTS_ISEMPTY_TOOLTIP": "リストが空の場合は、true を返します。", "LISTS_INLIST": "リスト", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "で以下のアイテムの最初の出現箇所を検索:", "LISTS_INDEX_OF_LAST": "で以下のテキストの最後の出現箇所を検索:", "LISTS_INDEX_OF_TOOLTIP": "リスト項目の最初/最後に出現するインデックス位置を返します。項目が見つからない場合は %1 を返します。", @@ -316,7 +277,6 @@ "LISTS_GET_INDEX_FIRST": "最初", "LISTS_GET_INDEX_LAST": "最後", "LISTS_GET_INDEX_RANDOM": "ランダム", - "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 は、最初の項目です。", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 は、最後の項目です。", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "リスト内の指定位置にある項目を返します。", @@ -331,7 +291,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "リスト内の最初の項目を削除します。", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "リスト内の最後の項目を削除します。", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "リスト内にあるアイテムをランダムに削除します。", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "セット", "LISTS_SET_INDEX_INSERT": "挿入位置:", "LISTS_SET_INDEX_INPUT_TO": "値:", @@ -343,16 +302,13 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "リストの先頭に項目を挿入します。", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "リストの末尾に項目を追加します。", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "リストに項目をランダムに挿入します。", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "# からサブディレクトリのリストを取得します。", "LISTS_GET_SUBLIST_START_FROM_END": "端から #のサブリストを取得します。", "LISTS_GET_SUBLIST_START_FIRST": "最初からサブリストを取得する。", "LISTS_GET_SUBLIST_END_FROM_START": "終了位置:", "LISTS_GET_SUBLIST_END_FROM_END": "終了位置:後ろから", "LISTS_GET_SUBLIST_END_LAST": "最後まで", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "リストの指定された部分のコピーを作成します。", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 ( %2 ) に %3 を並び替える", "LISTS_SORT_TOOLTIP": "リストのコピーを並べ替え", "LISTS_SORT_ORDER_ASCENDING": "昇順", @@ -360,31 +316,24 @@ "LISTS_SORT_TYPE_NUMERIC": "数値順", "LISTS_SORT_TYPE_TEXT": "アルファベット順", "LISTS_SORT_TYPE_IGNORECASE": "アルファベット順(大文字・小文字の区別無し)", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "テキストからリストを作る", "LISTS_SPLIT_TEXT_FROM_LIST": "リストからテキストを作る", "LISTS_SPLIT_WITH_DELIMITER": "区切り記号", "LISTS_SPLIT_TOOLTIP_SPLIT": "テキストを区切り記号で分割したリストにする", "LISTS_SPLIT_TOOLTIP_JOIN": "テキストのリストを区切り記号で区切られた一つのテキストにする", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "%1を逆順に", "LISTS_REVERSE_TOOLTIP": "リストのコピーを逆順にする。", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "この変数の値を返します。", "VARIABLES_GET_CREATE_SET": "'セット%1を作成します。", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "%1 に %2 をセット", "VARIABLES_SET_TOOLTIP": "この入力を変数と等しくなるように設定します。", "VARIABLES_SET_CREATE_GET": "'%1 を取得' を作成します。", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFNORETURN_TITLE": "関数", "PROCEDURES_DEFNORETURN_PROCEDURE": "何かする", "PROCEDURES_BEFORE_PARAMS": "引数:", "PROCEDURES_CALL_BEFORE_PARAMS": "引数:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "出力なしの関数を作成します。", "PROCEDURES_DEFNORETURN_COMMENT": "この関数の説明…", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFRETURN_RETURN": "返す", "PROCEDURES_DEFRETURN_TOOLTIP": "一つの出力を持つ関数を作成します。", "PROCEDURES_ALLOW_STATEMENTS": "ステートメントを許可", @@ -400,7 +349,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "関数の内容を強調表示します。", "PROCEDURES_CREATE_DO": "'%1' を作成", "PROCEDURES_IFRETURN_TOOLTIP": "1番目の値が true の場合、2番目の値を返します。", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "警告: このブロックは、関数定義内でのみ使用できます。", "WORKSPACE_COMMENT_DEFAULT_TEXT": "ここへ入力", "WORKSPACE_ARIA_LABEL": "Blocklyワークスペース", diff --git a/msg/json/ka.json b/msg/json/ka.json index 66847e0b218..761db73c9ab 100644 --- a/msg/json/ka.json +++ b/msg/json/ka.json @@ -2,9 +2,12 @@ "@metadata": { "authors": [ "Otogi", + "StarrySky", "Გიო ოქრო" ] }, + "TODAY": "დღეს", + "DUPLICATE_BLOCK": "დუბლიკატი", "ENABLE_BLOCK": "ბლოკის ჩართვა", "MATH_ONLIST_OPERATOR_SUM": "სიის ჯამი", "DIALOG_OK": "კარგი" diff --git a/msg/json/kab.json b/msg/json/kab.json index 1f9485f58b5..88a531070fc 100644 --- a/msg/json/kab.json +++ b/msg/json/kab.json @@ -59,7 +59,6 @@ "COLOUR_BLEND_COLOUR2": "ini 2", "COLOUR_BLEND_RATIO": "afmiḍi", "COLOUR_BLEND_TOOLTIP": "Sexleḍ sin n yiniten d tesmekta (gar 0.0 ar 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "Ales %1 n tikkal", "CONTROLS_REPEAT_INPUT_DO": "eg", "CONTROLS_REPEAT_TOOLTIP": "Selkem ddeqs n tinaḍin ddeqs n tikal.", @@ -86,7 +85,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Rnu, kkes, neq ales asmizzwer n tgezmiyin akken ad talseḍ tawila n yiḥder-a ma.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Rnu tawtilt i yiḥder ma.", "CONTROLS_IF_ELSE_TOOLTIP": "Rnu tawtilt taneggarut i yiḥder ma igebren akk tinaḍin.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Ad yerr idetti ma yella i sin n yinekcam d imegduya.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Ad d-yerr idetti mayella i sin n yinekcam mačči d imegduya.", "LOGIC_COMPARE_TOOLTIP_LT": "Ad d-yerr idetti ma anekcam amezwaru meẓẓiy ɣef wis sin.", @@ -108,15 +106,12 @@ "LOGIC_TERNARY_IF_TRUE": "ma d idetti", "LOGIC_TERNARY_IF_FALSE": "ma d ucciḍ", "LOGIC_TERNARY_TOOLTIP": "Senqed tawtilt deg 'sekyed'. Ma d idetti, ad d-yerr azal 'ma idetti', ma ulac ad d-yerr azam 'ma ucciḍ'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Amḍan.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Ad d-yerr tmerni n sin n yimiḍanen.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ad d-yerr tmernit n sin n yimiḍanen.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Ad d-yerr tukksa gar sin n yimiḍanen.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Ad d-yerr aful n sin n yimḍanen.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Ad d-yerr amḍan amezwaru uzmir wis sin.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "aẓar uzmir 2", "MATH_SINGLE_TOOLTIP_ROOT": "Ad d-yerr aẓar uzmir sin n umḍan.", "MATH_SINGLE_OP_ABSOLUTE": "azal amagdez", @@ -126,14 +121,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Ad d-yerr alugaritm 10 n umiḍan.", "MATH_SINGLE_TOOLTIP_EXP": "Ad d-yerr e uzmir amiḍan.", "MATH_SINGLE_TOOLTIP_POW10": "Ad d-yerr 10 uzmir amiḍan.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Ad d-yerr asinus n teɣmert s tfesna (mačči aṛadyan).", "MATH_TRIG_TOOLTIP_COS": "Ad d-yerr akusinus n teɣmert s tfesna (mačči aṛadyan).", "MATH_TRIG_TOOLTIP_TAN": "Ad d-yerr taslayt n teɣmert s tfesna (mačči aṛadyan).", "MATH_TRIG_TOOLTIP_ASIN": "Ad d-yerr taganzi n usinus n umḍan.", "MATH_TRIG_TOOLTIP_ACOS": "Ad d-yerr taganzi n ukusinus n umḍan.", "MATH_TRIG_TOOLTIP_ATAN": "Ad d-yerr taganzi n teslayt n umiḍan.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Ad d-yerr yiwet seg tmezgiyin yettwasnen : π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), neɣ ∞ (ifeḍ).", "MATH_IS_EVEN": "d ayugan", "MATH_IS_ODD": "d aryugan", @@ -143,10 +136,8 @@ "MATH_IS_NEGATIVE": "d uzdir", "MATH_IS_DIVISIBLE_BY": "d ubṭay ɣef", "MATH_IS_TOOLTIP": "Senqed ma amḍan d ayugan, d aryugan, d amenzu, d ummid, d ufrar, d uzdir, neɣ d ubṭay ɣef kra n umḍan. Ad d-yerr idetti neɣ ucciḍ.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "snifel %1 s %2", "MATH_CHANGE_TOOLTIP": "Rnu amḍan i umutti '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Saẓ amiḍan d asawen neɣ d akesser.", "MATH_ROUND_OPERATOR_ROUND": "Saẓ", "MATH_ROUND_OPERATOR_ROUNDUP": "Saẓ d asawen", @@ -167,21 +158,17 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Ad d-yerr azza n tebdart.", "MATH_ONLIST_OPERATOR_RANDOM": "aferdis agacuran n tebdart", "MATH_ONLIST_TOOLTIP_RANDOM": "Ad d-yerr aferdis seg tebdart s wudem agacuran.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "tasagert n %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Ad d-yerr tasagert n beṭṭu n sin n yimḍanen.", "MATH_CONSTRAIN_TITLE": "Err tamara i %1 gar %2 akked %3", "MATH_CONSTRAIN_TOOLTIP": "Err tamara n umḍan akken ad yili gar snat n tlisa (ddant).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "ummid agacuran gar %1 akked %2", "MATH_RANDOM_INT_TOOLTIP": "Ad d-yerr ummid agacuran gar snat n tlisa, ddant.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tirẓi tagacurant", "MATH_RANDOM_FLOAT_TOOLTIP": "Ad d-yerr tirẓi tagacurant gar 0.0 (yedda) akked 1.0 (ur yeddi ara).", "MATH_ATAN2_HELPURL": "https://kab.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 seg X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Ad d-yerr arctangent n waggaz (X, Y) s tfesniwin deg -180 ɣer 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Asekkil, awal neɣ izirig n uḍris.", "TEXT_JOIN_TITLE_CREATEWITH": "rnu aḍris s", "TEXT_JOIN_TOOLTIP": "Ad yernu taceqquft n uḍris s usdukel gar yal amḍan n yiferdisen.", @@ -289,7 +276,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ar # si tagara", "LISTS_GET_SUBLIST_END_LAST": "ar taggara", "LISTS_GET_SUBLIST_TOOLTIP": "Ad yernu anɣel n uḥric yettwamlen n tebdart.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "smizzwer %1 %2 %3", "LISTS_SORT_TOOLTIP": "Smizzwer anɣel n tebdart.", "LISTS_SORT_ORDER_ASCENDING": "igemmen", @@ -319,9 +305,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "ad yernu tawuri s tuffɣa.", "PROCEDURES_ALLOW_STATEMENTS": "Sireg asmizzwer", "PROCEDURES_DEF_DUPLICATE_WARNING": "Ɣur-k: Tawuri-a ɣur-s iɣewwaṛen usligen.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Selkem tawuri '%1' i yesbadu useqdac.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Selkem tawuri '%1' i yesbadu useqdac sakin seqdec agmuḍ-is.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inekcam", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Rnu, kkes neɣ ales asmizzwer n yinekcam i twuri-a.", diff --git a/msg/json/kbd-cyrl.json b/msg/json/kbd-cyrl.json index 8c0f5b7024f..6692bf3fc6b 100644 --- a/msg/json/kbd-cyrl.json +++ b/msg/json/kbd-cyrl.json @@ -38,7 +38,6 @@ "CONTROLS_IF_MSG_IF": "щыпкъэу", "CONTROLS_IF_MSG_ELSEIF": "армырамэ щыпкъэу", "CONTROLS_IF_MSG_ELSE": "армырамэ", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_OPERATION_AND": "икIи", "LOGIC_OPERATION_OR": "е", "LOGIC_BOOLEAN_TRUE": "щыпкъэ", @@ -80,8 +79,6 @@ "TEXT_INDEXOF_OPERATOR_LAST": "иужьыу къыщыхэщыр къэгъуэтын", "PROCEDURES_BEFORE_PARAMS": "игъусэр:", "PROCEDURES_CALL_BEFORE_PARAMS": "игъусэр:", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", - "PROCEDURES_CALLRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_%28программирование%29", "DIALOG_OK": "ХЪУАЩ", "DIALOG_CANCEL": "ЩӀегъуэжын" } diff --git a/msg/json/km.json b/msg/json/km.json index fc2913460aa..0d09b1ea2b3 100644 --- a/msg/json/km.json +++ b/msg/json/km.json @@ -24,7 +24,6 @@ "RENAME_VARIABLE_TITLE": "ប្ដូរ​ឈ្មោះ​អថេរ​ទាំង '%1' ទៅ​ជា៖", "NEW_VARIABLE": "បង្កើតអថេរ...", "NEW_VARIABLE_TITLE": "ឈ្មោះ​អថេរ​ថ្មី៖", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "ជ្រើស​ពណ៌​មួយ​ពី​បន្ទះ​ពណ៌", "DIALOG_OK": "យល់ព្រម" } diff --git a/msg/json/kn.json b/msg/json/kn.json index 04fc7635daf..dd1c68b4b8b 100644 --- a/msg/json/kn.json +++ b/msg/json/kn.json @@ -48,7 +48,6 @@ "DELETE_VARIABLE_CONFIRMATION": "'%2' ಚರಾಂಶದ '%1' ಉಪಯೋಗಗಳನ್ನು ಅಳಿಸುವುದೇ ?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "'%1' ಚರಾಂಶವನ್ನು ಅಳಿಸಲಾಗುವುದಿಲ್ಲ. ಏಕೆಂದರೆ ಇದು '%2' ಕಾರ್ಯಘಟಕದ ವ್ಯಾಖ್ಯಾನದ ಭಾಗವಾಗಿದೆ", "DELETE_VARIABLE": "'%1' ಚರಾಂಶವನ್ನು ಅಳಿಸು", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "ವರ್ಣಫಲಕದಿಂದ ಬಣ್ಣವನ್ನು ಆರಿಸು.", "COLOUR_RANDOM_TITLE": "ಯಾದೃಚ್ಛಿಕ ಬಣ್ಣ", "COLOUR_RANDOM_TOOLTIP": "ಯಾದೃಚ್ಛಿಕವಾಗಿ ಯಾವುದಾದರೂ ಒಂದು ಬಣ್ಣವನ್ನು ಆರಿಸು.", @@ -62,7 +61,6 @@ "COLOUR_BLEND_COLOUR2": "ಬಣ್ಣ 2", "COLOUR_BLEND_RATIO": "ಅನುಪಾತ", "COLOUR_BLEND_TOOLTIP": "ಕೊಟ್ಟಿರುವ ಅನುಪಾತದಂತೆ(0.0 - 1.0) ಎರಡು ಬಣ್ಣಗಳನ್ನು ಮಿಶ್ರಣ ಮಾಡುತ್ತದೆ.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 ಬಾರಿ ಪುನರಾವರ್ತಿಸು", "CONTROLS_REPEAT_INPUT_DO": "ಮಾಡು", "CONTROLS_REPEAT_TOOLTIP": "ಕೆಲವು ಹೇಳಿಕೆಗಳನ್ನು ಹಲವಾರು ಬಾರಿ ಮಾಡು.", @@ -89,7 +87,6 @@ "CONTROLS_IF_IF_TOOLTIP": "ಈ 'ಆಗಿದ್ದರೆ' ಬ್ಲಾಕನ್ನು ಮರು ಸಂರಚಿಸಲು ಅದರ ಭಾಗಗಳನ್ನು ಸೇರಿಸು, ತೆಗೆ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸು.", "CONTROLS_IF_ELSEIF_TOOLTIP": "'ಆಗಿದ್ದರೆ' ಬ್ಲಾಕ್ ಗೆ ಒಂದು ಷರತ್ತು ಸೇರಿಸಿ.", "CONTROLS_IF_ELSE_TOOLTIP": "ಅಂತಿಮವಾದ, ಎಲ್ಲವನ್ನೂ-ಹಿಡಿ ಷರತ್ತನ್ನು 'ಆಗಿದ್ದರೆ' ಬ್ಲಾಕ್ ಗೆ ಸೇರಿಸಿ.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "ಎರಡೂ ಒದಗಿಸುವ ಅಂಶಗಳು ಪರಸ್ಪರ ಸಮನಾಗಿದ್ದರೆ, ಸರಿ ಹಿಂತಿರುಗಿಸಿ.", "LOGIC_COMPARE_TOOLTIP_NEQ": "ಎರಡೂ ಒದಗಿಸುವ ಅಂಶಗಳು ಪರಸ್ಪರ ಸಮನಾಗಿರದಿದ್ದರೆ ಸರಿ ಹಿಂತಿರುಗಿಸಿ.", "LOGIC_COMPARE_TOOLTIP_LT": "ಮೊದಲನೇ ಒದಗಿಸುವ ಅಂಶ ಎರಡನೇ ಒದಗಿಸುವ ಅಂಶಕ್ಕಿಂತ ಚಿಕ್ಕದ್ದಾಗಿದ್ದರೆ ಸರಿ ಹಿಂತಿರುಗಿಸಿ.", @@ -111,15 +108,12 @@ "LOGIC_TERNARY_IF_TRUE": "ಸತ್ಯ ಆಗಿದ್ದರೆ", "LOGIC_TERNARY_IF_FALSE": "ಸುಳ್ಳು ಆಗಿದ್ದರೆ", "LOGIC_TERNARY_TOOLTIP": "'ಪರೀಕ್ಷೆ'ಯಲ್ಲಿನ ಷರತ್ತನ್ನು ಪರಿಶೀಲಿಸಿ. ಷರತ್ತು ಸರಿಯಾಗಿದ್ದರೆ, 'ಸತ್ಯವಾಗಿದ್ದರೆ' ಮೌಲ್ಯವನ್ನು; ಇಲ್ಲದಿದ್ದರೆ 'ಸುಳ್ಳಾಗಿದ್ದರೆ' ಮೌಲ್ಯವನ್ನೂ ಹಿಂತಿರುಗಿಸುವುದು.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "ಒಂದು ಸಂಖ್ಯೆ.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "ಎರಡು ಸಂಖ್ಯೆಗಳ ಮೊತ್ತವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "ಎರಡು ಸಂಖ್ಯೆಗಳ ವ್ಯತ್ಯಾಸವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "ಎರಡು ಸಂಖ್ಯೆಗಳ ಗುಣಲಬ್ಧವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "ಎರಡು ಸಂಖ್ಯೆಗಳ ಭಾಗಲಬ್ಧವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_ARITHMETIC_TOOLTIP_POWER": "ಮೊದಲ ಸಂಖ್ಯೆಯ ಘಾತಾಂಶ ಎರಡನೇ ಸಂಖ್ಯೆಯಾದಾಗಿನ ಫಲಿತಾಂಶವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "ವರ್ಗಮೂಲ", "MATH_SINGLE_TOOLTIP_ROOT": "ಸಂಖ್ಯೆಯ ವರ್ಗಮೂಲವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_SINGLE_OP_ABSOLUTE": "ಪರಿಪೂರ್ಣ", @@ -129,14 +123,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "ಒಂದು ಸಂಖ್ಯೆಯ ಆಧಾರ 10 ಲಾಗರಿಥಮನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_SINGLE_TOOLTIP_EXP": "ಒಂದು ಸಂಖ್ಯೆಯ e ಘಾತವಾಗಿದ್ದಾಗಿನ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_SINGLE_TOOLTIP_POW10": "ಒಂದು ಸಂಖ್ಯೆಯ 10ರ ಘಾತವಾಗಿದ್ದಾಗಿನ ಮೌಲ್ಯವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "ಕೋನವೊಂದರ ಸೈನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)", "MATH_TRIG_TOOLTIP_COS": "ಕೋನವೊಂದರ ಕೊಸೈನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)", "MATH_TRIG_TOOLTIP_TAN": "ಕೋನವೊಂದರ ಟ್ಯಾಂಜೆಂಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)", "MATH_TRIG_TOOLTIP_ASIN": "ಸಂಖ್ಯೆಯೊಂದರ ಆರ್ಕ್ ಸೈನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_TRIG_TOOLTIP_ACOS": "ಸಂಖ್ಯೆಯೊಂದರ ಆರ್ಕ್ ಕೊಸೈನ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)", "MATH_TRIG_TOOLTIP_ATAN": "ಸಂಖ್ಯೆಯೊಂದರ ಆರ್ಕ್ ಟ್ಯಾಂಜೆಂಟ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸಿ(ರೇಡಿಯನ್‌ಗಳಲ್ಲ)", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "ಸಾಮಾನ್ಯ ಸ್ಥಿರಾಂಕಗಳಲ್ಲಿ ಒಂದನ್ನು ಹಿಂತಿರುಗಿಸಿ:π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).", "MATH_IS_EVEN": "ಸಮ ಸಂಖ್ಯೆಯೇ?", "MATH_IS_ODD": "ಬೆಸ ಸಂಖ್ಯೆಯೇ?", @@ -146,10 +138,8 @@ "MATH_IS_NEGATIVE": "ಋಣಾತ್ಮಕವೇ?", "MATH_IS_DIVISIBLE_BY": "ಇದರಿಂದ ಭಾಗಿಸಬಹುದೇ?", "MATH_IS_TOOLTIP": "ಒಂದು ಸಂಖ್ಯೆ ಸಮ, ಬೆಸ, ಅವಿಭಾಜ್ಯ, ಪೂರ್ಣ, ಧನಾತ್ಮಕ, ಋಣಾತ್ಮಕವಾಗಿದೆಯೇ ಅಥವಾ ನಿರ್ದಿಷ್ಟ ಸಂಖ್ಯೆಯಿಂದ ಭಾಗಿಸ ಬಹುದೇ ಎಂದು ಪರಿಶೀಲಿಸಿ. ಸತ್ಯ ಅಥವಾ ಸುಳ್ಳು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%1 ಅನ್ನು %2 ರಿಂದ ಬದಲಾಯಿಸಿ", "MATH_CHANGE_TOOLTIP": "ಚರಾಂಶ '%1' ಕ್ಕೆ ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "ಒಂದು ಸಂಖ್ಯೆಯನ್ನು ಮೇಲಿನ ಅಥವಾ ಕೆಳಗಿನ ಪೂರ್ಣಾಂಕ ಮಾಡಿ.", "MATH_ROUND_OPERATOR_ROUND": "ಸುತ್ತು", "MATH_ROUND_OPERATOR_ROUNDUP": "ಮೇಲಿನ ಪೂರ್ಣಾಂಕ ಮಾಡಿ.", @@ -170,21 +160,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "ಪಟ್ಟಿಯ ಪ್ರಮಾಣಿತ ವಿಚಲನವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_ONLIST_OPERATOR_RANDOM": "ಪಟ್ಟಿಯ ಯಾದೃಚ್ಛಿತ ಅಂಶ", "MATH_ONLIST_TOOLTIP_RANDOM": "ಪಟ್ಟಿಯ ಯಾದೃಚ್ಛಿತ ಅಂಶವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2 ರ ಶೇಷ", "MATH_MODULO_TOOLTIP": "ಎರಡು ಸಂಖ್ಯೆಗಳ ವಿಭಜನೆಯ ಶೇಷವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", "MATH_CONSTRAIN_TITLE": "%1ಅನ್ನು ಕಡಿಮೆ %2 ಹೆಚ್ಚಿನ %3 ಮೌಲ್ಯಗಳ ನಡುವೆ ನಿರ್ಬಂಧಿಸಿ", "MATH_CONSTRAIN_TOOLTIP": "ನಿಗದಿತ ಮಿತಿಗಳ ನಡುವೆ ಸಂಖ್ಯೆಯನ್ನು ನಿರ್ಬಂಧಿಸಿ(ಒಳಗೊ೦ಡ).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "ಯಾದೃಚ್ಛಿತ ಪೂರ್ಣಾಂಕ %1 ರಿಂದ %2 ರವರೆಗೆ", "MATH_RANDOM_INT_TOOLTIP": "ಎರಡು ನಿರ್ದಿಷ್ಟ ಮಿತಿಗಳ ನಡುವೆ ಇರುವ ಯಾದೃಚ್ಛಿತ ಪೂರ್ಣಾಂಕವನ್ನು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ಯಾದೃಚ್ಛಿತ ಭಿನ್ನರಾಶಿ", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (ಒಳಗೊಂಡ) ಮತ್ತು 1.0 (ವಿಶೇಷ) ನಡುವೆ ಯಾದೃಚ್ಛಿತ ಭಿನ್ನರಾಶಿಯನ್ನು ಹಿಂತಿರುಗಿಸಿ.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "X:%1 Y:%2 ಬಿಂದುವಿನ ಆರ್ಕ್ ಟ್ಯಾನ್", "MATH_ATAN2_TOOLTIP": "ಬಿಂದು (X,Y) ನ ಆರ್ಕ್ ಟ್ಯಾಂಜೆಂಟ್ ನ್ನು -180 ರಿಂದ 180 ರವರೆಗಿನ ಡಿಗ್ರಿಗಳಲ್ಲಿ ಹಿಂತಿರುಗಿಸಿ.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "ಒಂದು ಅಕ್ಷರ, ಪದ ಅಥವಾ ಪಠ್ಯದ ಸಾಲು.", "TEXT_JOIN_TITLE_CREATEWITH": "ಇದರೊಂದಿಗೆ ಪಠ್ಯವನ್ನು ರಚಿಸಿ", "TEXT_JOIN_TOOLTIP": "ಹಲವಾರು ಅಂಶಗಳನ್ನು ಒಟ್ಟುಗೂಡಿಸುವ ಮೂಲಕ ಪಠ್ಯದ ತುಣುಕನ್ನು ರಚಿಸಿ.", @@ -292,7 +277,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ಕೊನೆಯಿಂದ # ವರೆಗೆ", "LISTS_GET_SUBLIST_END_LAST": "ಕೊನೆಯವರೆಗೂ", "LISTS_GET_SUBLIST_TOOLTIP": "ಪಟ್ಟಿಯ ನಿರ್ದಿಷ್ಟ ಭಾಗದ ಪ್ರತಿಯನ್ನು ರಚಿಸುತ್ತದೆ.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 ವಿಂಗಡಿಸಿ", "LISTS_SORT_TOOLTIP": "ಪಟ್ಟಿಯ ಪ್ರತಿಯನ್ನು ವಿಂಗಡಿಸಿ.", "LISTS_SORT_ORDER_ASCENDING": "ಆರೋಹಣ", @@ -322,9 +306,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "ಹೊರಾಂಶ ಇರುವ ಕಾರ್ಯ ಘಟಕವನ್ನು ರಚಿಸುತ್ತದೆ.", "PROCEDURES_ALLOW_STATEMENTS": "ಹೇಳಿಕೆಗಳನ್ನು ಅನುಮತಿಸಿ", "PROCEDURES_DEF_DUPLICATE_WARNING": "ಎಚ್ಚರಿಕೆ: ಈ ಕಾರ್ಯಘಟಕವು ನಕಲಿ ನಿಯತಾಂಕಗಳನ್ನು ಹೊಂದಿದೆ.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "ಬಳಕೆದಾರ-ವ್ಯಾಖ್ಯಾನಿತ ಕಾರ್ಯಘಟಕ '%1'ಅನ್ನು ಚಲಾಯಿಸಿ.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "ಬಳಕೆದಾರ-ವ್ಯಾಖ್ಯಾನಿತ ಕಾರ್ಯಘಟಕ '%1'ಅನ್ನು ಚಲಾಯಿಸಿ ಮತ್ತು ಅದರ ಹೊರಾಂಶವನ್ನು ಉಪಯೋಗಿಸಿ", "PROCEDURES_MUTATORCONTAINER_TITLE": "ಒಳಾoಶಗಳು", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "ಈ ಕಾರ್ಯಕ್ಕೆ ಒಳಾoಶಗಳನ್ನು ಸೇರಿಸಿ, ತೆಗೆದುಹಾಕಿ ಅಥವಾ ಮರುಕ್ರಮಗೊಳಿಸಿ.", diff --git a/msg/json/ko.json b/msg/json/ko.json index b59cbf03f0b..9f8415ca25d 100644 --- a/msg/json/ko.json +++ b/msg/json/ko.json @@ -2,6 +2,7 @@ "@metadata": { "authors": [ "Alex00728", + "Amire80", "Codenstory", "Gongsoonyee", "Hym411", @@ -60,13 +61,11 @@ "COLOUR_PICKER_TOOLTIP": "팔레트에서 색을 고릅니다", "COLOUR_RANDOM_TITLE": "무작위 색상", "COLOUR_RANDOM_TOOLTIP": "무작위로 색을 고릅니다.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "색", "COLOUR_RGB_RED": "빨강", "COLOUR_RGB_GREEN": "초록", "COLOUR_RGB_BLUE": "파랑", "COLOUR_RGB_TOOLTIP": "빨강,파랑,초록의 값을 이용하여 색을 만드십시오. 모든 값은 0과 100 사이에 있어야 합니다.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "혼합", "COLOUR_BLEND_COLOUR1": "색 1", "COLOUR_BLEND_COLOUR2": "색 2", @@ -123,7 +122,6 @@ "LOGIC_BOOLEAN_TRUE": "참", "LOGIC_BOOLEAN_FALSE": "거짓", "LOGIC_BOOLEAN_TOOLTIP": "참 혹은 거짓 모두 반환합니다.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "빈 값", "LOGIC_NULL_TOOLTIP": "빈 값을 반환합니다.", "LOGIC_TERNARY_HELPURL": "https://ko.wikipedia.org/wiki/물음표", @@ -133,11 +131,7 @@ "LOGIC_TERNARY_TOOLTIP": "'test'의 조건을 검사합니다. 조건이 참이면 'if true' 값을 반환합니다. 거짓이면 'if false' 값을 반환합니다.", "MATH_NUMBER_HELPURL": "https://ko.wikipedia.org/wiki/수_(수학)", "MATH_NUMBER_TOOLTIP": "수", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -177,7 +171,6 @@ "MATH_IS_NEGATIVE": "가 음(-)수 이면", "MATH_IS_DIVISIBLE_BY": "가 다음 수로 나누어 떨어지면 :", "MATH_IS_TOOLTIP": "어떤 수가 짝 수, 홀 수, 소 수, 정 수, 양 수, 음 수, 나누어 떨어지는 수 인지 검사해 결과값을 돌려줍니다. 참(true) 또는 거짓(false) 값을 돌려줌.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "바꾸기 %1 만큼 %2", "MATH_CHANGE_TOOLTIP": "변수 '%1' 에 저장되어있는 값에, 어떤 수를 더해, 변수에 다시 저장합니다.", "MATH_ROUND_HELPURL": "https://ko.wikipedia.org/wiki/반올림", @@ -185,7 +178,6 @@ "MATH_ROUND_OPERATOR_ROUND": "반올림", "MATH_ROUND_OPERATOR_ROUNDUP": "올림", "MATH_ROUND_OPERATOR_ROUNDDOWN": "버림", - "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "합", "MATH_ONLIST_TOOLTIP_SUM": "리스트에 들어있는 수(값)들을, 모두 합(sum) 한, 총합(sum)을 돌려줍니다.", "MATH_ONLIST_OPERATOR_MIN": "최소값", @@ -202,54 +194,42 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "이 리스트의 표준 편차를 반환합니다.", "MATH_ONLIST_OPERATOR_RANDOM": "목록의 임의 항목", "MATH_ONLIST_TOOLTIP_RANDOM": "목록에서 임의의 아이템을 돌려줍니다.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2의 나머지", "MATH_MODULO_TOOLTIP": "첫 번째 수를 두 번째 수로 나눈, 나머지 값을 돌려줍니다.", "MATH_CONSTRAIN_HELPURL": "https://ko.wikipedia.org/wiki/클램핑_(그래픽)", "MATH_CONSTRAIN_TITLE": "%1의 값을, 최소 %2 최대 %3으로 조정", "MATH_CONSTRAIN_TOOLTIP": "어떤 수를, 특정 범위의 값이 되도록 강제로 조정합니다.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "랜덤정수(%1<= n <=%2)", "MATH_RANDOM_INT_TOOLTIP": "두 주어진 제한된 범위 사이의 임의 정수값을 돌려줍니다.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "임의 분수", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (포함)과 1.0 (배타적) 사이의 임의 분수 값을 돌려줍니다.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "X:%1 Y:%2의 atan2", "MATH_ATAN2_TOOLTIP": "점 (X, Y)의 아크탄젠트를 -180에서 180까지 도 단위로 반환합니다.", "TEXT_TEXT_HELPURL": "https://ko.wikipedia.org/wiki/문자열", "TEXT_TEXT_TOOLTIP": "문자, 단어, 문장.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "텍스트 만들기", "TEXT_JOIN_TOOLTIP": "여러 개의 아이템들을 연결해(묶어), 새로운 문장을 만듭니다.", "TEXT_CREATE_JOIN_TITLE_JOIN": "가입", "TEXT_CREATE_JOIN_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 텍스트 블럭을 재구성합니다.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "텍스트에 항목을 추가합니다.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "다음 %1 내용 덧붙이기 %2", "TEXT_APPEND_TOOLTIP": "'%1' 변수의 끝에 일부 텍스트를 덧붙입니다.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "다음 문장의 문자 개수 %1", "TEXT_LENGTH_TOOLTIP": "입력된 문장의, 문자 개수를 돌려줍니다.(공백문자 포함)", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1이 비어 있습니다", "TEXT_ISEMPTY_TOOLTIP": "입력된 문장이, 빈 문장(\"\")이면 참(true) 값을 돌려줍니다.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "두 번째 텍스트에서 첫 번째 텍스트가 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 텍스트가 없으면 %1을 반환합니다.", "TEXT_INDEXOF_TITLE": "문장 %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "에서 다음 문장이 처음으로 나타난 위치 찾기 :", "TEXT_INDEXOF_OPERATOR_LAST": "에서 다음 문장이 마지막으로 나타난 위치 찾기 :", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "텍스트 %1 %2에서", "TEXT_CHARAT_FROM_START": "에서, 앞에서부터 # 번째 위치의 문자 얻기", "TEXT_CHARAT_FROM_END": "에서, 마지막부터 # 번째 위치의 문자 얻기", "TEXT_CHARAT_FIRST": "에서, 첫 번째 문자 얻기", "TEXT_CHARAT_LAST": "에서, 마지막 문자 얻기", "TEXT_CHARAT_RANDOM": "에서, 랜덤하게 한 문자 얻기", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "특정 번째 위치에서, 문자를 얻어내 돌려줍니다.", "TEXT_GET_SUBSTRING_TOOLTIP": "문장 중 일부를 얻어내 돌려줍니다.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "문장", "TEXT_GET_SUBSTRING_START_FROM_START": "에서, 처음부터 # 번째 문자부터 얻어냄", "TEXT_GET_SUBSTRING_START_FROM_END": "에서, 마지막에서 # 번째부터 얻어냄", @@ -257,54 +237,40 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "# 번째 문자까지", "TEXT_GET_SUBSTRING_END_FROM_END": "끝에서부터 # 번째 문자까지", "TEXT_GET_SUBSTRING_END_LAST": "마지막 문자까지", - "TEXT_GET_SUBSTRING_TAIL": "", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "영문 대소문자 형태를 변경해 돌려줍니다.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "대문자로", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "소문자로", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "첫 문자만 대문자로", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "문장의 왼쪽/오른쪽/양쪽에서 스페이스 문자를 제거해 돌려줍니다.", "TEXT_TRIM_OPERATOR_BOTH": "양쪽의 공백 문자 제거", "TEXT_TRIM_OPERATOR_LEFT": "왼쪽의 공백 문자 제거", "TEXT_TRIM_OPERATOR_RIGHT": "오른쪽의 공백 문자 제거", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "다음 내용 출력 %1", "TEXT_PRINT_TOOLTIP": "원하는 문장, 수, 값 등을 출력합니다.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "메시지를 활용해 문장 입력", "TEXT_PROMPT_TYPE_NUMBER": "메시지를 활용해 수 입력", "TEXT_PROMPT_TOOLTIP_NUMBER": "수에 대해 사용자의 입력을 받습니다.", "TEXT_PROMPT_TOOLTIP_TEXT": "문장에 대해 사용자의 입력을 받습니다.", "TEXT_COUNT_MESSAGE0": "%2에서 %1 숫자 세기", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "다른 어떤 텍스트에서 어떤 텍스트가 나타난 횟수를 셉니다.", "TEXT_REPLACE_MESSAGE0": "%3에서 %2을(를) %1(으)로 바꾸기", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "다른 텍스트 내에서 일부 텍스트의 모든 발생을 치환합니다.", "TEXT_REVERSE_MESSAGE0": "%1 뒤집기", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "텍스트 안의 문자의 순서를 반전시킵니다.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "빈 리스트 생성", "LISTS_CREATE_EMPTY_TOOLTIP": "데이터 레코드가 없는, 길이가 0인 목록을 반환합니다.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "원하는 수의 항목들로 목록을 생성합니다.", "LISTS_CREATE_WITH_INPUT_WITH": "리스트 만들기", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "리스트", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "섹션을 추가, 제거하거나 순서를 변경하여 이 리스트 블럭을 재구성합니다.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "아이템을 리스트에 추가합니다.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "지정된 값을, 지정된 개수 만큼 넣어, 목록을 생성합니다.", "LISTS_REPEAT_TITLE": "%1을 %2번 넣어, 리스트 생성", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "%1의 길이", "LISTS_LENGTH_TOOLTIP": "목록의 길이를 반환합니다.", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1이 비어 있습니다", "LISTS_ISEMPTY_TOOLTIP": "목록이 비었을 때 참을 반환합니다.", "LISTS_INLIST": "리스트", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "처음으로 나타난 위치", "LISTS_INDEX_OF_LAST": "마지막으로 나타난 위치", "LISTS_INDEX_OF_TOOLTIP": "목록에서 항목이 처음 또는 마지막으로 발생한 색인 위치를 반환합니다. 항목이 없으면 %1을 반환합니다.", @@ -316,7 +282,6 @@ "LISTS_GET_INDEX_FIRST": "첫 번째", "LISTS_GET_INDEX_LAST": "마지막", "LISTS_GET_INDEX_RANDOM": "임의로", - "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1은 첫 번째 항목입니다.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1은(는) 마지막 항목입니다.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "목록에서 특정 위치의 항목을 반환합니다.", @@ -331,7 +296,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "리스트에서 첫 번째 아이템을 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "리스트에서 마지막 아이템을 찾아 삭제합니다.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "리스트에서 랜덤하게 아이템을 삭제합니다.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "에서 설정", "LISTS_SET_INDEX_INSERT": "에서 원하는 위치에 삽입", "LISTS_SET_INDEX_INPUT_TO": "에", @@ -343,16 +307,13 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "항목을 목록의 처음 위치에 삽입합니다.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "리스트의 마지막에 아이템을 추가합니다.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "목록에서 임의 위치에 아이템을 삽입합니다.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "처음 # 번째 위치부터, 서브 리스트 추출", "LISTS_GET_SUBLIST_START_FROM_END": "마지막부터 # 번째 위치부터, 서브 리스트 추출", "LISTS_GET_SUBLIST_START_FIRST": "첫 번째 위치부터, 서브 리스트 추출", "LISTS_GET_SUBLIST_END_FROM_START": "앞에서부터 # 번째로", "LISTS_GET_SUBLIST_END_FROM_END": "끝에서부터 # 번째로", "LISTS_GET_SUBLIST_END_LAST": "마지막으로", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "목록의 특정 부분에 대한 복사본을 만듭니다.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "정렬 %1 %2 %3", "LISTS_SORT_TOOLTIP": "목록의 사본을 정렬합니다.", "LISTS_SORT_ORDER_ASCENDING": "오름차순", @@ -360,16 +321,13 @@ "LISTS_SORT_TYPE_NUMERIC": "숫자순", "LISTS_SORT_TYPE_TEXT": "알파벳순", "LISTS_SORT_TYPE_IGNORECASE": "알파벳순 (대소문자 구분 안 함)", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "텍스트에서 목록 만들기", "LISTS_SPLIT_TEXT_FROM_LIST": "목록에서 텍스트 만들기", "LISTS_SPLIT_WITH_DELIMITER": "분리와", "LISTS_SPLIT_TOOLTIP_SPLIT": "각 속보, 텍스트의 목록들에서 텍스트를 분할합니다.", "LISTS_SPLIT_TOOLTIP_JOIN": "구분 기호로 구분하여 텍스트 목록을 하나의 텍스트에 병합합니다.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "%1 뒤집기", "LISTS_REVERSE_TOOLTIP": "리스트의 복사본을 뒤집습니다.", - "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_HELPURL": "https://ko.wikipedia.org/wiki/%EB%B3%80%EC%88%98_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)", "VARIABLES_GET_TOOLTIP": "변수에 저장 되어있는 값을 돌려줍니다.", "VARIABLES_GET_CREATE_SET": "'집합 %1' 생성", @@ -377,15 +335,13 @@ "VARIABLES_SET": "%1를 %2로 설정", "VARIABLES_SET_TOOLTIP": "변수의 값을 입력한 값으로 변경해 줍니다.", "VARIABLES_SET_CREATE_GET": "'%1 값 읽기' 블럭 생성", - "PROCEDURES_DEFNORETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", "PROCEDURES_DEFNORETURN_TITLE": "함수", "PROCEDURES_DEFNORETURN_PROCEDURE": "함수 이름", "PROCEDURES_BEFORE_PARAMS": "사용:", "PROCEDURES_CALL_BEFORE_PARAMS": "사용:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "실행 후, 결과 값을 돌려주지 않는 함수를 만듭니다.", "PROCEDURES_DEFNORETURN_COMMENT": "이 함수를 설명하세요...", - "PROCEDURES_DEFRETURN_HELPURL": "https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98_%28%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%29", + "PROCEDURES_DEFRETURN_HELPURL": "https://ko.wikipedia.org/wiki/함수_(컴퓨터_과학)", "PROCEDURES_DEFRETURN_RETURN": "다음을 돌려줌", "PROCEDURES_DEFRETURN_TOOLTIP": "실행 후, 결과 값을 돌려주는 함수를 만듭니다.", "PROCEDURES_ALLOW_STATEMENTS": "서술 허가", @@ -401,7 +357,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "함수 정의 찾기", "PROCEDURES_CREATE_DO": "'%1' 생성", "PROCEDURES_IFRETURN_TOOLTIP": "값이 참이라면, 두 번째 값을 반환합니다.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "경고: 이 블럭은, 함수 정의 블럭 안에서만 사용할 수 있습니다.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "말해 보세요...", "WORKSPACE_ARIA_LABEL": "Blockly 워크스페이스", diff --git a/msg/json/ksh.json b/msg/json/ksh.json index 078e004ed87..42082671e45 100644 --- a/msg/json/ksh.json +++ b/msg/json/ksh.json @@ -36,7 +36,6 @@ "LISTS_ISEMPTY_TOOLTIP": "Jitt „Wohr“ us, wann en dä Leß nix dren es.", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 es de Eezde en de Leß.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 es de Läzde en de Leß.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_ORDER_ASCENDING": "opwääts", "LISTS_SORT_ORDER_DESCENDING": "rökwääts zottehre", "VARIABLES_SET": "säz der Wäät en %1 op %2", diff --git a/msg/json/ky.json b/msg/json/ky.json index af1a8661a26..cf2af989900 100644 --- a/msg/json/ky.json +++ b/msg/json/ky.json @@ -30,7 +30,6 @@ "RENAME_VARIABLE_TITLE": "Баардык '%1' өзгөрмөнүнүн атын алмаштыр", "NEW_VARIABLE": "жаңы өзгөрмө", "NEW_VARIABLE_TITLE": "Жаңы өзгөрмөнүн аты", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "палитрадан түс танда", "COLOUR_RANDOM_TITLE": "тушкелди түс", "COLOUR_RANDOM_TOOLTIP": "Түстү тушкелди тандоо.", @@ -44,7 +43,6 @@ "COLOUR_BLEND_COLOUR2": "2-түс", "COLOUR_BLEND_RATIO": "катышы", "COLOUR_BLEND_TOOLTIP": "Эки түстү берилген катыш (0.0 - 1.0) менен аралаштыр.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 жолу кайтала", "CONTROLS_REPEAT_INPUT_DO": "жаса", "CONTROLS_REPEAT_TOOLTIP": "Билдирүүнү бир канча жолу кайтала", diff --git a/msg/json/lb.json b/msg/json/lb.json index 412dd51bcfd..5e7a386ff70 100644 --- a/msg/json/lb.json +++ b/msg/json/lb.json @@ -58,7 +58,6 @@ "LOGIC_BOOLEAN_FALSE": "falsch", "LOGIC_BOOLEAN_TOOLTIP": "Schéckt entweder richteg oder falsch zréck.", "LOGIC_NULL": "null", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "Test", "LOGIC_TERNARY_IF_TRUE": "wa wouer", "LOGIC_TERNARY_IF_FALSE": "wa falsch", @@ -96,7 +95,6 @@ "TEXT_GET_SUBSTRING_END_LAST": "bis bei de leschte Buschtaf", "TEXT_PRINT_TITLE": "%1 drécken", "TEXT_PROMPT_TOOLTIP_TEXT": "Frot de Benotzer no engem Text.", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_REPLACE_MESSAGE0": "%1 duerch %2 a(n) %3 ersetzen", "TEXT_REPLACE_TOOLTIP": "All Kéiers wou e bestëmmten Text do ass duerch en aneren Text ersetzen.", "TEXT_REVERSE_TOOLTIP": "Dréint d'Reiefolleg vun den Zeechen am Text ëm.", @@ -124,7 +122,6 @@ "LISTS_SORT_TITLE": "%1 %2 %3 zortéieren", "LISTS_SORT_TYPE_NUMERIC": "numeresch", "LISTS_SORT_TYPE_TEXT": "alphabetesch", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "%1 ëmdréinen", "PROCEDURES_DEFNORETURN_PROCEDURE": "eppes maachen", "PROCEDURES_BEFORE_PARAMS": "mat:", diff --git a/msg/json/lki.json b/msg/json/lki.json index 023d034b64b..38def675568 100644 --- a/msg/json/lki.json +++ b/msg/json/lki.json @@ -69,7 +69,6 @@ "CONTROLS_IF_IF_TOOLTIP": "افزودن، حذف یا بازمرتب‌سازی قسمت‌ها برای پیکربندی دوبارهٔ این بلوک اگر.", "CONTROLS_IF_ELSEIF_TOOLTIP": "افزودن یک شرط به بلوک اگر.", "CONTROLS_IF_ELSE_TOOLTIP": "اضافه‌کردن نهایی، گرفتن همهٔ شرایط به بلوک اگر.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "بازگشت صحیح اگر هر دو ورودی با یکدیگر برابر باشد.", "LOGIC_COMPARE_TOOLTIP_NEQ": "برگرداندن صحیح اگر هر دو ورودی با یکدیگر برابر نباشند.", "LOGIC_COMPARE_TOOLTIP_LT": "بازگرداندن صحیح اگر ورودی اول کوچکتر از ورودی دوم باشد.", @@ -91,15 +90,12 @@ "LOGIC_TERNARY_IF_TRUE": "اگر درست", "LOGIC_TERNARY_IF_FALSE": "اگر نادرست", "LOGIC_TERNARY_TOOLTIP": "بررسی وضعیت در «آزمایش». اگر وضعیت صحیح باشد، مقدار «اگر صحیح» را بر می‌گرداند در غیر اینصورت مقدار «اگر ناصحیح» را.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "شؤمارە یەک", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "بازگرداندن مقدار جمع دو عدد.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "بازگرداندن تفاوت دو عدد.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "بازگرداندن حاصلضرب دو عدد.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "بازگرداندن باقی‌ماندهٔ دو عدد.", "MATH_ARITHMETIC_TOOLTIP_POWER": "بازگرداندن اولین عددی که از توان عدد دوم حاصل شده باشد.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "ریشهٔ دوم", "MATH_SINGLE_TOOLTIP_ROOT": "ریشهٔ دوم یک عدد را باز می‌گرداند.", "MATH_SINGLE_OP_ABSOLUTE": "مطلق", @@ -109,14 +105,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "بازگرداندن لگاریتم بر پایهٔ ۱۰ یک عدد.", "MATH_SINGLE_TOOLTIP_EXP": "بازگرداندن توان e یک عدد.", "MATH_SINGLE_TOOLTIP_POW10": "بازگرداندن توان ۱۰ یک عدد.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "بازگرداندن سینوس درجه (نه رادیان).", "MATH_TRIG_TOOLTIP_COS": "بازگرداندن کسینوس درجه (نه رادیان).", "MATH_TRIG_TOOLTIP_TAN": "بازگرداندن تانژانت یک درجه (نه رادیان).", "MATH_TRIG_TOOLTIP_ASIN": ".(بازگرداندن آرک‌سینوس درجه (نه رادیان", "MATH_TRIG_TOOLTIP_ACOS": "بازگرداندن آرک‌کسینوس درجه (نه رادیان).", "MATH_TRIG_TOOLTIP_ATAN": "بازگرداندن آرک‌تانژانت درجه (نه رادیان).", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "یکی از مقادیر مشترک را برمی‌گرداند: π (۳٫۱۴۱…)، e (۲٫۷۱۸...)، φ (۱٫۶۱۸)، sqrt(۲) (۱٫۴۱۴)، sqrt(۱/۲) (۰٫۷۰۷...) و یا ∞ (بی‌نهایت).", "MATH_IS_EVEN": "زوج است", "MATH_IS_ODD": "فرد است", @@ -126,10 +120,8 @@ "MATH_IS_NEGATIVE": "منفی است", "MATH_IS_DIVISIBLE_BY": "تقسیم شده بر", "MATH_IS_TOOLTIP": "بررسی می‌کند که آیا یک عدد زوج، فرد، اول، کامل، مثبت، منفی یا بخش‌پذیر عدد خاصی باشد را بررسی می‌کند. درست یا نادرست باز می‌گرداند.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "تغییر %1 با %2", "MATH_CHANGE_TOOLTIP": "افزودن یک عدد به متغیر '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "گردکردن یک عدد به بالا یا پایین.", "MATH_ROUND_OPERATOR_ROUND": "گردکردن", "MATH_ROUND_OPERATOR_ROUNDUP": "گرد به بالا", @@ -150,18 +142,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "انحراف معیار فهرست را بر می‌گرداند.", "MATH_ONLIST_OPERATOR_RANDOM": "مورد تصادفی از فهرست", "MATH_ONLIST_TOOLTIP_RANDOM": "موردی تصادفی از فهرست را بر می‌گرداند.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "باقی‌ماندهٔ %1 + %2", "MATH_MODULO_TOOLTIP": "باقی‌ماندهٔ تقسیم دو عدد را بر می‌گرداند.", "MATH_CONSTRAIN_TITLE": "محدودکردن %1 پایین %2 بالا %3", "MATH_CONSTRAIN_TOOLTIP": "محدودکردن یک عدد بین محدودیت‌های مشخص‌شده (بسته).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "عدد صحیح تصادفی بین %1 تا %2", "MATH_RANDOM_INT_TOOLTIP": "یک عدد تصادفی بین دو مقدار مشخص‌شده به صورت بسته باز می‌گرداند.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "کسر تصادفی", "MATH_RANDOM_FLOAT_TOOLTIP": "بازگرداندن کسری تصادفی بین ۰٫۰ (بسته) تا ۱٫۰ (باز).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "یک حرف، کلمه یا خطی از متن.", "TEXT_JOIN_TITLE_CREATEWITH": "ایجاد متن با", "TEXT_JOIN_TOOLTIP": "یک تکه‌ای از متن را با چسپاندن همهٔ تعداد از موارد ایجاد می‌کند.", @@ -279,9 +267,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "تابعی با یک خروجی می‌سازد.", "PROCEDURES_ALLOW_STATEMENTS": "اجازه اظهارات", "PROCEDURES_DEF_DUPLICATE_WARNING": "اخطار: این تابعی پارامتر تکراری دارد.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1».", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLRETURN_TOOLTIP": "اجرای تابع تعریف‌شده توسط کاربر «%1» و استفاده از خروجی آن.", "PROCEDURES_MUTATORCONTAINER_TITLE": "ورودی‌ها", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "افزودن، حذف یا دوباره مرتب‌کردن ورودی این تابع.", diff --git a/msg/json/lo.json b/msg/json/lo.json index ec7aabb9f9e..fde92a3bb2a 100644 --- a/msg/json/lo.json +++ b/msg/json/lo.json @@ -42,7 +42,6 @@ "COLOUR_BLEND_COLOUR2": "ສີ 2", "COLOUR_BLEND_RATIO": "ອັດຕາສ່ວນ", "COLOUR_BLEND_TOOLTIP": "ປະສົມສອງສີເຂົ້າກັນດ້ວຍອັດຕາສ່ວນ (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ເຮັດຄືນ %1 ຄັ້ງ", "CONTROLS_REPEAT_INPUT_DO": "ເຮັດ", "CONTROLS_REPEAT_TOOLTIP": "ເຮັດຄຳສັ່ງບາງຄຳສັ່ງຄືນຫຼາຍໆຄັ້ງ.", diff --git a/msg/json/lrc.json b/msg/json/lrc.json index a7938661986..c92ee97242a 100644 --- a/msg/json/lrc.json +++ b/msg/json/lrc.json @@ -30,7 +30,6 @@ "NEW_VARIABLE": "آلشتگر تازٱ...", "NEW_VARIABLE_TYPE_TITLE": "نوع آلشتگر تازٱ", "NEW_VARIABLE_TITLE": "نوم آلشتگر تازٱ:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "یاٛ رٱنڳ د رٱنڳدو اْنتخاو بٱکؽت", "COLOUR_RANDOM_TITLE": "رٱنڳ بٱختٱکی", "COLOUR_RANDOM_TOOLTIP": "یاٛ ٱنڳ بٱختٱکی اْنتخاو بٱکؽت", @@ -43,7 +42,6 @@ "COLOUR_BLEND_COLOUR2": "رٱنڳ 2", "COLOUR_BLEND_RATIO": "نسڤٱت", "COLOUR_BLEND_TOOLTIP": "هٱر کوم د رٱنڳؽا ناْ ڤا نسڤٱت داٛئٱ بٱ بٱشؽڤن(0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 تکرار کو چٱن بار", "CONTROLS_REPEAT_INPUT_DO": "ٱنجوم باٛ", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "تا تکرار کو", @@ -65,15 +63,10 @@ "LOGIC_TERNARY_CONDITION": "آزماشت کردن", "LOGIC_TERNARY_IF_TRUE": "ٱر دۏرس بی", "LOGIC_TERNARY_IF_FALSE": "ٱر غلٱت بی", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "یاٛ شمارٱ.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "ڤاْ ٱندازٱ دۏ شمارٱ ڤرگٱردن.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "چارسوک ریشٱ", "MATH_SINGLE_OP_ABSOLUTE": "تموم ۉ کمال", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_IS_EVEN": "همیشٱ هؽسش", "MATH_IS_ODD": "تٱنڳؽا ٱ", "MATH_IS_PRIME": "ڤٱ ٱڤلٱ", @@ -81,9 +74,7 @@ "MATH_IS_POSITIVE": "موسبٱتٱ", "MATH_IS_NEGATIVE": "مٱنفی ٱ", "MATH_IS_DIVISIBLE_BY": "یٱ ڤا بٱئر بیٱ", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "آلشت بٱکؽت %1 وا %2", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_OPERATOR_ROUND": "گرد کردن", "MATH_ROUND_OPERATOR_ROUNDUP": "ڤ رۉ گرد کردن", "MATH_ROUND_OPERATOR_ROUNDDOWN": "ڤ هار گرد کردن", @@ -93,10 +84,6 @@ "MATH_ONLIST_OPERATOR_AVERAGE": "مؽنجاگٱ نومگٱ", "MATH_ONLIST_OPERATOR_MEDIAN": "مؽنجا نومگٱ", "MATH_ONLIST_OPERATOR_MODE": "بؽشری د نومگٱ", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_JOIN_TITLE_CREATEWITH": "دۏرس کردن مٱتن ڤا", "TEXT_CREATE_JOIN_TITLE_JOIN": "پاٛڤٱسن", "TEXT_ISEMPTY_TITLE": "%1 هالٛیٱ", @@ -128,8 +115,6 @@ "PROCEDURES_BEFORE_PARAMS": "ڤا:", "PROCEDURES_CALL_BEFORE_PARAMS": "ڤا:", "PROCEDURES_DEFRETURN_RETURN": "ڤرگٱردنیئن", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_MUTATORCONTAINER_TITLE": "دادٱیا", "PROCEDURES_MUTATORARG_TITLE": "نوم دادٱ:", "PROCEDURES_CREATE_DO": "دۏرس کردن%1", diff --git a/msg/json/lt.json b/msg/json/lt.json index d320c4ec456..9818697c1f3 100644 --- a/msg/json/lt.json +++ b/msg/json/lt.json @@ -55,7 +55,6 @@ "COLOUR_BLEND_COLOUR2": "2 spalva", "COLOUR_BLEND_RATIO": "santykis", "COLOUR_BLEND_TOOLTIP": "Sumaišo dvi spalvas su pateiktu santykiu (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "pakartokite %1 kartus", "CONTROLS_REPEAT_INPUT_DO": "daryti", "CONTROLS_REPEAT_TOOLTIP": "Leidžia atlikti išvardintus veiksmus kelis kartus.", @@ -82,7 +81,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Galite pridėt/pašalinti/pertvarkyti sąlygų \"šakas\".", "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridėti sąlygą „jei“ blokui.", "CONTROLS_IF_ELSE_TOOLTIP": "Pridėti veiksmų vykdymo variantą/\"šaką\", kai netenkinama nė viena sąlyga.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Tenkinama, jei abu reiškiniai lygūs.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Grįžti tiesa, jeigu abi įvestys ne lygios tarpusavyje.", "LOGIC_COMPARE_TOOLTIP_LT": "Grįžti tiesa, jei pirma įvestis mažesnė nei antra įvestis.", @@ -106,13 +104,11 @@ "LOGIC_TERNARY_TOOLTIP": "Jeigu sąlygą tenkinama, grąžina pirmą reikšmę, o jei ne - antrąją.", "MATH_NUMBER_HELPURL": "https://lt.wikipedia.org/wiki/Skaičius", "MATH_NUMBER_TOOLTIP": "Skaičius.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Grąžina dviejų skaičių sumą.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Grąžina dviejų skaičių skirtumą.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Grąžina dviejų skaičių sandaugą.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Grąžina dviejų skaičių dalmenį.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Grąžina pirmą skaičių pakeltą laipsniu pagal antrą skaičių.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "kvadratinė šaknis", "MATH_SINGLE_TOOLTIP_ROOT": "Grįžti kvadratinę šaknį iš skaičiaus.", "MATH_SINGLE_OP_ABSOLUTE": "modulis", @@ -129,7 +125,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Grąžinti skaičiaus arksinusą.", "MATH_TRIG_TOOLTIP_ACOS": "Grąžinti skaičiaus arkkosinusą.", "MATH_TRIG_TOOLTIP_ATAN": "Grąžinti skaičiaus arktangentą.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Grįžti viena iš pagrindinių konstantų: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (begalybė).", "MATH_IS_EVEN": "yra lyginis", "MATH_IS_ODD": "yra nelyginis", @@ -139,7 +134,6 @@ "MATH_IS_NEGATIVE": "yra neigiamas", "MATH_IS_DIVISIBLE_BY": "yra dalus iš", "MATH_IS_TOOLTIP": "Patikrina skaičiaus savybę: (ne)lyginis/pirminis/sveikasis/teigiamas/neigiamas/dalus iš x.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "padidink %1 (emptypage) %2", "MATH_CHANGE_TOOLTIP": "Prideda skaičių prie kintamojo '%1'. Kai skaičius neigiamas - gaunasi atimtis.", "MATH_ROUND_HELPURL": "https://lt.wikipedia.org/wiki/Apvalinimas", @@ -163,18 +157,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Grįžti standartine pakraipa iš sąrašo.", "MATH_ONLIST_OPERATOR_RANDOM": "atsitiktinis elementas iš sąrašo", "MATH_ONLIST_TOOLTIP_RANDOM": "Grąžinti atsitiktinį elementą iš sąrašo.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "dalybos liekana %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Grįžti likučiu nuo dviejų skaičių dalybos.", "MATH_CONSTRAIN_TITLE": "apribok %1 tarp %2 ir %3", "MATH_CONSTRAIN_TOOLTIP": "Apriboti skaičių, kad būtų tarp nustatytų ribų (imtinai).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "atsitiktinis sveikas sk. nuo %1 iki %2", "MATH_RANDOM_INT_TOOLTIP": "Grįžti atsitiktinį sveikąjį skaičių tarp dviejų nustatytų ribų, imtinai.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "atsitiktinė trupmena", "MATH_RANDOM_FLOAT_TOOLTIP": "Atsitiktinė trupmena nuo 0 (imtinai) iki 1 (neimtinai).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Tekstas (arba žodis, ar raidė)", "TEXT_JOIN_TITLE_CREATEWITH": "sukurti tekstą su", "TEXT_JOIN_TOOLTIP": "Sukurti teksto fragmentą sujungiant bet kokį skaičių fragmentų.", @@ -220,13 +210,10 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Prašyti vartotoją įvesti skaičių.", "TEXT_PROMPT_TOOLTIP_TEXT": "Prašyti vartotoją įvesti tekstą.", "TEXT_COUNT_MESSAGE0": "skaičius %1 iš %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Suskaičiuoti, kiek kartų šis tekstas kartojasi kitame tekste.", "TEXT_REPLACE_MESSAGE0": "pakeisti %1 į %2 šiame %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Pašalinti visas teksto dalis kitame tekste.", "TEXT_REVERSE_MESSAGE0": "atbulai %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REVERSE_TOOLTIP": "Apversti teksto simbolių tvarką.", "LISTS_CREATE_EMPTY_TITLE": "tuščias sąrašas", "LISTS_CREATE_EMPTY_TOOLTIP": "Grąžina sąrašą, ilgio 0, neturintį duomenų", @@ -274,7 +261,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "iki # nuo galo", "LISTS_GET_SUBLIST_END_LAST": "iki galo", "LISTS_GET_SUBLIST_TOOLTIP": "Sukuria nurodytos sąrašo dalies kopiją.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "rūšiuoti %1 %2 %3", "LISTS_SORT_TOOLTIP": "Rūšiuoti sąrašo kopiją.", "LISTS_SORT_ORDER_ASCENDING": "didėjančia tvarka", @@ -296,9 +282,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Sukuria funkciją - komandą, kuri ne tik atlieka veiksmus bet ir pateikia (grąžina/duoda) rezultatą.", "PROCEDURES_ALLOW_STATEMENTS": "leisti vidinius veiksmus", "PROCEDURES_DEF_DUPLICATE_WARNING": "Ši komanda turi du vienodus gaunamų duomenų pavadinimus.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Vykdyti sukurtą komandą \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Įvykdyti komandą \"%1\" ir naudoti jos suskaičiuotą (atiduotą) reikšmę.", "PROCEDURES_MUTATORCONTAINER_TITLE": "gaunami duomenys (parametrai)", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tvarkyti komandos gaunamus duomenis (parametrus).", diff --git a/msg/json/lv.json b/msg/json/lv.json index 04ae055e6b9..a0e90dc1d0b 100644 --- a/msg/json/lv.json +++ b/msg/json/lv.json @@ -86,7 +86,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Pievienot, noņemt vai mainīt sekciju secību šim \"ja\" blokam.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Pievienot nosacījumu \"ja\" blokam.", "CONTROLS_IF_ELSE_TOOLTIP": "Pievienot gala nosacījumu \"ja\" blokam.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Patiess, ja abas puses ir vienādas.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Patiess, ja abas puses nav vienādas.", "LOGIC_COMPARE_TOOLTIP_LT": "Patiess, ja kreisā puse ir mazāka par labo pusi.", @@ -110,13 +109,11 @@ "LOGIC_TERNARY_TOOLTIP": "Pārbaudīt nosacījumu. Ja 'nosacījums' ir patiess, atgriež vērtību 'ja patiess', pretējā gadījumā vērtību 'ja aplams'.", "MATH_NUMBER_HELPURL": "https://lv.wikipedia.org/wiki/Skaitlis", "MATH_NUMBER_TOOLTIP": "Skaitlis.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Atgriež divu skaitļu summu.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Atgriež divu skaitļu starpību.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Atgriež divu skaitļu reizinājumu.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Atgriež divu skaitļu dalījumu.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Atgriež pirmo skaitli kāpinātu pakāpē otrais skaitlis.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "kvadrātsakne", "MATH_SINGLE_TOOLTIP_ROOT": "Atgriež skaitļa kvadrātsakni.", "MATH_SINGLE_OP_ABSOLUTE": "absolūtā vērtība", @@ -126,14 +123,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Atgriež skaitļa logaritmu pie bāzes 10.", "MATH_SINGLE_TOOLTIP_EXP": "Atgriež e pakāpē dotais skaitlis.", "MATH_SINGLE_TOOLTIP_POW10": "Atgriež 10 pakāpē dotais skaitlis.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Sinuss no grādiem (nevis radiāniem).", "MATH_TRIG_TOOLTIP_COS": "Kosinuss no grādiem (nevis radiāniem).", "MATH_TRIG_TOOLTIP_TAN": "Tangenss no grādiem (nevis radiāniem).", "MATH_TRIG_TOOLTIP_ASIN": "Arksinuss (grādos).", "MATH_TRIG_TOOLTIP_ACOS": "Arkkosinuss (grādos).", "MATH_TRIG_TOOLTIP_ATAN": "Arktangenss (grādos).", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Atgriež kādu no matemātikas konstantēm: π (3.141…), e (2.718…), φ (1.618…), √(2) (1.414…), √(½) (0.707…), ∞ (bezgalība).", "MATH_IS_EVEN": "ir pāra", "MATH_IS_ODD": "ir nepāra", @@ -143,10 +138,8 @@ "MATH_IS_NEGATIVE": "ir negatīvs", "MATH_IS_DIVISIBLE_BY": "dalās bez atlikuma ar", "MATH_IS_TOOLTIP": "Pārbauda, vai skaitlis ir pāra, nepāra, vesels, pozitīvs, negatīvs vai dalās ar noteiktu skaitli. Atgriež \"patiess\" vai \"aplams\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "izmainīt %1 par %2", "MATH_CHANGE_TOOLTIP": "Pieskaitīt doto skaitli mainīgajam '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Noapaļot skaitli uz augšu vai uz leju.", "MATH_ROUND_OPERATOR_ROUND": "noapaļot", "MATH_ROUND_OPERATOR_ROUNDUP": "apaļot uz augšu", @@ -167,21 +160,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Atgriež dotā saraksta standartnovirzi.", "MATH_ONLIST_OPERATOR_RANDOM": "nejaušs", "MATH_ONLIST_TOOLTIP_RANDOM": "Atgriež nejauši izvēlētu vērtību no dotā saraksta.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "atlikums no %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Atlikums no divu skaitļu dalījuma.", "MATH_CONSTRAIN_TITLE": "ierobežot %1 no %2 līdz %3", "MATH_CONSTRAIN_TOOLTIP": "Ierobežo skaitli no noteiktajās robežās (ieskaitot galapunktus).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "nejaušs vesels skaitlis no %1 līdz %2", "MATH_RANDOM_INT_TOOLTIP": "Atgriež nejaušu veselu skaitli dotajās robežās (iekļaujot galapunktus)", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "nejaušs skaitlis [0..1)", "MATH_RANDOM_FLOAT_TOOLTIP": "Atgriež nejaušu reālo skaitli robežās no 0 (iekļaujot) līdz 1 (neiekļaujot).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "ATAN2 no X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Atgriezt arktangensu punktam (X, Y) grādos no -180 līdz 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Burts, vārds vai jebkāda teksta rinda.", "TEXT_JOIN_TITLE_CREATEWITH": "veidot tekstu no", "TEXT_JOIN_TOOLTIP": "Izveidot tekstu savienojot dotos argumentus.", @@ -289,7 +277,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "līdz pozīcijai no beigām", "LISTS_GET_SUBLIST_END_LAST": "līdz beigām", "LISTS_GET_SUBLIST_TOOLTIP": "Nokopēt daļu no dotā saraksta.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "Sakārtot sarakstu no %3 elementiem %2 secībā %1", "LISTS_SORT_TOOLTIP": "Saraksta sakārtota kopija.", "LISTS_SORT_ORDER_ASCENDING": "augošā", @@ -319,9 +306,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Izveido funkciju, kas atgriež rezultātu.", "PROCEDURES_ALLOW_STATEMENTS": "atļaut apakškomandas", "PROCEDURES_DEF_DUPLICATE_WARNING": "Brīdinājums: funkcijai ir vienādi argumenti.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Izpildīt iepriekš definētu funkcju '%1' un izmantot tās rezultātu.", "PROCEDURES_MUTATORCONTAINER_TITLE": "argumenti", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Pievienot, pārkārtot vai dzēst funkcijas argumentus.", diff --git a/msg/json/mk.json b/msg/json/mk.json index aa367f52b19..b79d45c5034 100644 --- a/msg/json/mk.json +++ b/msg/json/mk.json @@ -170,7 +170,6 @@ "PROCEDURES_DEFNORETURN_COMMENT": "Опишете ја оваа функција...", "PROCEDURES_DEFRETURN_RETURN": "назад", "PROCEDURES_ALLOW_STATEMENTS": "дозволи тврдења", - "PROCEDURES_CALLNORETURN_HELPURL": "https://mk.wikipedia.org/wiki/Потпрограма", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Додај, отстрани или пренареди ги влезните параметри за оваа функција.", "PROCEDURES_CREATE_DO": "Создај го '%1'", "WORKSPACE_ARIA_LABEL": "Работен простор на Blockly", diff --git a/msg/json/mnw.json b/msg/json/mnw.json index cbb4db5f79b..62f8c4271c4 100644 --- a/msg/json/mnw.json +++ b/msg/json/mnw.json @@ -40,7 +40,6 @@ "DELETE_VARIABLE_CONFIRMATION": "ဇိုတ်ပလီု %1 တုဲ ရပ်စပ် '%2' နဒဒှ်မပြံင်လှာဲဟာ?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "မပြံင်လှာဲ '%1' ဂှ် ဇိုတ်ပလီု ဟွံဂွံ၊ ဟိုတ်နူ ဍေဟ်ဂှ် ဆက်စပ်ဒၟံင် ကုဝှင်ရှေန် '%2'", "DELETE_VARIABLE": "ဇိုတ်ပလီု အပြံင်အလှာဲ '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "ရုဲကေတ် အသာ် မွဲ နူကဵု ဖလာတ်", "COLOUR_RANDOM_TITLE": "ဇျောမ်ကေတ် အသာ်", "COLOUR_RANDOM_TOOLTIP": "ရုဲစှ်ကေတ် အသာ် မွဲ ပ္ဍဲ ဇဟောမ်", @@ -54,7 +53,6 @@ "COLOUR_BLEND_COLOUR2": "အသာ် ၂", "COLOUR_BLEND_RATIO": "ဗၞတ်ဗ္ၜတ်", "COLOUR_BLEND_TOOLTIP": "ပနှဴ အသာ် ၜါ နကဵု ဗၞတ်ဗ္ၜတ် (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ထပ်ဂလိုင်ပတိုန် %1 နာဍဳ", "CONTROLS_REPEAT_INPUT_DO": "ပ", "CONTROLS_REPEAT_TOOLTIP": "ကၠောန်ပတိတ် လလောင်တြး မဂၠိုင် ကုအလန်၊၊", @@ -85,10 +83,7 @@ "LOGIC_TERNARY_CONDITION": "စမ်ၜတ်", "LOGIC_TERNARY_IF_TRUE": "ယဝ်ဍာံ", "LOGIC_TERNARY_IF_FALSE": "ယဝ်ဗၠေတ်", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "မဂၞန်မွဲ", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ABSOLUTE": "ဍာံဍာံ", "DIALOG_CANCEL": "တးပဲါ" } diff --git a/msg/json/ms.json b/msg/json/ms.json index 854cbfdf303..539eb129bdc 100644 --- a/msg/json/ms.json +++ b/msg/json/ms.json @@ -42,7 +42,6 @@ "COLOUR_BLEND_COLOUR2": "warna 2", "COLOUR_BLEND_RATIO": "nisbah", "COLOUR_BLEND_TOOLTIP": "Campurkan dua warna sekali pada nisbah yang ditentukan (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ulang %1 kali", "CONTROLS_REPEAT_INPUT_DO": "lakukan", "CONTROLS_REPEAT_TOOLTIP": "Lakukan perintah berulang kali.", @@ -93,11 +92,6 @@ "LOGIC_TERNARY_TOOLTIP": "Check the condition in 'test'. If the condition is true, returns the 'if true' value; otherwise returns the 'if false' value.", "MATH_NUMBER_HELPURL": "https://ms.wikipedia.org/wiki/Nombor", "MATH_NUMBER_TOOLTIP": "Suatu nombor.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -140,7 +134,6 @@ "MATH_CHANGE_HELPURL": "https://id.wikipedia.org/wiki/Perjumlahan", "MATH_CHANGE_TITLE": "perubahan %1 oleh %2", "MATH_CHANGE_TOOLTIP": "Tambah nombor kepada pembolehubah '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Bulat nombor yang naik atau turun.", "MATH_ROUND_OPERATOR_ROUND": "pusingan", "MATH_ROUND_OPERATOR_ROUNDUP": "pusingan ke atas", @@ -166,10 +159,8 @@ "MATH_MODULO_TOOLTIP": "Taip balik baki yang didapat daripada pembahagian dua nombor tersebut.", "MATH_CONSTRAIN_TITLE": "constrain %1 low %2 high %3", "MATH_CONSTRAIN_TOOLTIP": "Constrain a number to be between the specified limits (inclusive).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "integer rawak dari %1ke %2", "MATH_RANDOM_INT_TOOLTIP": "Kembalikan integer rawak diantara dua had yang ditentukan, inklusif.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "pecahan rawak", "MATH_RANDOM_FLOAT_TOOLTIP": "Kembali sebahagian kecil rawak antara 0.0 (inklusif) dan 1.0 (eksklusif).", "TEXT_TEXT_HELPURL": "https://ms.wikipedia.org/wiki/Rentetan", @@ -218,7 +209,6 @@ "TEXT_PROMPT_TOOLTIP_TEXT": "Peringatkan pengguna untuk sebahagian teks.", "LISTS_CREATE_EMPTY_TITLE": "Wujudkan senarai kosong", "LISTS_CREATE_EMPTY_TOOLTIP": "Kembalikan senarai panjang 0, yang tidak mengandungi rekod data", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Wujudkan senarai dengan apa jua nombor item.", "LISTS_CREATE_WITH_INPUT_WITH": "wujudkan senarai dengan", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "senarai", @@ -274,7 +264,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ke # dari akhir", "LISTS_GET_SUBLIST_END_LAST": "ke akhir", "LISTS_GET_SUBLIST_TOOLTIP": "Wujudkan salinan bahagian yang ditentukan dari senarai.", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "buat senarai dgn teks", "LISTS_SPLIT_TEXT_FROM_LIST": "buat teks drpd senarai", "LISTS_SPLIT_WITH_DELIMITER": "dengan delimiter", @@ -295,9 +284,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Mencipta satu fungsi dengan pengeluaran.", "PROCEDURES_ALLOW_STATEMENTS": "bolehkan kenyataan", "PROCEDURES_DEF_DUPLICATE_WARNING": "Amaran: Fungsi ini mempunyai parameter yang berganda.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://ms.wikipedia.org/wiki/Fungsi", "PROCEDURES_CALLNORETURN_TOOLTIP": "Run the user-defined function '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://ms.wikipedia.org/wiki/Fungsi", "PROCEDURES_CALLRETURN_TOOLTIP": "Run the user-defined function '%1' and use its output.", "PROCEDURES_MUTATORCONTAINER_TITLE": "Input-input", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Tambah, alih keluar atau susun semula input pada fungsi ini.", @@ -306,7 +293,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Serlahkan definisi fungsi", "PROCEDURES_CREATE_DO": "Hasilkan '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "If a value is true, then return a second value.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Amaran: Blok ini hanya boleh digunakan dalam fungsi definisi.", "DIALOG_OK": "OK", "DIALOG_CANCEL": "Batalkan" diff --git a/msg/json/nb.json b/msg/json/nb.json index 394e29701a9..354b0a07e72 100644 --- a/msg/json/nb.json +++ b/msg/json/nb.json @@ -43,23 +43,19 @@ "DELETE_VARIABLE_CONFIRMATION": "Slett %1 bruk av variabelen «%2»?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Kan ikke slette variabelen «%1» fordi den er del av definisjonen for funksjonen «%2»", "DELETE_VARIABLE": "Slett variabelen «%1»", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Velg en farge fra paletten.", "COLOUR_RANDOM_TITLE": "tilfeldig farge", "COLOUR_RANDOM_TOOLTIP": "Velg en tilfeldig farge.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "farge med", "COLOUR_RGB_RED": "rød", "COLOUR_RGB_GREEN": "grønn", "COLOUR_RGB_BLUE": "blå", "COLOUR_RGB_TOOLTIP": "Lag en farge med angitt verdi av rød, grønn og blå. Alle verdier må være mellom 0 og 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "blande", "COLOUR_BLEND_COLOUR1": "farge 1", "COLOUR_BLEND_COLOUR2": "farge 2", "COLOUR_BLEND_RATIO": "forhold", "COLOUR_BLEND_TOOLTIP": "Blander to farger sammen med et gitt forhold (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "gjenta %1 ganger", "CONTROLS_REPEAT_INPUT_DO": "gjør", "CONTROLS_REPEAT_TOOLTIP": "Gjenta noen instruksjoner flere ganger.", @@ -86,7 +82,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Legg til, fjern eller flytt seksjoner i denne hvis-blokken.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Legg til en betingelse til hvis blokken.", "CONTROLS_IF_ELSE_TOOLTIP": "Legg til hva som skal skje hvis de andre ikke slår til.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Returnerer sann hvis begge inputene er like hverandre.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Returnerer sant hvis begge argumentene er ulike hverandre.", "LOGIC_COMPARE_TOOLTIP_LT": "Returnerer sant hvis det første argumentet er mindre enn det andre argumentet.", @@ -102,21 +97,14 @@ "LOGIC_BOOLEAN_TRUE": "sann", "LOGIC_BOOLEAN_FALSE": "usann", "LOGIC_BOOLEAN_TOOLTIP": "Returnerer enten sann eller usann.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "null", "LOGIC_NULL_TOOLTIP": "Returnerer null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "hvis sant", "LOGIC_TERNARY_IF_FALSE": "hvis usant", "LOGIC_TERNARY_TOOLTIP": "Sjekk betingelsen i 'test'. Hvis betingelsen er sann, da returneres 'hvis sant' verdien. Hvis ikke returneres 'hvis usant' verdien.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Et tall.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -129,7 +117,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returner produktet av to tall.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returner kvotienten av to tall.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Returner det første tallet opphøyd i den andre tallet.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "kvadratrot", "MATH_SINGLE_TOOLTIP_ROOT": "Returner kvadratroten av et tall.", "MATH_SINGLE_OP_ABSOLUTE": "absoluttverdi", @@ -139,14 +126,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Returner base-10 logaritmen til et tall.", "MATH_SINGLE_TOOLTIP_EXP": "Returner e opphøyd i et tall.", "MATH_SINGLE_TOOLTIP_POW10": "Returner 10 opphøyd i et tall.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Returner sinus av en vinkel (ikke radian).", "MATH_TRIG_TOOLTIP_COS": "Returner cosinus av en vinkel (ikke radian).", "MATH_TRIG_TOOLTIP_TAN": "Returner tangenten av en vinkel (ikke radian).", "MATH_TRIG_TOOLTIP_ASIN": "Returner arcsinus til et tall.", "MATH_TRIG_TOOLTIP_ACOS": "Returner arccosinus til et tall.", "MATH_TRIG_TOOLTIP_ATAN": "Returner arctangens til et tall.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Returner en av felleskonstantene π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), eller ∞ (uendelig).", "MATH_IS_EVEN": "er et partall", "MATH_IS_ODD": "er et oddetall", @@ -156,10 +141,8 @@ "MATH_IS_NEGATIVE": "er negativer negativt", "MATH_IS_DIVISIBLE_BY": "er delelig med", "MATH_IS_TOOLTIP": "Sjekk om et tall er et partall, oddetall, primtall, heltall, positivt, negativt, eller om det er delelig med et annet tall. Returnerer sant eller usant.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "endre %1 ved %2", "MATH_CHANGE_TOOLTIP": "Addere et tall til variabelen '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Avrund et tall ned eller opp.", "MATH_ROUND_OPERATOR_ROUND": "avrunding", "MATH_ROUND_OPERATOR_ROUNDUP": "rund opp", @@ -180,20 +163,15 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Returner listens standardavvik.", "MATH_ONLIST_OPERATOR_RANDOM": "tilfeldig element i listen", "MATH_ONLIST_TOOLTIP_RANDOM": "Returner et tilfeldig element fra listen.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "resten av %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Returner resten fra delingen av to tall.", "MATH_CONSTRAIN_TITLE": "begrense %1 lav %2 høy %3", "MATH_CONSTRAIN_TOOLTIP": "Begrens et tall til å være mellom de angitte grenseverdiene (inklusiv).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "Et tilfeldig heltall mellom %1 og %2", "MATH_RANDOM_INT_TOOLTIP": "Returner et tilfeldig tall mellom de to spesifiserte grensene, inkludert de to.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "tilfeldig flyttall", "MATH_RANDOM_FLOAT_TOOLTIP": "Returner et tilfeldig flyttall mellom 0.0 (inkludert) og 1.0 (ikke inkludert).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 av X:%1 Y:%2", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "En bokstav, ett ord eller en linje med tekst.", "TEXT_JOIN_TITLE_CREATEWITH": "lag tekst med", "TEXT_JOIN_TOOLTIP": "Opprett en tekst ved å sette sammen et antall elementer.", @@ -216,7 +194,6 @@ "TEXT_CHARAT_FIRST": "hent første bokstav", "TEXT_CHARAT_LAST": "hent den siste bokstaven", "TEXT_CHARAT_RANDOM": "hent en tilfeldig bokstav", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "Returnerer bokstaven på angitt plassering.", "TEXT_GET_SUBSTRING_TOOLTIP": "Returnerer den angitte delen av teksten.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "i tekst", @@ -226,7 +203,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "til bokstav #", "TEXT_GET_SUBSTRING_END_FROM_END": "til bokstav # fra slutten", "TEXT_GET_SUBSTRING_END_LAST": "til siste bokstav", - "TEXT_GET_SUBSTRING_TAIL": "", "TEXT_CHANGECASE_TOOLTIP": "Returnerer en kopi av teksten der store og små bokstaver er byttet om.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "til STORE BOKSTAVER", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "til små bokstaver", @@ -242,15 +218,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Be brukeren om et tall.", "TEXT_PROMPT_TOOLTIP_TEXT": "Spør brukeren om tekst.", "TEXT_COUNT_MESSAGE0": "tell %1 i %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Tell hvor mange ganger noe tekst dukker opp i annen tekst.", "TEXT_REPLACE_MESSAGE0": "erstatt %1 med %2 i %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Erstatter alle forekomster av noe tekst i en annen tekst.", "TEXT_REVERSE_MESSAGE0": "reverser %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Reverserer rekkefølgen på tegnene i teksten.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "opprett en tom liste", "LISTS_CREATE_EMPTY_TOOLTIP": "Returnerer en tom liste, altså med lengde 0", "LISTS_CREATE_WITH_TOOLTIP": "Lag en liste med et vilkårlig antall elementer.", @@ -276,7 +248,6 @@ "LISTS_GET_INDEX_FIRST": "først", "LISTS_GET_INDEX_LAST": "siste", "LISTS_GET_INDEX_RANDOM": "tilfeldig", - "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 er det første elementet.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 er det siste elementet.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Returner elementet på den angitte posisjonen i en liste.", @@ -308,9 +279,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "til #", "LISTS_GET_SUBLIST_END_FROM_END": "til # fra slutten", "LISTS_GET_SUBLIST_END_LAST": "til siste", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Kopiérer en ønsket del av en liste.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sorter %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sorter en kopi av en liste.", "LISTS_SORT_ORDER_ASCENDING": "stigende", @@ -323,7 +292,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "med avgrenser", "LISTS_SPLIT_TOOLTIP_SPLIT": "Splitt teksten til en liste med tekster, brutt ved hver avgrenser.", "LISTS_SPLIT_TOOLTIP_JOIN": "Føy sammen en liste tekster til én tekst, avskilt av en avgrenser.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "reverser %1", "LISTS_REVERSE_TOOLTIP": "Reverser en kopi av ei liste.", "VARIABLES_GET_TOOLTIP": "Returnerer verdien av denne variabelen.", @@ -331,22 +299,17 @@ "VARIABLES_SET": "sett %1 til %2", "VARIABLES_SET_TOOLTIP": "Setter verdien av denne variablen lik parameteren.", "VARIABLES_SET_CREATE_GET": "Opprett 'hent %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "til", "PROCEDURES_DEFNORETURN_PROCEDURE": "gjør noe", "PROCEDURES_BEFORE_PARAMS": "med:", "PROCEDURES_CALL_BEFORE_PARAMS": "med:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Opprett en funksjon som ikke har noe resultat.", "PROCEDURES_DEFNORETURN_COMMENT": "Beskriv denne funksjonen…", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "returner", "PROCEDURES_DEFRETURN_TOOLTIP": "Oppretter en funksjon som har et resultat.", "PROCEDURES_ALLOW_STATEMENTS": "tillat uttalelser", "PROCEDURES_DEF_DUPLICATE_WARNING": "Advarsel: Denne funksjonen har duplikate parametere.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Kjør den brukerdefinerte funksjonen'%1' og bruk resultatet av den.", "PROCEDURES_MUTATORCONTAINER_TITLE": "parametere", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Legg til, fjern eller endre rekkefølgen på input til denne funksjonen.", diff --git a/msg/json/ne.json b/msg/json/ne.json index edfab8ce4f9..1d502b05d75 100644 --- a/msg/json/ne.json +++ b/msg/json/ne.json @@ -1,6 +1,8 @@ { "@metadata": { "authors": [ + "Bada Kaji", + "बडा काजी", "सरोज कुमार ढकाल" ] }, @@ -42,5 +44,5 @@ "MATH_IS_NEGATIVE": "ऋणात्मक संख्या हो", "PROCEDURES_MUTATORCONTAINER_TITLE": "इन्पुटहरू", "DIALOG_OK": "हुन्छ", - "DIALOG_CANCEL": "रद्द गर्ने" + "DIALOG_CANCEL": "रद्द गर्नुहोस्" } diff --git a/msg/json/nl.json b/msg/json/nl.json index c59ed69d86f..00c2fd96a60 100644 --- a/msg/json/nl.json +++ b/msg/json/nl.json @@ -59,13 +59,11 @@ "COLOUR_PICKER_TOOLTIP": "Kies een kleur in het palet.", "COLOUR_RANDOM_TITLE": "willekeurige kleur", "COLOUR_RANDOM_TOOLTIP": "Kies een willekeurige kleur.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "kleuren met", "COLOUR_RGB_RED": "rood", "COLOUR_RGB_GREEN": "groen", "COLOUR_RGB_BLUE": "blauw", "COLOUR_RGB_TOOLTIP": "Maak een kleur met de opgegeven hoeveelheid rood, groen en blauw. Alle waarden moeten tussen 0 en 100 liggen.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "mengen", "COLOUR_BLEND_COLOUR1": "kleur 1", "COLOUR_BLEND_COLOUR2": "kleur 2", @@ -75,23 +73,19 @@ "CONTROLS_REPEAT_TITLE": "%1 keer herhalen", "CONTROLS_REPEAT_INPUT_DO": "voer uit", "CONTROLS_REPEAT_TOOLTIP": "Voer een aantal opdrachten meerdere keren uit.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "herhalen zolang", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "herhalen totdat", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Terwijl een waarde waar is de volgende opdrachten uitvoeren.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Terwijl een waarde onwaar is de volgende opdrachten uitvoeren.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Laat de variabele \"%1\" de waarden aannemen van het beginnummer tot het laatste nummer, tellende met het opgegeven interval, en met uitvoering van de opgegeven blokken.", "CONTROLS_FOR_TITLE": "rekenen met %1 van %2 tot %3 in stappen van %4", "CONTROLS_FOREACH_TITLE": "voor ieder item %1 in lijst %2", "CONTROLS_FOREACH_TOOLTIP": "Voor ieder item in een lijst, stel de variabele \"%1\" in op het item en voer daarna opdrachten uit.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "uit lus breken", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "doorgaan met de volgende iteratie van de lus", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Uit de bovenliggende lus breken.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "De rest van deze lus overslaan en doorgaan met de volgende herhaling.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden in een lus.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Als een waarde waar is, voer dan opdrachten uit.", "CONTROLS_IF_TOOLTIP_2": "Als een waarde waar is, voert dan het eerste blok met opdrachten uit. Voer andere het tweede blok met opdrachten uit.", "CONTROLS_IF_TOOLTIP_3": "Als de eerste waarde waar is, voer dan het eerste blok met opdrachten uit. Voer anders, als de tweede waarde waar is, het tweede blok met opdrachten uit.", @@ -109,33 +103,23 @@ "LOGIC_COMPARE_TOOLTIP_LTE": "Geeft \"waar\" terug als de eerste invoer kleiner of gelijk is aan de tweede invoer.", "LOGIC_COMPARE_TOOLTIP_GT": "Geeft \"waar\" terug als de eerste invoer meer is dan de tweede invoer.", "LOGIC_COMPARE_TOOLTIP_GTE": "Geeft \"waar\" terug als de eerste invoer groter is of gelijk aan de tweede invoer.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Geeft waar als beide waarden waar zijn.", "LOGIC_OPERATION_AND": "en", "LOGIC_OPERATION_TOOLTIP_OR": "Geeft \"waar\" terug als in ieder geval één van de waarden waar is.", "LOGIC_OPERATION_OR": "of", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "niet %1", "LOGIC_NEGATE_TOOLTIP": "Geeft \"waar\" terug als de invoer \"onwaar\" is. Geeft \"onwaar\" als de invoer \"waar\" is.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", "LOGIC_BOOLEAN_TRUE": "waar", "LOGIC_BOOLEAN_FALSE": "onwaar", "LOGIC_BOOLEAN_TOOLTIP": "Geeft \"waar\" of \"onwaar\" terug.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "niets", "LOGIC_NULL_TOOLTIP": "Geeft niets terug.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "als waar", "LOGIC_TERNARY_IF_FALSE": "als onwaar", "LOGIC_TERNARY_TOOLTIP": "Test de voorwaarde in \"test\". Als de voorwaarde \"waar\" is, geef de waarde van \"als waar\" terug; geef anders de waarde van \"als onwaar\" terug.", "MATH_NUMBER_HELPURL": "https://nl.wikipedia.org/wiki/Getal_%28wiskunde%29", "MATH_NUMBER_TOOLTIP": "Een getal.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -175,7 +159,6 @@ "MATH_IS_NEGATIVE": "is negatief", "MATH_IS_DIVISIBLE_BY": "is deelbaar door", "MATH_IS_TOOLTIP": "Test of een getal even, oneven, een priemgetal, geheel, positief of negatief is, of deelbaar is door een bepaald getal. Geeft \"waar\" of \"onwaar\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%1 wijzigen met %2", "MATH_CHANGE_TOOLTIP": "Voegt een getal toe aan variabele \"%1\".", "MATH_ROUND_HELPURL": "https://nl.wikipedia.org/wiki/Afronden", @@ -210,32 +193,25 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://nl.wikipedia.org/wiki/Toevalsgenerator", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "willekeurige fractie", "MATH_RANDOM_FLOAT_TOOLTIP": "Geeft een willekeurige fractie tussen 0.0 (inclusief) en 1.0 (exclusief).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 van X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Geef de boogtangens van punt (X, Y) terug in graden tussen -180 naar 180.", "TEXT_TEXT_HELPURL": "https://nl.wikipedia.org/wiki/String_%28informatica%29", "TEXT_TEXT_TOOLTIP": "Een letter, woord of een regel tekst.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "maak tekst met", "TEXT_JOIN_TOOLTIP": "Maakt een stuk tekst door één of meer items samen te voegen.", "TEXT_CREATE_JOIN_TITLE_JOIN": "samenvoegen", "TEXT_CREATE_JOIN_TOOLTIP": "Toevoegen, verwijderen of volgorde wijzigen van secties om dit tekstblok opnieuw in te stellen.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Voegt een item aan de tekst toe.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "voor%1 voeg tekst toe van %2", "TEXT_APPEND_TOOLTIP": "Voeg tekst toe aan de variabele \"%1\".", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "lengte van %1", "TEXT_LENGTH_TOOLTIP": "Geeft het aantal tekens terug (inclusief spaties) in de opgegeven tekst.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1 is leeg", "TEXT_ISEMPTY_TOOLTIP": "Geeft \"waar\" terug, als de opgegeven tekst leeg is.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van de eerste tekst in de tweede tekst. Geeft %1 terug als de tekst niet gevonden is.", "TEXT_INDEXOF_TITLE": "in tekst %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "zoek eerste voorkomen van tekst", "TEXT_INDEXOF_OPERATOR_LAST": "zoek het laatste voorkomen van tekst", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "in tekst %1 %2", "TEXT_CHARAT_FROM_START": "haal letter # op", "TEXT_CHARAT_FROM_END": "haal letter # op vanaf einde", @@ -244,7 +220,6 @@ "TEXT_CHARAT_RANDOM": "haal willekeurige letter op", "TEXT_CHARAT_TOOLTIP": "Geeft de letter op de opgegeven positie terug.", "TEXT_GET_SUBSTRING_TOOLTIP": "Geeft het opgegeven onderdeel van de tekst terug.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "in tekst", "TEXT_GET_SUBSTRING_START_FROM_START": "haal subtekst op vanaf letter #", "TEXT_GET_SUBSTRING_START_FROM_END": "haal subtekst op vanaf letter # vanaf einde", @@ -252,20 +227,16 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "naar letter #", "TEXT_GET_SUBSTRING_END_FROM_END": "van letter # tot einde", "TEXT_GET_SUBSTRING_END_LAST": "naar laatste letter", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "Geef een kopie van de tekst met veranderde hoofdletters terug.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "naar HOOFDLETTERS", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "naar kleine letters", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "naar Hoofdletter Per Woord", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "Geeft een kopie van de tekst met verwijderde spaties van één of beide kanten.", "TEXT_TRIM_OPERATOR_BOTH": "spaties van beide kanten afhalen van", "TEXT_TRIM_OPERATOR_LEFT": "spaties van de linkerkant verwijderen van", "TEXT_TRIM_OPERATOR_RIGHT": "spaties van de rechterkant verwijderen van", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "tekst weergeven: %1", "TEXT_PRINT_TOOLTIP": "Drukt de opgegeven tekst, getal of een andere waarde af.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "vraagt om invoer met bericht", "TEXT_PROMPT_TYPE_NUMBER": "vraagt de gebruiker om een getal met de tekst", "TEXT_PROMPT_TOOLTIP_NUMBER": "Vraagt de gebruiker om een getal in te voeren.", @@ -276,7 +247,6 @@ "TEXT_REPLACE_TOOLTIP": "Vervang alle voorkomens van tekst in een andere tekst.", "TEXT_REVERSE_MESSAGE0": "%1 omkeren", "TEXT_REVERSE_TOOLTIP": "Keert de volgorde van de tekens in de tekst om.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "maak een lege lijst", "LISTS_CREATE_EMPTY_TOOLTIP": "Geeft een lijst terug met lengte 0, zonder items", "LISTS_CREATE_WITH_TOOLTIP": "Maak een lijst met een willekeurig aantal items.", @@ -284,16 +254,13 @@ "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lijst", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Voeg stukken toe, verwijder ze of wijzig de volgorde om dit lijstblok aan te passen.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Voeg iets toe aan de lijst.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "Maakt een lijst die bestaat uit de opgegeven waarde, het opgegeven aantal keer herhaald.", "LISTS_REPEAT_TITLE": "Maak lijst met item %1, %2 keer herhaald", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "lengte van %1", "LISTS_LENGTH_TOOLTIP": "Geeft de lengte van een lijst terug.", "LISTS_ISEMPTY_TITLE": "%1 is leeg", "LISTS_ISEMPTY_TOOLTIP": "Geeft waar terug als de lijst leeg is.", "LISTS_INLIST": "in lijst", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "zoek eerste voorkomen van item", "LISTS_INDEX_OF_LAST": "zoek laatste voorkomen van item", "LISTS_INDEX_OF_TOOLTIP": "Geeft de index terug van het eerste of laatste voorkomen van een item in de lijst. Geeft %1 terug als het item niet is gevonden.", @@ -319,7 +286,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Verwijdert het eerste item in een lijst.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Verwijdert het laatste item uit een lijst.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Verwijdert een willekeurig item uit een lijst.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "stel in", "LISTS_SET_INDEX_INSERT": "tussenvoegen op", "LISTS_SET_INDEX_INPUT_TO": "als", @@ -331,7 +297,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Voegt het item toe aan het begin van de lijst.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Voeg het item aan het einde van een lijst toe.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Voegt het item op een willekeurige positie in de lijst in.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "haal sublijst op vanaf positie", "LISTS_GET_SUBLIST_START_FROM_END": "haal sublijst op van positie vanaf einde", "LISTS_GET_SUBLIST_START_FIRST": "haal sublijst op vanaf eerste", @@ -339,7 +304,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "naar # vanaf einde", "LISTS_GET_SUBLIST_END_LAST": "naar laatste", "LISTS_GET_SUBLIST_TOOLTIP": "Maakt een kopie van het opgegeven deel van de lijst.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sorteer %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sorteer een kopie van een lijst.", "LISTS_SORT_ORDER_ASCENDING": "oplopend", @@ -354,10 +318,8 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Lijst van tekstdelen samenvoegen in één stuk tekst, waarbij de tekstdelen gescheiden zijn door een scheidingsteken.", "LISTS_REVERSE_MESSAGE0": "%1 omkeren", "LISTS_REVERSE_TOOLTIP": "Keert een kopie van een lijst om.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Geeft de waarde van deze variabele.", "VARIABLES_GET_CREATE_SET": "Maak \"verander %1\"", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "stel %1 in op %2", "VARIABLES_SET_TOOLTIP": "Verandert de waarde van de variabele naar de waarde van de invoer.", "VARIABLES_SET_CREATE_GET": "Maak 'opvragen van %1'", @@ -384,7 +346,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Accentueer functiedefinitie", "PROCEDURES_CREATE_DO": "Maak \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Als de eerste waarde \"waar\" is, geef dan de tweede waarde terug.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Waarschuwing: dit blok mag alleen gebruikt worden binnen de definitie van een functie.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Zeg iets...", "WORKSPACE_ARIA_LABEL": "Blockly werkruimte", diff --git a/msg/json/oc.json b/msg/json/oc.json index 14b8d9af315..2c6f6b508b4 100644 --- a/msg/json/oc.json +++ b/msg/json/oc.json @@ -90,14 +90,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Renvia lo logaritme decimal d’un nombre.", "MATH_SINGLE_TOOLTIP_EXP": "Renvia a la poténcia d’un nombre.", "MATH_SINGLE_TOOLTIP_POW10": "Renvia 10 a la poténcia d’un nombre.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Renvia lo sinus d’un angle en grases (pas en radians).", "MATH_TRIG_TOOLTIP_COS": "Renvia lo cosinus d’un angle en grases (pas en radians).", "MATH_TRIG_TOOLTIP_TAN": "Renvia la tangenta d’un angle en grases (pas en radians).", "MATH_TRIG_TOOLTIP_ASIN": "Renvia l’arcsinus d’un nombre.", "MATH_TRIG_TOOLTIP_ACOS": "Renvia l’arccosinus d’un nombre.", "MATH_TRIG_TOOLTIP_ATAN": "Renvia l’arctangenta d’un nombre.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_IS_EVEN": "es par", "MATH_IS_ODD": "es impar", "MATH_IS_PRIME": "es primièr", @@ -117,13 +115,9 @@ "MATH_ONLIST_OPERATOR_MODE": "majoritaris de la lista", "MATH_ONLIST_OPERATOR_STD_DEV": "escart-tipe de la lista", "MATH_ONLIST_OPERATOR_RANDOM": "element aleatòri de lista", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "residú de %1 ÷ %2", "MATH_CONSTRAIN_TITLE": "constrénher %1 entre %2 e %3", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraccion aleatòria", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Una letra, un mot o una linha de tèxte.", "TEXT_JOIN_TITLE_CREATEWITH": "crear un tèxte amb", "TEXT_CREATE_JOIN_TITLE_JOIN": "jónher", @@ -189,8 +183,6 @@ "PROCEDURES_CALL_BEFORE_PARAMS": "amb :", "PROCEDURES_DEFRETURN_RETURN": "retorn", "PROCEDURES_ALLOW_STATEMENTS": "autorizar los òrdres", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_MUTATORCONTAINER_TITLE": "entradas", "PROCEDURES_MUTATORARG_TITLE": "nom de l’entrada :", "PROCEDURES_CREATE_DO": "Crear '%1'", diff --git a/msg/json/pa.json b/msg/json/pa.json index 47b9bc8a505..e784ddc391b 100644 --- a/msg/json/pa.json +++ b/msg/json/pa.json @@ -28,7 +28,6 @@ "UNDO": "ਅਣਕੀਤਾ ਕਰੋ", "REDO": "ਮੁੜ ਕਰੋ", "CHANGE_VALUE_TITLE": "ਮੁੱਲ ਬਦਲੋ:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "ਰੰਗ-ਫੱਟੀ ਵਿੱਚੋਂ ਰੰਗ ਚੁਣੋ", "COLOUR_RANDOM_TITLE": "ਰਲ਼ਵਾਂ ਰੰਗ", "COLOUR_RANDOM_TOOLTIP": "ਰਲ਼ਵਾਂ ਰੰਗ ਚੁਣੋ", @@ -41,7 +40,6 @@ "COLOUR_BLEND_COLOUR2": "ਰੰਗ 2", "COLOUR_BLEND_RATIO": "ਅਨੁਪਾਤ", "COLOUR_BLEND_TOOLTIP": "ਦਿੱਤੇ ਅਨੁਪਾਤ (0.0 - 1.0) ਅਨੁਸਾਰ ਦੋ ਰੰਗ ਮਿਲਾਓ।", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 ਵਾਰੀ ਦੁਹਰਾਉ", "CONTROLS_REPEAT_INPUT_DO": "ਕਰੋ", "CONTROLS_IF_MSG_IF": "ਜੇ", diff --git a/msg/json/pl.json b/msg/json/pl.json index 3943f451d60..83045a07079 100644 --- a/msg/json/pl.json +++ b/msg/json/pl.json @@ -22,13 +22,14 @@ "WaldiSt", "Wojtas", "Woytecr", + "Łukasz3212", "아라" ] }, "VARIABLES_DEFAULT_NAME": "element", "UNNAMED_KEY": "bez nazwy", "TODAY": "Dzisiaj", - "DUPLICATE_BLOCK": "Powiel", + "DUPLICATE_BLOCK": "Duplikat", "ADD_COMMENT": "Dodaj Komentarz", "REMOVE_COMMENT": "Usuń komentarz", "DUPLICATE_COMMENT": "Zduplikowany komentarz", @@ -61,23 +62,19 @@ "DELETE_VARIABLE_CONFIRMATION": "Usunąć %1 wystąpień zmiennej '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nie można usunąć zmiennej '%1', ponieważ jest częścią definicji funkcji '%2'", "DELETE_VARIABLE": "Usuń zmienną '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Wybierz kolor z palety.", "COLOUR_RANDOM_TITLE": "losowy kolor", "COLOUR_RANDOM_TOOLTIP": "Wybierz kolor w sposób losowy.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "kolor z", "COLOUR_RGB_RED": "czerwony", "COLOUR_RGB_GREEN": "zielony", "COLOUR_RGB_BLUE": "niebieski", "COLOUR_RGB_TOOLTIP": "Utwórz kolor składający sie z podanej ilości czerwieni, zieleni i błękitu. Zakres wartości: 0 do 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "wymieszaj", "COLOUR_BLEND_COLOUR1": "kolor 1", "COLOUR_BLEND_COLOUR2": "kolor 2", "COLOUR_BLEND_RATIO": "proporcja", "COLOUR_BLEND_TOOLTIP": "Miesza dwa kolory w danej proporcji (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "powtórz %1 razy", "CONTROLS_REPEAT_INPUT_DO": "wykonaj", "CONTROLS_REPEAT_TOOLTIP": "Wykonaj niektóre instrukcje kilka razy.", @@ -120,21 +117,14 @@ "LOGIC_BOOLEAN_TRUE": "prawda", "LOGIC_BOOLEAN_FALSE": "fałsz", "LOGIC_BOOLEAN_TOOLTIP": "Zwraca 'prawda' lub 'fałsz'.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "nic", "LOGIC_NULL_TOOLTIP": "Zwraca nic.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "jeśli prawda", "LOGIC_TERNARY_IF_FALSE": "jeśli fałsz", "LOGIC_TERNARY_TOOLTIP": "Sprawdź warunek w „test”. Jeśli warunek jest prawdziwy, to zwróci „jeśli prawda”; jeśli nie jest prawdziwy to zwróci „jeśli fałsz”.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Liczba.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", "MATH_DIVISION_SYMBOL": "/", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tg", @@ -174,7 +164,6 @@ "MATH_IS_NEGATIVE": "jest ujemna", "MATH_IS_DIVISIBLE_BY": "jest podzielna przez", "MATH_IS_TOOLTIP": "Sprawdź, czy liczba jest parzysta, nieparzysta, pierwsza, całkowita, dodatnia, ujemna, lub czy jest podzielna przez podaną liczbę. Zwraca wartość \"prawda\" lub \"fałsz\".", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "zmień %1 o %2", "MATH_CHANGE_TOOLTIP": "Dodaj liczbę do zmiennej '%1'.", "MATH_ROUND_HELPURL": "https://pl.wikipedia.org/wiki/Zaokrąglanie", @@ -182,7 +171,6 @@ "MATH_ROUND_OPERATOR_ROUND": "zaokrąglij", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrąglij w górę", "MATH_ROUND_OPERATOR_ROUNDDOWN": "zaokrąglij w dół", - "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "suma elementów listy", "MATH_ONLIST_TOOLTIP_SUM": "Zwróć sumę wszystkich liczb z listy.", "MATH_ONLIST_OPERATOR_MIN": "minimalna wartość z listy", @@ -204,13 +192,11 @@ "MATH_MODULO_TOOLTIP": "Zwróć resztę z dzielenia dwóch liczb przez siebie.", "MATH_CONSTRAIN_TITLE": "ogranicz %1 z dołu %2 z góry %3", "MATH_CONSTRAIN_TOOLTIP": "Ogranicz liczbę, aby była w określonych granicach (włącznie).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "losowa liczba całkowita od %1 do %2", "MATH_RANDOM_INT_TOOLTIP": "Zwróć losową liczbę całkowitą w ramach dwóch wyznaczonych granic, włącznie.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "losowy ułamek", "MATH_RANDOM_FLOAT_TOOLTIP": "Zwróć losowy ułamek między 0.0 (włącznie), a 1.0 (wyłącznie).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", + "MATH_ATAN2_TITLE": "atan2 z %X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Zwraca arcus tangens punktu (X, Y) w stopniach od -180 do 180.", "TEXT_TEXT_HELPURL": "https://pl.wikipedia.org/wiki/Tekstowy_typ_danych", "TEXT_TEXT_TOOLTIP": "Litera, wyraz lub linia tekstu.", @@ -235,7 +221,6 @@ "TEXT_CHARAT_FIRST": "pobierz pierwszą literę", "TEXT_CHARAT_LAST": "pobierz ostatnią literę", "TEXT_CHARAT_RANDOM": "pobierz losową literę", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "Zwraca literę z określonej pozycji.", "TEXT_GET_SUBSTRING_TOOLTIP": "Zwraca określoną część tekstu.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "w tekście", @@ -245,7 +230,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "do # litery", "TEXT_GET_SUBSTRING_END_FROM_END": "do # litery od końca", "TEXT_GET_SUBSTRING_END_LAST": "do ostatniej litery", - "TEXT_GET_SUBSTRING_TAIL": "", "TEXT_CHANGECASE_TOOLTIP": "Zwraca kopię tekstu z odwruconą wielkością liter.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "na WIELKIE LITERY", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "na małe litery", @@ -261,14 +245,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Zapytaj użytkownika o liczbę.", "TEXT_PROMPT_TOOLTIP_TEXT": "Zapytaj użytkownika o jakiś tekst.", "TEXT_COUNT_MESSAGE0": "policz %1 w %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Liczy ile razy dany tekst występuje w innym tekście.", "TEXT_REPLACE_MESSAGE0": "zamień %1 na %2 w %3", "TEXT_REPLACE_TOOLTIP": "Zastąp wszystkie wystąpienia danego tekstu innym.", "TEXT_REVERSE_MESSAGE0": "odwróć %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Odwraca kolejność znaków w tekście.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "utwórz pustą listę", "LISTS_CREATE_EMPTY_TOOLTIP": "Zwraca listę o długości 0, nie zawierającą danych", "LISTS_CREATE_WITH_TOOLTIP": "Utwórz listę z dowolną ilością elementów.", @@ -325,9 +306,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "do #", "LISTS_GET_SUBLIST_END_FROM_END": "do # od końca", "LISTS_GET_SUBLIST_END_LAST": "do ostatniego", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Tworzy kopię żądanej części listy.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sortuj %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortuj kopię listy.", "LISTS_SORT_ORDER_ASCENDING": "rosnąco", @@ -342,21 +321,17 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Łączy listę tekstów w jeden tekst, rozdzielany separatorem.", "LISTS_REVERSE_MESSAGE0": "odwróć %1", "LISTS_REVERSE_TOOLTIP": "Odwraca kolejność danych w kopii listy.", - "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Zwraca wartość tej zmiennej.", "VARIABLES_GET_CREATE_SET": "Utwórz klocek 'ustaw %1'", "VARIABLES_SET": "przypisz %1 wartość %2", "VARIABLES_SET_TOOLTIP": "Wartości zmiennej i wejście będą identyczne.", "VARIABLES_SET_CREATE_GET": "Utwórz klocek 'pobierz %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "do", "PROCEDURES_DEFNORETURN_PROCEDURE": "zrób coś", "PROCEDURES_BEFORE_PARAMS": "z:", "PROCEDURES_CALL_BEFORE_PARAMS": "z:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Tworzy funkcję nie posiadającą wyjścia.", "PROCEDURES_DEFNORETURN_COMMENT": "Opisz tę funkcję...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "zwróć", "PROCEDURES_DEFRETURN_TOOLTIP": "Tworzy funkcję posiadającą wyjście.", "PROCEDURES_ALLOW_STATEMENTS": "zezwól na czynności", @@ -374,6 +349,7 @@ "PROCEDURES_IFRETURN_TOOLTIP": "Jeśli warunek jest spełniony zwróć drugą wartość.", "PROCEDURES_IFRETURN_WARNING": "Uwaga: Ten klocek może być używany tylko w definicji funkcji.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Powiedz coś...", + "WORKSPACE_ARIA_LABEL": "Obszar roboczy Blockly", "COLLAPSED_WARNINGS_WARNING": "Zwinięte bloki zawierają ostrzeżenia.", "DIALOG_OK": "OK", "DIALOG_CANCEL": "Anuluj" diff --git a/msg/json/pms.json b/msg/json/pms.json index f48080d1709..acee3f24a7b 100644 --- a/msg/json/pms.json +++ b/msg/json/pms.json @@ -40,7 +40,6 @@ "DELETE_VARIABLE_CONFIRMATION": "Eliminé %1 utilisassion ëd la variàbil '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "As peul nen eliminesse la variàbil '%1' përchè a l'é part ëd la definission dla fonsion '%2'", "DELETE_VARIABLE": "Eliminé la variàbil '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Serne un color ant la taulòssa.", "COLOUR_RANDOM_TITLE": "color a asar", "COLOUR_RANDOM_TOOLTIP": "Serne un color a asar.", @@ -54,7 +53,6 @@ "COLOUR_BLEND_COLOUR2": "color 2", "COLOUR_BLEND_RATIO": "rapòrt", "COLOUR_BLEND_TOOLTIP": "A mës-cia doi color ansema con un rapòrt dàit (0,0 - 1,0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "arpete %1 vire", "CONTROLS_REPEAT_INPUT_DO": "fé", "CONTROLS_REPEAT_TOOLTIP": "Eseguì chèiche anstrussion vàire vire.", @@ -81,7 +79,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Gionté, gavé o riordiné le session për cinfiguré torna ës blòch si.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Gionté na condission al blòch si.", "CONTROLS_IF_ELSE_TOOLTIP": "Gionté na condission final ch'a cheuj tut al blòch si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Rësponde ver si le doe imission a son uguaj.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Rësponde ver si le doe imission a son nen uguaj.", "LOGIC_COMPARE_TOOLTIP_LT": "Rësponde ver si la prima imission a l'é pi cita dla sconda.", @@ -103,15 +100,18 @@ "LOGIC_TERNARY_IF_TRUE": "se ver", "LOGIC_TERNARY_IF_FALSE": "se fàuss", "LOGIC_TERNARY_TOOLTIP": "Controlé la condission an 'preuva'. Se la condission a l'é vera, a rëspond con ël valor 'se ver'; dësnò a rëspond con ël valor 'se fàuss'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Un nùmer.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_TOOLTIP_ADD": "A smon la soma ëd doi nùmer.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "A smon la diferensa dij doi nùmer.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "A smon ël prodot dij doi nùmer.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "A smon ël cossient dij doi nùmer.", "MATH_ARITHMETIC_TOOLTIP_POWER": "A smon ël prim nùmer alvà a la potensa dël second.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "rèis quadra", "MATH_SINGLE_TOOLTIP_ROOT": "A smon la rèis quadra d'un nùmer.", "MATH_SINGLE_OP_ABSOLUTE": "assolù", @@ -121,14 +121,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "A smon ël logaritm an base 10 d'un nùmer.", "MATH_SINGLE_TOOLTIP_EXP": "A smon e a la potensa d'un nùmer.", "MATH_SINGLE_TOOLTIP_POW10": "A smon 10 a la potensa d'un nùmer.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "A smon ël sen ëd n'àngol an gré (pa an radiant).", "MATH_TRIG_TOOLTIP_COS": "A smon ël cosen ëd n'àngol an gré (pa an radiant).", "MATH_TRIG_TOOLTIP_TAN": "A smon la tangenta ëd n'àngol an gré (pa an radiant).", "MATH_TRIG_TOOLTIP_ASIN": "A smon l'arch-sen d'un nùmer.", "MATH_TRIG_TOOLTIP_ACOS": "A smon l'arch-cosen d'un nùmer.", "MATH_TRIG_TOOLTIP_ATAN": "A smon l'arch-tangenta d'un nùmer.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "A smon un-a dle costante comun-e π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…) o ∞ (infinì).", "MATH_IS_EVEN": "a l'é cobi", "MATH_IS_ODD": "a l'é dëscobi", @@ -138,10 +136,8 @@ "MATH_IS_NEGATIVE": "a l'é negativ", "MATH_IS_DIVISIBLE_BY": "a l'é divisìbil për", "MATH_IS_TOOLTIP": "A contròla si un nùmer a l'é cobi, dëscobi, prim, antreghm positiv, negativ, o s'a l'é divisìbil për un nùmer dàit. A rëspond ver o fàuss.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "ancrementé %1 për %2", "MATH_CHANGE_TOOLTIP": "Gionté un nùmer a la variàbil '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "A arionda un nùmer për difet o ecess.", "MATH_ROUND_OPERATOR_ROUND": "ariondé", "MATH_ROUND_OPERATOR_ROUNDUP": "ariondé për ecess", @@ -162,21 +158,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "A smon la deviassion ëstàndard ëd la lista.", "MATH_ONLIST_OPERATOR_RANDOM": "element a l'ancàpit ëd la lista", "MATH_ONLIST_TOOLTIP_RANDOM": "A smon n'element a l'ancàpit da la lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "resta ëd %1:%2", "MATH_MODULO_TOOLTIP": "A smon la resta ëd la division dij doi nùmer.", "MATH_CONSTRAIN_TITLE": "limité %1 antra %2 e %3", "MATH_CONSTRAIN_TOOLTIP": "Limité un nùmer a esse antra le limitassion ëspessificà (comprèise).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "antregh aleatòri antra %1 e %2", "MATH_RANDOM_INT_TOOLTIP": "A smon n'antregh aleatòri antra ij doi lìmit ëspessificà, comprèis.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "frassion aleatòria", "MATH_RANDOM_FLOAT_TOOLTIP": "A smon na frassion aleatòria antra 0,0 (comprèis) e 1,0 (esclus).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 ëd X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "A rëspond con l'arch-tangent dël pont (X, Y) an gre da -180 a 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Na litra, na paròla o na linia ëd test.", "TEXT_JOIN_TITLE_CREATEWITH": "creé ël test con", "TEXT_JOIN_TOOLTIP": "Creé un tòch ëd test an gionzend un nùmer qualsëssìa d'element.", @@ -223,17 +214,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Ciamé un nùmer a l'utent.", "TEXT_PROMPT_TOOLTIP_TEXT": "Ciamé un test a l'utent.", "TEXT_COUNT_MESSAGE0": "nùmer %1 su %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Conté vàire vire un test dàit a compariss an n'àutr test.", "TEXT_REPLACE_MESSAGE0": "rampiassé %1 con %2 an %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Rampiassé tute j'ocorense d'un test con n'àutr.", "TEXT_REVERSE_MESSAGE0": "Anversé %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Anversé l'òrdin dij caràter ant ël test.", "LISTS_CREATE_EMPTY_TITLE": "creé na lista veuida", "LISTS_CREATE_EMPTY_TOOLTIP": "Smon-e na lista, ëd longheur 0, ch'a conten gnun-a argistrassion", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Creé na lista con un nùmer qualsëssìa d'element.", "LISTS_CREATE_WITH_INPUT_WITH": "creé na lista con", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", @@ -252,6 +239,7 @@ "LISTS_GET_INDEX_GET": "oten-e", "LISTS_GET_INDEX_GET_REMOVE": "oten-e e eliminé", "LISTS_GET_INDEX_REMOVE": "eliminé", + "LISTS_GET_INDEX_FROM_START": "n.", "LISTS_GET_INDEX_FROM_END": "# da la fin", "LISTS_GET_INDEX_FIRST": "prim", "LISTS_GET_INDEX_LAST": "ùltim", @@ -288,7 +276,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "fin-a a # da la fin", "LISTS_GET_SUBLIST_END_LAST": "fin-a a l'ùltim", "LISTS_GET_SUBLIST_TOOLTIP": "A crea na còpia dël tòch ëspessificà ëd na lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordiné %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordiné na còpia ëd na lista.", "LISTS_SORT_ORDER_ASCENDING": "chërsent", @@ -296,13 +283,11 @@ "LISTS_SORT_TYPE_NUMERIC": "numérich", "LISTS_SORT_TYPE_TEXT": "alfabétich", "LISTS_SORT_TYPE_IGNORECASE": "alfabétich, ignorand ël caràter minùscol o majùscol", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "fé na lista da 'n test", "LISTS_SPLIT_TEXT_FROM_LIST": "fé 'n test da na lista", "LISTS_SPLIT_WITH_DELIMITER": "con ël separator", "LISTS_SPLIT_TOOLTIP_SPLIT": "Divide un test an na lista ëd test, tajand a minca 'n separator.", "LISTS_SPLIT_TOOLTIP_JOIN": "Gionze na lista ëd test ant un test sol, separandje con un separator.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "anversé %1", "LISTS_REVERSE_TOOLTIP": "Anversé na còpia ëd na lista", "VARIABLES_GET_TOOLTIP": "A smon ël valor ëd sa variàbil.", @@ -320,9 +305,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "A crea na fonsion con na surtìa.", "PROCEDURES_ALLOW_STATEMENTS": "përmëtte le diciairassion", "PROCEDURES_DEF_DUPLICATE_WARNING": "Atension: Costa fonsion a l'ha dij paràmeter duplicà.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Eseguì la fonsion '%1' definìa da l'utent e dovré sò arzultà.", "PROCEDURES_MUTATORCONTAINER_TITLE": "imission", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Gionté, gavé o riordiné j'imission ëd sa fonsion.", @@ -331,7 +314,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Sot-ligné la definission dla fonsion", "PROCEDURES_CREATE_DO": "Creé '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Se un valor a l'é ver, antlora smon-e un second valor.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Atension: Ës blòch a podria esse dovrà mach an na definission ëd fonsion.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Dì cheicòs...", "WORKSPACE_ARIA_LABEL": "Spassi ëd travaj ëd Blockly", diff --git a/msg/json/pt-br.json b/msg/json/pt-br.json index a12da981376..d2da2867244 100644 --- a/msg/json/pt-br.json +++ b/msg/json/pt-br.json @@ -197,7 +197,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://pt.wikipedia.org/wiki/Gerador_de_n%C3%BAmeros_pseudoaleat%C3%B3rios", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fração aleatória", "MATH_RANDOM_FLOAT_TOOLTIP": "Retorna uma fração aleatória entre 0.0 (inclusivo) e 1.0 (exclusivo).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Retorne o arco tangente do ponto (X, Y) em graus de -180 a 180.", "TEXT_TEXT_HELPURL": "https://pt.wikipedia.org/wiki/Cadeia_de_caracteres", @@ -225,7 +224,6 @@ "TEXT_CHARAT_RANDOM": "obter letra aleatória", "TEXT_CHARAT_TOOLTIP": "Retorna a letra na posição especificada.", "TEXT_GET_SUBSTRING_TOOLTIP": "Retorna o trecho de texto especificado.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "no texto", "TEXT_GET_SUBSTRING_START_FROM_START": "obter trecho de letra nº", "TEXT_GET_SUBSTRING_START_FROM_END": "obter trecho de letra nº a partir do final", @@ -233,49 +231,37 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "até letra nº", "TEXT_GET_SUBSTRING_END_FROM_END": "até letra nº a partir do final", "TEXT_GET_SUBSTRING_END_LAST": "até última letra", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "Retorna uma cópia do texto em um formato diferente.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "para MAIÚSCULAS", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "para minúsculas", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "para Nomes Próprios", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "Retorna uma cópia do texto com os espaços removidos de uma ou ambas extremidades.", "TEXT_TRIM_OPERATOR_BOTH": "remover espaços de ambos os lados de", "TEXT_TRIM_OPERATOR_LEFT": "remover espaços à esquerda de", "TEXT_TRIM_OPERATOR_RIGHT": "remover espaços à direita de", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "imprime %1", "TEXT_PRINT_TOOLTIP": "Imprime o texto, número ou valor especificado.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "Pede um texto com uma mensagem", "TEXT_PROMPT_TYPE_NUMBER": "Pede um número com uma mensagem", "TEXT_PROMPT_TOOLTIP_NUMBER": "Pede ao usuário um número.", "TEXT_PROMPT_TOOLTIP_TEXT": "Pede ao usuário um texto.", "TEXT_COUNT_MESSAGE0": "Contar %1 em %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Calcule quantas vezes algum texto aparece centro de algum outro texto.", "TEXT_REPLACE_MESSAGE0": "substituir %1 por %2 em %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Texto#substituindo-substrings", "TEXT_REPLACE_TOOLTIP": "Substitua todas as ocorrências de algum texto dentro de algum outro texto.", "TEXT_REVERSE_MESSAGE0": "inverter %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Texto#invertendo-texto", "TEXT_REVERSE_TOOLTIP": "Inverter a ordem dos caracteres no texto.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "criar lista vazia", "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna uma lista, de tamanho 0, contendo nenhum registro", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Cria uma lista com a quantidade de itens informada.", "LISTS_CREATE_WITH_INPUT_WITH": "criar lista com", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Acrescenta, remove ou reordena seções para reconfigurar este bloco de lista.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Acrescenta um item à lista.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "Cria uma lista consistindo no valor informado repetido o número de vezes especificado.", "LISTS_REPEAT_TITLE": "criar lista com item %1 repetido %2 vezes", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "tamanho de %1", "LISTS_LENGTH_TOOLTIP": "Retorna o tamanho de uma lista.", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1 é vazia", "LISTS_ISEMPTY_TOOLTIP": "Retorna ao verdadeiro se a lista estiver vazia.", "LISTS_INLIST": "na lista", @@ -315,7 +301,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Insere o item no início de uma lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Insere o item no final de uma lista.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Insere o item em uma posição qualquer de uma lista.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "obtém sublista de nº", "LISTS_GET_SUBLIST_START_FROM_END": "obtém sublista de nº a partir do final", "LISTS_GET_SUBLIST_START_FIRST": "obtém sublista a partir do primeiro", @@ -323,7 +308,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "até nº a partir do final", "LISTS_GET_SUBLIST_END_LAST": "até último", "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordenar %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", "LISTS_SORT_ORDER_ASCENDING": "ascendente", @@ -331,19 +315,15 @@ "LISTS_SORT_TYPE_NUMERIC": "numérico", "LISTS_SORT_TYPE_TEXT": "alfabético", "LISTS_SORT_TYPE_IGNORECASE": "alfabético, ignorar maiúscula/minúscula", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "Fazer uma lista a partir do texto", "LISTS_SPLIT_TEXT_FROM_LIST": "fazer um texto a partir da lista", "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir o texto em uma lista de textos, separando-o em cada delimitador.", "LISTS_SPLIT_TOOLTIP_JOIN": "Juntar uma lista de textos em um único texto, separado por um delimitador.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Listas#invertendo-uma-lista", "LISTS_REVERSE_MESSAGE0": "inverter %1", "LISTS_REVERSE_TOOLTIP": "Inverter uma cópia da lista.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Retorna o valor desta variável.", "VARIABLES_GET_CREATE_SET": "Criar \"definir %1\"", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "definir %1 para %2", "VARIABLES_SET_TOOLTIP": "Define esta variável para o valor da entrada.", "VARIABLES_SET_CREATE_GET": "Criar \"obter %1\"", @@ -370,7 +350,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Destacar definição da função", "PROCEDURES_CREATE_DO": "Criar \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Se um valor é verdadeiro, então retorna um valor.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Atenção: Este bloco só pode ser utilizado dentro da definição de uma função.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Diz algo...", "WORKSPACE_ARIA_LABEL": "Espaço de trabalho do Blockly", diff --git a/msg/json/pt.json b/msg/json/pt.json index 85b6a445fd9..55be8612ae2 100644 --- a/msg/json/pt.json +++ b/msg/json/pt.json @@ -60,13 +60,11 @@ "COLOUR_PICKER_TOOLTIP": "Escolha uma cor da paleta de cores.", "COLOUR_RANDOM_TITLE": "cor aleatória", "COLOUR_RANDOM_TOOLTIP": "Escolha uma cor aleatoriamente.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "pinte com", "COLOUR_RGB_RED": "vermelho", "COLOUR_RGB_GREEN": "verde", "COLOUR_RGB_BLUE": "azul", "COLOUR_RGB_TOOLTIP": "Cria uma cor de acordo com a quantidade especificada de vermelho, verde e azul. Todos os valores devem estar entre 0 e 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "misturar", "COLOUR_BLEND_COLOUR1": "cor 1", "COLOUR_BLEND_COLOUR2": "cor 2", @@ -125,11 +123,6 @@ "LOGIC_TERNARY_TOOLTIP": "Avalia a condição em \"teste\". Se a condição for verdadeira retorna o valor \"se verdadeiro\", senão retorna o valor \"se falso\".", "MATH_NUMBER_HELPURL": "http://pt.wikipedia.org/wiki/N%C3%BAmero", "MATH_NUMBER_TOOLTIP": "Um número.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -204,7 +197,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "http://pt.wikipedia.org/wiki/N%C3%BAmero_aleat%C3%B3rio", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fração aleatória", "MATH_RANDOM_FLOAT_TOOLTIP": "Insere uma fração aleatória entre 0.0 (inclusive) e 1.0 (exclusive).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 de X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Devolver o arco tangente do ponto (X, Y) em graus entre -180 e 180.", "TEXT_TEXT_HELPURL": "http://pt.wikipedia.org/wiki/Cadeia_de_caracteres", @@ -254,15 +246,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Pede ao utilizador um número.", "TEXT_PROMPT_TOOLTIP_TEXT": "Pede ao utilizador um texto.", "TEXT_COUNT_MESSAGE0": "contar %1 em %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Conte quantas vezes um certo texto aparece dentro de algum outro texto.", "TEXT_REPLACE_MESSAGE0": "substituir %1 por %2 em %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Substituir todas as ocorrências de um certo texto dentro de algum outro texto.", "TEXT_REVERSE_MESSAGE0": "inverter %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Inverte a ordem dos caracteres no texto.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "criar lista vazia", "LISTS_CREATE_EMPTY_TOOLTIP": "Retorna uma lista, de tamanho 0, contendo nenhum registo", "LISTS_CREATE_WITH_TOOLTIP": "Cria uma lista com qualquer número de itens.", @@ -320,7 +308,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "até #, a partir do final", "LISTS_GET_SUBLIST_END_LAST": "para o último", "LISTS_GET_SUBLIST_TOOLTIP": "Cria uma cópia da porção especificada de uma lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "ordenar %1 %2 %3", "LISTS_SORT_TOOLTIP": "Ordenar uma cópia de uma lista.", "LISTS_SORT_ORDER_ASCENDING": "ascendente", @@ -333,7 +320,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "com delimitador", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dividir o texto numa lista de textos, separando-o em cada delimitador.", "LISTS_SPLIT_TOOLTIP_JOIN": "Juntar uma lista de textos num único texto, separado por um delimitador.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "inverter %1", "LISTS_REVERSE_TOOLTIP": "Inverter uma cópia da lista.", "VARIABLES_GET_TOOLTIP": "Retorna o valor desta variável.", @@ -341,14 +327,12 @@ "VARIABLES_SET": "definir %1 para %2", "VARIABLES_SET_TOOLTIP": "Define esta variável para o valor inserido.", "VARIABLES_SET_CREATE_GET": "Criar \"obter %1\"", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFNORETURN_TITLE": "para", "PROCEDURES_DEFNORETURN_PROCEDURE": "faz algo", "PROCEDURES_BEFORE_PARAMS": "com:", "PROCEDURES_CALL_BEFORE_PARAMS": "com:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Cria uma função que não tem retorno.", "PROCEDURES_DEFNORETURN_COMMENT": "Descreva esta função...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_DEFRETURN_RETURN": "retorna", "PROCEDURES_DEFRETURN_TOOLTIP": "Cria uma função que possui um valor de retorno.", "PROCEDURES_ALLOW_STATEMENTS": "permitir declarações", diff --git a/msg/json/qqq.json b/msg/json/qqq.json index 17154d64c66..3cfa464f8fb 100644 --- a/msg/json/qqq.json +++ b/msg/json/qqq.json @@ -2,6 +2,7 @@ "@metadata": { "authors": [ "Ajeje Brazorf", + "Amire80", "Espertus", "Liuxinyu970226", "Metalhead64", @@ -47,16 +48,16 @@ "DELETE_VARIABLE": "dropdown choice - Delete the currently selected variable.", "COLOUR_PICKER_HELPURL": "{{Optional}} url - Information about colour.", "COLOUR_PICKER_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette https://github.com/google/blockly/wiki/Colour#picking-a-colour-from-a-palette].", - "COLOUR_RANDOM_HELPURL": "{{Optional}} url - A link that displays a random colour each time you visit it.", + "COLOUR_RANDOM_HELPURL": "{{Ignored}} url - A link that displays a random colour each time you visit it.", "COLOUR_RANDOM_TITLE": "block text - Title of block that generates a colour at random.", "COLOUR_RANDOM_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#generating-a-random-colour https://github.com/google/blockly/wiki/Colour#generating-a-random-colour].", - "COLOUR_RGB_HELPURL": "{{Optional}} url - A link for colour codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners.", + "COLOUR_RGB_HELPURL": "{{Ignored}} url - A link for colour codes with percentages (0-100%) for each component, instead of the more common 0-255, which may be more difficult for beginners.", "COLOUR_RGB_TITLE": "block text - Title of block for [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", "COLOUR_RGB_RED": "block input text - The amount of red (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Red}}", "COLOUR_RGB_GREEN": "block input text - The amount of green (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", "COLOUR_RGB_BLUE": "block input text - The amount of blue (from 0 to 100) to use when [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].\n{{Identical|Blue}}", "COLOUR_RGB_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components https://github.com/google/blockly/wiki/Colour#creating-a-colour-from-red-green-and-blue-components].", - "COLOUR_BLEND_HELPURL": "{{Optional}} url - A useful link that displays blending of two colours.", + "COLOUR_BLEND_HELPURL": "{{Ignored}} url - A useful link that displays blending of two colours.", "COLOUR_BLEND_TITLE": "block text - A verb for blending two shades of paint.", "COLOUR_BLEND_COLOUR1": "block input text - The first of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend].", "COLOUR_BLEND_COLOUR2": "block input text - The second of two colours to [https://github.com/google/blockly/wiki/Colour#blending-colours blend].", @@ -236,7 +237,7 @@ "TEXT_CHARAT_FIRST": "block text - Indicates that the first letter of the following piece of text should be retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", "TEXT_CHARAT_LAST": "block text - Indicates that the last letter (or number, punctuation mark, etc.) of the following piece of text should be retrieved. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", "TEXT_CHARAT_RANDOM": "block text - Indicates that any letter (or number, punctuation mark, etc.) in the following piece of text should be randomly selected. See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", - "TEXT_CHARAT_TAIL": "block text - Text that goes after the rightmost block/dropdown when getting a single letter from a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these blocks] or shown below. For most languages, this will be blank. [[File:Blockly-text-get.png]]", + "TEXT_CHARAT_TAIL": "{{Optional}}\nblock text - Text that goes after the rightmost block/dropdown when getting a single letter from a piece of text, as in [https://blockly-demo.appspot.com/static/apps/code/index.html#3m23km these blocks] or shown below. For most languages, this will be blank. [[File:Blockly-text-get.png]]", "TEXT_CHARAT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Text#extracting-a-single-character https://github.com/google/blockly/wiki/Text#extracting-a-single-character]. [[File:Blockly-text-get.png]]", "TEXT_GET_SUBSTRING_TOOLTIP": "See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text].", "TEXT_GET_SUBSTRING_HELPURL": "{{Optional}} url - Information about extracting characters from text. Reminder: urls are the lowest priority translations. Feel free to skip.", @@ -247,7 +248,7 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "dropdown - Indicates that the following number specifies the position (relative to the start position) of the end of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", "TEXT_GET_SUBSTRING_END_FROM_END": "dropdown - Indicates that the following number specifies the position (relative to the end position) of the end of the region of text that should be obtained from the preceding piece of text. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", "TEXT_GET_SUBSTRING_END_LAST": "block text - Indicates that a region ending with the last letter of the preceding piece of text should be extracted. See [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text]. [[File:Blockly-get-substring.png]]", - "TEXT_GET_SUBSTRING_TAIL": "block text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text extracting a region of text]. In most languages, this will be the empty string. [[File:Blockly-get-substring.png]]", + "TEXT_GET_SUBSTRING_TAIL": "{{Optional}}\nblock text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text extracting a region of text]. In most languages, this will be the empty string. [[File:Blockly-get-substring.png]]", "TEXT_CHANGECASE_HELPURL": "{{Optional}} url - Information about the case of letters (upper-case and lower-case).", "TEXT_CHANGECASE_TOOLTIP": "tooltip - Describes a block to adjust the case of letters. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "block text - Indicates that all of the letters in the following piece of text should be capitalized. If your language does not use case, you may indicate that this is not applicable to your language. For more information on this block, see [https://github.com/google/blockly/wiki/Text#adjusting-text-case https://github.com/google/blockly/wiki/Text#adjusting-text-case].", @@ -285,7 +286,7 @@ "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs].", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs https://github.com/google/blockly/wiki/Lists#changing-number-of-inputs].", "LISTS_REPEAT_HELPURL": "{{Optional}} url - Information about [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item].", - "LISTS_REPEAT_TOOLTIP": "{{Optional}} url - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item].", + "LISTS_REPEAT_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#create-list-with creating a list with multiple copies of a single item].", "LISTS_REPEAT_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#create-list-with https://github.com/google/blockly/wiki/Lists#create-list-with]. \n\nParameters:\n* %1 - the item (text) to be repeated\n* %2 - the number of times to repeat it", "LISTS_LENGTH_HELPURL": "{{Optional}} url - Information about how the length of a list is computed (i.e., by the total number of elements, not the number of different elements).", "LISTS_LENGTH_TITLE": "block text - See [https://github.com/google/blockly/wiki/Lists#length-of https://github.com/google/blockly/wiki/Lists#length-of]. \n\nParameters:\n* %1 - the list whose length is desired", @@ -306,7 +307,7 @@ "LISTS_GET_INDEX_FIRST": "dropdown - Indicates that the '''first''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", "LISTS_GET_INDEX_LAST": "dropdown - Indicates that the '''last''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", "LISTS_GET_INDEX_RANDOM": "dropdown - Indicates that a '''random''' item should be [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessed in a list]. [[File:Blockly-list-get-item.png]]", - "LISTS_GET_INDEX_TAIL": "block text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessing an item from a list]. In most languages, this will be the empty string. [[File:Blockly-list-get-item.png]]", + "LISTS_GET_INDEX_TAIL": "{{Optional}}\nblock text - Text that should go after the rightmost block/dropdown when [https://github.com/google/blockly/wiki/Lists#getting-a-single-item accessing an item from a list]. In most languages, this will be the empty string. [[File:Blockly-list-get-item.png]]", "LISTS_INDEX_FROM_START_TOOLTIP": "tooltip - Indicates the ordinal number that the first item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", "LISTS_INDEX_FROM_END_TOOLTIP": "tooltip - Indicates the ordinal number that the last item in a list is referenced by. %1 will be replaced by either '#0' or '#1' depending on the indexing mode.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-single-item https://github.com/google/blockly/wiki/Lists#getting-a-single-item] for more information.", @@ -340,7 +341,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "dropdown - Indicates that an index relative to the front of the list should be used to specify the end of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_END_FROM_END": "dropdown - Indicates that an index relative to the end of the list should be used to specify the end of the range from which to [https://github.com/google/blockly/wiki/Lists#getting-a-sublist get a sublist]. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_END_LAST": "dropdown - Indicates that the '''last''' item in the given list should be [https://github.com/google/blockly/wiki/Lists#getting-a-sublist the end of the selected sublist]. [[File:Blockly-get-sublist.png]]", - "LISTS_GET_SUBLIST_TAIL": "block text - This appears in the rightmost position ('tail') of the sublist block, as described at [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. In English and most other languages, this is the empty string. [[File:Blockly-get-sublist.png]]", + "LISTS_GET_SUBLIST_TAIL": "{{Optional}}\nblock text - This appears in the rightmost position ('tail') of the sublist block, as described at [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist]. In English and most other languages, this is the empty string. [[File:Blockly-get-sublist.png]]", "LISTS_GET_SUBLIST_TOOLTIP": "tooltip - See [https://github.com/google/blockly/wiki/Lists#getting-a-sublist https://github.com/google/blockly/wiki/Lists#getting-a-sublist] for more information. [[File:Blockly-get-sublist.png]]", "LISTS_SORT_HELPURL": "{{Optional}} url - Information describing sorting a list.", "LISTS_SORT_TITLE": "Sort as type %1 (numeric or alphabetic) in order %2 (ascending or descending) a list of items %3.\n{{Identical|Sort}}", @@ -359,7 +360,7 @@ "LISTS_REVERSE_HELPURL": "{{Optional}} url - Information describing reversing a list.", "LISTS_REVERSE_MESSAGE0": "block text - Title of block that returns a copy of a list (%1) with the order of items reversed.", "LISTS_REVERSE_TOOLTIP": "tooltip - Short description for a block that reverses a copy of a list.", - "ORDINAL_NUMBER_SUFFIX": "grammar - Text that follows an ordinal number (a number that indicates position relative to other numbers). In most languages, such text appears before the number, so this should be blank. An exception is Hungarian. See [[Translating:Blockly#Ordinal_numbers]] for more information.", + "ORDINAL_NUMBER_SUFFIX": "{{Optional}}\ngrammar - Text that follows an ordinal number (a number that indicates position relative to other numbers). In most languages, such text appears before the number, so this should be blank. An exception is Hungarian. See [[Translating:Blockly#Ordinal_numbers]] for more information.", "VARIABLES_GET_HELPURL": "{{Optional}} url - Information about ''variables'' in computer programming. Consider using your language's translation of [https://en.wikipedia.org/wiki/Variable_(computer_science) https://en.wikipedia.org/wiki/Variable_(computer_science)], if it exists.", "VARIABLES_GET_TOOLTIP": "tooltip - This gets the value of the named variable without modifying it.", "VARIABLES_GET_CREATE_SET": "context menu - Selecting this creates a block to set (change) the value of this variable. \n\nParameters:\n* %1 - the name of the variable.", @@ -372,7 +373,7 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "default name - This acts as a placeholder for the name of a function on a function definition block, as shown on [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#w7cfju this block]. The user will replace it with the function's name.", "PROCEDURES_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's definition block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", "PROCEDURES_CALL_BEFORE_PARAMS": "block text - This precedes the list of parameters on a function's caller block. See [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function with parameters].", - "PROCEDURES_DEFNORETURN_DO": "block text - This appears next to the function's 'body', the blocks that should be run when the function is called, as shown in [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function definition].", + "PROCEDURES_DEFNORETURN_DO": "{{Optional}}\nblock text - This appears next to the function's 'body', the blocks that should be run when the function is called, as shown in [https://blockly-demo.appspot.com/static/apps/code/index.html?lang=en#voztpd this sample function definition].", "PROCEDURES_DEFNORETURN_TOOLTIP": "tooltip", "PROCEDURES_DEFNORETURN_COMMENT": "Placeholder text that the user is encouraged to replace with a description of what their function does.", "PROCEDURES_DEFRETURN_HELPURL": "{{Optional}} url - Information about defining [https://en.wikipedia.org/wiki/Subroutine functions] that have return values.", diff --git a/msg/json/ro.json b/msg/json/ro.json index 51c9d612d83..456337c03d3 100644 --- a/msg/json/ro.json +++ b/msg/json/ro.json @@ -50,19 +50,16 @@ "COLOUR_PICKER_TOOLTIP": "Alege o culoare din paleta de culori.", "COLOUR_RANDOM_TITLE": "culoare aleatorie", "COLOUR_RANDOM_TOOLTIP": "Alege o culoare la întâmplare.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "colorează cu", "COLOUR_RGB_RED": "roșu", "COLOUR_RGB_GREEN": "verde", "COLOUR_RGB_BLUE": "albastru", "COLOUR_RGB_TOOLTIP": "Creează o culoare cu suma specificată de roșu, verde și albastru. Toate valorile trebuie să fie între 0 și 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "amestec", "COLOUR_BLEND_COLOUR1": "culoare 1", "COLOUR_BLEND_COLOUR2": "culoare 2", "COLOUR_BLEND_RATIO": "Raport", "COLOUR_BLEND_TOOLTIP": "Amestecă două culori cu un raport dat (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "repetă de %1 ori", "CONTROLS_REPEAT_INPUT_DO": "fă", "CONTROLS_REPEAT_TOOLTIP": "Face unele afirmații de mai multe ori.", @@ -89,7 +86,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Adaugă, elimină sau reordonează secțiuni pentru a reconfigura acest bloc if.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Adăugați o condiție în blocul if.", "CONTROLS_IF_ELSE_TOOLTIP": "Adauga o stare finala, cuprinde toata conditia din blocul if.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Returnează adevărat dacă ambele intrări sunt egale.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Returnează adevărat daca cele două intrări nu sunt egale.", "LOGIC_COMPARE_TOOLTIP_LT": "Returnează adevărat dacă prima intrare este mai mică decât a doua intrare.", @@ -105,21 +101,13 @@ "LOGIC_BOOLEAN_TRUE": "adevărat", "LOGIC_BOOLEAN_FALSE": "fals", "LOGIC_BOOLEAN_TOOLTIP": "Returnează adevărat sau fals.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "nul", "LOGIC_NULL_TOOLTIP": "returnează nul.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "dacă este adevărat", "LOGIC_TERNARY_IF_FALSE": "dacă este fals", "LOGIC_TERNARY_TOOLTIP": "Verifică condiția din „test”. Dacă condiția este adevărată, returnează valoarea „în cazul în care adevărat”; în caz contrar întoarce valoarea „în cazul în care e fals”.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Un număr.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tg", @@ -132,7 +120,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Returnează produsul celor două numere.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Returnează câtul celor două numere.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Returneaza numărul rezultat prin ridicarea primului număr la puterea celui de-al doilea.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "rădăcina pătrată", "MATH_SINGLE_TOOLTIP_ROOT": "Returnează rădăcina pătrată a unui număr.", "MATH_SINGLE_OP_ABSOLUTE": "absolută", @@ -159,10 +146,8 @@ "MATH_IS_NEGATIVE": "este negativ", "MATH_IS_DIVISIBLE_BY": "este divizibil cu", "MATH_IS_TOOLTIP": "Verifică dacă un număr este un par, impar, prim, întreg, pozitiv, negativ, sau dacă este divizibil cu un anumit număr. Returnează true sau false.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "schimbă %1 de %2", "MATH_CHANGE_TOOLTIP": "Adaugă un număr variabilei '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Rotunjirea unui număr în sus sau în jos.", "MATH_ROUND_OPERATOR_ROUND": "rotund", "MATH_ROUND_OPERATOR_ROUNDUP": "rotunjește în sus", @@ -183,21 +168,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Întoarce deviația standard a listei.", "MATH_ONLIST_OPERATOR_RANDOM": "element aleatoriu din lista", "MATH_ONLIST_TOOLTIP_RANDOM": "Returnează un element aleatoriu din listă.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "restul la %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Întoarce restul din împărțirea celor două numere.", "MATH_CONSTRAIN_TITLE": "constrânge %1 redus %2 ridicat %3", "MATH_CONSTRAIN_TOOLTIP": "Constrânge un număr să fie între limitele specificate (inclusiv).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "un număr întreg aleator de la %1 la %2", "MATH_RANDOM_INT_TOOLTIP": "Returnează un număr întreg aleator aflat între cele două limite specificate, inclusiv.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fracții aleatorii", "MATH_RANDOM_FLOAT_TOOLTIP": "Returnează o fracție aleatoare între 0.0 (inclusiv) și 1.0 (exclusiv).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Întoarceți arctangentul punctului (X, Y) în grade de la -180 la 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "O literă, cuvânt sau linie de text.", "TEXT_JOIN_TITLE_CREATEWITH": "crează text cu", "TEXT_JOIN_TOOLTIP": "Creați o bucată de text prin unirea oricărui număr de elemente.", @@ -249,7 +229,6 @@ "TEXT_REPLACE_TOOLTIP": "Înlocuiți toate aparițiile anumitor texte într-un alt text.", "TEXT_REVERSE_MESSAGE0": "inversă %1", "TEXT_REVERSE_TOOLTIP": "Inversează ordinea caracterelor din text.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "creează listă goală", "LISTS_CREATE_EMPTY_TOOLTIP": "Returnează o listă, de lungime 0, care nu conține înregistrări de date", "LISTS_CREATE_WITH_TOOLTIP": "Creați o listă cu orice număr de elemente.", @@ -307,7 +286,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "la # de la sfarsit", "LISTS_GET_SUBLIST_END_LAST": "la ultima", "LISTS_GET_SUBLIST_TOOLTIP": "Creează o copie a porțiunii specificate dintr-o listă.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sortați %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortați o copie a unei liste.", "LISTS_SORT_ORDER_ASCENDING": "crescător", @@ -327,7 +305,6 @@ "VARIABLES_SET": "seteaza %1 la %2", "VARIABLES_SET_TOOLTIP": "Setează această variabilă sa fie egală la intrare.", "VARIABLES_SET_CREATE_GET": "Crează 'get %1'", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "la", "PROCEDURES_DEFNORETURN_PROCEDURE": "fă ceva", "PROCEDURES_BEFORE_PARAMS": "cu:", @@ -339,9 +316,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Creează o funcție cu o ieșire.", "PROCEDURES_ALLOW_STATEMENTS": "permite declarațiile", "PROCEDURES_DEF_DUPLICATE_WARNING": "Atenție: Această funcție are parametri duplicați.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Executați funcția '%1 'definită de utilizator.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Executați funcția „%1” definită de utilizator și folosiți producția sa.", "PROCEDURES_MUTATORCONTAINER_TITLE": "intrări", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Adăugă, șterge sau reordonează parametrii de intrare ai acestei funcții.", diff --git a/msg/json/ru.json b/msg/json/ru.json index 42a117e903b..f71b7cae807 100644 --- a/msg/json/ru.json +++ b/msg/json/ru.json @@ -9,6 +9,7 @@ "Mouse21", "Movses", "Okras", + "Pacha Tchernof", "Phil Rigovanov", "RedFox", "Redredsonia", @@ -16,7 +17,9 @@ "SimondR", "Teretalexev", "Thothsum", - "Vlad5250" + "UniCollab", + "Vlad5250", + "Zauzolkov" ] }, "VARIABLES_DEFAULT_NAME": "элемент", @@ -31,7 +34,7 @@ "DELETE_BLOCK": "Удалить блок", "DELETE_X_BLOCKS": "Удалить %1 блоков", "DELETE_ALL_BLOCKS": "Удалить все блоки (%1)?", - "CLEAN_UP": "Очистить блоки", + "CLEAN_UP": "Упорядочить блоки", "COLLAPSE_BLOCK": "Свернуть блок", "COLLAPSE_ALL": "Свернуть блоки", "EXPAND_BLOCK": "Развернуть блок", @@ -51,7 +54,7 @@ "NEW_VARIABLE_TYPE_TITLE": "Новый тип переменной:", "NEW_VARIABLE_TITLE": "Имя новой переменной:", "VARIABLE_ALREADY_EXISTS": "Переменная с именем '%1' уже существует.", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Название переменной '%1' уже используется другой типа: '%2'.", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Название переменной '%1' уже используется для другого типа: '%2'.", "DELETE_VARIABLE_CONFIRMATION": "Удалить %1 использований переменной '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Невозможно удалить переменную '%1', поскольку она является частью определения функции '%2'", "DELETE_VARIABLE": "Удалить переменную '%1'", @@ -112,7 +115,6 @@ "LOGIC_BOOLEAN_TRUE": "истина", "LOGIC_BOOLEAN_FALSE": "ложь", "LOGIC_BOOLEAN_TOOLTIP": "Возвращает значение истина или ложь.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "ничто", "LOGIC_NULL_TOOLTIP": "Возвращает ничто.", "LOGIC_TERNARY_HELPURL": "https://ru.wikipedia.org/wiki/Тернарная_условная_операция", @@ -122,6 +124,12 @@ "LOGIC_TERNARY_TOOLTIP": "Проверяет условие выбора. Если условие истинно, возвращает первое значение, в противном случае возвращает второе значение.", "MATH_NUMBER_HELPURL": "https://ru.wikipedia.org/wiki/Число", "MATH_NUMBER_TOOLTIP": "Число.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctan", "MATH_ARITHMETIC_HELPURL": "https://ru.wikipedia.org/wiki/Арифметика", "MATH_ARITHMETIC_TOOLTIP_ADD": "Возвращает сумму двух чисел.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Возвращает разность двух чисел.", @@ -155,7 +163,7 @@ "MATH_IS_NEGATIVE": "отрицательное", "MATH_IS_DIVISIBLE_BY": "делится на", "MATH_IS_TOOLTIP": "Проверяет, является ли число чётным, нечётным, простым, целым, положительным, отрицательным или оно кратно определённому числу. Возвращает значение истина или ложь.", - "MATH_CHANGE_HELPURL": "https://ru.wikipedia.org/wiki/%D0%98%D0%B4%D0%B8%D0%BE%D0%BC%D0%B0_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29#.D0.98.D0.BD.D0.BA.D1.80.D0.B5.D0.BC.D0.B5.D0.BD.D1.82", + "MATH_CHANGE_HELPURL": "https://ru.wikipedia.org/wiki/Идиома_(программирование)#Инкремент", "MATH_CHANGE_TITLE": "увеличить %1 на %2", "MATH_CHANGE_TOOLTIP": "Добавляет число к переменной '%1'.", "MATH_ROUND_HELPURL": "https://ru.wikipedia.org/wiki/Округление", @@ -180,17 +188,16 @@ "MATH_ONLIST_OPERATOR_RANDOM": "случайный элемент списка", "MATH_ONLIST_TOOLTIP_RANDOM": "Возвращает случайный элемент списка.", "MATH_MODULO_HELPURL": "https://ru.wikipedia.org/wiki/Деление_с_остатком", - "MATH_MODULO_TITLE": "остаток от %1 : %2", + "MATH_MODULO_TITLE": "остаток от %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Возвращает остаток от деления двух чисел.", "MATH_CONSTRAIN_TITLE": "ограничить %1 снизу %2 сверху %3", "MATH_CONSTRAIN_TOOLTIP": "Ограничивает число нижней и верхней границами (включительно).", "MATH_RANDOM_INT_HELPURL": "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел", - "MATH_RANDOM_INT_TITLE": "случайное целое число от %1 для %2", + "MATH_RANDOM_INT_TITLE": "случайное целое число от %1 до %2", "MATH_RANDOM_INT_TOOLTIP": "Возвращает случайное число между двумя заданными пределами (включая и их).", "MATH_RANDOM_FLOAT_HELPURL": "https://ru.wikipedia.org/wiki/Генератор_псевдослучайных_чисел", - "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случайное число от 0 (включительно) до 1", + "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случайное число от 0.0 до 1.0 (вкл.)", "MATH_RANDOM_FLOAT_TOOLTIP": "Возвращает случайное число от 0.0 (включительно) до 1.0.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 от X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Возвращает арктангенс точки (X, Y) в градусах от -180 до 180.", "TEXT_TEXT_HELPURL": "https://ru.wikipedia.org/wiki/Строковый_тип", @@ -240,17 +247,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Запросить у пользователя число.", "TEXT_PROMPT_TOOLTIP_TEXT": "Запросить у пользователя текст.", "TEXT_COUNT_MESSAGE0": "подсчитать количество %1 в %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Подсчитать, сколько раз отрывок текста появляется в другом тексте.", "TEXT_REPLACE_MESSAGE0": "заменить %1 на %2 в %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Заменить все вхождения некоторого текста другим текстом.", "TEXT_REVERSE_MESSAGE0": "изменить порядок на обратный %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Меняет порядок символов в тексте на обратный.", "LISTS_CREATE_EMPTY_TITLE": "создать пустой список", "LISTS_CREATE_EMPTY_TOOLTIP": "Возвращает список длины 0, не содержащий данных", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Создаёт список с любым числом элементов.", "LISTS_CREATE_WITH_INPUT_WITH": "создать список из", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "список", @@ -269,6 +272,7 @@ "LISTS_GET_INDEX_GET": "взять", "LISTS_GET_INDEX_GET_REMOVE": "взять и удалить", "LISTS_GET_INDEX_REMOVE": "удалить", + "LISTS_GET_INDEX_FROM_START": "№", "LISTS_GET_INDEX_FROM_END": "№ с конца", "LISTS_GET_INDEX_FIRST": "первый", "LISTS_GET_INDEX_LAST": "последний", @@ -305,7 +309,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "по № с конца", "LISTS_GET_SUBLIST_END_LAST": "по последний", "LISTS_GET_SUBLIST_TOOLTIP": "Создаёт копию указанной части списка.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сортировать %1 %2 %3", "LISTS_SORT_TOOLTIP": "Сортировать копию списка.", "LISTS_SORT_ORDER_ASCENDING": "по возрастанию", @@ -313,13 +316,11 @@ "LISTS_SORT_TYPE_NUMERIC": "числовая", "LISTS_SORT_TYPE_TEXT": "по алфавиту", "LISTS_SORT_TYPE_IGNORECASE": "по алфавиту, без учёта регистра", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "сделать список из текста", "LISTS_SPLIT_TEXT_FROM_LIST": "собрать текст из списка", "LISTS_SPLIT_WITH_DELIMITER": "с разделителем", "LISTS_SPLIT_TOOLTIP_SPLIT": "Разбивает текст в список текстов, по разделителям.", "LISTS_SPLIT_TOOLTIP_JOIN": "Соединяет список текстов в один текст с разделителями.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "изменить порядок на обратный %1", "LISTS_REVERSE_TOOLTIP": "Изменить порядок списка на обратный.", "VARIABLES_GET_TOOLTIP": "Возвращает значение этой переменной.", @@ -327,12 +328,14 @@ "VARIABLES_SET": "присвоить %1 = %2", "VARIABLES_SET_TOOLTIP": "Присваивает переменной значение вставки.", "VARIABLES_SET_CREATE_GET": "Создать вставку %1", + "PROCEDURES_DEFNORETURN_HELPURL": "https://ru.wikipedia.org/wiki/Подпрограмма", "PROCEDURES_DEFNORETURN_TITLE": "чтобы", "PROCEDURES_DEFNORETURN_PROCEDURE": "выполнить что-то", "PROCEDURES_BEFORE_PARAMS": "с:", "PROCEDURES_CALL_BEFORE_PARAMS": "с:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Создаёт процедуру, не возвращающую значение.", "PROCEDURES_DEFNORETURN_COMMENT": "Опишите эту функцию…", + "PROCEDURES_DEFRETURN_HELPURL": "https://ru.wikipedia.org/wiki/Функция_(программирование)", "PROCEDURES_DEFRETURN_RETURN": "вернуть", "PROCEDURES_DEFRETURN_TOOLTIP": "Создаёт процедуру, возвращающую значение.", "PROCEDURES_ALLOW_STATEMENTS": "разрешить операторы", @@ -348,7 +351,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Выделить определение процедуры", "PROCEDURES_CREATE_DO": "Создать вызов '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Если первое значение истинно, возвращает второе значение.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Предупреждение: Этот блок может использоваться только внутри определения функции.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Напишите здесь что-нибудь...", "WORKSPACE_ARIA_LABEL": "Рабочая область Blockly", diff --git a/msg/json/sc.json b/msg/json/sc.json index 5a9c241aee3..6e44bc65863 100644 --- a/msg/json/sc.json +++ b/msg/json/sc.json @@ -29,7 +29,6 @@ "RENAME_VARIABLE_TITLE": "A is variabilis '%1' muda nòmini a:", "NEW_VARIABLE": "Variabili noa...", "NEW_VARIABLE_TITLE": "Nòmini de sa variabili noa:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Scebera unu colori de sa tauledda.", "COLOUR_RANDOM_TITLE": "Unu colori a brítiu", "COLOUR_RANDOM_TOOLTIP": "Scebera unu colori a brítiu.", @@ -43,7 +42,6 @@ "COLOUR_BLEND_COLOUR2": "colori 2", "COLOUR_BLEND_RATIO": "raportu", "COLOUR_BLEND_TOOLTIP": "Amestura duus coloris cun unu raportu (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "repiti %1 bortas", "CONTROLS_REPEAT_INPUT_DO": "fai", "CONTROLS_REPEAT_TOOLTIP": "Fait pariga de cumandus prus bortas.", @@ -70,7 +68,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Aciungi, fùlia, o assenta is partis po torrai a sètiu custu brocu si.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Aciungi una cunditzioni a su brocu si.", "CONTROLS_IF_ELSE_TOOLTIP": "Aciungi una urtima cunditzioni piga-totu a su brocu si.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Torrat berus si is inputs funt unu uguali a s'àteru.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Torrat berus si is inputs non funt unu uguali a s'àteru.", "LOGIC_COMPARE_TOOLTIP_LT": "Torrat berus si su primu input est prus piticu de s'àteru.", @@ -92,15 +89,12 @@ "LOGIC_TERNARY_IF_TRUE": "si berus", "LOGIC_TERNARY_IF_FALSE": "si frassu", "LOGIC_TERNARY_TOOLTIP": "‎Cumproa sa cunditzioni in 'cumproa'. Si sa cunditzioni est berus, torrat su valori 'si berus'; sinuncas torrat su valori 'si frassu'.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Unu numeru", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Torrat sa summa de is duus nùmerus.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Torrat sa diferèntzia de is duus nùmerus.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Torrat su produtu de is duus nùmerus.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Torrat su cuotzienti de is duus nùmerus.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Torrat su primu numeru artziau a sa potenza de su segundu nùmeru.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "arraxina cuadra", "MATH_SINGLE_TOOLTIP_ROOT": "Torrat s'arraxina cuadra de unu numeru.", "MATH_SINGLE_OP_ABSOLUTE": "assolutu", @@ -110,14 +104,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Torrat su logaritmu a basi 10 de unu numeru.", "MATH_SINGLE_TOOLTIP_EXP": "Torrat (e) a sa potèntzia de unu numeru.", "MATH_SINGLE_TOOLTIP_POW10": "Torrat (10) a sa potèntzia de unu numeru.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Torrat su sinu de unu gradu (no radianti).", "MATH_TRIG_TOOLTIP_COS": "Torrat su cosinu de unu gradu (no radianti).", "MATH_TRIG_TOOLTIP_TAN": "Torrat sa tangenti de unu gradu (no radianti).", "MATH_TRIG_TOOLTIP_ASIN": "Torrat su arcsinu de unu numeru.", "MATH_TRIG_TOOLTIP_ACOS": "Torrat su arccosinu de unu numeru.", "MATH_TRIG_TOOLTIP_ATAN": "Torrat su arctangenti de unu numeru.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Torrat una de is costantis comunas: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), o ∞ (infiniu).", "MATH_IS_EVEN": "est paris", "MATH_IS_ODD": "est dísparu", @@ -127,10 +119,8 @@ "MATH_IS_NEGATIVE": "est negativu", "MATH_IS_DIVISIBLE_BY": "fait a ddu dividi po", "MATH_IS_TOOLTIP": "Cumprova si unu numeru est paris, dìsparis, primu, intreu, positivu, negativu o si fait a ddu dividi po unu numeru giau. Torrat berus o frassu.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "muda %1 de %2", "MATH_CHANGE_TOOLTIP": "Aciungi unu numeru a sa variabili '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Arretunda unu numeru faci a susu o faci a bàsciu.", "MATH_ROUND_OPERATOR_ROUND": "arretunda", "MATH_ROUND_OPERATOR_ROUNDUP": "Arretunda faci a susu", @@ -151,18 +141,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Torrat sa deviadura standard de sa lista.", "MATH_ONLIST_OPERATOR_RANDOM": "unu item a brìtiu de sa lista", "MATH_ONLIST_TOOLTIP_RANDOM": "Torrat unu item a brìtiu de sa lista.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "arrestu de %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Torrat s'arrestu de sa divisioni de duus numerus.", "MATH_CONSTRAIN_TITLE": "custringi %1 de %2 a %3", "MATH_CONSTRAIN_TOOLTIP": "Custringi unu numeru aintru de is liminaxus giaus (cumprendius).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "numeru intreu a brítiu de %1 a %2", "MATH_RANDOM_INT_TOOLTIP": "Torrat unu numeru intreu a brìtiu intra duus nùmerus giaus (cumpresus).", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "una fratzioni a brìtiu", "MATH_RANDOM_FLOAT_TOOLTIP": "Torrat una fratzioni a brìtiu intra 0.0 (cumpresu) e 1.0 (bogau).", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Una lìtera, paràula, o linia de testu.", "TEXT_JOIN_TITLE_CREATEWITH": "scri testu cun", "TEXT_JOIN_TOOLTIP": "Fait unu testu ponendi a pari parigas de items.", @@ -282,9 +268,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Fait una funtzioni cun output.", "PROCEDURES_ALLOW_STATEMENTS": "permiti decraratzionis", "PROCEDURES_DEF_DUPLICATE_WARNING": "Amonestu: Custa funtzioni tenit parametrus duplicaus.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLNORETURN_TOOLTIP": "Arròllia sa funtzione '%1' cuncordada dae s'impitadore.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_CALLRETURN_TOOLTIP": "Arròllia sa funtzione '%1' cuncordada dae s'impitadore e imprea s'output suu.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inputs", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Aciungi, fùlia, o assenta is inputs a custa funtzioni.", diff --git a/msg/json/sd.json b/msg/json/sd.json index c4e18afc59b..308ad160861 100644 --- a/msg/json/sd.json +++ b/msg/json/sd.json @@ -33,7 +33,6 @@ "RENAME_VARIABLE": "ڦرڻي کي نئون نالو ڏيو...", "NEW_VARIABLE": "نئون ڦرڻو...", "NEW_VARIABLE_TITLE": "ڦرڻي جو نئون نالو:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "رنگ دٻيءَ مان رنگ چونڊيو.", "COLOUR_RANDOM_TITLE": "بنا ترتيب رنگ", "COLOUR_RANDOM_TOOLTIP": "ڪو بہ ‌رنگ چونڊيو.", @@ -47,7 +46,6 @@ "COLOUR_BLEND_COLOUR2": "رنگ 2", "COLOUR_BLEND_RATIO": "تناسب", "COLOUR_BLEND_TOOLTIP": "ڄاڻايل تناسب سان ٻہ رنگ پاڻ ۾ ملايو (0.0-1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "1٪ ڀيرا ورجايو", "CONTROLS_REPEAT_INPUT_DO": "ڪريو", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ورجايو جڏهن", @@ -57,7 +55,6 @@ "CONTROLS_IF_MSG_IF": "جيڪڏهن", "CONTROLS_IF_MSG_ELSEIF": "نہ تہ جي", "CONTROLS_IF_MSG_ELSE": "نہ تہ", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "جيڪڏهن ٻئي ان پُٽس برابر آهن تہ درست وراڻيو", "LOGIC_COMPARE_TOOLTIP_NEQ": "جيڪڏهن ٻئي ان پُٽس اڻ برابر آهن تہ درست وراڻيو", "LOGIC_COMPARE_TOOLTIP_LT": "جيڪڏهن پهريون ان پُٽ ٻين ان پُٽ کان ننڍو آهي تہ درست وراڻيو", @@ -77,7 +74,6 @@ "LOGIC_TERNARY_IF_TRUE": "جيڪڏهن سچو", "LOGIC_TERNARY_IF_FALSE": "جيڪڏهن ڪوڙو", "MATH_NUMBER_TOOLTIP": "ڪو انگ.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "ٻن انگن جي جوڙ اپت ڏيو.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "ٻنهي انگن جو تفاوت ڏيو.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "ٻنهي انگن جي ضرب اُپت ڏيو.", diff --git a/msg/json/sk.json b/msg/json/sk.json index 26a89d16f3f..ab400afd573 100644 --- a/msg/json/sk.json +++ b/msg/json/sk.json @@ -50,7 +50,6 @@ "DELETE_VARIABLE_CONFIRMATION": "Odstrániť %1 použití premennej '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "Nie je možné zmazať premennú „%1“, pretože je súčasťou definície funkcie „%2“", "DELETE_VARIABLE": "Odstrániť premennú '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Zvoľte farbu z palety.", "COLOUR_RANDOM_TITLE": "náhodná farba", "COLOUR_RANDOM_TOOLTIP": "Zvoliť farbu náhodne.", @@ -64,7 +63,6 @@ "COLOUR_BLEND_COLOUR2": "farba 2", "COLOUR_BLEND_RATIO": "pomer", "COLOUR_BLEND_TOOLTIP": "Zmieša dve farby v danom pomere (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "opakuj %1 krát", "CONTROLS_REPEAT_INPUT_DO": "rob", "CONTROLS_REPEAT_TOOLTIP": "Opakuj určité príkazy viackrát.", @@ -91,7 +89,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Pridať, odstrániť alebo zmeniť poradie oddielov tohto \"ak\" bloku.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Pridať podmienku k \"ak\" bloku.", "CONTROLS_IF_ELSE_TOOLTIP": "Pridať poslednú záchytnú podmienku k \"ak\" bloku.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Vráť hodnotu pravda, ak sú vstupy rovnaké.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Vráť hodnotu pravda, ak vstupy nie sú rovnaké.", "LOGIC_COMPARE_TOOLTIP_LT": "Vráť hodnotu pravda, ak prvý vstup je menší než druhý.", @@ -113,18 +110,15 @@ "LOGIC_TERNARY_IF_TRUE": "ak pravda", "LOGIC_TERNARY_IF_FALSE": "ak nepravda", "LOGIC_TERNARY_TOOLTIP": "Skontroluj podmienku testom. Ak je podmienka pravda, vráť hodnotu \"ak pravda\", inak vráť hodnotu \"ak nepravda\".", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Číslo.", "MATH_TRIG_ASIN": "arcsin", "MATH_TRIG_ACOS": "arccos", "MATH_TRIG_ATAN": "arctan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Vráť súčet dvoch čísel.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vráť rozdiel dvoch čísel.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vráť súčin dvoch čísel.", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "Vráť podiel dvoch čísel.", "MATH_ARITHMETIC_TOOLTIP_POWER": "Vráť prvé číslo umocnené druhým.", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "druhá odmocnina", "MATH_SINGLE_TOOLTIP_ROOT": "Vráť druhú odmocninu čísla.", "MATH_SINGLE_OP_ABSOLUTE": "absolútna hodnota", @@ -134,7 +128,6 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Vráť logaritmus čísla so základom 10.", "MATH_SINGLE_TOOLTIP_EXP": "Vráť e umocnené číslom.", "MATH_SINGLE_TOOLTIP_POW10": "Vráť 10 umocnené číslom.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Vráť sínus uhla (v stupňoch).", "MATH_TRIG_TOOLTIP_COS": "Vráť kosínus uhla (v stupňoch).", "MATH_TRIG_TOOLTIP_TAN": "Vráť tangens uhla (v stupňoch).", @@ -151,10 +144,8 @@ "MATH_IS_NEGATIVE": "je záporné", "MATH_IS_DIVISIBLE_BY": "je deliteľné", "MATH_IS_TOOLTIP": "Skontroluj či je číslo párne, nepárne, celé, kladné, záporné alebo deliteľné určitým číslom. Vráť hodnotu pravda alebo nepravda.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "zmeniť %1 o %2", "MATH_CHANGE_TOOLTIP": "Pridaj číslo do premennej \"%1\".", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Zaokrúhli číslo nahor alebo nadol.", "MATH_ROUND_OPERATOR_ROUND": "zaokrúhli", "MATH_ROUND_OPERATOR_ROUNDUP": "zaokrúhli nahor", @@ -175,21 +166,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Vráť smeroddajnú odchýlku zoznamu.", "MATH_ONLIST_OPERATOR_RANDOM": "náhodný prvok zoznamu", "MATH_ONLIST_TOOLTIP_RANDOM": "Vráť náhodne zvolený prvok zoznamu.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "zvyšok po delení %1 + %2", "MATH_MODULO_TOOLTIP": "Vráť zvyšok po delení jedného čísla druhým.", "MATH_CONSTRAIN_TITLE": "obmedz %1 od %2 do %3", "MATH_CONSTRAIN_TOOLTIP": "Obmedzí číslo do zadaných hraníc (vrátane).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "náhodné celé číslo od %1 do %2", "MATH_RANDOM_INT_TOOLTIP": "Vráť náhodné celé číslo z určeného intervalu (vrátane).", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "náhodné číslo od 0 do 1", "MATH_RANDOM_FLOAT_TOOLTIP": "Vráť náhodné číslo z intervalu 0.0 (vrátane) až 1.0.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Vráťte arktangent bodu (X, Y) v stupňoch od -180 do 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Písmeno, slovo alebo riadok textu.", "TEXT_JOIN_TITLE_CREATEWITH": "vytvor text z", "TEXT_JOIN_TOOLTIP": "Vytvor text spojením určitého počtu prvkov.", @@ -243,7 +229,6 @@ "TEXT_REVERSE_TOOLTIP": "Obrátiť poradie písmen v texte.", "LISTS_CREATE_EMPTY_TITLE": "prázdny zoznam", "LISTS_CREATE_EMPTY_TOOLTIP": "Vráti zoznam nulovej dĺžky, ktorý neobsahuje žiadne prvky.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Vytvor zoznam s ľubovoľným počtom prvkov.", "LISTS_CREATE_WITH_INPUT_WITH": "vytvor zoznam s", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "zoznam", @@ -298,7 +283,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "po # od konca", "LISTS_GET_SUBLIST_END_LAST": "po koniec", "LISTS_GET_SUBLIST_TOOLTIP": "Skopíruje určený úsek zoznamu.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "zoradiť %1 %2 %3", "LISTS_SORT_TOOLTIP": "Zoradiť kópiu zoznamu.", "LISTS_SORT_ORDER_ASCENDING": "Vzostupne", diff --git a/msg/json/skr-arab.json b/msg/json/skr-arab.json index dc342da18cc..187cb3691c2 100644 --- a/msg/json/skr-arab.json +++ b/msg/json/skr-arab.json @@ -5,10 +5,12 @@ ] }, "VARIABLES_DEFAULT_NAME": "آئٹم", + "UNNAMED_KEY": "بغیر ناں", "TODAY": "اڄ", "DUPLICATE_BLOCK": "ڈپلیکیٹ", "ADD_COMMENT": "تبصرہ کرو", "REMOVE_COMMENT": "رائے مٹاؤ", + "DUPLICATE_COMMENT": " نقل تبصرہ", "EXTERNAL_INPUTS": "باہرلے انپٹ", "INLINE_INPUTS": "ان لائن ان پٹ", "DELETE_BLOCK": "بلاک مٹاؤ", @@ -29,7 +31,6 @@ "NEW_VARIABLE": "متغیر بݨاؤ۔۔۔", "NEW_VARIABLE_TITLE": "نواں متغیر ناں:", "VARIABLE_ALREADY_EXISTS": "'%1' نامی متغیر پہلے موجود ہے۔", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_RANDOM_TITLE": "بنا ترتيب رنگ", "COLOUR_RGB_TITLE": "نال رن٘گ", "COLOUR_RGB_RED": "رتا", @@ -55,7 +56,6 @@ "LOGIC_TERNARY_IF_TRUE": "اگر سچ ہے", "LOGIC_TERNARY_IF_FALSE": "اگر کوڑ ہے", "MATH_NUMBER_TOOLTIP": "ہک عدد", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_SINGLE_OP_ROOT": "مربعی جذر", "MATH_SINGLE_OP_ABSOLUTE": "مطلق", "MATH_IS_EVEN": "جفت ہے", diff --git a/msg/json/sl.json b/msg/json/sl.json index 09a48be4d5e..8e80cc25c77 100644 --- a/msg/json/sl.json +++ b/msg/json/sl.json @@ -24,8 +24,8 @@ "DELETE_X_BLOCKS": "Izbriši bloke (%1)", "DELETE_ALL_BLOCKS": "Izbrišem vse bloke (%1)?", "CLEAN_UP": "Ponastavi bloke", - "COLLAPSE_BLOCK": "Skrči blok", - "COLLAPSE_ALL": "Skrči bloke", + "COLLAPSE_BLOCK": "Strni blok", + "COLLAPSE_ALL": "Strni bloke", "EXPAND_BLOCK": "Razširi blok", "EXPAND_ALL": "Razširi bloke", "DISABLE_BLOCK": "Onemogoči blok", @@ -51,13 +51,11 @@ "COLOUR_PICKER_TOOLTIP": "Izberite barvo s palete.", "COLOUR_RANDOM_TITLE": "naključna barva", "COLOUR_RANDOM_TOOLTIP": "Izberite naključno barvo.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "določena barva", "COLOUR_RGB_RED": "rdeča", "COLOUR_RGB_GREEN": "zelena", "COLOUR_RGB_BLUE": "modra", "COLOUR_RGB_TOOLTIP": "Ustvari barvo z določeno količino rdeče, zelene in modre. Vse vrednosti morajo biti med 0 in 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "mešanica", "COLOUR_BLEND_COLOUR1": "barva 1", "COLOUR_BLEND_COLOUR2": "barva 2", @@ -67,24 +65,19 @@ "CONTROLS_REPEAT_TITLE": "ponovi %1-krat", "CONTROLS_REPEAT_INPUT_DO": "izvedi", "CONTROLS_REPEAT_TOOLTIP": "Določeni stavki se izvedejo večkrat.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ponavljaj, dokler", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ponavljaj, dokler ni", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Določeni stavki se izvajajo, dokler je vrednost resnična.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Določeni stavki se izvajajo, dokler je vrednost neresnična.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Vrednost spremenljivke »%1« se v določenem koraku spreminja od začetnega do končnega števila. Pri tem se izvedejo določeni bloki.", "CONTROLS_FOR_TITLE": "štej s/z %1 od %2 do %3 po %4", - "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", "CONTROLS_FOREACH_TITLE": "za vsak element %1 v seznamu %2", "CONTROLS_FOREACH_TOOLTIP": "Za vsak element v seznamu nastavi spremenljivko »%1« na ta element. Pri tem se izvedejo določeni stavki.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "prekini zanko", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "nadaljuj z naslednjo ponovitvijo zanke", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Prekine vsebujočo zanko.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Preskoči preostanek te zanke in nadaljuje z naslednjo ponovitvijo.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Pozor: Ta blok lahko uporabite znotraj zanke samo enkrat.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Če je vrednost resnična, izvedi določene stavke.", "CONTROLS_IF_TOOLTIP_2": "Če je vrednost resnična, izvedi prvo skupino stavkov. Sicer izvedi drugo skupino stavkov.", "CONTROLS_IF_TOOLTIP_3": "Če je prva vrednost resnična, izvedi prvo skupino stavkov. Sicer, če je resnična druga vrednost, izvedi drugo skupino stavkov.", @@ -95,40 +88,29 @@ "CONTROLS_IF_IF_TOOLTIP": "Dodajte, odstranite ali spremenite vrstni red odsekov za ponovno nastavitev bloka »če«.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodajte bloku »če« pogoj.", "CONTROLS_IF_ELSE_TOOLTIP": "Dodajte bloku »če« končni pogoj.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Vrne resnično, če sta vnosa enaka.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Vrne resnično, če vnosa nista enaka.", "LOGIC_COMPARE_TOOLTIP_LT": "Vrne resnično, če je prvi vnos manjši od drugega.", "LOGIC_COMPARE_TOOLTIP_LTE": "Vrne resnično, če je prvi vnos manjši ali enak drugemu.", "LOGIC_COMPARE_TOOLTIP_GT": "Vrne resnično, če je prvi vnos večji od drugega.", "LOGIC_COMPARE_TOOLTIP_GTE": "Vrne resnično, če je prvi vnos večji ali enak drugemu.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Vrne resnično, če sta oba vnosa resnična.", "LOGIC_OPERATION_AND": "in", "LOGIC_OPERATION_TOOLTIP_OR": "Vrne resnično, če je vsaj eden od vnosov resničen.", "LOGIC_OPERATION_OR": "ali", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "ne %1", "LOGIC_NEGATE_TOOLTIP": "Vrne resnično, če je vnos neresničen. Vrne neresnično, če je vnos resničen.", - "LOGIC_BOOLEAN_HELPURL": "https://github.com/google/blockly/wiki/Logic#values", "LOGIC_BOOLEAN_TRUE": "resnično", "LOGIC_BOOLEAN_FALSE": "neresnično", "LOGIC_BOOLEAN_TOOLTIP": "Vrne resnično ali neresnično.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "prazno", "LOGIC_NULL_TOOLTIP": "Vrne prazno.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "če resnično", "LOGIC_TERNARY_IF_FALSE": "če neresnično", "LOGIC_TERNARY_TOOLTIP": "Preveri pogoj v »testu«. Če je pogoj resničen, potem vrne vrednost »če resnično«; sicer vrne vrednost »če neresnično«.", "MATH_NUMBER_HELPURL": "https://sl.wikipedia.org/wiki/%C5%A0tevilo", "MATH_NUMBER_TOOLTIP": "Število.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -195,13 +177,10 @@ "MATH_MODULO_HELPURL": "https://sl.wikipedia.org/wiki/Modulo", "MATH_MODULO_TITLE": "ostanek pri %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Vrne ostanek pri deljenju dveh števil.", - "MATH_CONSTRAIN_HELPURL": "https://en.wikipedia.org/wiki/Clamping_%28graphics%29", "MATH_CONSTRAIN_TITLE": "omeji %1 na najmanj %2 in največ %3", "MATH_CONSTRAIN_TOOLTIP": "Omeji število, da bo med določenima (vključenima) mejama.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "naključno število med %1 in %2", "MATH_RANDOM_INT_TOOLTIP": "Vrne naključno število med dvema določenima mejama, vključno z mejama.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "naključni ulomek", "MATH_RANDOM_FLOAT_TOOLTIP": "Vrne naključni ulomek med (vključno) 0,0 in 1,0 (izključno).", "MATH_ATAN2_HELPURL": "https://sl.wikipedia.org/wiki/Atan2", @@ -209,27 +188,21 @@ "MATH_ATAN2_TOOLTIP": "Vrne arkus tangens točke (X, Y) v stopinjah med −180 in 180.", "TEXT_TEXT_HELPURL": "https://sl.wikipedia.org/wiki/Niz", "TEXT_TEXT_TOOLTIP": "Črka, beseda ali vrstica besedila.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "ustvari besedilo iz", "TEXT_JOIN_TOOLTIP": "Ustvari besedilo tako, da združi poljubno število elementov.", "TEXT_CREATE_JOIN_TITLE_JOIN": "združi", "TEXT_CREATE_JOIN_TOOLTIP": "Doda, odstrani ali spremeni vrstni red odsekov za ponovno nastavitev tega bloka besedila.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Doda element k besedilu.", - "TEXT_APPEND_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_APPEND_TITLE": "k %1 dodaj besedilo %2", "TEXT_APPEND_TOOLTIP": "Doda besedilo k spremenljivki »%1«.", - "TEXT_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Text#text-modification", "TEXT_LENGTH_TITLE": "dolžina %1", "TEXT_LENGTH_TOOLTIP": "Vrne število znakov (vključno s presledki) v določenem besedilu.", - "TEXT_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Text#checking-for-empty-text", "TEXT_ISEMPTY_TITLE": "%1 je prazno", "TEXT_ISEMPTY_TOOLTIP": "Vrne resnično, če je določeno besedilo prazno.", - "TEXT_INDEXOF_HELPURL": "https://github.com/google/blockly/wiki/Text#finding-text", "TEXT_INDEXOF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve drugega besedila v prvem besedilu. Če besedila ne najde, vrne %1.", "TEXT_INDEXOF_TITLE": "v besedilu %1 %2 %3", "TEXT_INDEXOF_OPERATOR_FIRST": "najdi prvo pojavitev besedila", "TEXT_INDEXOF_OPERATOR_LAST": "najdi zadnjo pojavitev besedila", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "v besedilu %1 %2", "TEXT_CHARAT_FROM_START": "vrni črko št.", "TEXT_CHARAT_FROM_END": "vrni črko št. od konca", @@ -238,7 +211,6 @@ "TEXT_CHARAT_RANDOM": "vrni naključno črko", "TEXT_CHARAT_TOOLTIP": "Vrne črko na določenem mestu.", "TEXT_GET_SUBSTRING_TOOLTIP": "Vrne določen del besedila.", - "TEXT_GET_SUBSTRING_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-a-region-of-text", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "iz besedila", "TEXT_GET_SUBSTRING_START_FROM_START": "vrni podniz od črke št.", "TEXT_GET_SUBSTRING_START_FROM_END": "vrni podniz od črke št. od konca", @@ -246,20 +218,16 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "do črke št.", "TEXT_GET_SUBSTRING_END_FROM_END": "do črke št. od konca", "TEXT_GET_SUBSTRING_END_LAST": "do zadnje črke", - "TEXT_CHANGECASE_HELPURL": "https://github.com/google/blockly/wiki/Text#adjusting-text-case", "TEXT_CHANGECASE_TOOLTIP": "Vrne kopijo besedila v drugi obliki.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "v VELIKE ČRKE", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "v male črke", "TEXT_CHANGECASE_OPERATOR_TITLECASE": "v Velike Začetnice", - "TEXT_TRIM_HELPURL": "https://github.com/google/blockly/wiki/Text#trimming-removing-spaces", "TEXT_TRIM_TOOLTIP": "Vrne kopijo besedila z odstranjenimi presledki z ene ali obeh strani.", "TEXT_TRIM_OPERATOR_BOTH": "odstrani presledke z obeh strani", "TEXT_TRIM_OPERATOR_LEFT": "odstrani presledke z leve strani", "TEXT_TRIM_OPERATOR_RIGHT": "odstrani presledke z desne strani", - "TEXT_PRINT_HELPURL": "https://github.com/google/blockly/wiki/Text#printing-text", "TEXT_PRINT_TITLE": "izpiši %1", "TEXT_PRINT_TOOLTIP": "Izpiše določeno besedilo, številko ali drugo vrednost.", - "TEXT_PROMPT_HELPURL": "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user", "TEXT_PROMPT_TYPE_TEXT": "vprašaj za besedilo s sporočilom", "TEXT_PROMPT_TYPE_NUMBER": "vprašaj za številko s sporočilom", "TEXT_PROMPT_TOOLTIP_NUMBER": "Vpraša uporabnika za vnos številke.", @@ -270,26 +238,20 @@ "TEXT_REPLACE_TOOLTIP": "Zamenja vse pojavitve besedila v drugem besedilu.", "TEXT_REVERSE_MESSAGE0": "obrni %1", "TEXT_REVERSE_TOOLTIP": "Obrne vrstni red znakov v besedilu.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "ustvari prazen seznam", "LISTS_CREATE_EMPTY_TOOLTIP": "Vrne seznam dolžine 0, ki ne vsebuje nobenih podatkovnih zapisov.", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Ustvari seznam s poljubnim številom elementov.", "LISTS_CREATE_WITH_INPUT_WITH": "ustvari seznam iz", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "seznam", "LISTS_CREATE_WITH_CONTAINER_TOOLTIP": "Doda, odstrani ali spremeni vrstni red blokov seznama.", "LISTS_CREATE_WITH_ITEM_TOOLTIP": "Doda element v seznam.", - "LISTS_REPEAT_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_REPEAT_TOOLTIP": "Ustvari seznam iz dane vrednosti z določenim številom ponovitev.", "LISTS_REPEAT_TITLE": "ustvari seznam z elementom %1, ki se ponovi %2-krat", - "LISTS_LENGTH_HELPURL": "https://github.com/google/blockly/wiki/Lists#length-of", "LISTS_LENGTH_TITLE": "dolžina %1", "LISTS_LENGTH_TOOLTIP": "Vrne dolžino seznama.", - "LISTS_ISEMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#is-empty", "LISTS_ISEMPTY_TITLE": "%1 je prazen", "LISTS_ISEMPTY_TOOLTIP": "Vrne resnično, če je seznam prazen.", "LISTS_INLIST": "v seznamu", - "LISTS_INDEX_OF_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list", "LISTS_INDEX_OF_FIRST": "najdi prvo pojavitev elementa", "LISTS_INDEX_OF_LAST": "najdi zadnjo pojavitev elementa", "LISTS_INDEX_OF_TOOLTIP": "Vrne mesto (indeks) prve/zadnje pojavitve elementa v seznamu. Če elementa ne najde, vrne %1.", @@ -315,7 +277,6 @@ "LISTS_GET_INDEX_TOOLTIP_REMOVE_FIRST": "Odstrani prvi element seznama.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_LAST": "Odstrani zadnji element seznama.", "LISTS_GET_INDEX_TOOLTIP_REMOVE_RANDOM": "Odstrani naključni element seznama.", - "LISTS_SET_INDEX_HELPURL": "https://github.com/google/blockly/wiki/Lists#in-list--set", "LISTS_SET_INDEX_SET": "nastavi na", "LISTS_SET_INDEX_INSERT": "vstavi na", "LISTS_SET_INDEX_INPUT_TO": "element", @@ -327,7 +288,6 @@ "LISTS_SET_INDEX_TOOLTIP_INSERT_FIRST": "Vstavi element na začetek seznama.", "LISTS_SET_INDEX_TOOLTIP_INSERT_LAST": "Doda element na konec seznama.", "LISTS_SET_INDEX_TOOLTIP_INSERT_RANDOM": "Vstavi element na naključno mesto v seznamu.", - "LISTS_GET_SUBLIST_HELPURL": "https://github.com/google/blockly/wiki/Lists#getting-a-sublist", "LISTS_GET_SUBLIST_START_FROM_START": "ustvari podseznam od mesta št.", "LISTS_GET_SUBLIST_START_FROM_END": "ustvari podseznam od mesta št. od konca", "LISTS_GET_SUBLIST_START_FIRST": "ustvari podseznam od prvega mesta", @@ -335,7 +295,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "do mesta št. od konca", "LISTS_GET_SUBLIST_END_LAST": "do zadnjega mesta", "LISTS_GET_SUBLIST_TOOLTIP": "Ustvari kopijo določenega dela seznama.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "uredi %1 %2 %3", "LISTS_SORT_TOOLTIP": "Uredi kopijo seznama.", "LISTS_SORT_ORDER_ASCENDING": "naraščajoče", @@ -343,7 +302,6 @@ "LISTS_SORT_TYPE_NUMERIC": "številsko", "LISTS_SORT_TYPE_TEXT": "abecedno", "LISTS_SORT_TYPE_IGNORECASE": "abecedno, prezri velikost črk", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "ustvari seznam iz besedila", "LISTS_SPLIT_TEXT_FROM_LIST": "ustvari besedilo iz seznama", "LISTS_SPLIT_WITH_DELIMITER": "z ločilom", @@ -351,21 +309,17 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Združi seznam besedil v eno besedilo z ločilom med besedili.", "LISTS_REVERSE_MESSAGE0": "obrni %1", "LISTS_REVERSE_TOOLTIP": "Obrne kopijo seznama.", - "VARIABLES_GET_HELPURL": "https://github.com/google/blockly/wiki/Variables#get", "VARIABLES_GET_TOOLTIP": "Vrne vrednost spremenljivke.", "VARIABLES_GET_CREATE_SET": "Ustvari »nastavi %1«", - "VARIABLES_SET_HELPURL": "https://github.com/google/blockly/wiki/Variables#set", "VARIABLES_SET": "nastavi %1 na %2", "VARIABLES_SET_TOOLTIP": "Nastavi, da je vrednost spremenljivke enaka vnosu.", "VARIABLES_SET_CREATE_GET": "Ustvari »vrni %1«", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "izvedi", "PROCEDURES_DEFNORETURN_PROCEDURE": "nekaj", "PROCEDURES_BEFORE_PARAMS": "s/z:", "PROCEDURES_CALL_BEFORE_PARAMS": "s/z:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Ustvari funkcijo brez izhoda.", "PROCEDURES_DEFNORETURN_COMMENT": "Opiši funkcijo ...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "vrni", "PROCEDURES_DEFRETURN_TOOLTIP": "Ustvari funkcijo z izhodom.", "PROCEDURES_ALLOW_STATEMENTS": "dovoli stavke", @@ -381,7 +335,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Označi blok funkcije", "PROCEDURES_CREATE_DO": "Ustvari »%1«", "PROCEDURES_IFRETURN_TOOLTIP": "Če je vrednost resnična, vrne drugo vrednost.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Pozor: Ta blok lahko uporabite samo v bloku funkcije.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Povej nekaj ...", "WORKSPACE_ARIA_LABEL": "Blocklyjev delovni prostor", diff --git a/msg/json/sq.json b/msg/json/sq.json index eae51aeb730..31a5c2cb6b3 100644 --- a/msg/json/sq.json +++ b/msg/json/sq.json @@ -47,13 +47,11 @@ "COLOUR_PICKER_TOOLTIP": "Zgjidh nje ngjyre nga nje game ngjyrash.", "COLOUR_RANDOM_TITLE": "ngjyre e rastesishme", "COLOUR_RANDOM_TOOLTIP": "Zgjidhni një ngjyrë në mënyrë të rastësishme.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "ngjyre me", "COLOUR_RGB_RED": "e kuqe", "COLOUR_RGB_GREEN": "jeshile", "COLOUR_RGB_BLUE": "blu", "COLOUR_RGB_TOOLTIP": "Krijo një ngjyrë me shumën e specifikuar te te kuqes, te gjelbëres, dhe bluse. Te gjitha vlerat duhet te jene mes 0 dhe 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "Përzierje", "COLOUR_BLEND_COLOUR1": "Ngjyra 1", "COLOUR_BLEND_COLOUR2": "Ngjyra 2", @@ -112,11 +110,7 @@ "LOGIC_TERNARY_TOOLTIP": "Kontrollo kushtin në 'test'. Nëse kushti është i saktë, kthen vlerën 'nëse e saktë'; përndryshe kthen vlerën 'nëse e pasaktë'.", "MATH_NUMBER_HELPURL": "http://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Një numër.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", "MATH_MULTIPLICATION_SYMBOL": "x", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -191,7 +185,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "http://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "fraksioni i rastësishëm", "MATH_RANDOM_FLOAT_TOOLTIP": "Kthe fraksionin e rastësishëm në mes të 0.0 (përfshirëse) dhe 1.0 (jopërfshirëse).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 of X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Ktheni arkangjentin e pikës (X, Y) në gradë nga -180 në 180.", "TEXT_TEXT_HELPURL": "http://en.wikipedia.org/wiki/String_(computer_science)", @@ -241,13 +234,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Kerkoji perdoruesit nje numer.", "TEXT_PROMPT_TOOLTIP_TEXT": "Kerkoji perdoruesit ca tekst.", "TEXT_COUNT_MESSAGE0": "numro %1 në %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Numrin sa herë paraqitet një tekst brenda një teksti tjetër.", "TEXT_REPLACE_MESSAGE0": "zëvendëso %1 me %2 në %3", "TEXT_REPLACE_TOOLTIP": "Zëvendëso të gjitha paraqitjet e një teksti brenda një teksti tjetër.", "TEXT_REVERSE_MESSAGE0": "kthe %1", "TEXT_REVERSE_TOOLTIP": "Kthen renditjen e karaktereve në tekst.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "krijo një listë të zbrazët", "LISTS_CREATE_EMPTY_TOOLTIP": "Kthen një listë, te gjatësisë 0, duke mos përmbajtur asnjë regjistrim të të dhënave", "LISTS_CREATE_WITH_TOOLTIP": "Krijo një listë me ndonjë numbër të sendeve.", @@ -305,7 +296,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "tek # nga fundi", "LISTS_GET_SUBLIST_END_LAST": "tek i fundit", "LISTS_GET_SUBLIST_TOOLTIP": "Krijon në kopje të pjesës së specifikuar të listës.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "rendit %1 %2 %3", "LISTS_SORT_TOOLTIP": "Rendit një kopje të listës.", "LISTS_SORT_ORDER_ASCENDING": "ngjitje", @@ -325,21 +315,17 @@ "VARIABLES_SET": "vendos %1 ne %2", "VARIABLES_SET_TOOLTIP": "Vendos kete variable te jete e barabarte me te dhenat ne hyrje.", "VARIABLES_SET_CREATE_GET": "Krijo 'merr %1", - "PROCEDURES_DEFNORETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "te", "PROCEDURES_DEFNORETURN_PROCEDURE": "bëj diqka", "PROCEDURES_BEFORE_PARAMS": "me:", "PROCEDURES_CALL_BEFORE_PARAMS": "me:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Krijon një funksion pa dalje.", "PROCEDURES_DEFNORETURN_COMMENT": "Përshkruaj këtë funksion...", - "PROCEDURES_DEFRETURN_HELPURL": "http://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "rikthe", "PROCEDURES_DEFRETURN_TOOLTIP": "Krijon një funksion me një dalje.", "PROCEDURES_ALLOW_STATEMENTS": "lejo deklaratat", "PROCEDURES_DEF_DUPLICATE_WARNING": "Paralajmërim: Ky funksion ka parametra të dyfishuar.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Lësho funksionin e definuar nga përdoruesi '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Lëho funksionin e definuar nga përdoruesi '%1' dhe përdor daljen e tij.", "PROCEDURES_MUTATORCONTAINER_TITLE": "Informacioni i futur", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Shto, hiq, ose rirendit inputet e këtij funksioni.", diff --git a/msg/json/sr-latn.json b/msg/json/sr-latn.json index 4dbffcc8de0..c38a6ca603e 100644 --- a/msg/json/sr-latn.json +++ b/msg/json/sr-latn.json @@ -39,13 +39,11 @@ "COLOUR_PICKER_TOOLTIP": "Izaberite boju sa palete.", "COLOUR_RANDOM_TITLE": "slučajna boja", "COLOUR_RANDOM_TOOLTIP": "Izaberite boju nasumice.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "boja sa", "COLOUR_RGB_RED": "crvena", "COLOUR_RGB_GREEN": "zelena", "COLOUR_RGB_BLUE": "plava", "COLOUR_RGB_TOOLTIP": "Kreiraj boju sa određenom količinom crvene,zelene, i plave. Sve vrednosti moraju biti između 0 i 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "pomešaj", "COLOUR_BLEND_COLOUR1": "boja 1", "COLOUR_BLEND_COLOUR2": "boja 2", @@ -94,28 +92,19 @@ "LOGIC_BOOLEAN_TRUE": "tačno", "LOGIC_BOOLEAN_FALSE": "netačno", "LOGIC_BOOLEAN_TOOLTIP": "Vraća ili tačno ili netačno.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "bez vrednosti", "LOGIC_NULL_TOOLTIP": "Vraća „bez vrednosti“.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "proba", "LOGIC_TERNARY_IF_TRUE": "ako je tačno", "LOGIC_TERNARY_IF_FALSE": "ako je netačno", "LOGIC_TERNARY_TOOLTIP": "Proveri uslov u 'test'. Ako je uslov tačan, tada vraća 'if true' vrednost; u drugom slučaju vraća 'if false' vrednost.", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "Neki broj.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", "MATH_TRIG_ASIN": "arc sin", "MATH_TRIG_ACOS": "arc cos", "MATH_TRIG_ATAN": "arc tan", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_ARITHMETIC_TOOLTIP_ADD": "Vratite zbir dva broja.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vraća razliku dva broja.", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "Vraća proizvod dva broja.", @@ -148,7 +137,6 @@ "MATH_IS_NEGATIVE": "je negativan", "MATH_IS_DIVISIBLE_BY": "je deljiv sa", "MATH_IS_TOOLTIP": "Provjerava da li je broj paran, neparan, prost, cio, pozitivan, negativan, ili da li je deljiv sa određenim brojem. Vraća tačno ili netačno.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "promeni %1 za %2", "MATH_CHANGE_TOOLTIP": "Dodajte broj promenljivoj „%1“.", "MATH_ROUND_HELPURL": "https://sr.wikipedia.org/wiki/Zaokruživanje", @@ -230,15 +218,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Pitajte korisnika za broj.", "TEXT_PROMPT_TOOLTIP_TEXT": "Pitajte korisnika za unos teksta.", "TEXT_COUNT_MESSAGE0": "broj %1 u %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Broji koliko puta se neki tekst pojavljuje unutar nekog drugog teksta.", "TEXT_REPLACE_MESSAGE0": "zamena %1 sa %2 u %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Zamena svih pojava nekog teksta unutar nekog drugog teksta.", "TEXT_REVERSE_MESSAGE0": "obrnuto %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Obrće redosled karaktera u tekstu.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "napravi prazan spisak", "LISTS_CREATE_EMPTY_TOOLTIP": "vraća listu, dužine 0, ne sadržavajući evidenciju podataka", "LISTS_CREATE_WITH_TOOLTIP": "Kreiraj listu sa bilo kojim brojem stavki.", @@ -296,7 +280,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "do # od kraja", "LISTS_GET_SUBLIST_END_LAST": "do poslednje", "LISTS_GET_SUBLIST_TOOLTIP": "Pravi kopiju određenog dela liste.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sortiraj %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortirajte kopiju spiska.", "LISTS_SORT_ORDER_ASCENDING": "rastuće", @@ -309,7 +292,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "sa razdvajanje", "LISTS_SPLIT_TOOLTIP_SPLIT": "Podeliti tekst u listu tekstova, razbijanje na svakom graničnik.", "LISTS_SPLIT_TOOLTIP_JOIN": "Da se pridruži listu tekstova u jedan tekst, podeljenih za razdvajanje.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "obrnuto %1", "LISTS_REVERSE_TOOLTIP": "Obrni kopiju spiska.", "VARIABLES_GET_TOOLTIP": "Vraća vrednost ove promenljive.", @@ -317,21 +299,17 @@ "VARIABLES_SET": "postavi %1 u %2", "VARIABLES_SET_TOOLTIP": "Postavlja promenljivu tako da bude jednaka ulazu.", "VARIABLES_SET_CREATE_GET": "Napravi „preuzmi %1“", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "da", "PROCEDURES_DEFNORETURN_PROCEDURE": "uradite nešto", "PROCEDURES_BEFORE_PARAMS": "sa:", "PROCEDURES_CALL_BEFORE_PARAMS": "sa:", "PROCEDURES_DEFNORETURN_TOOLTIP": "Pravi funkciju bez izlaza.", "PROCEDURES_DEFNORETURN_COMMENT": "Opisati ovu funkciju...", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "vrati", "PROCEDURES_DEFRETURN_TOOLTIP": "Pravi funkciju sa izlazom.", "PROCEDURES_ALLOW_STATEMENTS": "dozvoliti izreke", "PROCEDURES_DEF_DUPLICATE_WARNING": "Upozorenje: Ova funkcija ima duplikate parametara.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Pokrenite prilagođenu funkciju „%1“.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Pokrenite prilagođenu funkciju „%1“ i koristi njen izlaz.", "PROCEDURES_MUTATORCONTAINER_TITLE": "ulazi", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Da dodate, uklonite ili pereuporяdočitь ulaza za ovu funkciju.", diff --git a/msg/json/sr.json b/msg/json/sr.json index bf3c42a06a1..ab6714d5fe5 100644 --- a/msg/json/sr.json +++ b/msg/json/sr.json @@ -53,13 +53,11 @@ "COLOUR_PICKER_TOOLTIP": "Одаберите боју са палете.", "COLOUR_RANDOM_TITLE": "случајна боја", "COLOUR_RANDOM_TOOLTIP": "Одаберите боју насумично.", - "COLOUR_RGB_HELPURL": "http://www.december.com/html/spec/colorper.html", "COLOUR_RGB_TITLE": "боја са", "COLOUR_RGB_RED": "црвена", "COLOUR_RGB_GREEN": "зелена", "COLOUR_RGB_BLUE": "плава", "COLOUR_RGB_TOOLTIP": "Направите боју са одређеном количином црвене, зелене и плаве. Све вредности морају бити између 0 и 100.", - "COLOUR_BLEND_HELPURL": "http://meyerweb.com/eric/tools/color-blend/", "COLOUR_BLEND_TITLE": "помешај", "COLOUR_BLEND_COLOUR1": "боја 1", "COLOUR_BLEND_COLOUR2": "боја 2", @@ -108,21 +106,14 @@ "LOGIC_BOOLEAN_TRUE": "тачно", "LOGIC_BOOLEAN_FALSE": "нетачно", "LOGIC_BOOLEAN_TOOLTIP": "Враћа или „тачно“ или „нетачно“.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "без вредности", "LOGIC_NULL_TOOLTIP": "Враћа „без вредности“.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "проба", "LOGIC_TERNARY_IF_TRUE": "ако је тачно", "LOGIC_TERNARY_IF_FALSE": "ако је нетачно", "LOGIC_TERNARY_TOOLTIP": "Проверите услов у „проба”. Ако је услов тачан, тада враћа „ако је тачно” вредност; у другом случају враћа „ако је нетачно” вредност.", "MATH_NUMBER_HELPURL": "https://sr.wikipedia.org/wiki/Број", "MATH_NUMBER_TOOLTIP": "Број.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "син", "MATH_TRIG_COS": "цос", "MATH_TRIG_TAN": "тан", @@ -162,7 +153,6 @@ "MATH_IS_NEGATIVE": "је негативан", "MATH_IS_DIVISIBLE_BY": "је дељив са", "MATH_IS_TOOLTIP": "Проверава да ли је број паран, непаран, прост, цео, позитиван, негативан, или дељив са одређеним бројем. Враћа „тачно” или „нетачно”.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "промени %1 за %2", "MATH_CHANGE_TOOLTIP": "Додаје број променљивој „%1”.", "MATH_ROUND_HELPURL": "https://sr.wikipedia.org/wiki/Заокруживање", @@ -170,7 +160,6 @@ "MATH_ROUND_OPERATOR_ROUND": "заокружи", "MATH_ROUND_OPERATOR_ROUNDUP": "заокружи навише", "MATH_ROUND_OPERATOR_ROUNDDOWN": "заокружи наниже", - "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "збир списка", "MATH_ONLIST_TOOLTIP_SUM": "Враћа збир свих бројева са списка.", "MATH_ONLIST_OPERATOR_MIN": "мин. списка", @@ -198,7 +187,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://sr.wikipedia.org/wiki/Генератор_случајних_бројева", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "случајни разломак", "MATH_RANDOM_FLOAT_TOOLTIP": "Враћа случајни разломак између 0.0 (укључиво) и 1.0 (искључиво).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "атан2 од X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Врати арктангенту тачке (X, Y) у степенима од -180 до 180.", "TEXT_TEXT_HELPURL": "https://sr.wikipedia.org/wiki/Ниска", @@ -224,7 +212,6 @@ "TEXT_CHARAT_FIRST": "преузми прво слово", "TEXT_CHARAT_LAST": "преузми последње слово", "TEXT_CHARAT_RANDOM": "преузми случајно слово", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "Враћа слово на одређени положај.", "TEXT_GET_SUBSTRING_TOOLTIP": "Враћа одређени део текста.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "у тексту", @@ -234,7 +221,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "слову #", "TEXT_GET_SUBSTRING_END_FROM_END": "слову # са краја", "TEXT_GET_SUBSTRING_END_LAST": "последњем слову", - "TEXT_GET_SUBSTRING_TAIL": "", "TEXT_CHANGECASE_TOOLTIP": "Враћа примерак текста са другачијом величином слова.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "великим словима", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "малим словима", @@ -250,15 +236,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Питајте корисника за број.", "TEXT_PROMPT_TOOLTIP_TEXT": "Питајте корисника за унос текста.", "TEXT_COUNT_MESSAGE0": "број %1 у %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Броји колико пута се неки текст појављује унутар неког другог текста.", "TEXT_REPLACE_MESSAGE0": "замена %1 са %2 у %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Замена свих појава неког текста унутар неког другог текста.", "TEXT_REVERSE_MESSAGE0": "обрнуто %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Обрће редослед карактера у тексту.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "направи празан списак", "LISTS_CREATE_EMPTY_TOOLTIP": "Враћа списак, дужине 0, без података", "LISTS_CREATE_WITH_TOOLTIP": "Направите списак са било којим бројем ставки.", @@ -284,7 +266,6 @@ "LISTS_GET_INDEX_FIRST": "прва", "LISTS_GET_INDEX_LAST": "последња", "LISTS_GET_INDEX_RANDOM": "случајна", - "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 је прва ставка.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 је последња ставка.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Враћа ставку на одређену позицију на списку.", @@ -316,9 +297,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "до #", "LISTS_GET_SUBLIST_END_FROM_END": "до # од краја", "LISTS_GET_SUBLIST_END_LAST": "до последње", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Прави копију одређеног дела списка.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сортирај %1 %2 %3", "LISTS_SORT_TOOLTIP": "Сортирајте копију списка.", "LISTS_SORT_ORDER_ASCENDING": "растуће", @@ -331,24 +310,19 @@ "LISTS_SPLIT_WITH_DELIMITER": "са граничником", "LISTS_SPLIT_TOOLTIP_SPLIT": "Раздваја текст у списак текстова, преламањем на сваком граничнику.", "LISTS_SPLIT_TOOLTIP_JOIN": "Спаја списак текстова у један текст, раздвојених граничником.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "обрнуто %1", "LISTS_REVERSE_TOOLTIP": "Обрни копију списка.", - "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Враћа вредност ове променљиве.", "VARIABLES_GET_CREATE_SET": "Направи блок за доделу вредности %1", "VARIABLES_SET": "постави %1 у %2", "VARIABLES_SET_TOOLTIP": "Поставља променљиву тако да буде једнака улазу.", "VARIABLES_SET_CREATE_GET": "Направи блок за преузимање вредности из „%1”", - "PROCEDURES_DEFNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFNORETURN_TITLE": "до", "PROCEDURES_DEFNORETURN_PROCEDURE": "урадите нешто", "PROCEDURES_BEFORE_PARAMS": "са:", "PROCEDURES_CALL_BEFORE_PARAMS": "са:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Прави функцију без излаза.", "PROCEDURES_DEFNORETURN_COMMENT": "Опишите ову функцију…", - "PROCEDURES_DEFRETURN_HELPURL": "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29", "PROCEDURES_DEFRETURN_RETURN": "врати", "PROCEDURES_DEFRETURN_TOOLTIP": "Прави функцију са излазом.", "PROCEDURES_ALLOW_STATEMENTS": "дозволи изјаве", diff --git a/msg/json/sv.json b/msg/json/sv.json index 46c19a9de80..1ea2206a711 100644 --- a/msg/json/sv.json +++ b/msg/json/sv.json @@ -52,40 +52,32 @@ "COLOUR_PICKER_TOOLTIP": "Välj en färg från paletten.", "COLOUR_RANDOM_TITLE": "slumpfärg", "COLOUR_RANDOM_TOOLTIP": "Slumpa fram en färg.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "färg med", "COLOUR_RGB_RED": "röd", "COLOUR_RGB_GREEN": "grön", "COLOUR_RGB_BLUE": "blå", "COLOUR_RGB_TOOLTIP": "Skapa en färg med det angivna mängden röd, grön och blå. Alla värden måste vara mellan 0 och 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "blanda", "COLOUR_BLEND_COLOUR1": "färg 1", "COLOUR_BLEND_COLOUR2": "färg 2", "COLOUR_BLEND_RATIO": "förhållande", "COLOUR_BLEND_TOOLTIP": "Blandar ihop två färger med ett bestämt förhållande (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "upprepa %1 gånger", "CONTROLS_REPEAT_INPUT_DO": "utför", "CONTROLS_REPEAT_TOOLTIP": "Utför några kommandon flera gånger.", - "CONTROLS_WHILEUNTIL_HELPURL": "https://github.com/google/blockly/wiki/Loops#repeat", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "upprepa så länge", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "upprepa tills", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "Medan ett värde är sant, utför några kommandon.", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "Medan ett värde är falskt, utför några kommandon.", - "CONTROLS_FOR_HELPURL": "https://github.com/google/blockly/wiki/Loops#count-with", "CONTROLS_FOR_TOOLTIP": "Låt variabeln \"%1\" anta värden från starttalet till sluttalet, beräknat med det angivna intervallet, och utför de angivna blocken.", "CONTROLS_FOR_TITLE": "räkna med %1 från %2 till %3 med %4", - "CONTROLS_FOREACH_HELPURL": "https://github.com/google/blockly/wiki/Loops#for-each", "CONTROLS_FOREACH_TITLE": "för varje föremål %1 i listan %2", "CONTROLS_FOREACH_TOOLTIP": "För varje objekt i en lista, ange variabeln '%1' till objektet, och utför sedan några kommandon.", - "CONTROLS_FLOW_STATEMENTS_HELPURL": "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "bryt ut ur loop", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "fortsätta med nästa upprepning av loop", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "Bryt ut ur den innehållande upprepningen.", "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "Hoppa över resten av denna loop och fortsätt med nästa loop.", "CONTROLS_FLOW_STATEMENTS_WARNING": "Varning: Detta block kan endast användas i en loop.", - "CONTROLS_IF_HELPURL": "https://github.com/google/blockly/wiki/IfElse", "CONTROLS_IF_TOOLTIP_1": "Om ett värde är sant, utför några kommandon.", "CONTROLS_IF_TOOLTIP_2": "Om värdet är sant, utför det första kommandoblocket. Utför annars det andra kommandoblocket.", "CONTROLS_IF_TOOLTIP_3": "Om det första värdet är sant, utför det första kommandoblocket. Annars, om det andra värdet är sant, utför det andra kommandoblocket.", @@ -103,12 +95,10 @@ "LOGIC_COMPARE_TOOLTIP_LTE": "Ger tillbaka sant om det första värdet är mindre än eller lika med det andra.", "LOGIC_COMPARE_TOOLTIP_GT": "Ger tillbaka sant om det första värdet är större än det andra.", "LOGIC_COMPARE_TOOLTIP_GTE": "Ger tillbaka sant om det första värdet är större än eller lika med det andra.", - "LOGIC_OPERATION_HELPURL": "https://github.com/google/blockly/wiki/Logic#logical-operations", "LOGIC_OPERATION_TOOLTIP_AND": "Ger tillbaka sant om båda värdena är sanna.", "LOGIC_OPERATION_AND": "och", "LOGIC_OPERATION_TOOLTIP_OR": "Ger tillbaka sant om minst ett av värdena är sant.", "LOGIC_OPERATION_OR": "eller", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "inte %1", "LOGIC_NEGATE_TOOLTIP": "Ger tillbaka sant om inmatningen är falsk. Ger tillbaka falskt och inmatningen är sann.", "LOGIC_BOOLEAN_TRUE": "sant", @@ -117,18 +107,12 @@ "LOGIC_NULL_HELPURL": "https://sv.wikipedia.org/wiki/Null", "LOGIC_NULL": "null", "LOGIC_NULL_TOOLTIP": "Returnerar null.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "test", "LOGIC_TERNARY_IF_TRUE": "om sant", "LOGIC_TERNARY_IF_FALSE": "om falskt", "LOGIC_TERNARY_TOOLTIP": "Kontrollera villkoret i \"test\". Om villkoret är sant, ge tillbaka \"om sant\"-värdet; annars ge tillbaka \"om falskt\"-värdet.", "MATH_NUMBER_HELPURL": "https://sv.wikipedia.org/wiki/Tal", "MATH_NUMBER_TOOLTIP": "Ett tal.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "-", - "MATH_DIVISION_SYMBOL": "÷", - "MATH_MULTIPLICATION_SYMBOL": "×", - "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -168,7 +152,6 @@ "MATH_IS_NEGATIVE": "är negativt", "MATH_IS_DIVISIBLE_BY": "är delbart med", "MATH_IS_TOOLTIP": "Kontrollera om ett tal är jämnt, ojämnt, helt, positivt, negativt eller det är delbart med ett bestämt tal. Returnerar med sant eller falskt.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "ändra %1 med %2", "MATH_CHANGE_TOOLTIP": "Lägg till ett tal till variabeln '%1'.", "MATH_ROUND_HELPURL": "https://sv.wikipedia.org/wiki/Avrundning", @@ -203,7 +186,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://sv.wikipedia.org/wiki/Slumptalsgenerator", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slumpat decimaltal", "MATH_RANDOM_FLOAT_TOOLTIP": "Ger tillbaka ett slumpat decimaltal mellan 0.0 (inkluderat) och 1.0 (exkluderat).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 av X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Returnerar arcustangens av punkt (X, Y) i grader från -180 till 180.", "TEXT_TEXT_HELPURL": "https://sv.wikipedia.org/wiki/Str%C3%A4ng_%28data%29", @@ -253,18 +235,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Fråga användaren efter ett tal.", "TEXT_PROMPT_TOOLTIP_TEXT": "Fråga användaren efter lite text.", "TEXT_COUNT_MESSAGE0": "räkna %1 i %2", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Räkna hur många gånger en text förekommer inom en annan text.", "TEXT_REPLACE_MESSAGE0": "ersätt %1 med %2 i %3", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "Ersätt alla förekomster av en text inom en annan text.", "TEXT_REVERSE_MESSAGE0": "vänd på %1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "Vänder på teckenordningen i texten.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "skapa tom lista", "LISTS_CREATE_EMPTY_TOOLTIP": "Ger tillbaka en lista utan någon data, alltså med längden 0", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "Skapa en lista med valfritt antal föremål.", "LISTS_CREATE_WITH_INPUT_WITH": "skapa lista med", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "lista", @@ -320,7 +297,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "till # från slutet", "LISTS_GET_SUBLIST_END_LAST": "till sista", "LISTS_GET_SUBLIST_TOOLTIP": "Skapar en kopia av den specificerade delen av en lista.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sortera %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sortera en kopia av en lista.", "LISTS_SORT_ORDER_ASCENDING": "stigande", @@ -328,13 +304,11 @@ "LISTS_SORT_TYPE_NUMERIC": "numeriskt", "LISTS_SORT_TYPE_TEXT": "alfabetiskt", "LISTS_SORT_TYPE_IGNORECASE": "alfabetiskt, ignorera skiftläge", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "skapa lista från text", "LISTS_SPLIT_TEXT_FROM_LIST": "skapa text från lista", "LISTS_SPLIT_WITH_DELIMITER": "med avgränsare", "LISTS_SPLIT_TOOLTIP_SPLIT": "Dela upp text till en textlista och bryt vid varje avgränsare.", "LISTS_SPLIT_TOOLTIP_JOIN": "Sammanfoga en textlista till en text, som separeras av en avgränsare.", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "vänd på %1", "LISTS_REVERSE_TOOLTIP": "Vänd på en kopia av en lista.", "VARIABLES_GET_TOOLTIP": "Returnerar värdet av denna variabel.", @@ -354,9 +328,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Skapar en funktion med output.", "PROCEDURES_ALLOW_STATEMENTS": "tillåta uttalanden", "PROCEDURES_DEF_DUPLICATE_WARNING": "Varning: Denna funktion har dubbla parametrar.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\".", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Kör den användardefinierade funktionen \"%1\" och använd resultatet av den.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inmatningar", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Lägg till, ta bort och ändra ordningen för inmatningar till denna funktion.", @@ -365,7 +337,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Markera funktionsdefinition", "PROCEDURES_CREATE_DO": "Skapa '%1'", "PROCEDURES_IFRETURN_TOOLTIP": "Om ett värde är sant returneras ett andra värde.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Varning: Detta block får användas endast i en funktionsdefinition.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Säg någonting...", "WORKSPACE_ARIA_LABEL": "Blocklys arbetsyta", diff --git a/msg/json/ta.json b/msg/json/ta.json index bc858c93473..63e7705a888 100644 --- a/msg/json/ta.json +++ b/msg/json/ta.json @@ -35,7 +35,6 @@ "NEW_VARIABLE": "மாறிலியை உருவாக்குக...", "NEW_VARIABLE_TYPE_TITLE": "புதிய மாறிலியின் பெயர்:", "NEW_VARIABLE_TITLE": "புதிய மாறிலியின் பெயர்:", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "வண்ண தட்டிலிருந்து ஒரு நிறத்தைத் தேர்ந்தெடுக்கவும்.", "COLOUR_RANDOM_TITLE": "தற்போக்கு நிறம்", "COLOUR_RANDOM_TOOLTIP": "தற்போக்கில் ஒரு நிறத்தை தேர்ந்தெடுக்கவும்.", @@ -49,7 +48,6 @@ "COLOUR_BLEND_COLOUR2": "நிறம் 2", "COLOUR_BLEND_RATIO": "விகிதம்", "COLOUR_BLEND_TOOLTIP": "கொடுக்கப்பட்ட விகதத்தில் (0.0 - 1.0) இரு நிறங்களை கலக்குக.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "'%1' முரை திரும்ப செய்", "CONTROLS_REPEAT_INPUT_DO": "செய்க", "CONTROLS_REPEAT_TOOLTIP": "கட்டளைகளை பல முரை செய்ய", @@ -76,7 +74,6 @@ "CONTROLS_IF_IF_TOOLTIP": "கட்டளைகளை தொகுப்பு திருத்துதம் செய்", "CONTROLS_IF_ELSEIF_TOOLTIP": "ஆனால் தொகுப்பிற்கு நிபந்தனை சேர்க்க", "CONTROLS_IF_ELSE_TOOLTIP": "ஆனால் தொகுப்பிற்கு விதிவிலக்கு காப்பை சேர்க்க", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "இரண்டு மாறியும் ஈடானால், மெய் பின்கொடு.", "LOGIC_COMPARE_TOOLTIP_NEQ": "இரண்டு மாறியும் ஈடாகாவிட்டால், மெய் பின்கொடு.", "LOGIC_COMPARE_TOOLTIP_LT": "முதல் உள்ளீடு இரண்டாவதைவிட குறைவாக இருந்தால், மெய் பின்கொடு.", @@ -132,10 +129,8 @@ "MATH_IS_POSITIVE": "எண் நேர்ம முழுதானதா ?", "MATH_IS_NEGATIVE": "எண் குறைவானதா ?", "MATH_IS_DIVISIBLE_BY": "ஆல் வகுபடக் கூடியது", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "மாற்று %1 மூலம் %2", "MATH_CHANGE_TOOLTIP": "எண்னை '%1' மதிப்பால் கூட்டு,", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "மேல்/கீழ் வழி முழு எண் ஆக மாற்று.", "MATH_ROUND_OPERATOR_ROUND": "முழுமையாக்கு", "MATH_ROUND_OPERATOR_ROUNDUP": "மேல்வழி முழுமையாக்கு", @@ -156,15 +151,12 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "பட்டியலின் நியமவிலகலை பின்கொடு.", "MATH_ONLIST_OPERATOR_RANDOM": "ஒரு பட்டியலில் இருந்து சீரற்ற உருப்படி", "MATH_ONLIST_TOOLTIP_RANDOM": "ஒரு பட்டியலில் இருந்து சீரற்ற உருப்படி பின்கொடு", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "%1 ÷ %2ன் மீதி", "MATH_MODULO_TOOLTIP": "இரண்டு எண்கள் மூலம் பிரிவில் இருந்து எஞ்சியதை பின்கொடு.", "MATH_CONSTRAIN_TITLE": "%1 மாறியை %2 மேலும் %3 கீழும் வற்புறுத்து", "MATH_CONSTRAIN_TOOLTIP": "எண் மாறி வீசுகளம் உள்ளடங்கிய வாறு வற்புறுத்து", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "வீசுகளம் %1 இல் இருந்து %2 உள்ளடங்கிய வாறு சீரற்ற எண்", "MATH_RANDOM_INT_TOOLTIP": "வீசுகளம் இல் இருந்த (உள்ளடங்கிய) வாறு சீரற்ற எண் பின்கொடு.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "சீரற்ற எண் பின்னம்", "MATH_RANDOM_FLOAT_TOOLTIP": "சீரற்ற எண் பின்னம், 0.0 இல் இருந்து 1.0 உட்பட, பின்கொடு.", "TEXT_TEXT_HELPURL": "https://ta.wikipedia.org/wiki/%E0%AE%9A%E0%AE%B0%E0%AE%AE%E0%AF%8D_%28%E0%AE%95%E0%AE%A3%E0%AE%BF%E0%AE%A9%E0%AE%BF%E0%AE%AF%E0%AE%BF%E0%AE%AF%E0%AE%B2%E0%AF%8D%29", @@ -291,9 +283,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "வெளியீடு உள்ள ஒரு செயல்பாடு உருவாக்குகிறது", "PROCEDURES_ALLOW_STATEMENTS": "வாக்குமூலங்களை அனுமதிக்கவும்", "PROCEDURES_DEF_DUPLICATE_WARNING": "எச்சரிக்கை: இந்த செயற்கூறில் போலியான அளபுருக்கள் உண்டு.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "பயனரின் '%1' செயற்கூற்றை ஓட்டு.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "பயனரின் '%1' செயற்கூற்றை ஓட்டி வரும் வெளியீட்டை பயன்படுத்து.", "PROCEDURES_MUTATORCONTAINER_TITLE": "உள்ளீடுகள்", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "செயல்கூறுகளின் உள்ளீட்டை சேர், நீக்கு, or மீண்டும் வரிசை செய்.", diff --git a/msg/json/tcy.json b/msg/json/tcy.json index a5ed486f442..6f38cacaa99 100644 --- a/msg/json/tcy.json +++ b/msg/json/tcy.json @@ -52,7 +52,6 @@ "COLOUR_BLEND_COLOUR2": "ಬಣ್ಣೊ ೨(ರಡ್ಡ್)", "COLOUR_BLEND_RATIO": "ಅನುಪಾತೊ", "COLOUR_BLEND_TOOLTIP": "ಕೊರಿನ ಅನುಪಾತೊಡು (0.0- 1.0) ರಡ್ಡ್ ಬಣ್ಣೊಲೆನ್ ಬೆರಕೆ ಮಲ್ಪುಂಡು.", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": " %1 ಸರ್ತಿ ಕೂಡೊರ ಮಲ್ಪು", "CONTROLS_REPEAT_INPUT_DO": "ಮಲ್ಪುಲೆ", "CONTROLS_REPEAT_TOOLTIP": "ಕೆಲವು ಪಾತೆರೊಲೆನ್ ಮಸ್ತ್ ಸರ್ತಿ ಮಲ್ಪು", @@ -79,7 +78,6 @@ "CONTROLS_IF_IF_TOOLTIP": "ಸೇರಾವ್, ದೆತ್ತ್‌ ಬುಡು, ಅತ್ತಂಡ ಈ 'ಒಂಜಿ ವೇಲೆ' ತಡೆನ್ ಕುಡ ಸಂರಚಣೆ ಮಲ್ಪೆರೆ ವಿಭಾಗೊಲೆನ್ ಕುಡ ಒತ್ತರೆ ಮಲ್ಪುಲೆ.", "CONTROLS_IF_ELSEIF_TOOLTIP": "'ಒಂಜಿ ವೇಲೆ' ತಡೆಕ್ಕ್ ಒಂಜಿ ಶರ್ತನ್ ಸೇರಾವ್", "CONTROLS_IF_ELSE_TOOLTIP": "'ಒಂಜಿ ವೇಲೆ' ತಡೆಕ್ಕ್ ಒಂಜಿ ಕಡೆತ್ತ ಮಾತೆನ್ಲಾ-ಪತ್ತ್ (catch-all) ಶರ್ತನ್ ಸೇರಾವ್", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "ರಡ್ದ್ ಇನ್‌ಪುಟ್‌ಲಾ ಸಮ ಇತ್ತ್ಂಡ 'ನಿಜ'ನ್ ಪಿರಕೊರು", "LOGIC_COMPARE_TOOLTIP_NEQ": "ರಡ್ದ್ ಇನ್‌ಪುಟ್‌ಲಾ ಸಮ ಅತ್ತಾಂಡ 'ನಿಜ'ನ್ ಪಿರಕೊರು", "LOGIC_COMPARE_TOOLTIP_LT": "ಸುರುತ್ತ ಇನ್‌ಪುಟ್ ರಡ್ಡನೆ ಇನ್‌ಪುಟ್‌ಡ್ದ್ ಎಲ್ಯ ಆದಿತ್ತ್ಂಡ, 'ನಿಜ'ನ್ ಪಿರಕೊರು", @@ -136,7 +134,6 @@ "MATH_IS_NEGATIVE": "ಋಣ ಸಂಖ್ಯೆ", "MATH_IS_DIVISIBLE_BY": "ಭಾಗಿಪೊಲಿ", "MATH_IS_TOOLTIP": "ಒಂಜಿ ಸಂಖ್ಯೆ ಸಮನಾ, ಬೆಸನಾ, ಅವಿಭಾಜ್ಯನಾ, ಪೂರ್ಣನಾ, ಧನನಾ, ಋಣನಾ, ಅತ್ತಂಡ ಅವೆನ್ ಬೇತೆ ಒಂಜಿ ನಿರ್ದಿಷ್ಟ ಸಂಖ್ಯೆಡ್ದ್ ಭಾಗಿಪೊಲಿಯಾ ಪಂದ್ ಪರೀಕ್ಷೆ ಮಲ್ಪು. ನಿಜ ಅತ್ತಂಡ ಸುಲ್ಲುನು ಪಿರಕೊರ್ಪುಂಡು.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "%1 ನ್ %2 ಟ್ ಬದಲ್ ಮಲ್ಪು", "MATH_CHANGE_TOOLTIP": "'%1' ವ್ಯತ್ಯಯೊಗು ಒಂಜಿ ಸಂಖ್ಯೆನ್ ಸೇರಾವ್", "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/ಪೂರ್ಣಾಂಕೊ", @@ -171,7 +168,6 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/ರಾಂಡಮ್_ನಂಬರ್_ಜನರೇಶನ್", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿ", "MATH_RANDOM_FLOAT_TOOLTIP": "0.0 (ಸೇರ್‌ದ್) ಬೊಕ್ಕ 1.0 (ಸೇರಂದೆ) ನಡುತ ಒವ್ವಾಂಡಲ ಒಂಜಿ ಭಿನ್ನರಾಶಿನ್ ಪಿರಕೊರು.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/ಸ್ಟ್ರಿಂಗ್_(ಕಂಪ್ಯೂಟರ್_ಸೈನ್ಸ್)", "TEXT_TEXT_TOOLTIP": "ಒಂಜಿ ಅಕ್ಷರೊ, ಪದೊ ಅತ್ತಂಡ ಪಾಟೊದ ಒಂಜಿ ಸಾಲ್", "TEXT_JOIN_TITLE_CREATEWITH": "ನೆಡ್ದ್ ಪಟ್ಯೊನು ಉಂಡು ಮಲ್ಪು", @@ -274,7 +270,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ಅಕೇರಿಡ್ದ್ # ಗ್", "LISTS_GET_SUBLIST_END_LAST": "ಅಕೇರಿಗ್", "LISTS_GET_SUBLIST_TOOLTIP": "ಪಟ್ಯೊದ ನಿರ್ದಿಷ್ಟ ಬಾಗೊದ ಪ್ರತಿನ್ ಉಂಡುಮಲ್ಪುಂಡು.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "%1 %2 %3 ಇಂಗಡಿಪು", "LISTS_SORT_TOOLTIP": "ಒಂಜಿ ಪಟ್ಟಿದ ಒಂಜಿ ಪ್ರತಿನ್ ಇಂಗಡಿಪು", "LISTS_SORT_ORDER_ASCENDING": "ಏರುನು", diff --git a/msg/json/tdd.json b/msg/json/tdd.json new file mode 100644 index 00000000000..1d80f22c128 --- /dev/null +++ b/msg/json/tdd.json @@ -0,0 +1,108 @@ +{ + "@metadata": { + "authors": [ + "咽頭べさ" + ] + }, + "VARIABLES_DEFAULT_NAME": "ᥟᥢᥴ", + "TODAY": "ᥛᥫᥲᥢᥭᥳ", + "DUPLICATE_BLOCK": "ᥗᥧᥖᥱ", + "ADD_COMMENT": "ᥔᥬᥱᥑᥩᥲᥑᥭᥲᥓᥬᥴ", + "REMOVE_COMMENT": "ᥗᥩᥢᥴᥙᥦᥖᥲ ᥑᥩᥲᥑᥭᥲᥓᥬᥴ", + "EXTERNAL_INPUTS": "ᥑᥫᥒᥲᥟᥢᥴᥘᥧᥐᥳᥖᥣᥒᥰᥢᥩᥐᥲᥑᥝᥲᥛᥣᥰ", + "INLINE_INPUTS": "ᥑᥫᥒᥲᥟᥢᥴᥑᥝᥲᥛᥣᥰᥓᥩᥛᥰᥘᥦᥒᥰ", + "DELETE_BLOCK": "ᥛᥩᥖᥱᥙᥘᥩᥐᥳ", + "DELETE_X_BLOCKS": "ᥛᥩᥖᥱᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ %1", + "COLLAPSE_BLOCK": "ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰᥘᥦᥝᥴ", + "COLLAPSE_ALL": "ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰᥓᥫᥰᥘᥦᥝᥴ", + "EXPAND_BLOCK": "ᥑᥣᥐᥲᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ", + "EXPAND_ALL": "ᥑᥣᥐᥲᥓᥫᥰᥞᥦᥳᥖᥖᥰ", + "DISABLE_BLOCK": "ᥟᥪᥖᥰᥓᥬᥳ ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ", + "ENABLE_BLOCK": "ᥙᥪᥖᥱᥓᥬᥳ ᥘᥩᥒᥲᥞᥦᥳᥖᥖᥰ", + "HELP": "ᥓᥩᥭᥲᥗᥦᥛᥴ", + "CHANGE_VALUE_TITLE": "ᥘᥦᥐᥲᥘᥣᥭᥲᥢᥛᥳᥐᥖᥳ:", + "RENAME_VARIABLE": "ᥘᥪᥛᥳᥑᥪᥢᥰ ᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱ...", + "RENAME_VARIABLE_TITLE": "ᥘᥪᥛᥳᥑᥪᥢᥰ ᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱᥓᥫᥰᥢᥢᥳ '%1' ᥗᥪᥒᥴ:", + "NEW_VARIABLE": "ᥐᥩᥱᥔᥣᥒᥲ ᥖᥨᥝᥴᥢᥪᥒᥴ...", + "NEW_VARIABLE_TITLE": "ᥓᥪᥲᥟᥢᥴᥘᥣᥭᥲᥛᥬᥱ:", + "COLOUR_PICKER_HELPURL": "https://tdd.wikipedia.org/wiki/ᥔᥤᥴ", + "COLOUR_PICKER_TOOLTIP": "ᥘᥫᥐᥲᥔᥤᥴ ᥖᥛᥲᥖᥤᥲ ᥚᥣᥰᥘᥦᥖᥳ.", + "COLOUR_RANDOM_TITLE": "ᥔᥤᥴᥘᥣᥛᥰᥘᥤᥛᥰ", + "COLOUR_RANDOM_TOOLTIP": "ᥘᥫᥐᥲᥔᥤᥴᥖᥛᥲᥖᥤᥲᥘᥩᥐᥰᥘᥣᥛᥰᥘᥤᥛᥰ.", + "COLOUR_RGB_TITLE": "ᥞᥨᥛᥲᥐᥪᥐᥰᥔᥤᥴ", + "COLOUR_RGB_RED": "ᥘᥤᥒᥴ", + "COLOUR_RGB_GREEN": "ᥑᥥᥝᥴ", + "COLOUR_RGB_BLUE": "ᥔᥩᥛᥱ", + "COLOUR_RGB_TOOLTIP": "ᥞᥥᥖᥰᥖᥨᥭᥰ ᥔᥤᥴᥟᥢᥴᥢᥪᥒᥲ ᥓᥩᥛᥰᥢᥒᥱᥛᥐᥰᥛᥢᥲᥝᥭᥳ ᥢᥬᥰᥑᥣᥒᥱ ᥔᥤᥴᥘᥦᥒᥴ, ᥑᥥᥝᥴ ᥘᥦᥲ ᥔᥩᥛᥱ. ᥢᥛᥳᥢᥐᥰᥔᥤᥴ ᥖᥥᥴᥘᥭᥲᥛᥤᥰᥢᥬᥰᥝᥨᥒᥲᥐᥣᥒᥴ 0 ᥖᥩᥱ 100.", + "COLOUR_BLEND_TITLE": "ᥘᥩᥰᥘᥦᥰ", + "COLOUR_BLEND_COLOUR1": "ᥔᥤᥴ 1", + "COLOUR_BLEND_COLOUR2": "ᥔᥤᥴ 2", + "COLOUR_BLEND_RATIO": "ᥔᥦᥢᥰ", + "COLOUR_BLEND_TOOLTIP": "ᥟᥝᥴᥔᥤᥴᥔᥩᥒᥴᥟᥢᥴᥘᥩᥰᥐᥢᥴ ᥓᥩᥛᥰᥢᥛᥴ ᥔᥦᥢᥰᥟᥢᥴᥙᥢᥴᥝᥭᥳ (0.0 - 1.0).", + "CONTROLS_REPEAT_HELPURL": "https://tdd.wikipedia.org/wiki/ᥖᥣᥱᥖᥨᥒᥱᥛᥨᥢᥰ", + "CONTROLS_REPEAT_TITLE": "ᥙᥢᥱᥑᥪᥢᥰ %1 ᥐᥛᥰ", + "CONTROLS_REPEAT_INPUT_DO": "ᥞᥥᥖᥰ", + "CONTROLS_REPEAT_TOOLTIP": "ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ ᥖᥒᥰᥢᥛᥴ.", + "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ᥑᥣᥝᥰᥖᥪᥐᥳᥘᥪᥛᥳ", + "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ᥖᥪᥐᥳᥘᥪᥛᥳᥗᥪᥒᥴ", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥟᥛᥱᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴ ᥐᥛᥲᥚᥩᥒᥲ.", + "CONTROLS_FOR_TITLE": "ᥖᥦᥱᥟᥣᥢᥱᥐᥪᥐᥰ %1 ᥖᥩᥱ %2 ᥖᥩᥱ %3 ᥘᥨᥭᥲ %4", + "CONTROLS_FOREACH_TITLE": "ᥖᥣᥱᥐᥧᥲᥟᥢᥴᥟᥢᥴ ᥢᥬᥰ %1 ᥔᥥᥢᥲᥛᥣᥭᥴ %2", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ᥟᥩᥐᥱᥖᥤᥲᥑᥩᥙᥱᥛᥨᥢᥰ", + "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ᥔᥪᥙᥱᥙᥢᥱᥗᥦᥒᥲ ᥑᥩᥙᥱᥛᥨᥢᥰᥖᥣᥒᥱᥟᥢᥴ", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK": "ᥐᥪᥖᥰᥙᥦᥖᥲ ᥑᥩᥙᥱᥛᥨᥢᥰ ᥟᥢᥴᥛᥤᥰᥝᥭᥳ", + "CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE": "ᥝᥥᥢᥳᥝᥭᥳ ᥑᥩᥙᥱᥛᥨᥢᥰ ᥟᥢᥴᥐᥪᥖᥰᥓᥫᥲᥝᥭᥳ, ᥔᥥᥴ ᥔᥪᥙᥱᥗᥦᥒᥲᥖᥣᥒᥱᥟᥢᥴ.", + "CONTROLS_FLOW_STATEMENTS_WARNING": "ᥜᥣᥒᥳ: ᥙᥘᥩᥐᥳᥟᥢᥴᥢᥭᥳ ᥐᥨᥭᥰᥓᥬᥳᥘᥨᥭᥲᥖᥣᥱ ᥑᥩᥙᥱᥛᥨᥢᥰᥐᥨᥭᥰ.", + "CONTROLS_IF_TOOLTIP_1": "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ.", + "CONTROLS_IF_TOOLTIP_2": "ᥙᥩᥰᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥢᥱᥛᥦᥢᥲᥕᥝᥳᥓᥪᥒᥴ ᥞᥥᥖᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥐᥛᥲᥚᥩᥒᥲ.", + "CONTROLS_IF_TOOLTIP_3": "ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥳᥢᥪᥒᥲ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥘᥩᥐᥳᥟᥩᥢᥴᥖᥣᥒᥰᥔᥧᥖᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥭᥴᥔᥩᥒᥴᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲ ᥙᥘᥩᥐᥳᥔᥩᥒᥴ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴ.", + "CONTROLS_IF_TOOLTIP_4": "ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ)ᥛᥣᥭᥴᥢᥪᥒᥲ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥘᥩᥐᥳᥟᥩᥢᥴᥖᥣᥒᥰᥔᥧᥖᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥘᥫᥴᥔᥥᥴᥢᥢᥳ, ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥛᥣᥭᥴᥔᥩᥒᥴ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲ ᥙᥘᥩᥐᥳᥔᥩᥒᥴ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ. ᥔᥒᥴᥝᥣᥲ ᥐᥣᥲᥑᥢᥴ(ᥢᥛᥳᥐᥖᥳ) ᥟᥛᥱᥛᥤᥰᥘᥩᥒᥲᥛᥣᥢᥱᥛᥦᥢᥲ ᥔᥒᥴᥓᥪᥒᥴ ᥞᥥᥖᥰᥙᥦᥖᥲᥙᥘᥩᥐᥳ ᥐᥛᥰᥘᥪᥛᥰ ᥖᥤᥲᥢᥬᥰᥑᥩᥲᥐᥥᥙᥰᥗᥩᥢᥴᥖ.", + "CONTROLS_IF_MSG_IF": "ᥔᥒᥴᥝᥣᥲ", + "CONTROLS_IF_MSG_ELSEIF": "ᥔᥒᥴᥝᥣᥲ ᥘᥫᥴᥔᥥᥴᥢᥢᥳ", + "CONTROLS_IF_MSG_ELSE": "ᥘᥫᥴᥔᥥᥴᥢᥢᥳ", + "CONTROLS_IF_ELSEIF_TOOLTIP": "ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥔᥬᥱᥙᥢᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰ ᥖᥛᥲ.", + "CONTROLS_IF_ELSE_TOOLTIP": "ᥔᥬᥱᥐᥛᥰᥘᥪᥢᥰ, ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥟᥝᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰᥖᥒᥰᥔᥥᥒᥲ ᥖᥛᥲ.", + "LOGIC_COMPARE_HELPURL": "ᥔᥬᥱᥐᥛᥰᥘᥪᥢᥰ, ᥔᥒᥴᥝᥣᥲ ᥙᥘᥩᥐᥳᥓᥪᥒᥴ ᥟᥝᥴᥘᥩᥒᥲᥖᥣᥒᥰᥛᥢᥰᥖᥒᥰᥔᥥᥒᥲ ᥖᥛᥲ. https://tdd.wikipedia.org/wiki/ᥙᥣᥭᥰᥢᥙᥳ", + "LOGIC_COMPARE_TOOLTIP_EQ": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴ ᥛᥫᥢᥴᥖᥣᥒᥱᥟᥢᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_COMPARE_TOOLTIP_NEQ": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴ ᥟᥛᥱᥛᥫᥢᥴᥖᥣᥒᥱᥟᥢᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_COMPARE_TOOLTIP_LT": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥛᥫᥢᥴ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_COMPARE_TOOLTIP_LTE": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥛᥫᥢᥴ ᥟᥛᥱᥢᥢᥴ ᥚᥥᥒᥱᥙᥥᥒᥰ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_COMPARE_TOOLTIP_GT": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥕᥬᥱᥘᥫᥴ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_COMPARE_TOOLTIP_GTE": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥩᥢᥴᥖᥣᥒᥰ ᥕᥬᥱᥘᥫᥴ ᥟᥛᥱᥢᥢᥴ ᥚᥥᥒᥱᥙᥥᥒᥰ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥭᥴᥔᥩᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_OPERATION_TOOLTIP_AND": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥖᥒᥰᥔᥩᥒᥴᥟᥢᥴ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_OPERATION_AND": "ᥘᥦᥲ", + "LOGIC_OPERATION_TOOLTIP_OR": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥐᥛᥰᥘᥪᥢᥰᥔᥧᥖᥰ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ.", + "LOGIC_OPERATION_OR": "ᥟᥛᥱᥢᥢᥴ", + "LOGIC_NEGATE_TITLE": "ᥟᥛᥱᥓᥬᥲ %1", + "LOGIC_NEGATE_TOOLTIP": "ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴᥓᥪᥒᥴ ᥛᥦᥰᥑᥪᥢᥰ ᥞᥬᥲᥛᥣᥢᥱᥛᥦᥢᥲ. ᥔᥒᥴᥝᥣᥲ ᥟᥢᥴᥚᥫᥛᥳᥔᥬᥱ ᥛᥣᥢᥱᥛᥦᥢᥲᥓᥪᥒᥴ ᥑᥪᥢᥰᥛᥨᥢᥳᥛᥦᥰ ᥞᥬᥲᥢᥦᥢᥲᥢᥣᥴ.", + "LOGIC_BOOLEAN_TRUE": "ᥛᥣᥢᥱᥛᥦᥢᥲ", + "LOGIC_BOOLEAN_FALSE": "ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ", + "LOGIC_BOOLEAN_TOOLTIP": "ᥛᥣᥢᥱᥛᥦᥢᥲᥘᥦᥲᥔᥒᥴ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴᥘᥦᥲᥔᥒᥴ ᥞᥨᥢᥴᥑᥪᥢᥰ.", + "LOGIC_NULL": "ᥟᥛᥱᥑᥝᥲᥑᥣᥒᥱ", + "LOGIC_NULL_TOOLTIP": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥛᥱᥑᥝᥲᥑᥣᥒᥱ", + "LOGIC_TERNARY_CONDITION": "ᥓᥣᥛᥰ", + "LOGIC_TERNARY_IF_TRUE": "ᥔᥒᥴᥝᥣᥲ ᥛᥣᥢᥱᥛᥦᥢᥲ", + "LOGIC_TERNARY_IF_FALSE": "ᥔᥒᥴᥝᥣᥲ ᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ", + "LOGIC_TERNARY_TOOLTIP": "ᥓᥣᥛᥰᥐᥨᥖᥱᥖᥨᥭᥰ ᥔᥣᥭᥴᥒᥣᥭᥴ. ᥔᥒᥴᥝᥣᥲ ᥔᥣᥭᥴᥒᥣᥭᥴᥛᥣᥢᥱᥛᥦᥢᥲ, ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) 'ᥔᥒᥴᥛᥣᥢᥱᥛᥦᥢᥲ'; ᥘᥫᥴᥢᥢᥳ ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) 'ᥔᥒᥴᥟᥛᥱᥢᥦᥢᥲᥢᥣᥴ'.", + "MATH_NUMBER_HELPURL": "https://tdd.wikipedia.org/wiki/ᥛᥣᥭᥴᥢᥙᥳ", + "MATH_NUMBER_TOOLTIP": "ᥛᥣᥭᥴᥢᥙᥳ ᥢᥪᥒᥲᥟᥢᥴ.", + "MATH_ARITHMETIC_HELPURL": "https://tdd.wikipedia.org/wiki/ᥙᥣᥭᥰᥢᥙᥳ", + "MATH_ARITHMETIC_TOOLTIP_ADD": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥖᥣᥒᥰᥢᥛᥴ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ.", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥙᥦᥐᥱᥙᥫᥒᥲ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ.", + "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥟᥝᥴᥟᥩᥐᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ.", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥙᥛᥣᥱᥢ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ ᥔᥩᥒᥴ.", + "MATH_ARITHMETIC_TOOLTIP_POWER": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥖᥨᥝᥴᥢᥙᥳᥛᥣᥭᥴᥢᥪᥒᥲᥢᥭᥳ ᥓᥩᥭᥲᥞᥦᥒᥰᥙᥢᥴ ᥖᥨᥝᥴᥢᥙᥳᥛᥣᥭᥴᥔᥩᥒᥴ.", + "MATH_SINGLE_HELPURL": "https://tdd.wikipedia.org/wiki/ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ", + "MATH_SINGLE_OP_ROOT": "ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ", + "MATH_SINGLE_TOOLTIP_ROOT": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥛᥣᥭᥴᥖᥨᥙᥳᥛᥫᥢᥴ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_OP_ABSOLUTE": "ᥙᥐᥖᥤ", + "MATH_SINGLE_TOOLTIP_ABS": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥐᥣᥲᥑᥢᥴ (ᥢᥛᥳᥐᥖᥳ) ᥙᥐᥖᥤ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_TOOLTIP_NEG": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥟᥢᥴᥔᥣᥢᥴᥑᥖᥰ ᥢᥬᥰ ᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_TOOLTIP_LN": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥘᥩᥐᥰᥘᥣᥭᥰᥢᥙᥳ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_TOOLTIP_LOG10": "ᥘᥥᥝᥴᥑᥪᥢᥰ ᥙᥪᥢᥳᥗᥣᥢᥴ 10 ᥘᥩᥐᥰᥘᥣᥭᥰᥢᥙᥳ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_TOOLTIP_EXP": "ᥘᥥᥝᥴᥑᥪᥢᥰ e ᥐᥣᥱᥖᥤᥲ ᥙᥣᥱᥝᥣᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_SINGLE_TOOLTIP_POW10": "ᥘᥥᥝᥴᥑᥪᥢᥰ 10 ᥐᥣᥱᥖᥤᥲ ᥙᥣᥱᥝᥣᥱ ᥢᥬᥰᥛᥣᥭᥴᥢᥙᥳ.", + "MATH_IS_EVEN": "ᥙᥥᥢᥴᥐᥨᥙᥳ", + "MATH_IS_ODD": "ᥙᥥᥢᥴᥐᥤᥐᥲ" +} diff --git a/msg/json/th.json b/msg/json/th.json index 2e8d5b8c7e2..cf969982c58 100644 --- a/msg/json/th.json +++ b/msg/json/th.json @@ -61,7 +61,6 @@ "COLOUR_BLEND_COLOUR2": "สีที่ 2", "COLOUR_BLEND_RATIO": "อัตราส่วน", "COLOUR_BLEND_TOOLTIP": "ผสมสองสีเข้าด้วยกันด้วยอัตราส่วน (0.0 - 1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ทำซ้ำ %1 ครั้ง", "CONTROLS_REPEAT_INPUT_DO": "ทำ", "CONTROLS_REPEAT_TOOLTIP": "ทำซ้ำบางคำสั่งหลายครั้ง", @@ -118,7 +117,6 @@ "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "คืนค่าผลคูณของตัวเลขทั้งสองจำนวน", "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "คืนค่าผลหารของตัวเลขทั้งสองจำนวน", "MATH_ARITHMETIC_TOOLTIP_POWER": "คืนค่าผลการยกกำลัง โดยตัวเลขแรกเป็นฐาน และตัวเลขที่สองเป็นเลขชี้กำลัง", - "MATH_SINGLE_HELPURL": "https://en.wikipedia.org/wiki/Square_root", "MATH_SINGLE_OP_ROOT": "รากที่สอง", "MATH_SINGLE_TOOLTIP_ROOT": "คืนค่ารากที่สองของตัวเลข", "MATH_SINGLE_OP_ABSOLUTE": "ค่าสัมบูรณ์", @@ -145,7 +143,6 @@ "MATH_IS_NEGATIVE": "เป็นเลขติดลบ", "MATH_IS_DIVISIBLE_BY": "หารลงตัว", "MATH_IS_TOOLTIP": "ตรวจว่าตัวเลขเป็นจำนวนคู่ จำนวนคี่ จำนวนเฉพาะ จำนวนเต็ม เลขบวก เลขติดลบ หรือหารด้วยเลขที่กำหนดลงตัวหรือไม่ คืนค่าเป็นจริงหรือเท็จ", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "เปลี่ยนค่า %1 เป็น %2", "MATH_CHANGE_TOOLTIP": "เพิ่มค่าของตัวแปร \"%1\"", "MATH_ROUND_HELPURL": "https://th.wikipedia.org/wiki/การปัดเศษ", @@ -169,18 +166,14 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "คืนค่าส่วนเบี่ยงเบนมาตรฐานของรายการ", "MATH_ONLIST_OPERATOR_RANDOM": "สุ่มรายการ", "MATH_ONLIST_TOOLTIP_RANDOM": "สุ่มคืนค่าสิ่งที่อยู่ในรายการ", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "เศษของ %1 ÷ %2", "MATH_MODULO_TOOLTIP": "คืนค่าเศษที่ได้จากการหารของตัวเลขทั้งสองจำนวน", "MATH_CONSTRAIN_TITLE": "จำกัดค่า %1 ต่ำสุด %2 สูงสุด %3", "MATH_CONSTRAIN_TOOLTIP": "จำกัดค่าของตัวเลขให้อยู่ในช่วงที่กำหนด", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "สุ่มเลขจำนวนเต็มตั้งแต่ %1 จนถึง %2", "MATH_RANDOM_INT_TOOLTIP": "สุ่มเลขจำนวนเต็มจากช่วงที่กำหนด", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "สุ่มเลขเศษส่วน", "MATH_RANDOM_FLOAT_TOOLTIP": "สุ่มเลขเศษส่วน ตั้งแต่ 0.0 แต่ไม่เกิน 1.0", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 ของ X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "เปลี่ยนอาร์กแทนเจนต์ของชุด (X, Y) จากองศา 180 เป็น -180.", "TEXT_TEXT_HELPURL": "https://th.wikipedia.org/wiki/สายอักขระ", @@ -291,7 +284,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "ถึง # จากท้ายสุด", "LISTS_GET_SUBLIST_END_LAST": "ถึง ท้ายสุด", "LISTS_GET_SUBLIST_TOOLTIP": "สร้างสำเนารายการในช่วงที่กำหนด", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "เรียงลำดับ %1 %2 %3", "LISTS_SORT_TOOLTIP": "เรียงลำดับสำเนาของรายชื่อ", "LISTS_SORT_ORDER_ASCENDING": "น้อยไปหามาก", diff --git a/msg/json/tr.json b/msg/json/tr.json index f22282ee847..307b411fe02 100644 --- a/msg/json/tr.json +++ b/msg/json/tr.json @@ -65,13 +65,11 @@ "COLOUR_PICKER_TOOLTIP": "Paletten bir renk seç.", "COLOUR_RANDOM_TITLE": "rastgele renk", "COLOUR_RANDOM_TOOLTIP": "Rastgele bir renk seç.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "renk değerleri", "COLOUR_RGB_RED": "kırmızı", "COLOUR_RGB_GREEN": "yeşil", "COLOUR_RGB_BLUE": "mavi", "COLOUR_RGB_TOOLTIP": "Kırmızı, yeşil ve mavinin belirli miktarıyla bir renk oluştur. Tüm değerler 0 ile 100 arasında olmalıdır.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "karıştır", "COLOUR_BLEND_COLOUR1": "1. renk", "COLOUR_BLEND_COLOUR2": "2. renk", @@ -130,9 +128,6 @@ "LOGIC_TERNARY_TOOLTIP": "'test' durumunu kontrol edin. Koşul true olursa, 'if true' değerini döndürür; aksi takdirde 'if false' değerini döndürür.", "MATH_NUMBER_HELPURL": "https://tr.wikipedia.org/wiki/Sayı", "MATH_NUMBER_TOOLTIP": "Sayı.", - "MATH_ADDITION_SYMBOL": "+", - "MATH_SUBTRACTION_SYMBOL": "tire", - "MATH_DIVISION_SYMBOL": "÷", "MATH_MULTIPLICATION_SYMBOL": "x", "MATH_POWER_SYMBOL": "üst alma", "MATH_TRIG_SIN": "Sinüs", @@ -182,7 +177,6 @@ "MATH_ROUND_OPERATOR_ROUND": "yuvarla", "MATH_ROUND_OPERATOR_ROUNDUP": "yukarı yuvarla", "MATH_ROUND_OPERATOR_ROUNDDOWN": "aşağı yuvarla", - "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "listenin toplamı", "MATH_ONLIST_TOOLTIP_SUM": "Listedeki tüm sayıların toplamını döndürün.", "MATH_ONLIST_OPERATOR_MIN": "listenin en küçüğü", @@ -236,7 +230,6 @@ "TEXT_CHARAT_FIRST": "ilk harfini al", "TEXT_CHARAT_LAST": "son harfi al", "TEXT_CHARAT_RANDOM": "rastgele harf al", - "TEXT_CHARAT_TAIL": "", "TEXT_CHARAT_TOOLTIP": "Belirtilen konumdaki harfi döndürür.", "TEXT_GET_SUBSTRING_TOOLTIP": "Metnin belirli bir bölümünü döndürür.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "metinde", @@ -246,7 +239,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "# harfe", "TEXT_GET_SUBSTRING_END_FROM_END": "en başından # harfi", "TEXT_GET_SUBSTRING_END_LAST": "son harfe", - "TEXT_GET_SUBSTRING_TAIL": "", "TEXT_CHANGECASE_TOOLTIP": "Metnin bir kopyasını farklı bir durumda döndürün.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "ÜST DURUMA", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "küçük harfe", @@ -262,13 +254,11 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "Bir numara için kullanıcı sor.", "TEXT_PROMPT_TOOLTIP_TEXT": "Bazı metinler için kullanıcı sor.", "TEXT_COUNT_MESSAGE0": "%1 içinde %2 say.", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "Bazı metnin başka bir metnin içinde kaç kez oluştuğunu sayın.", "TEXT_REPLACE_MESSAGE0": "%1 yerine %3 içindeki %2 ile değiştir", "TEXT_REPLACE_TOOLTIP": "Bazı metnin tüm tekrarlarını başka bir metnin içinde değiştirin.", "TEXT_REVERSE_MESSAGE0": "%1 ters çevirin", "TEXT_REVERSE_TOOLTIP": "Metindeki karakterlerin sırasını tersine çevirir.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "boş liste oluştur", "LISTS_CREATE_EMPTY_TOOLTIP": "Veri kaydı içermeyen 0 uzunluğunda bir liste döndürür", "LISTS_CREATE_WITH_TOOLTIP": "İstediğiniz sayıda öğe içeren bir liste oluşturun.", @@ -294,7 +284,6 @@ "LISTS_GET_INDEX_FIRST": "ilk", "LISTS_GET_INDEX_LAST": "son", "LISTS_GET_INDEX_RANDOM": "rastgele", - "LISTS_GET_INDEX_TAIL": "", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 ilk öğedir.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 son öğedir.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Listede belirtilen konumda bulunan öğeyi döndürür.", @@ -326,9 +315,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "#", "LISTS_GET_SUBLIST_END_FROM_END": "sonuna kadar #", "LISTS_GET_SUBLIST_END_LAST": "sona", - "LISTS_GET_SUBLIST_TAIL": "", "LISTS_GET_SUBLIST_TOOLTIP": "Listenin belirtilen bölümünün bir kopyasını oluşturur.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sıra %1 %2 %3", "LISTS_SORT_TOOLTIP": "Listenin bir kopyasını sıralayın.", "LISTS_SORT_ORDER_ASCENDING": "artan", @@ -343,7 +330,6 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Metin listesini bir sınırlayıcı ile ayrılmış tek bir metinde birleştirin.", "LISTS_REVERSE_MESSAGE0": "%1 ters çevirin", "LISTS_REVERSE_TOOLTIP": "Listenin bir kopyasını ters çevirin.", - "ORDINAL_NUMBER_SUFFIX": "", "VARIABLES_GET_TOOLTIP": "Bu değişkenin değerini döndürür.", "VARIABLES_GET_CREATE_SET": "'set %1' oluştur", "VARIABLES_SET": "%1 %2 ayarla", @@ -354,7 +340,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "bir şey yap", "PROCEDURES_BEFORE_PARAMS": "ile:", "PROCEDURES_CALL_BEFORE_PARAMS": "ile:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Çıkışı olmayan bir işlev oluşturur.", "PROCEDURES_DEFNORETURN_COMMENT": "Bu işlevi açıklayın...", "PROCEDURES_DEFRETURN_HELPURL": "https://tr.wikipedia.org/wiki/Altyordam", @@ -373,7 +358,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Vurgulama işlevi tanımı", "PROCEDURES_CREATE_DO": "'%1' oluştur", "PROCEDURES_IFRETURN_TOOLTIP": "Bir değer true ise, ikinci bir değer döndürün.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Uyarı: Bu blok yalnızca bir işlev tanımı içinde kullanılabilir.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Bir şeyler söyle...", "WORKSPACE_ARIA_LABEL": "Blockly Çalışma Alanı", diff --git a/msg/json/uk.json b/msg/json/uk.json index b0763406ebf..e5d397ca552 100644 --- a/msg/json/uk.json +++ b/msg/json/uk.json @@ -54,13 +54,11 @@ "COLOUR_PICKER_TOOLTIP": "Вибрати колір з палітри.", "COLOUR_RANDOM_TITLE": "випадковий колір", "COLOUR_RANDOM_TOOLTIP": "Вибрати колір навмання.", - "COLOUR_RGB_HELPURL": "https://www.december.com/html/spec/colorpercompact.html", "COLOUR_RGB_TITLE": "колір з", "COLOUR_RGB_RED": "червоний", "COLOUR_RGB_GREEN": "зелений", "COLOUR_RGB_BLUE": "синій", "COLOUR_RGB_TOOLTIP": "Створити колір зі вказаними рівнями червоного, зеленого та синього. Усі значення мають бути від 0 до 100.", - "COLOUR_BLEND_HELPURL": "https://meyerweb.com/eric/tools/color-blend/#:::rgbp", "COLOUR_BLEND_TITLE": "змішати", "COLOUR_BLEND_COLOUR1": "колір 1", "COLOUR_BLEND_COLOUR2": "колір 2", @@ -109,10 +107,8 @@ "LOGIC_BOOLEAN_TRUE": "істина", "LOGIC_BOOLEAN_FALSE": "хибність", "LOGIC_BOOLEAN_TOOLTIP": "Повертає значення істина або хибність.", - "LOGIC_NULL_HELPURL": "https://en.wikipedia.org/wiki/Nullable_type", "LOGIC_NULL": "ніщо", "LOGIC_NULL_TOOLTIP": "Повертає ніщо.", - "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "тест", "LOGIC_TERNARY_IF_TRUE": "якщо істина", "LOGIC_TERNARY_IF_FALSE": "якщо хибність", @@ -152,7 +148,6 @@ "MATH_IS_NEGATIVE": "від'ємне", "MATH_IS_DIVISIBLE_BY": "ділиться на", "MATH_IS_TOOLTIP": "Перевіряє, чи число парне, непарне, просте, ціле, додатне, від'ємне або чи воно ділиться на певне число без остачі. Повертає істину або хибність.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "змінити %1 на %2", "MATH_CHANGE_TOOLTIP": "Додати число до змінної '%1'.", "MATH_ROUND_HELPURL": "https://uk.wikipedia.org/wiki/Округлення", @@ -188,12 +183,10 @@ "MATH_RANDOM_FLOAT_HELPURL": "https://uk.wikipedia.org/wiki/Генерація_випадкових_чисел", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "випадковий дріб", "MATH_RANDOM_FLOAT_TOOLTIP": "Повертає випадковий дріб від 0,0 (включно) та 1.0 (не включно).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 по X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Повертає арктангенс точки (X, Y) у градусах від -180 до 180.", "TEXT_TEXT_HELPURL": "https://uk.wikipedia.org/wiki/Рядок_(програмування)", "TEXT_TEXT_TOOLTIP": "Символ, слово або рядок тексту.", - "TEXT_JOIN_HELPURL": "https://github.com/google/blockly/wiki/Text#text-creation", "TEXT_JOIN_TITLE_CREATEWITH": "створити текст з", "TEXT_JOIN_TOOLTIP": "Створити фрагмент тексту шляхом з'єднування будь-якого числа елементів.", "TEXT_CREATE_JOIN_TITLE_JOIN": "приєднати", @@ -209,14 +202,12 @@ "TEXT_INDEXOF_TITLE": "у тексті %1 %2 %3.", "TEXT_INDEXOF_OPERATOR_FIRST": "знайти перше входження тексту", "TEXT_INDEXOF_OPERATOR_LAST": "знайти останнє входження тексту", - "TEXT_CHARAT_HELPURL": "https://github.com/google/blockly/wiki/Text#extracting-text", "TEXT_CHARAT_TITLE": "з тексту %1 %2", "TEXT_CHARAT_FROM_START": "отримати символ #", "TEXT_CHARAT_FROM_END": "отримати символ # з кінця", "TEXT_CHARAT_FIRST": "отримати перший символ", "TEXT_CHARAT_LAST": "отримати останній символ", "TEXT_CHARAT_RANDOM": "отримати випадковий символ", - "TEXT_CHARAT_TAIL": "-ий.", "TEXT_CHARAT_TOOLTIP": "Повертає символ у зазначеній позиції.", "TEXT_GET_SUBSTRING_TOOLTIP": "Повертає заданий фрагмент тексту.", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "у тексті", @@ -226,7 +217,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "до символу #", "TEXT_GET_SUBSTRING_END_FROM_END": "до символу # з кінця", "TEXT_GET_SUBSTRING_END_LAST": "до останнього символу", - "TEXT_GET_SUBSTRING_TAIL": "-ого.", "TEXT_CHANGECASE_TOOLTIP": "В іншому випадку повертає копію тексту.", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "до ВЕРХНЬОГО регістру", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "до нижнього регістру", @@ -247,7 +237,6 @@ "TEXT_REPLACE_TOOLTIP": "Замінює всі входження деякого тексту іншим текстом.", "TEXT_REVERSE_MESSAGE0": "розвернути %1", "TEXT_REVERSE_TOOLTIP": "Змінює на протилежний порядок символів у тексті.", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "створити порожній список", "LISTS_CREATE_EMPTY_TOOLTIP": "Повертає список, довжиною 0, що не містить записів даних", "LISTS_CREATE_WITH_TOOLTIP": "Створює список з будь-якою кількістю елементів.", @@ -273,7 +262,6 @@ "LISTS_GET_INDEX_FIRST": "перший", "LISTS_GET_INDEX_LAST": "останній", "LISTS_GET_INDEX_RANDOM": "випадковий", - "LISTS_GET_INDEX_TAIL": "-ий.", "LISTS_INDEX_FROM_START_TOOLTIP": "%1 - це перший елемент.", "LISTS_INDEX_FROM_END_TOOLTIP": "%1 - це останній елемент.", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "Повертає елемент у заданій позиції у списку.", @@ -305,9 +293,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "до #", "LISTS_GET_SUBLIST_END_FROM_END": "до # з кінця", "LISTS_GET_SUBLIST_END_LAST": "до останнього", - "LISTS_GET_SUBLIST_TAIL": "символу.", "LISTS_GET_SUBLIST_TOOLTIP": "Створює копію вказаної частини списку.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "сортувати %3 %1 %2", "LISTS_SORT_TOOLTIP": "Сортувати копію списку.", "LISTS_SORT_ORDER_ASCENDING": "за зростанням", @@ -322,7 +308,6 @@ "LISTS_SPLIT_TOOLTIP_JOIN": "Злити список текстів у єдиний текст, відокремивши розділювачами.", "LISTS_REVERSE_MESSAGE0": "розвернути %1", "LISTS_REVERSE_TOOLTIP": "Змінити порядок копії списку на зворотний.", - "ORDINAL_NUMBER_SUFFIX": "-ий.", "VARIABLES_GET_TOOLTIP": "Повертає значення цієї змінної.", "VARIABLES_GET_CREATE_SET": "Створити 'встановити %1'", "VARIABLES_SET": "встановити %1 до %2", @@ -333,7 +318,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "щось зробити", "PROCEDURES_BEFORE_PARAMS": "з:", "PROCEDURES_CALL_BEFORE_PARAMS": "з:", - "PROCEDURES_DEFNORETURN_DO": "блок тексту", "PROCEDURES_DEFNORETURN_TOOLTIP": "Створює функцію без виводу.", "PROCEDURES_DEFNORETURN_COMMENT": "Опишіть цю функцію...", "PROCEDURES_DEFRETURN_HELPURL": "https://uk.wikipedia.org/wiki/Підпрограма", @@ -352,7 +336,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "Підсвітити визначення функції", "PROCEDURES_CREATE_DO": "Створити \"%1\"", "PROCEDURES_IFRETURN_TOOLTIP": "Якщо значення істинне, то повернути друге значення.", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "Попередження: цей блок може використовуватися лише в межах визначення функції.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Скажіть щось...", "WORKSPACE_ARIA_LABEL": "Робоча область Blockly", diff --git a/msg/json/ur.json b/msg/json/ur.json index d869380c6eb..d5c5036cd69 100644 --- a/msg/json/ur.json +++ b/msg/json/ur.json @@ -46,7 +46,6 @@ "DELETE_VARIABLE_CONFIRMATION": "%2 متغیر کے %1 استعمال کو حذف کریں؟", "CANNOT_DELETE_VARIABLE_PROCEDURE": "متغیر '٪ 1' کو حذف نہیں کر سکتا کیونکہ یہ فنکشن کی تعریف کا حصہ ہے '٪ 2'", "DELETE_VARIABLE": "'٪ 1' متغیر کو حذف کریں", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "پیلیٹ سے رنگ منتخب کریں", "COLOUR_RANDOM_TITLE": "ناسیدھا رنگ", "COLOUR_RANDOM_TOOLTIP": "کسی بھی رنگ کو منتجب کریں", @@ -60,7 +59,6 @@ "COLOUR_BLEND_COLOUR2": "رنگ 2", "COLOUR_BLEND_RATIO": "ریشیو", "COLOUR_BLEND_TOOLTIP": "دیئے گئے ریشیو میں دو رنگوں کو مرکب کریں (0.0-1.0)", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "%1 مرتبہ دہرائے", "CONTROLS_REPEAT_INPUT_DO": "کریں", "CONTROLS_REPEAT_TOOLTIP": "کچھ جملوں کو کہیں مرتبہ کریں۔", @@ -79,7 +77,6 @@ "CONTROLS_IF_MSG_IF": "اگر", "CONTROLS_IF_MSG_ELSEIF": "دوسراں اگر", "CONTROLS_IF_MSG_ELSE": "دوسراں", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_OPERATION_AND": "اور", "LOGIC_OPERATION_OR": "یا", "LOGIC_NEGATE_TITLE": "%1 نہیں", @@ -88,9 +85,7 @@ "LOGIC_TERNARY_CONDITION": "ٹیسٹ", "LOGIC_TERNARY_IF_TRUE": "اگ سچ ہے", "LOGIC_TERNARY_IF_FALSE": "اگر غلط ہے", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "ایک نمبر.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", "MATH_SINGLE_OP_ROOT": "اسکویر روٹ", "MATH_SINGLE_OP_ABSOLUTE": "بالکل", "TEXT_CHARAT_FROM_START": "# حرف حاصل کریں", diff --git a/msg/json/uz.json b/msg/json/uz.json index 94e58a65430..c8d830e6012 100644 --- a/msg/json/uz.json +++ b/msg/json/uz.json @@ -26,7 +26,6 @@ "VARIABLE_ALREADY_EXISTS": "'%1' nomli o'zgaruvchi mavjud.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' nomli o'zgaruvchi boshqa tur uchun allaqachon mavjud: '%2'.", "DELETE_VARIABLE": "'%1' o'zgaruvchisini o'chirib tashlang", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_RANDOM_TITLE": "tasodifiy rang", "COLOUR_RANDOM_TOOLTIP": "Tasodifiy rangni tanlang.", "COLOUR_RGB_RED": "qizil", diff --git a/msg/json/vi.json b/msg/json/vi.json index 886cdf7a724..43c68b34698 100644 --- a/msg/json/vi.json +++ b/msg/json/vi.json @@ -9,6 +9,7 @@ "Nguyễn Mạnh An", "Qneutron", "SierraNguyen", + "TARGET6tidiem", "Withoutaname" ] }, @@ -62,7 +63,6 @@ "COLOUR_BLEND_COLOUR2": "màu 2", "COLOUR_BLEND_RATIO": "tỉ lệ", "COLOUR_BLEND_TOOLTIP": "Pha hai màu với nhau theo tỉ lệ (0 - 100).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "lặp lại %1 lần", "CONTROLS_REPEAT_INPUT_DO": "thực hiện", "CONTROLS_REPEAT_TOOLTIP": "Thực hiện các lệnh vài lần.", @@ -113,6 +113,12 @@ "LOGIC_TERNARY_TOOLTIP": "Kiểm tra điều kiện. Nếu điều kiện đúng, hoàn trả giá trị từ mệnh đề \"nếu đúng\" nếu không đúng, hoàn trả giá trị từ mệnh đề \"nếu sai\".", "MATH_NUMBER_HELPURL": "https://vi.wikipedia.org/wiki/S%E1%BB%91", "MATH_NUMBER_TOOLTIP": "Một con số.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://vi.wikipedia.org/wiki/S%E1%BB%91_h%E1%BB%8Dc", "MATH_ARITHMETIC_TOOLTIP_ADD": "Hoàn trả tổng của hai con số.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Hoàn trả hiệu của hai con số.", @@ -136,7 +142,6 @@ "MATH_TRIG_TOOLTIP_ASIN": "Hoàn trả Arcsin của một góc (theo độ).", "MATH_TRIG_TOOLTIP_ACOS": "Hoàn trả Arccos của một góc (theo độ).", "MATH_TRIG_TOOLTIP_ATAN": "Hoàn trả Arctang của một góc (theo độ).", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Hoàn trả các đẳng số thường gặp: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (vô cực).", "MATH_IS_EVEN": "là số chẵn", "MATH_IS_ODD": "là số lẻ", @@ -149,12 +154,10 @@ "MATH_CHANGE_HELPURL": "https://vi.wikipedia.org/wiki/Ph%C3%A9p_c%E1%BB%99ng", "MATH_CHANGE_TITLE": "cộng vào %1 giá trị %2", "MATH_CHANGE_TOOLTIP": "Cộng số đầu vào vào biến \"%1\".", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Làm tròn lên hoặc tròn xuống số đầu vào.", "MATH_ROUND_OPERATOR_ROUND": "làm tròn", "MATH_ROUND_OPERATOR_ROUNDUP": "làm tròn lên", "MATH_ROUND_OPERATOR_ROUNDDOWN": "làm tròn xuống", - "MATH_ONLIST_HELPURL": "", "MATH_ONLIST_OPERATOR_SUM": "tổng của một danh sách", "MATH_ONLIST_TOOLTIP_SUM": "Hoàn trả tổng số của tất cả các số trong danh sách.", "MATH_ONLIST_OPERATOR_MIN": "số nhỏ nhất của một danh sách", @@ -171,23 +174,18 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Hoàn trả độ lệch chuẩn của danh sách số.", "MATH_ONLIST_OPERATOR_RANDOM": "một số bất kỳ của một danh sách", "MATH_ONLIST_TOOLTIP_RANDOM": "Hoàn trả một số bất kỳ từ các số trong danh sách.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "số dư của %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Chia số thứ nhất cho số thứ hai rồi hoàn trả số dư từ.", "MATH_CONSTRAIN_TITLE": "giới hạn %1 không dưới %2 không hơn %3", "MATH_CONSTRAIN_TOOLTIP": "Giới hạn số đầu vào để không dưới số thứ nhất và không hơn số thứ hai.", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "Một số nguyên bất kỳ từ %1 đến %2", "MATH_RANDOM_INT_TOOLTIP": "Hoàn trả một số nguyên bất kỳ lớn hơn hoặc bằng số đầu và nhỏ hơn hoặc bằng số sau.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "phân số bất kỳ", "MATH_RANDOM_FLOAT_TOOLTIP": "Hoàn trả một phân số bất kỳ không nhỏ hơn 0.0 và không lớn hơn 1.0.", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 của X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Trả về arctangent của điểm (X, Y) trong khoảng từ -180 độ đến 180 độ.", "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/string_(computer_science)", "TEXT_TEXT_TOOLTIP": "Một ký tự, một từ, hay một dòng.", - "TEXT_JOIN_HELPURL": "", "TEXT_JOIN_TITLE_CREATEWITH": "tạo văn bản từ", "TEXT_JOIN_TOOLTIP": "Tạo một văn bản từ các thành phần.", "TEXT_CREATE_JOIN_TITLE_JOIN": "kết nối", @@ -295,7 +293,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "đến (đếm từ cuối) thứ", "LISTS_GET_SUBLIST_END_LAST": "đến cuối cùng", "LISTS_GET_SUBLIST_TOOLTIP": "Lấy một mảng của danh sách này để tạo danh sách con.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "sắp xếp %1 %2 %3", "LISTS_SORT_TOOLTIP": "Sắp xếp một bản sao của một danh sách.", "LISTS_SORT_ORDER_ASCENDING": "tăng dần", @@ -319,7 +316,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "làm gì đó", "PROCEDURES_BEFORE_PARAMS": "với:", "PROCEDURES_CALL_BEFORE_PARAMS": "với:", - "PROCEDURES_DEFNORETURN_DO": "", "PROCEDURES_DEFNORETURN_TOOLTIP": "Một thủ tục không có giá trị hoàn trả.", "PROCEDURES_DEFNORETURN_COMMENT": "Mô tả hàm này...", "PROCEDURES_DEFRETURN_RETURN": "hoàn trả", diff --git a/msg/json/yo.json b/msg/json/yo.json index 524d89e0323..b6c62963c1d 100644 --- a/msg/json/yo.json +++ b/msg/json/yo.json @@ -39,7 +39,6 @@ "DELETE_VARIABLE_CONFIRMATION": "Paa %1 lilo '%2' oniruuru rẹ?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "E ko lee paa Oniruuru rẹ ' %1' nitori wipe o je ara itumọ isise eto yi '%2'", "DELETE_VARIABLE": "Paa awon '%1' Oniruuru rẹ", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Yan awọ kan lati inu patako awọ.", "COLOUR_RANDOM_TITLE": "awọ àrìnàkò", "COLOUR_RANDOM_TOOLTIP": "Yan awọ kan ni ọna àrìnàkò.", @@ -53,7 +52,6 @@ "COLOUR_BLEND_COLOUR2": "awọ 2", "COLOUR_BLEND_RATIO": "ipin", "COLOUR_BLEND_TOOLTIP": "Da awo meji papo pelu ipin (0.0 - 1.0).", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "Iye igba %1 ti tun ṣe", "CONTROLS_REPEAT_INPUT_DO": "ṣe", "CONTROLS_REPEAT_TOOLTIP": "Ṣe awon alaye ni igba pupo.", @@ -80,7 +78,6 @@ "CONTROLS_IF_IF_TOOLTIP": "Ṣe afikun, se ayọkuro, tabi se a tun beere abala yii lati se a tun gbejade bulọọku yii.", "CONTROLS_IF_ELSEIF_TOOLTIP": "Ṣe afikun si ipo yii bi bulọọku.", "CONTROLS_IF_ELSE_TOOLTIP": "Ṣe afikun ipari, mu-gbogbo ipo si bulọọku.", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_COMPARE_TOOLTIP_EQ": "Da otito pada b iafikun mejeji ba dogba bakanna.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Da otito pada bi afikun mejeji ko ba dogba bakanna.", "LOGIC_COMPARE_TOOLTIP_LT": "Da otito pada bi afikun akooko ba kere ju afiku keji lo.", @@ -120,14 +117,12 @@ "MATH_SINGLE_TOOLTIP_LOG10": "Da ipilẹ 10 lọgaridimu nọmba kan pada.", "MATH_SINGLE_TOOLTIP_EXP": "Da e pada si agbara ti nọmba kan.", "MATH_SINGLE_TOOLTIP_POW10": "Da 10 pada si agbara nọmba kan.", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_TRIG_TOOLTIP_SIN": "Da sine ti digiri pada (kii ṣe Radian).", "MATH_TRIG_TOOLTIP_COS": "Da cosine ti digiri pada (kii ṣe Radian).", "MATH_TRIG_TOOLTIP_TAN": "Da tangent ti digiri pada (kii ṣe Radian).", "MATH_TRIG_TOOLTIP_ASIN": "Da arcsine ti digiri pada.", "MATH_TRIG_TOOLTIP_ACOS": "Da arccosine ti digiri pada.", "MATH_TRIG_TOOLTIP_ATAN": "Da arctangent ti digiri pada.", - "MATH_CONSTANT_HELPURL": "https://en.wikipedia.org/wiki/Mathematical_constant", "MATH_CONSTANT_TOOLTIP": "Da ọkan ninu awọn aiyipada ti o wọpọ pada: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (ailopin).", "MATH_IS_EVEN": "je se e pin", "MATH_IS_ODD": "je ai se e pin", @@ -137,10 +132,8 @@ "MATH_IS_NEGATIVE": "je ai dara", "MATH_IS_DIVISIBLE_BY": "je sisee pin pẹlu", "MATH_IS_TOOLTIP": "Ṣe ayẹwo boya nọmba jẹ eyi to se pin, ai se pin, akori, odidi, ti o dara, ti ko dara, tabi ti o ba se e pin pelu nọmba kan. Pada otitọ tabi irọ.", - "MATH_CHANGE_HELPURL": "https://en.wikipedia.org/wiki/Programming_idiom#Incrementing_a_counter", "MATH_CHANGE_TITLE": "iyipada %1 nipasẹ %2", "MATH_CHANGE_TOOLTIP": "Se afiku si nọmba orisirisi '%1'.", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", "MATH_ROUND_TOOLTIP": "Pa oju nọmba de soke tabi si isalẹ.", "MATH_ROUND_OPERATOR_ROUND": "pa ju de", "MATH_ROUND_OPERATOR_ROUNDUP": "pa ju de soke", @@ -161,21 +154,16 @@ "MATH_ONLIST_TOOLTIP_STD_DEV": "Da iṣiro deede ti akojọ pada.", "MATH_ONLIST_OPERATOR_RANDOM": "àrìnàkò nkan ti akojọ", "MATH_ONLIST_TOOLTIP_RANDOM": "Da àrìnàkò ida ipilẹ nkan lati inu akojọ.", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", "MATH_MODULO_TITLE": "iyokù %1 ÷ %2", "MATH_MODULO_TOOLTIP": "Da iyokù lati pinpin awọn nọmba meji pada.", "MATH_CONSTRAIN_TITLE": "atokọ %1 kukuru %2 giga %3", "MATH_CONSTRAIN_TOOLTIP": "Ṣe atokọ nọmba laarin awọn nọmba kukuru ati giga. (ini afikun).", - "MATH_RANDOM_INT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_INT_TITLE": "oniruru abala lati %1 si %2", "MATH_RANDOM_INT_TOOLTIP": "Da àrìnàkò abala laarin awon opin pato meji pada, ini afikun.", - "MATH_RANDOM_FLOAT_HELPURL": "https://en.wikipedia.org/wiki/Random_number_generation", "MATH_RANDOM_FLOAT_TITLE_RANDOM": "oniruru ipin", "MATH_RANDOM_FLOAT_TOOLTIP": "Da àrìnàkò ida pada laarin 0.0 (ini afikun) ati 1.0 (iyasọtọ).", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 X:%1 Y:%2", "MATH_ATAN2_TOOLTIP": "Da ojuami arctangent pada (X, Y) ni awon digiri lati -180 si 180.", - "TEXT_TEXT_HELPURL": "https://en.wikipedia.org/wiki/String_(computer_science)", "TEXT_TEXT_TOOLTIP": "Lẹta, ọrọ, tabi ila ọrọ.", "TEXT_JOIN_TITLE_CREATEWITH": "ṣẹ ẹda ọrọ pẹlu", "TEXT_JOIN_TOOLTIP": "Ṣẹda ọrọ kan nipa ṣiṣepọ gbogbo awọn ohun kan.", @@ -283,7 +271,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "sii # lati opin", "LISTS_GET_SUBLIST_END_LAST": "sii opin", "LISTS_GET_SUBLIST_TOOLTIP": "Ṣẹda ẹda ti apa kan ti o wa ninu akojọ.", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "to %1 %2 %3", "LISTS_SORT_TOOLTIP": "To ẹda akojọ lẹsẹẹsẹ.", "LISTS_SORT_ORDER_ASCENDING": "si oke", @@ -313,9 +300,7 @@ "PROCEDURES_DEFRETURN_TOOLTIP": "Ṣẹda iṣẹ pẹlu iṣagbejade kan.", "PROCEDURES_ALLOW_STATEMENTS": "gba alaye laaye", "PROCEDURES_DEF_DUPLICATE_WARNING": "Ikilo: Isẹ yii ni awọn ẹda odiwọn.", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLNORETURN_TOOLTIP": "Ṣe ṣalaye-iṣẹ ti olumulo '%1'.", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_CALLRETURN_TOOLTIP": "Ṣe ṣalaye-iṣẹ ti olumulo '%1' kii o sii lo iṣagbejade rẹ.", "PROCEDURES_MUTATORCONTAINER_TITLE": "igbewọle", "PROCEDURES_MUTATORCONTAINER_TOOLTIP": "Fikun, yọ kuro, tabi tun beere awọn igbewọle si iṣẹ yii.", diff --git a/msg/json/zgh.json b/msg/json/zgh.json index 8d5a525bb53..33401304c15 100644 --- a/msg/json/zgh.json +++ b/msg/json/zgh.json @@ -27,7 +27,6 @@ "NEW_VARIABLE_TYPE_TITLE": "ⴰⵏⴰⵡ ⴰⵎⴰⵢⵏⵓ ⵏ ⵓⵎⵙⴽⵉⵍ:", "NEW_VARIABLE_TITLE": "ⵉⵙⵎ ⵏ ⵓⵎⵙⴽⵉⵍ ⴰⵎⴰⵢⵏⵓ:", "DELETE_VARIABLE": "ⴽⴽⵙ ⴰⵎⵙⴽⵉⵍ '%1'", - "COLOUR_PICKER_HELPURL": "https://en.wikipedia.org/wiki/Color", "COLOUR_RGB_TITLE": "ⴽⵍⵓ ⵙ", "COLOUR_RGB_RED": "ⴰⵣⴳⴳⵯⴰⵖ", "COLOUR_RGB_GREEN": "ⴰⵣⴳⵣⴰ", @@ -37,7 +36,6 @@ "COLOUR_BLEND_COLOUR1": "ⴰⴽⵍⵓ 1", "COLOUR_BLEND_COLOUR2": "ⴰⴽⵍⵓ 2", "COLOUR_BLEND_RATIO": "ⴰⵙⵙⴰⵖ", - "CONTROLS_REPEAT_HELPURL": "https://en.wikipedia.org/wiki/For_loop", "CONTROLS_REPEAT_TITLE": "ⴰⵍⵙ %1 ⵜⵉⴽⴽⴰⵍ", "CONTROLS_REPEAT_INPUT_DO": "ⴳ", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "ⴰⵍⵙ ⴰⴷⴷⴰⴳ", @@ -46,7 +44,6 @@ "CONTROLS_IF_MSG_IF": "ⵎⴽ", "CONTROLS_IF_MSG_ELSEIF": "ⵉⵙ", "CONTROLS_IF_MSG_ELSE": "ⵎⴽ ⴷ ⵓⵀⵓ", - "LOGIC_COMPARE_HELPURL": "https://en.wikipedia.org/wiki/Inequality_(mathematics)", "LOGIC_OPERATION_AND": "ⴷ", "LOGIC_OPERATION_OR": "ⵏⵖ", "LOGIC_NEGATE_TITLE": "ⵓⵔ ⴷ %1", @@ -56,15 +53,9 @@ "LOGIC_TERNARY_CONDITION": "ⴰⵔⵎ", "LOGIC_TERNARY_IF_TRUE": "ⵎⴽ ⵉⴷⵜⵜⴰ", "LOGIC_TERNARY_IF_FALSE": "ⵎⴽ ⵓⵔ ⵉⴷⵜⵜⵉ", - "MATH_NUMBER_HELPURL": "https://en.wikipedia.org/wiki/Number", "MATH_NUMBER_TOOLTIP": "ⴽⵔⴰ ⵏ ⵓⵎⴹⴰⵏ.", - "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Arithmetic", - "MATH_TRIG_HELPURL": "https://en.wikipedia.org/wiki/Trigonometric_functions", "MATH_CHANGE_TITLE": "ⵙⵏⴼⵍ %1 ⵙ %2", "MATH_CHANGE_TOOLTIP": "ⵔⵏⵓ ⵢⴰⵏ ⵓⵎⴹⴰⵏ ⵖⵔ ⵓⵎⵙⴽⵉⵍ '%1'", - "MATH_ROUND_HELPURL": "https://en.wikipedia.org/wiki/Rounding", - "MATH_MODULO_HELPURL": "https://en.wikipedia.org/wiki/Modulo_operation", - "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2", "MATH_ATAN2_TITLE": "atan2 ⵙⴳ X:%1 Y:%2", "TEXT_JOIN_TITLE_CREATEWITH": "ⵙⵏⴼⵍⵓⵍ ⴰⴹⵕⵉⵚ ⵙ", "TEXT_CREATE_JOIN_TITLE_JOIN": "ⵍⴽⵎ", @@ -86,8 +77,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "ⴳ ⴽⵔⴰ", "PROCEDURES_BEFORE_PARAMS": "ⵙ:", "PROCEDURES_CALL_BEFORE_PARAMS": "ⵙ:", - "PROCEDURES_CALLNORETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", - "PROCEDURES_CALLRETURN_HELPURL": "https://en.wikipedia.org/wiki/Subroutine", "PROCEDURES_MUTATORARG_TOOLTIP": "ⵔⵏⵓ ⴰⵏⴽⵛⴰⵎ ⵖⵔ ⵜⵙⵖⵏⵜ.", "DIALOG_OK": "ⵡⴰⵅⵅⴰ", "DIALOG_CANCEL": "ⵙⵔ" diff --git a/msg/json/zh-hans.json b/msg/json/zh-hans.json index 4e4d60738bd..34019dba1e0 100644 --- a/msg/json/zh-hans.json +++ b/msg/json/zh-hans.json @@ -114,7 +114,6 @@ "LOGIC_OPERATION_AND": "并且", "LOGIC_OPERATION_TOOLTIP_OR": "如果至少有一个输入结果为真,则返回真。", "LOGIC_OPERATION_OR": "或", - "LOGIC_NEGATE_HELPURL": "https://github.com/google/blockly/wiki/Logic#not", "LOGIC_NEGATE_TITLE": "非%1", "LOGIC_NEGATE_TOOLTIP": "如果输入结果为假,则返回真;如果输入结果为真,则返回假。", "LOGIC_BOOLEAN_TRUE": "真", @@ -223,7 +222,6 @@ "TEXT_CHARAT_FIRST": "获取第一个字符", "TEXT_CHARAT_LAST": "获取最后一个字符", "TEXT_CHARAT_RANDOM": "获取随机一个字符", - "TEXT_CHARAT_TAIL": "-", "TEXT_CHARAT_TOOLTIP": "返回位于指定位置的字符。", "TEXT_GET_SUBSTRING_TOOLTIP": "返回文本中指定的一部分。", "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "从文本", @@ -233,7 +231,6 @@ "TEXT_GET_SUBSTRING_END_FROM_START": "到第#个字符", "TEXT_GET_SUBSTRING_END_FROM_END": "到倒数第#个字符", "TEXT_GET_SUBSTRING_END_LAST": "到最后一个字符", - "TEXT_GET_SUBSTRING_TAIL": "-", "TEXT_CHANGECASE_TOOLTIP": "用不同的大小写模式复制并返回这段文字。", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "转为大写", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "转为小写", @@ -249,18 +246,13 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "要求用户输入数字。", "TEXT_PROMPT_TOOLTIP_TEXT": "要求用户输入一些文本。", "TEXT_COUNT_MESSAGE0": "计算%1在%2里出现的次数", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "计算在一段文本中,某个部分文本重复出现了多少次。", "TEXT_REPLACE_MESSAGE0": "把%3中的%1替换为%2", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "在一段文本中,将出现过的某部分文本都替换掉。", "TEXT_REVERSE_MESSAGE0": "倒转文本%1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "将文本中各个字符的顺序倒转。", - "LISTS_CREATE_EMPTY_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-empty-list", "LISTS_CREATE_EMPTY_TITLE": "创建空列表", "LISTS_CREATE_EMPTY_TOOLTIP": "返回一个列表,长度为 0,不包含任何数据记录", - "LISTS_CREATE_WITH_HELPURL": "https://github.com/google/blockly/wiki/Lists#create-list-with", "LISTS_CREATE_WITH_TOOLTIP": "建立一个具有任意数量项目的列表。", "LISTS_CREATE_WITH_INPUT_WITH": "创建列表,内容:", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "列表", @@ -284,7 +276,6 @@ "LISTS_GET_INDEX_FIRST": "第一项", "LISTS_GET_INDEX_LAST": "最后一项", "LISTS_GET_INDEX_RANDOM": "随机的一项", - "LISTS_GET_INDEX_TAIL": "-", "LISTS_INDEX_FROM_START_TOOLTIP": "%1是第一项。", "LISTS_INDEX_FROM_END_TOOLTIP": "%1是最后一项。", "LISTS_GET_INDEX_TOOLTIP_GET_FROM": "返回在列表中的指定位置的项。", @@ -316,9 +307,7 @@ "LISTS_GET_SUBLIST_END_FROM_START": "到第#项", "LISTS_GET_SUBLIST_END_FROM_END": "到倒数第#项", "LISTS_GET_SUBLIST_END_LAST": "到最后一项", - "LISTS_GET_SUBLIST_TAIL": "-", "LISTS_GET_SUBLIST_TOOLTIP": "复制列表中指定的部分。", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "排序%1 %2 %3", "LISTS_SORT_TOOLTIP": "排序一个列表,返回副本。", "LISTS_SORT_ORDER_ASCENDING": "升序", @@ -326,16 +315,13 @@ "LISTS_SORT_TYPE_NUMERIC": "按数字", "LISTS_SORT_TYPE_TEXT": "按字母", "LISTS_SORT_TYPE_IGNORECASE": "按字母(忽略大小写)", - "LISTS_SPLIT_HELPURL": "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists", "LISTS_SPLIT_LIST_FROM_TEXT": "从文本制作列表", "LISTS_SPLIT_TEXT_FROM_LIST": "将列表合并为文本", "LISTS_SPLIT_WITH_DELIMITER": "分隔符:", "LISTS_SPLIT_TOOLTIP_SPLIT": "将文本按指定的分隔符拆分为文本组成的列表。", "LISTS_SPLIT_TOOLTIP_JOIN": "加入文本列表至一个文本,由分隔符分隔。", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "倒转%1", "LISTS_REVERSE_TOOLTIP": "倒转一个列表,返回副本。", - "ORDINAL_NUMBER_SUFFIX": "-", "VARIABLES_GET_TOOLTIP": "返回此变量的值。", "VARIABLES_GET_CREATE_SET": "创建“设定%1”", "VARIABLES_SET": "赋值 %1 为 %2", @@ -346,7 +332,6 @@ "PROCEDURES_DEFNORETURN_PROCEDURE": "做点什么", "PROCEDURES_BEFORE_PARAMS": "与:", "PROCEDURES_CALL_BEFORE_PARAMS": "与:", - "PROCEDURES_DEFNORETURN_DO": "-", "PROCEDURES_DEFNORETURN_TOOLTIP": "创建一个不带输出值的函数。", "PROCEDURES_DEFNORETURN_COMMENT": "描述该功能...", "PROCEDURES_DEFRETURN_HELPURL": "https://zh.wikipedia.org/wiki/子程序", @@ -365,7 +350,6 @@ "PROCEDURES_HIGHLIGHT_DEF": "突出显示函数定义", "PROCEDURES_CREATE_DO": "创建“%1”", "PROCEDURES_IFRETURN_TOOLTIP": "如果值为真,则返回第二个值。", - "PROCEDURES_IFRETURN_HELPURL": "http://c2.com/cgi/wiki?GuardClause", "PROCEDURES_IFRETURN_WARNING": "警告:这个块只能在函数内部使用。", "WORKSPACE_COMMENT_DEFAULT_TEXT": "说点什么...", "WORKSPACE_ARIA_LABEL": "Blockly工作区", diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json index 9c4048e9593..b3dfbadab2f 100644 --- a/msg/json/zh-hant.json +++ b/msg/json/zh-hant.json @@ -119,6 +119,12 @@ "LOGIC_TERNARY_TOOLTIP": "檢查「測試」中的條件。如果條件為真,將返回「如果為真」的值;否則,返回「如果為假」的值。", "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/數", "MATH_NUMBER_TOOLTIP": "一個數字。", + "MATH_TRIG_SIN": "正弦", + "MATH_TRIG_COS": "餘弦", + "MATH_TRIG_TAN": "正切", + "MATH_TRIG_ASIN": "反正弦", + "MATH_TRIG_ACOS": "反餘弦", + "MATH_TRIG_ATAN": "反正切", "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/算術", "MATH_ARITHMETIC_TOOLTIP_ADD": "返回兩個數字的總和。", "MATH_ARITHMETIC_TOOLTIP_MINUS": "返回兩個數字的差。", @@ -237,13 +243,10 @@ "TEXT_PROMPT_TOOLTIP_NUMBER": "輸入數字", "TEXT_PROMPT_TOOLTIP_TEXT": "輸入文字", "TEXT_COUNT_MESSAGE0": "在%2計算%1", - "TEXT_COUNT_HELPURL": "https://github.com/google/blockly/wiki/Text#counting-substrings", "TEXT_COUNT_TOOLTIP": "計算某些文字在內容裡的出現次數。", "TEXT_REPLACE_MESSAGE0": "在%3以%2取代%1", - "TEXT_REPLACE_HELPURL": "https://github.com/google/blockly/wiki/Text#replacing-substrings", "TEXT_REPLACE_TOOLTIP": "取代在內容裡的全部某些文字。", "TEXT_REVERSE_MESSAGE0": "反轉%1", - "TEXT_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Text#reversing-text", "TEXT_REVERSE_TOOLTIP": "反轉排序在文字裡的字元。", "LISTS_CREATE_EMPTY_TITLE": "建立空的清單", "LISTS_CREATE_EMPTY_TOOLTIP": "返回一個長度(項目數量)為 0 的清單,不包含任何資料記錄", @@ -265,6 +268,7 @@ "LISTS_GET_INDEX_GET": "取得", "LISTS_GET_INDEX_GET_REMOVE": "取得並移除", "LISTS_GET_INDEX_REMOVE": "移除", + "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "倒數第 # 筆", "LISTS_GET_INDEX_FIRST": "第一筆", "LISTS_GET_INDEX_LAST": "最後一筆", @@ -301,7 +305,6 @@ "LISTS_GET_SUBLIST_END_FROM_END": "到 # 倒數", "LISTS_GET_SUBLIST_END_LAST": "到 最後面", "LISTS_GET_SUBLIST_TOOLTIP": "複製清單中指定的部分。", - "LISTS_SORT_HELPURL": "https://github.com/google/blockly/wiki/Lists#sorting-a-list", "LISTS_SORT_TITLE": "排列 %1 %2 %3", "LISTS_SORT_TOOLTIP": "排序清單的複製內容。", "LISTS_SORT_ORDER_ASCENDING": "升序", @@ -314,7 +317,6 @@ "LISTS_SPLIT_WITH_DELIMITER": "用分隔符", "LISTS_SPLIT_TOOLTIP_SPLIT": "將文本變成清單項目,按分隔符號拆分。", "LISTS_SPLIT_TOOLTIP_JOIN": "串起清單項目成一個文本,並用分隔符號分開。", - "LISTS_REVERSE_HELPURL": "https://github.com/google/blockly/wiki/Lists#reversing-a-list", "LISTS_REVERSE_MESSAGE0": "反轉%1", "LISTS_REVERSE_TOOLTIP": "反轉清單的複製內容。", "VARIABLES_GET_TOOLTIP": "返回此變數的值。", diff --git a/package-lock.json b/package-lock.json index 1823285c0af..99fba3746c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,23 @@ { "name": "blockly", - "version": "8.0.5", + "version": "9.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "blockly", - "version": "8.0.5", + "version": "9.0.0", "license": "Apache-2.0", "dependencies": { "jsdom": "15.2.1" }, "devDependencies": { "@blockly/block-test": "^2.0.1", - "@blockly/dev-tools": "^3.0.1", + "@blockly/dev-tools": "^4.0.2", "@blockly/theme-modern": "^2.1.1", "@hyperjump/json-schema": "^0.18.4", + "@microsoft/api-extractor": "^7.29.5", + "@typescript-eslint/eslint-plugin": "^5.33.1", "@wdio/selenium-standalone-service": "^7.10.1", "chai": "^4.2.0", "clang-format": "^1.6.0", @@ -23,8 +25,9 @@ "concurrently": "^7.0.0", "eslint": "^8.4.1", "eslint-config-google": "^0.14.0", - "google-closure-compiler": "^20220301.0.0", - "google-closure-deps": "^20220202.0.0", + "eslint-plugin-jsdoc": "^39.3.6", + "google-closure-compiler": "^20220905.0.0", + "google-closure-deps": "^20220905.0.0", "gulp": "^4.0.2", "gulp-clang-format": "^1.0.27", "gulp-concat": "^2.6.1", @@ -38,7 +41,7 @@ "http-server": "^14.0.0", "js-green-licenses": "^3.0.0", "json5": "^2.2.0", - "mocha": "^9.1.1", + "mocha": "^10.0.0", "readline-sync": "^1.4.10", "rimraf": "^3.0.2", "selenium-standalone": "^8.0.3", @@ -155,28 +158,28 @@ } }, "node_modules/@blockly/block-test": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-2.0.4.tgz", - "integrity": "sha512-nECM+4kSaZLNVBhbfTnsKl+kfqxcBHbflo6TE2rmaP8GjbndtT9I7XHdmXDtHGomfPTFF1qJ7bl09fmFqcdeQQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-2.0.18.tgz", + "integrity": "sha512-IujQmkTPwRtbONyJ1nWxSr5FYaoCXByOKuNYsXiLa5TL79DlU6CuapzFCw/AnFF0z6LImY+WlMuiQPo0HhG/Lw==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "^7.20211209.0" + "blockly": ">=7 <9" } }, "node_modules/@blockly/dev-tools": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-3.0.7.tgz", - "integrity": "sha512-s55teQLYNKOtWZIngce2WFy052CrEGPMfhRzQgFKlrTfVafr+iZc+E4MTIY1J9R2Zw5uKnfxULV8LfNrwcH+fA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-4.0.3.tgz", + "integrity": "sha512-YWkutC33AjdOHFYmzC2skVbVqv7acfOzoD4f1ph3/9G6JsfNPuXLMvYdeuxH2iCULtHcYXwUn5Cg8Q7cLS83ow==", "dev": true, "dependencies": { - "@blockly/block-test": "^2.0.4", - "@blockly/theme-dark": "^2.0.7", - "@blockly/theme-deuteranopia": "^1.0.8", - "@blockly/theme-highcontrast": "^1.0.8", - "@blockly/theme-tritanopia": "^1.0.8", + "@blockly/block-test": "^2.0.18", + "@blockly/theme-dark": "^3.0.17", + "@blockly/theme-deuteranopia": "^2.0.17", + "@blockly/theme-highcontrast": "^2.0.17", + "@blockly/theme-tritanopia": "^2.0.17", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -188,87 +191,116 @@ "node": ">=8.0.0" }, "peerDependencies": { - "blockly": "^7.20211209.0" + "blockly": ">=8 <9" } }, "node_modules/@blockly/theme-dark": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-2.0.7.tgz", - "integrity": "sha512-sErL00Uaa0yBviBWpNT0tobaty5BYb+xbE3LwSsot7P/4u/j+pD+oKS8fqt8xsWxbtn67zL8PARmaP3KVe4+Aw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-3.0.17.tgz", + "integrity": "sha512-WxYApZT2vok2k4ba98KrweFTTiL2CS8JvOO8ZaOaI5GSWTU7jO6b+KCPHf5WAEY80iqAspg1gRTeePKliZmgIA==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "3.20200123.0 - 7" + "blockly": ">=7 <9" } }, "node_modules/@blockly/theme-deuteranopia": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-1.0.8.tgz", - "integrity": "sha512-/9aDJCUuyDJ4OSHr2lCJRpqBLSvgV8YP7uCeCKuoY3uMnMKTxEcJ/AUma+oF98os+i3/GeNzCMYQ/6bdlCXRIQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-2.0.17.tgz", + "integrity": "sha512-smTIWZJNUBAz7YoNRoFUWk0K5ghFWaXlrDqtbPWxpSEr+qxmVoj3ZqjDvy1R+QexMCg4BQ+XZdJpTwVAwuY8lg==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "3.20200123.0 - 7" + "blockly": ">=7 <9" } }, "node_modules/@blockly/theme-highcontrast": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-1.0.8.tgz", - "integrity": "sha512-A9bvQpmNtsn3W3pWa0NRttBm1IeIhV6zGAp4ziY+GU0kNGZDgbrP10JJKfz3dv+RCaXmslE9kS25RU/LYJjB/Q==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-2.0.17.tgz", + "integrity": "sha512-Cy3hd0TNmeytvLwqo9yRYy4YgW9pn4z8sDPWO7SXdUqFNgKoT8FBfMMEbYLmC2vdQyn+Fj1Q04FugVF1xqEm2w==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "3.20200123.0 - 7" + "blockly": ">=7 <9" } }, "node_modules/@blockly/theme-modern": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.28.tgz", - "integrity": "sha512-SRPrQJOvTU8yC+NFnfFipaciCJEfmIG+imPwNcL1WZ/pPct6ojEDwHKAalWkHGLrTb0rmOaDVeHJJQx+HZmQsQ==", + "version": "2.1.42", + "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.42.tgz", + "integrity": "sha512-CCS1EYQ3k0N70/ol0ozzEBcb5dYMpmjjOQFOEDWsSzyt8qujKRneFDp8f9+/W1a43jyaY53kZPTYuaXfPaAp0A==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "3.20200123.0 - 7" + "blockly": ">=3.20200123.0 <9" } }, "node_modules/@blockly/theme-tritanopia": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-1.0.8.tgz", - "integrity": "sha512-61G8VB5a8F9eRMYAXpeRia/DrRRfAnUqpA62pksvtcRwMoztwhToUHHkSYuOHxpDpKG/rTlaFtf/GUHFFaFHEQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-2.0.17.tgz", + "integrity": "sha512-DuE6TcRTcrEIzVszbcI3xeq8XEdAR25uOVIOTAUPLcp8wjGSGxDp5OZLePLHvIFC8aZ7tUgr/3gW6F0/F0nPmQ==", "dev": true, "engines": { "node": ">=8.17.0" }, "peerDependencies": { - "blockly": "3.20200123.0 - 7" + "blockly": ">=7 <9" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", + "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "dev": true, + "dependencies": { + "comment-parser": "1.3.1", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~3.1.0" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18" } }, "node_modules/@eslint/eslintrc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", - "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/@gulp-sourcemaps/identity-map": { @@ -354,9 +386,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -367,6 +399,29 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -388,9 +443,9 @@ } }, "node_modules/@hyperjump/json-schema": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.4.tgz", - "integrity": "sha512-FVdSlOrOio/sWCbVbAP3yH/gKKddvrIvKzLS/id6/CidWH0r0x5ZTPM1zBS0Su7gU6OOjFRxDYhrIhnNBI5ODg==", + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.5.tgz", + "integrity": "sha512-O4+E8BqwzkhPm6BEkswaExIqtrtznpVQjyllA3Q3rB0VQZ4YWW7L5AtaqIiL0XtxpnuCiPKqb73BBGdyycLL6g==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -435,6 +490,242 @@ "url": "https://github.com/sponsors/jdesrosiers" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.31.2.tgz", + "integrity": "sha512-ZODCU9ckTS9brXiZpUW2iDrnAg7jLxeLBM1AkPpSZFcbG/8HGLvfKOKrd71VIJHjc52x2lB8xj7ZWksnP7AOBA==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.24.2", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0", + "@rushstack/rig-package": "0.3.15", + "@rushstack/ts-command-line": "4.12.3", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.7.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.2.tgz", + "integrity": "sha512-uUvjqTCY7hYERWGks+joTioN1QYHIucCDy7I/JqLxFxLbFXE5dpc1X7L+FG4PN/s8QYL24DKt0fqJkgcrFKLTw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.52.0.tgz", + "integrity": "sha512-Z+MAP//G3rEGZd3JxJcBGcPYJlh8pvPoLMTLa5Sy6FTE6hRPzN+5J8DT7BbTmlqZaL6SZpXF30heRUbnYOvujw==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.15.tgz", + "integrity": "sha512-jxVfvO5OnkRlYRhcVDZWvwiI2l4pv37HDJRtyg5HbD8Z/I8Xj32RICgrxS5xMeGGytobrg5S6OfPOHskg7Nw+A==", + "dev": true, + "dependencies": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/rig-package/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.3.tgz", + "integrity": "sha512-Pdij22RotMXzI+HWHyYCvw0RMZhiP5a6Za/96XamZ1+mxmpSm4ujf8TROKxGAHySmR5A8iNVSlzhNMnUlFQE6g==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -494,6 +785,12 @@ "node": ">=10" } }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "node_modules/@types/aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.0.tgz", @@ -551,6 +848,12 @@ "rxjs": "^7.2.0" } }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "node_modules/@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -620,69 +923,449 @@ "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.0.tgz", "integrity": "sha512-HGk753KRu2N4mWduovY4BLjYq4jTOL29gV2OfGdGxHcPSWGFkC5RRIdk+VTs5XmYd7MVAD+JwKrcb5+5Y7FOCg==", "dev": true, - "peer": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/selenium-standalone": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/selenium-standalone/-/selenium-standalone-7.0.1.tgz", + "integrity": "sha512-zbKenL0fAXzPyiOaaFMrvFdMNhj5BgNJQq8bxiZfwQD9ID2J8bUG5xbcS3tQtlzIX/62z9nG5Vo45oaHWTbvbw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ua-parser-js": { + "version": "0.7.36", + "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", + "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", + "dev": true + }, + "node_modules/@types/vinyl": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", + "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "dev": true, + "dependencies": { + "@types/expect": "^1.20.4", + "@types/node": "*" + } + }, + "node_modules/@types/which": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz", + "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", + "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.33.1", + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/typescript-estree": "5.33.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", + "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", + "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", + "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", "dev": true, - "dependencies": { - "@types/node": "*" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/selenium-standalone": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/selenium-standalone/-/selenium-standalone-7.0.1.tgz", - "integrity": "sha512-zbKenL0fAXzPyiOaaFMrvFdMNhj5BgNJQq8bxiZfwQD9ID2J8bUG5xbcS3tQtlzIX/62z9nG5Vo45oaHWTbvbw==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", "dev": true, "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", "dev": true, - "peer": true, "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@types/ua-parser-js": { - "version": "0.7.36", - "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", - "integrity": "sha512-N1rW+njavs70y2cApeIw1vLMYXRwfBy+7trgavGuuTfOd7j1Yh7QTRc/yqsPl6ncokt72ZXuxEU0PiCp9bSwNQ==", - "dev": true - }, - "node_modules/@types/vinyl": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.6.tgz", - "integrity": "sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==", + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "@types/expect": "^1.20.4", - "@types/node": "*" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@types/which": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz", - "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", + "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", "dev": true, - "optional": true, + "peer": true, "dependencies": { - "@types/node": "*" + "@typescript-eslint/types": "5.33.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@ungap/promise-all-settled": { @@ -1001,27 +1684,27 @@ } }, "node_modules/@wdio/repl": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.17.3.tgz", - "integrity": "sha512-ZX4dYnoOb9NC3IQFhva4B7FCoVx9v7CIG7g5W4bX/un5Xfyz3Fne1vGP9Aku15nyIaXRSCzuV6vpT/5KR6q6Hg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.25.0.tgz", + "integrity": "sha512-XhWsiOgKnkJ/0z2Um+ckcLVUHjyBB9JEtdP2mY2LjkK55W2/mXl+Mg0G3zNbG3YvT8VCV3QzSFAJKBhyfaBjwA==", "dev": true, "dependencies": { - "@wdio/utils": "7.17.3" + "@wdio/utils": "7.25.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "node_modules/@wdio/repl/node_modules/@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -1034,26 +1717,34 @@ } }, "node_modules/@wdio/repl/node_modules/@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "^4.6.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@wdio/repl/node_modules/@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" }, "engines": { @@ -1061,17 +1752,17 @@ } }, "node_modules/@wdio/selenium-standalone-service": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.18.0.tgz", - "integrity": "sha512-Tl+GB45oYsnL5zP5xQU245Uhcm3IFL7XP3x7nIsUj7VHzWPSvMB4Hib90CnNiTd2pY1AUC8q+2rlS1M1jZq3VQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.25.0.tgz", + "integrity": "sha512-WRX4ljr6VRmV2YO+jqWSOhKMQKpLItJUklhOT9P98LwzMB607fMFTnN1vJ/rI3Q2ZLoHDPbPGnbmTYUw/4uzzQ==", "dev": true, "dependencies": { "@types/fs-extra": "^9.0.1", - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.18.0", - "@wdio/logger": "7.17.3", - "@wdio/types": "7.18.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "fs-extra": "^10.0.0", "selenium-standalone": "^8.0.3" }, @@ -1083,30 +1774,31 @@ } }, "node_modules/@wdio/selenium-standalone-service/node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/config": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.18.0.tgz", - "integrity": "sha512-pXv4MWfMFSOXU6eJRbJuHcP0hN9sOyRzEpHNgMk6hsDpzqSKFp2Rg4fYrlmvYJILrM6PxTfylVz9gwP4QWOsdA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.18.0", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -1119,16 +1811,78 @@ } }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.18.0.tgz", - "integrity": "sha512-GZO5gmobbAOGln4+edAsyPbeLes4I6ZCa0iBn/KVM72y8cvHH+L2ojLsDvzd6Pn/g79zDjEUpBH7BgkDplj8lg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "^4.6.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/utils": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", + "dev": true, + "dependencies": { + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "p-iteration": "^1.1.8" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/@wdio/types": { @@ -1178,9 +1932,9 @@ } }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1396,12 +2150,6 @@ "node": ">= 6" } }, - "node_modules/archiver/node_modules/async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - }, "node_modules/archiver/node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1586,6 +2334,15 @@ "node": ">=0.10.0" } }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -1648,9 +2405,9 @@ } }, "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, "node_modules/async-done": { @@ -1888,9 +2645,9 @@ } }, "node_modules/blockly": { - "version": "7.20211209.2", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-7.20211209.2.tgz", - "integrity": "sha512-74HTPbnDOwVGKx6qRE/ZVVQwf+J9s/WkgDKv0vuXw/DtBLvLrew7Nf5jaZP0+DXRVJpP1u5sfu+qtHaom0i6Ug==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-8.0.4.tgz", + "integrity": "sha512-qGYrynzalzEHOMLJhZmADpuMXUH55nSTVgVd11Z1ZlVsm3NQ69ZVgBEaCSN+GsEUUpoui71g4oVzE2iHEHbAtw==", "dev": true, "peer": true, "dependencies": { @@ -2404,12 +3161,12 @@ } }, "node_modules/clang-format": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.6.0.tgz", - "integrity": "sha512-W3/L7fWkA8DoLkz9UGjrRnNi+J5a5TuS2HDLqk6WsicpOzb66MBu4eY/EcXhicHriVnAXWQVyk5/VeHWY6w4ow==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.8.0.tgz", + "integrity": "sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==", "dev": true, "dependencies": { - "async": "^1.5.2", + "async": "^3.2.3", "glob": "^7.0.0", "resolve": "^1.1.6" }, @@ -2725,6 +3482,15 @@ "color-support": "bin.js" } }, + "node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2737,12 +3503,21 @@ } }, "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", "dev": true, "engines": { - "node": ">= 12" + "node": ">= 12.0.0" } }, "node_modules/component-emitter": { @@ -2820,37 +3595,30 @@ } }, "node_modules/concurrently": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz", - "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", + "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "date-fns": "^2.16.1", + "date-fns": "^2.29.1", "lodash": "^4.17.21", - "rxjs": "^6.6.3", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", "tree-kill": "^1.2.2", - "yargs": "^16.2.0" + "yargs": "^17.3.1" }, "bin": { + "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" }, "engines": { "node": "^12.20.0 || ^14.13.0 || >=16.0.0" - } - }, - "node_modules/concurrently/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" }, - "engines": { - "npm": ">=2.0.0" + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, "node_modules/concurrently/node_modules/supports-color": { @@ -2868,33 +3636,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/concurrently/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/concurrently/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -3104,9 +3845,9 @@ } }, "node_modules/date-fns": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.27.0.tgz", - "integrity": "sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "dev": true, "engines": { "node": ">=0.11" @@ -3126,9 +3867,9 @@ } }, "node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3366,60 +4107,61 @@ } }, "node_modules/devtools": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.17.3.tgz", - "integrity": "sha512-y5O+z+q7cUuAKMY9ZNGexbb62MUimKAJX7OkFecix2Fl9+YFSmAQUUtHWrTt9qFkw5NJNMdiXZhQvk+JdfRygw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.0.tgz", + "integrity": "sha512-SU9jKoJJccXKXfYiIqgktoL5TuzLglqcHeivPPJjzhX17S99zH9bHw4SyhQALox3J1Xgmim+dzO6yTQtRU6cAQ==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "puppeteer-core": "^13.1.3", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", - "uuid": "^8.0.0" + "uuid": "^9.0.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/devtools-protocol": { - "version": "0.0.979353", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.979353.tgz", - "integrity": "sha512-/A7o8FU5n4i2WN/RH6opBbteawPbNgyKmmyl6Ts4zpQ5FVq/cGe2K/qGr8t80BLVu8KynTckHbdpaLCwxzRyFA==", + "version": "0.0.1049481", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1049481.tgz", + "integrity": "sha512-QeoiFUnCNlXusSIfCOov0bn9uGTx7Q+9Cj+vvNFzHym5OcJeXyFxXNtvWtFmDorlEnTJYL5S6wXv+kgAg1s/Zw==", "dev": true }, "node_modules/devtools/node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "node_modules/devtools/node_modules/@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" }, "engines": { "node": ">=12.0.0" } }, "node_modules/devtools/node_modules/@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -3432,57 +4174,126 @@ } }, "node_modules/devtools/node_modules/@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/devtools/node_modules/@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "^4.6.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/devtools/node_modules/@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" }, "engines": { "node": ">=12.0.0" } }, + "node_modules/devtools/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/devtools/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/devtools/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/devtools/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true, "bin": { "uuid": "dist/bin/uuid" } }, - "node_modules/diff": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", - "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", + "node_modules/diff": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-2.2.3.tgz", + "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=8" } }, "node_modules/doctrine": { @@ -3604,13 +4415,13 @@ } }, "node_modules/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", "dev": true, "peer": true, "dependencies": { - "jake": "^10.8.5" + "jake": "^10.6.1" }, "bin": { "ejs": "bin/cli.js" @@ -3786,13 +4597,15 @@ } }, "node_modules/eslint": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.9.0.tgz", - "integrity": "sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.1.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3802,30 +4615,32 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" @@ -3849,6 +4664,27 @@ "eslint": ">=5.16.0" } }, + "node_modules/eslint-plugin-jsdoc": { + "version": "39.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", + "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.31.0", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "semver": "^7.3.7", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, "node_modules/eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -3919,27 +4755,33 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, "engines": { - "node": ">= 4" + "node": "*" } }, "node_modules/espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "dependencies": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -4349,6 +5191,35 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4365,6 +5236,15 @@ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", "dev": true }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -4420,36 +5300,13 @@ "optional": true }, "node_modules/filelist": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", - "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", "dev": true, "peer": true, "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" + "minimatch": "^3.0.4" } }, "node_modules/fill-range": { @@ -4719,12 +5576,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "node_modules/gaxios": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", @@ -4778,6 +5629,7 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, + "peer": true, "engines": { "node": ">=8" }, @@ -5144,9 +5996,9 @@ } }, "node_modules/globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5170,6 +6022,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/glogg": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", @@ -5183,13 +6055,13 @@ } }, "node_modules/google-closure-compiler": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20220301.0.0.tgz", - "integrity": "sha512-+yAqhufKIWddg587tnvRll92eLJQIlzINmgr1h5gLXZVioY3svrSYKH4TZiUuNj0UnVFoK0o1YuW122x+iFl2g==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20220905.0.0.tgz", + "integrity": "sha512-idZavy2vn91HCmqEepjmLFjfOdYoRsh9PggUbazUpjAOrBQz0HOm3WjOICMiywre+EnY1QGss0srEBtFtukM6w==", "dev": true, "dependencies": { - "chalk": "2.x", - "google-closure-compiler-java": "^20220301.0.0", + "chalk": "4.x", + "google-closure-compiler-java": "^20220905.0.0", "minimist": "1.x", "vinyl": "2.x", "vinyl-sourcemaps-apply": "^0.2.0" @@ -5201,24 +6073,24 @@ "node": ">=10" }, "optionalDependencies": { - "google-closure-compiler-linux": "^20220301.0.0", - "google-closure-compiler-osx": "^20220301.0.0", - "google-closure-compiler-windows": "^20220301.0.0" + "google-closure-compiler-linux": "^20220905.0.0", + "google-closure-compiler-osx": "^20220905.0.0", + "google-closure-compiler-windows": "^20220905.0.0" } }, "node_modules/google-closure-compiler-java": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20220301.0.0.tgz", - "integrity": "sha512-kv5oaUI4xn3qWYWtRHRqbm314kesfeFlCxiFRcvBIx13mKfR0qvbOkgajLpSM6nb3voNM/E9MB9mfvHJ9XIXSg==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20220905.0.0.tgz", + "integrity": "sha512-wxGxNla/0UDS1Lm0cRxEy85KhVRd0vNlsTclnIJ9f1gRWzvvTsJ4lwz+PdT60R6y2hKAOBvydIJHh+B8XJastA==", "dev": true }, "node_modules/google-closure-compiler-linux": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20220301.0.0.tgz", - "integrity": "sha512-N2D0SRnxZ7kqdoZ2WsmLIjmizR4Xr0HaUYDK2RCOtsV21RYV8OR2u0ATp7aXhYy8WfxvYH478Ehvmc9Uzy986A==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20220905.0.0.tgz", + "integrity": "sha512-kH09S66sz9+6wZmYM22VX8vG8KhCKJwFwXCfHx/ZOU6DBEzni6KfWrP+87CzTmZFEivclBhWAndm5HgNhSOEXQ==", "cpu": [ - "x64", - "x86" + "x32", + "x64" ], "dev": true, "optional": true, @@ -5227,12 +6099,12 @@ ] }, "node_modules/google-closure-compiler-osx": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20220301.0.0.tgz", - "integrity": "sha512-Xqf0m5takwfv43ML4aODJxmAsAZQMTMo683gyRs0APAecncs+YKxaDPMH+pQAdI3HPY2QsvkarlunAp0HSwU5A==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20220905.0.0.tgz", + "integrity": "sha512-4uo2GAz77gI8nDt4OA8VUYh/FNdjmTLOIRDazl7si+BOjgp9bC6C3E/88o+YHETsVtrPmZk57/W7vH0lftyTAw==", "cpu": [ + "x32", "x64", - "x86", "arm64" ], "dev": true, @@ -5242,10 +6114,11 @@ ] }, "node_modules/google-closure-compiler-windows": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20220301.0.0.tgz", - "integrity": "sha512-s+FU/vcpLTEgx8MCMgj0STCYkVk7syzF9KqiYPOTtbTD9ra99HPe/CEuQG7iJ3Fty9dhm9zEaetv4Dp4Wr6x+Q==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20220905.0.0.tgz", + "integrity": "sha512-TZKHu6RHnrmgV90Gyen8+TGc0vgjgds80ErR+al5CqmfP9p+AskBbOe5CWZJht0bANrUhaeBMCrbs+7loFv06Q==", "cpu": [ + "x32", "x64" ], "dev": true, @@ -5254,81 +6127,10 @@ "win32" ] }, - "node_modules/google-closure-compiler/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/google-closure-compiler/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/google-closure-compiler/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/google-closure-compiler/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/google-closure-compiler/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/google-closure-compiler/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/google-closure-compiler/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/google-closure-deps": { - "version": "20220202.0.0", - "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20220202.0.0.tgz", - "integrity": "sha512-cPE4GbWRn4ix92UFE1nbjJpQw3eQ/1fGjjMDJG8mghhBEiBBXzBZUEpPALrpdEy9ZYgOdaRAr9UqAN35jfmy8g==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20220905.0.0.tgz", + "integrity": "sha512-W1brOBePH/oWy6TcG0CD2dM5b2g5GNephTc+OsNgVc/YOOz0chF3CsApijs3EO0VtBfz1/4c0i914k6lDdEJxg==", "dev": true, "dependencies": { "minimatch": "^3.0.4", @@ -5412,15 +6214,6 @@ "lodash": "^4.17.15" } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, "node_modules/gulp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", @@ -6296,9 +7089,9 @@ } }, "node_modules/http-server": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.0.tgz", - "integrity": "sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "dependencies": { "basic-auth": "^2.0.1", @@ -6308,7 +7101,7 @@ "html-encoding-sniffer": "^3.0.0", "http-proxy": "^1.18.1", "mime": "^1.6.0", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "opener": "^1.5.1", "portfinder": "^1.0.28", "secure-compare": "3.0.1", @@ -6394,9 +7187,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" @@ -6418,6 +7211,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6870,61 +7672,145 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/istextorbinary": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", + "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "dev": true, + "dependencies": { + "binaryextensions": "^2.2.0", + "textextensions": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "peer": true, + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true, + "peer": true + }, + "node_modules/jake/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "peer": true + }, + "node_modules/jake/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true, + "peer": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "node_modules/istextorbinary": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-3.3.0.tgz", - "integrity": "sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==", + "node_modules/jake/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, - "dependencies": { - "binaryextensions": "^2.2.0", - "textextensions": "^3.2.0" - }, + "peer": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://bevry.me/fund" + "node": ">=4" } }, - "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "node_modules/jake/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "peer": true, "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/jake/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true, - "peer": true + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true }, "node_modules/js-green-licenses": { "version": "3.0.1", @@ -6948,6 +7834,12 @@ "node": ">= 10.x" } }, + "node_modules/js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6971,6 +7863,15 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", + "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsdom": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", @@ -7076,13 +7977,10 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -7455,6 +8353,12 @@ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", @@ -7790,6 +8694,15 @@ "node": ">=10" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -8037,48 +8950,55 @@ "dev": true }, "node_modules/mocha": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", - "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.2.0", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 12.0.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/mocha/node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -8088,6 +9008,18 @@ "node": ">=0.3.1" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -8181,9 +9113,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -9115,9 +10047,9 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -9449,16 +10381,16 @@ } }, "node_modules/puppeteer-core": { - "version": "13.5.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.5.1.tgz", - "integrity": "sha512-dobVqWjV34ilyfQHR3BBnCYaekBYTi5MgegEYBRYd3s3uFy8jUpZEEWbaFjG9ETm+LGzR5Lmr0aF6LLuHtiuCg==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", + "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", "dev": true, "dependencies": { "cross-fetch": "3.1.5", - "debug": "4.3.3", - "devtools-protocol": "0.0.969999", + "debug": "4.3.4", + "devtools-protocol": "0.0.981744", "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", @@ -9472,11 +10404,24 @@ } }, "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.969999", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.969999.tgz", - "integrity": "sha512-6GfzuDWU0OFAuOvBokXpXPLxjOJ5DZ157Ue3sGQQM3LgAamb8m0R0ruSfN0DDu+XG5XJgT50i6zZ/0o8RglreQ==", + "version": "0.0.981744", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", + "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", "dev": true }, + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/puppeteer-core/node_modules/ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", @@ -9512,6 +10457,26 @@ "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", "dev": true }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -10136,6 +11101,16 @@ "node": ">=0.12" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rgb2hex": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", @@ -10167,12 +11142,34 @@ "node": ">=0.12.0" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/rxjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, - "peer": true, "dependencies": { "tslib": "~2.1.0" } @@ -10181,8 +11178,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true, - "peer": true + "dev": true }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -10221,12 +11217,12 @@ "dev": true }, "node_modules/selenium-standalone": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.0.9.tgz", - "integrity": "sha512-Bl5Wbaeu5bKVmpLVATYeRcPsk9Bv3fr1aUvdC39UZjG6R/bem8j8Pj+dwB9F+PsS/owQnKh0BCg1KalZcAImbw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.0.tgz", + "integrity": "sha512-gRFJm2A91sL0/4PavIsfTVNjyqNjk+zbdJg/zAYgTMjuoWJv+BlYJh+1UbEtyjt4YvZACYif1DFAzFjQapqiOA==", "dev": true, "dependencies": { - "commander": "^8.3.0", + "commander": "^9.0.0", "cross-spawn": "^7.0.3", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -10250,9 +11246,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10387,6 +11383,12 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, "node_modules/sigma": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sigma/-/sigma-1.2.1.tgz", @@ -10427,6 +11429,15 @@ "node": ">=0.3.1" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -10743,6 +11754,12 @@ "node": ">=0.10.0" } }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -10957,6 +11974,15 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -11401,6 +12427,21 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -11464,9 +12505,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -11726,12 +12767,6 @@ "uuid": "bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -11763,6 +12798,15 @@ "builtins": "^1.0.3" } }, + "node_modules/validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", @@ -11922,19 +12966,19 @@ } }, "node_modules/webdriver": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.17.3.tgz", - "integrity": "sha512-E1V/IKYjJoVjK9zhHfSCWeqORhgNlDuYydykm0h+CchEhMSgTmtTH/LYfXSx4myXzobdlIg6xhE7Jv7XPjSkAA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.25.0.tgz", + "integrity": "sha512-fYsxVMHpYAXecJP1m+fqC3BSKrWS3fcCiI120NRnZrZ52vcodpiJSuOAedKIXegQZlzl77U4VWeSHiY1f6Iseg==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@types/node": "^18.0.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "got": "^11.0.2", - "ky": "^0.30.0", + "ky": "0.30.0", "lodash.merge": "^4.6.1" }, "engines": { @@ -11942,30 +12986,31 @@ } }, "node_modules/webdriver/node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "node_modules/webdriver/node_modules/@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" }, "engines": { "node": ">=12.0.0" } }, "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -11978,41 +13023,77 @@ } }, "node_modules/webdriver/node_modules/@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/webdriver/node_modules/@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "^4.6.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/webdriver/node_modules/@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" }, "engines": { "node": ">=12.0.0" } }, + "node_modules/webdriver/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/webdriver/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webdriver/node_modules/ky": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", @@ -12025,28 +13106,39 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, + "node_modules/webdriver/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/webdriverio": { - "version": "7.17.4", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.17.4.tgz", - "integrity": "sha512-p7u2q7NJL7Et8FdSroq/Ltoi3KkKxERE79Srh9lFr6yRNPFqb46dJf/g4nljLhburnGkbNdYN15JWgyWYnnj9g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.0.tgz", + "integrity": "sha512-7s7PSeGpcUkZq3UTjdG8etbblAerp27Jyf/VQ4Nr0bdZACDfsCVSyvQQuD0HH880VryV+7tjXK6cSV4eYzY64Q==", "dev": true, "dependencies": { "@types/aria-query": "^5.0.0", - "@types/node": "^17.0.4", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/repl": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@types/node": "^18.0.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/repl": "7.25.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.17.3", - "devtools-protocol": "^0.0.979353", + "devtools": "7.25.0", + "devtools-protocol": "^0.0.1049481", "fs-extra": "^10.0.0", - "get-port": "^5.1.1", "grapheme-splitter": "^1.0.2", "lodash.clonedeep": "^4.5.0", "lodash.isobject": "^3.0.2", @@ -12058,37 +13150,38 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.17.3" + "webdriver": "7.25.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/webdriverio/node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "node_modules/webdriverio/node_modules/@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" }, "engines": { "node": ">=12.0.0" } }, "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -12101,35 +13194,43 @@ } }, "node_modules/webdriverio/node_modules/@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true, "engines": { "node": ">=12.0.0" } }, "node_modules/webdriverio/node_modules/@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "dependencies": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" }, "engines": { "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "^4.6.2" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/webdriverio/node_modules/@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" }, "engines": { @@ -12145,10 +13246,29 @@ "balanced-match": "^1.0.0" } }, + "node_modules/webdriverio/node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webdriverio/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -12231,9 +13351,9 @@ } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "node_modules/wrap-ansi": { @@ -12314,12 +13434,12 @@ "dev": true }, "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", @@ -12388,6 +13508,20 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yarn-install": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/yarn-install/-/yarn-install-1.0.0.tgz", @@ -12531,6 +13665,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/z-schema": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^2.20.3" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", @@ -12646,23 +13807,23 @@ } }, "@blockly/block-test": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-2.0.4.tgz", - "integrity": "sha512-nECM+4kSaZLNVBhbfTnsKl+kfqxcBHbflo6TE2rmaP8GjbndtT9I7XHdmXDtHGomfPTFF1qJ7bl09fmFqcdeQQ==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-2.0.18.tgz", + "integrity": "sha512-IujQmkTPwRtbONyJ1nWxSr5FYaoCXByOKuNYsXiLa5TL79DlU6CuapzFCw/AnFF0z6LImY+WlMuiQPo0HhG/Lw==", "dev": true, "requires": {} }, "@blockly/dev-tools": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-3.0.7.tgz", - "integrity": "sha512-s55teQLYNKOtWZIngce2WFy052CrEGPMfhRzQgFKlrTfVafr+iZc+E4MTIY1J9R2Zw5uKnfxULV8LfNrwcH+fA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-4.0.3.tgz", + "integrity": "sha512-YWkutC33AjdOHFYmzC2skVbVqv7acfOzoD4f1ph3/9G6JsfNPuXLMvYdeuxH2iCULtHcYXwUn5Cg8Q7cLS83ow==", "dev": true, "requires": { - "@blockly/block-test": "^2.0.4", - "@blockly/theme-dark": "^2.0.7", - "@blockly/theme-deuteranopia": "^1.0.8", - "@blockly/theme-highcontrast": "^1.0.8", - "@blockly/theme-tritanopia": "^1.0.8", + "@blockly/block-test": "^2.0.18", + "@blockly/theme-dark": "^3.0.17", + "@blockly/theme-deuteranopia": "^2.0.17", + "@blockly/theme-highcontrast": "^2.0.17", + "@blockly/theme-tritanopia": "^2.0.17", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -12672,55 +13833,77 @@ } }, "@blockly/theme-dark": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-2.0.7.tgz", - "integrity": "sha512-sErL00Uaa0yBviBWpNT0tobaty5BYb+xbE3LwSsot7P/4u/j+pD+oKS8fqt8xsWxbtn67zL8PARmaP3KVe4+Aw==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-3.0.17.tgz", + "integrity": "sha512-WxYApZT2vok2k4ba98KrweFTTiL2CS8JvOO8ZaOaI5GSWTU7jO6b+KCPHf5WAEY80iqAspg1gRTeePKliZmgIA==", "dev": true, "requires": {} }, "@blockly/theme-deuteranopia": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-1.0.8.tgz", - "integrity": "sha512-/9aDJCUuyDJ4OSHr2lCJRpqBLSvgV8YP7uCeCKuoY3uMnMKTxEcJ/AUma+oF98os+i3/GeNzCMYQ/6bdlCXRIQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-2.0.17.tgz", + "integrity": "sha512-smTIWZJNUBAz7YoNRoFUWk0K5ghFWaXlrDqtbPWxpSEr+qxmVoj3ZqjDvy1R+QexMCg4BQ+XZdJpTwVAwuY8lg==", "dev": true, "requires": {} }, "@blockly/theme-highcontrast": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-1.0.8.tgz", - "integrity": "sha512-A9bvQpmNtsn3W3pWa0NRttBm1IeIhV6zGAp4ziY+GU0kNGZDgbrP10JJKfz3dv+RCaXmslE9kS25RU/LYJjB/Q==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-2.0.17.tgz", + "integrity": "sha512-Cy3hd0TNmeytvLwqo9yRYy4YgW9pn4z8sDPWO7SXdUqFNgKoT8FBfMMEbYLmC2vdQyn+Fj1Q04FugVF1xqEm2w==", "dev": true, "requires": {} }, "@blockly/theme-modern": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.28.tgz", - "integrity": "sha512-SRPrQJOvTU8yC+NFnfFipaciCJEfmIG+imPwNcL1WZ/pPct6ojEDwHKAalWkHGLrTb0rmOaDVeHJJQx+HZmQsQ==", + "version": "2.1.42", + "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-2.1.42.tgz", + "integrity": "sha512-CCS1EYQ3k0N70/ol0ozzEBcb5dYMpmjjOQFOEDWsSzyt8qujKRneFDp8f9+/W1a43jyaY53kZPTYuaXfPaAp0A==", "dev": true, "requires": {} }, "@blockly/theme-tritanopia": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-1.0.8.tgz", - "integrity": "sha512-61G8VB5a8F9eRMYAXpeRia/DrRRfAnUqpA62pksvtcRwMoztwhToUHHkSYuOHxpDpKG/rTlaFtf/GUHFFaFHEQ==", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-2.0.17.tgz", + "integrity": "sha512-DuE6TcRTcrEIzVszbcI3xeq8XEdAR25uOVIOTAUPLcp8wjGSGxDp5OZLePLHvIFC8aZ7tUgr/3gW6F0/F0nPmQ==", "dev": true, "requires": {} }, + "@es-joy/jsdoccomment": { + "version": "0.31.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", + "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "dev": true, + "requires": { + "comment-parser": "1.3.1", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "~3.1.0" + } + }, "@eslint/eslintrc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.1.0.tgz", - "integrity": "sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", + "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.3.1", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } } }, "@gulp-sourcemaps/identity-map": { @@ -12792,9 +13975,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz", - "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==", + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", + "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -12802,6 +13985,18 @@ "minimatch": "^3.0.4" } }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, "@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -12818,9 +14013,9 @@ } }, "@hyperjump/json-schema": { - "version": "0.18.4", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.4.tgz", - "integrity": "sha512-FVdSlOrOio/sWCbVbAP3yH/gKKddvrIvKzLS/id6/CidWH0r0x5ZTPM1zBS0Su7gU6OOjFRxDYhrIhnNBI5ODg==", + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.5.tgz", + "integrity": "sha512-O4+E8BqwzkhPm6BEkswaExIqtrtznpVQjyllA3Q3rB0VQZ4YWW7L5AtaqIiL0XtxpnuCiPKqb73BBGdyycLL6g==", "dev": true, "requires": { "@hyperjump/json-schema-core": "^0.23.4", @@ -12850,6 +14045,219 @@ "just-curry-it": "^3.1.0" } }, + "@microsoft/api-extractor": { + "version": "7.31.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.31.2.tgz", + "integrity": "sha512-ZODCU9ckTS9brXiZpUW2iDrnAg7jLxeLBM1AkPpSZFcbG/8HGLvfKOKrd71VIJHjc52x2lB8xj7ZWksnP7AOBA==", + "dev": true, + "requires": { + "@microsoft/api-extractor-model": "7.24.2", + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0", + "@rushstack/rig-package": "0.3.15", + "@rushstack/ts-command-line": "4.12.3", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.7.4" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@microsoft/api-extractor-model": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.24.2.tgz", + "integrity": "sha512-uUvjqTCY7hYERWGks+joTioN1QYHIucCDy7I/JqLxFxLbFXE5dpc1X7L+FG4PN/s8QYL24DKt0fqJkgcrFKLTw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.52.0" + } + }, + "@microsoft/tsdoc": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", + "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "dev": true + }, + "@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + }, + "dependencies": { + "@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@rushstack/node-core-library": { + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.52.0.tgz", + "integrity": "sha512-Z+MAP//G3rEGZd3JxJcBGcPYJlh8pvPoLMTLa5Sy6FTE6hRPzN+5J8DT7BbTmlqZaL6SZpXF30heRUbnYOvujw==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "dependencies": { + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "@rushstack/rig-package": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.15.tgz", + "integrity": "sha512-jxVfvO5OnkRlYRhcVDZWvwiI2l4pv37HDJRtyg5HbD8Z/I8Xj32RICgrxS5xMeGGytobrg5S6OfPOHskg7Nw+A==", + "dev": true, + "requires": { + "resolve": "~1.17.0", + "strip-json-comments": "~3.1.1" + }, + "dependencies": { + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + } + } + }, + "@rushstack/ts-command-line": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.12.3.tgz", + "integrity": "sha512-Pdij22RotMXzI+HWHyYCvw0RMZhiP5a6Za/96XamZ1+mxmpSm4ujf8TROKxGAHySmR5A8iNVSlzhNMnUlFQE6g==", + "dev": true, + "requires": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, "@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -12900,6 +14308,12 @@ "defer-to-connect": "^2.0.0" } }, + "@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "@types/aria-query": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.0.tgz", @@ -12957,6 +14371,12 @@ "rxjs": "^7.2.0" } }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, "@types/keyv": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz", @@ -13091,6 +14511,220 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", + "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/type-utils": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + } + }, + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.33.1.tgz", + "integrity": "sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "5.33.1", + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/typescript-estree": "5.33.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz", + "integrity": "sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", + "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.38.0", + "@typescript-eslint/utils": "5.38.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + } + } + }, + "@typescript-eslint/types": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.33.1.tgz", + "integrity": "sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==", + "dev": true, + "peer": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz", + "integrity": "sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "5.33.1", + "@typescript-eslint/visitor-keys": "5.33.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/utils": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", + "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.38.0", + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/typescript-estree": "5.38.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "@typescript-eslint/scope-manager": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", + "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0" + } + }, + "@typescript-eslint/types": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", + "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", + "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "@typescript-eslint/visitor-keys": "5.38.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", + "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.38.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.33.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz", + "integrity": "sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/types": "5.33.1", + "eslint-visitor-keys": "^3.3.0" + } + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -13353,24 +14987,24 @@ "peer": true }, "@wdio/repl": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.17.3.tgz", - "integrity": "sha512-ZX4dYnoOb9NC3IQFhva4B7FCoVx9v7CIG7g5W4bX/un5Xfyz3Fne1vGP9Aku15nyIaXRSCzuV6vpT/5KR6q6Hg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.25.0.tgz", + "integrity": "sha512-XhWsiOgKnkJ/0z2Um+ckcLVUHjyBB9JEtdP2mY2LjkK55W2/mXl+Mg0G3zNbG3YvT8VCV3QzSFAJKBhyfaBjwA==", "dev": true, "requires": { - "@wdio/utils": "7.17.3" + "@wdio/utils": "7.25.0" }, "dependencies": { "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -13380,82 +15014,125 @@ } }, "@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "requires": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" } }, "@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" } } } }, "@wdio/selenium-standalone-service": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.18.0.tgz", - "integrity": "sha512-Tl+GB45oYsnL5zP5xQU245Uhcm3IFL7XP3x7nIsUj7VHzWPSvMB4Hib90CnNiTd2pY1AUC8q+2rlS1M1jZq3VQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.25.0.tgz", + "integrity": "sha512-WRX4ljr6VRmV2YO+jqWSOhKMQKpLItJUklhOT9P98LwzMB607fMFTnN1vJ/rI3Q2ZLoHDPbPGnbmTYUw/4uzzQ==", "dev": true, "requires": { "@types/fs-extra": "^9.0.1", - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.18.0", - "@wdio/logger": "7.17.3", - "@wdio/types": "7.18.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "fs-extra": "^10.0.0", "selenium-standalone": "^8.0.3" }, "dependencies": { "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, - "@wdio/config": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.18.0.tgz", - "integrity": "sha512-pXv4MWfMFSOXU6eJRbJuHcP0hN9sOyRzEpHNgMk6hsDpzqSKFp2Rg4fYrlmvYJILrM6PxTfylVz9gwP4QWOsdA==", + "@wdio/config": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", + "dev": true, + "requires": { + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", + "deepmerge": "^4.0.0", + "glob": "^8.0.3" + } + }, + "@wdio/logger": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^6.0.0" + } + }, + "@wdio/types": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", + "dev": true, + "requires": { + "@types/node": "^18.0.0", + "got": "^11.8.1" + } + }, + "@wdio/utils": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", + "dev": true, + "requires": { + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "p-iteration": "^1.1.8" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.18.0", - "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "balanced-match": "^1.0.0" } }, - "@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", "dev": true, "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" } }, - "@wdio/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.18.0.tgz", - "integrity": "sha512-GZO5gmobbAOGln4+edAsyPbeLes4I6ZCa0iBn/KVM72y8cvHH+L2ojLsDvzd6Pn/g79zDjEUpBH7BgkDplj8lg==", + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { - "@types/node": "^17.0.4", - "got": "^11.8.1" + "brace-expansion": "^2.0.1" } } } @@ -13498,9 +15175,9 @@ } }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", "dev": true }, "acorn-globals": { @@ -13637,12 +15314,6 @@ "zip-stream": "^4.1.0" }, "dependencies": { - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -13803,6 +15474,12 @@ "kind-of": "^5.0.2" } }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -13847,9 +15524,9 @@ "dev": true }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, "async-done": { @@ -14032,9 +15709,9 @@ } }, "blockly": { - "version": "7.20211209.2", - "resolved": "https://registry.npmjs.org/blockly/-/blockly-7.20211209.2.tgz", - "integrity": "sha512-74HTPbnDOwVGKx6qRE/ZVVQwf+J9s/WkgDKv0vuXw/DtBLvLrew7Nf5jaZP0+DXRVJpP1u5sfu+qtHaom0i6Ug==", + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/blockly/-/blockly-8.0.4.tgz", + "integrity": "sha512-qGYrynzalzEHOMLJhZmADpuMXUH55nSTVgVd11Z1ZlVsm3NQ69ZVgBEaCSN+GsEUUpoui71g4oVzE2iHEHbAtw==", "dev": true, "peer": true, "requires": { @@ -14428,12 +16105,12 @@ } }, "clang-format": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.6.0.tgz", - "integrity": "sha512-W3/L7fWkA8DoLkz9UGjrRnNi+J5a5TuS2HDLqk6WsicpOzb66MBu4eY/EcXhicHriVnAXWQVyk5/VeHWY6w4ow==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.8.0.tgz", + "integrity": "sha512-pK8gzfu55/lHzIpQ1givIbWfn3eXnU7SfxqIwVgnn5jEM6j4ZJYjpFqFs4iSBPNedzRMmfjYjuQhu657WAXHXw==", "dev": true, "requires": { - "async": "^1.5.2", + "async": "^3.2.3", "glob": "^7.0.0", "resolve": "^1.1.6" } @@ -14686,6 +16363,12 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, + "colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -14695,9 +16378,15 @@ } }, "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "dev": true + }, + "comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", "dev": true }, "component-emitter": { @@ -14767,30 +16456,22 @@ } }, "concurrently": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.0.0.tgz", - "integrity": "sha512-WKM7PUsI8wyXpF80H+zjHP32fsgsHNQfPLw/e70Z5dYkV7hF+rf8q3D+ScWJIEr57CpkO3OWBko6hwhQLPR8Pw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", + "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", "dev": true, "requires": { "chalk": "^4.1.0", - "date-fns": "^2.16.1", + "date-fns": "^2.29.1", "lodash": "^4.17.21", - "rxjs": "^6.6.3", + "rxjs": "^7.0.0", + "shell-quote": "^1.7.3", "spawn-command": "^0.0.2-1", "supports-color": "^8.1.0", "tree-kill": "^1.2.2", - "yargs": "^16.2.0" + "yargs": "^17.3.1" }, "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -14799,27 +16480,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true } } }, @@ -15005,9 +16665,9 @@ } }, "date-fns": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.27.0.tgz", - "integrity": "sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q==", + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", + "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", "dev": true }, "dateformat": { @@ -15017,9 +16677,9 @@ "dev": true }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -15197,48 +16857,49 @@ "dev": true }, "devtools": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.17.3.tgz", - "integrity": "sha512-y5O+z+q7cUuAKMY9ZNGexbb62MUimKAJX7OkFecix2Fl9+YFSmAQUUtHWrTt9qFkw5NJNMdiXZhQvk+JdfRygw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.0.tgz", + "integrity": "sha512-SU9jKoJJccXKXfYiIqgktoL5TuzLglqcHeivPPJjzhX17S99zH9bHw4SyhQALox3J1Xgmim+dzO6yTQtRU6cAQ==", "dev": true, "requires": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "puppeteer-core": "^13.1.3", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", - "uuid": "^8.0.0" + "uuid": "^9.0.0" }, "dependencies": { "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" } }, "@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -15248,44 +16909,75 @@ } }, "@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true }, "@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "requires": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" } }, "@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" } }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true } } }, "devtools-protocol": { - "version": "0.0.979353", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.979353.tgz", - "integrity": "sha512-/A7o8FU5n4i2WN/RH6opBbteawPbNgyKmmyl6Ts4zpQ5FVq/cGe2K/qGr8t80BLVu8KynTckHbdpaLCwxzRyFA==", + "version": "0.0.1049481", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1049481.tgz", + "integrity": "sha512-QeoiFUnCNlXusSIfCOov0bn9uGTx7Q+9Cj+vvNFzHym5OcJeXyFxXNtvWtFmDorlEnTJYL5S6wXv+kgAg1s/Zw==", "dev": true }, "diff": { @@ -15294,6 +16986,23 @@ "integrity": "sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k=", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -15411,13 +17120,13 @@ } }, "ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", "dev": true, "peer": true, "requires": { - "jake": "^10.8.5" + "jake": "^10.6.1" } }, "emoji-regex": { @@ -15556,13 +17265,15 @@ } }, "eslint": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.9.0.tgz", - "integrity": "sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==", + "version": "8.24.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.24.0.tgz", + "integrity": "sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.1.0", - "@humanwhocodes/config-array": "^0.9.2", + "@eslint/eslintrc": "^1.3.2", + "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -15572,30 +17283,32 @@ "eslint-scope": "^7.1.1", "eslint-utils": "^3.0.0", "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", + "espree": "^9.4.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", + "find-up": "^5.0.0", "glob-parent": "^6.0.1", - "globals": "^13.6.0", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "text-table": "^0.2.0" }, "dependencies": { "glob-parent": { @@ -15607,11 +17320,14 @@ "is-glob": "^4.0.3" } }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } } } }, @@ -15622,6 +17338,21 @@ "dev": true, "requires": {} }, + "eslint-plugin-jsdoc": { + "version": "39.3.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", + "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "~0.31.0", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.4.0", + "semver": "^7.3.7", + "spdx-expression-parse": "^3.0.1" + } + }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -15664,13 +17395,13 @@ "dev": true }, "espree": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz", - "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", "dev": true, "requires": { - "acorn": "^8.7.0", - "acorn-jsx": "^5.3.1", + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.3.0" } }, @@ -16002,6 +17733,31 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + } + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -16018,6 +17774,15 @@ "integrity": "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==", "dev": true }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -16063,35 +17828,13 @@ "optional": true }, "filelist": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", - "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", "dev": true, "peer": true, "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "peer": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } + "minimatch": "^3.0.4" } }, "fill-range": { @@ -16296,12 +18039,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, "gaxios": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.2.tgz", @@ -16342,7 +18079,8 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true + "dev": true, + "peer": true }, "get-stream": { "version": "5.2.0", @@ -16617,155 +18355,111 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.12.1", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.1.tgz", - "integrity": "sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "google-closure-compiler": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20220301.0.0.tgz", - "integrity": "sha512-+yAqhufKIWddg587tnvRll92eLJQIlzINmgr1h5gLXZVioY3svrSYKH4TZiUuNj0UnVFoK0o1YuW122x+iFl2g==", - "dev": true, - "requires": { - "chalk": "2.x", - "google-closure-compiler-java": "^20220301.0.0", - "google-closure-compiler-linux": "^20220301.0.0", - "google-closure-compiler-osx": "^20220301.0.0", - "google-closure-compiler-windows": "^20220301.0.0", - "minimist": "1.x", - "vinyl": "2.x", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "isexe": "^2.0.0" } } } }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + }, + "dependencies": { + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "glogg": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", + "dev": true, + "requires": { + "sparkles": "^1.0.0" + } + }, + "google-closure-compiler": { + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler/-/google-closure-compiler-20220905.0.0.tgz", + "integrity": "sha512-idZavy2vn91HCmqEepjmLFjfOdYoRsh9PggUbazUpjAOrBQz0HOm3WjOICMiywre+EnY1QGss0srEBtFtukM6w==", + "dev": true, + "requires": { + "chalk": "4.x", + "google-closure-compiler-java": "^20220905.0.0", + "google-closure-compiler-linux": "^20220905.0.0", + "google-closure-compiler-osx": "^20220905.0.0", + "google-closure-compiler-windows": "^20220905.0.0", + "minimist": "1.x", + "vinyl": "2.x", + "vinyl-sourcemaps-apply": "^0.2.0" + } + }, "google-closure-compiler-java": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20220301.0.0.tgz", - "integrity": "sha512-kv5oaUI4xn3qWYWtRHRqbm314kesfeFlCxiFRcvBIx13mKfR0qvbOkgajLpSM6nb3voNM/E9MB9mfvHJ9XIXSg==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-java/-/google-closure-compiler-java-20220905.0.0.tgz", + "integrity": "sha512-wxGxNla/0UDS1Lm0cRxEy85KhVRd0vNlsTclnIJ9f1gRWzvvTsJ4lwz+PdT60R6y2hKAOBvydIJHh+B8XJastA==", "dev": true }, "google-closure-compiler-linux": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20220301.0.0.tgz", - "integrity": "sha512-N2D0SRnxZ7kqdoZ2WsmLIjmizR4Xr0HaUYDK2RCOtsV21RYV8OR2u0ATp7aXhYy8WfxvYH478Ehvmc9Uzy986A==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-linux/-/google-closure-compiler-linux-20220905.0.0.tgz", + "integrity": "sha512-kH09S66sz9+6wZmYM22VX8vG8KhCKJwFwXCfHx/ZOU6DBEzni6KfWrP+87CzTmZFEivclBhWAndm5HgNhSOEXQ==", "dev": true, "optional": true }, "google-closure-compiler-osx": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20220301.0.0.tgz", - "integrity": "sha512-Xqf0m5takwfv43ML4aODJxmAsAZQMTMo683gyRs0APAecncs+YKxaDPMH+pQAdI3HPY2QsvkarlunAp0HSwU5A==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-osx/-/google-closure-compiler-osx-20220905.0.0.tgz", + "integrity": "sha512-4uo2GAz77gI8nDt4OA8VUYh/FNdjmTLOIRDazl7si+BOjgp9bC6C3E/88o+YHETsVtrPmZk57/W7vH0lftyTAw==", "dev": true, "optional": true }, "google-closure-compiler-windows": { - "version": "20220301.0.0", - "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20220301.0.0.tgz", - "integrity": "sha512-s+FU/vcpLTEgx8MCMgj0STCYkVk7syzF9KqiYPOTtbTD9ra99HPe/CEuQG7iJ3Fty9dhm9zEaetv4Dp4Wr6x+Q==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-compiler-windows/-/google-closure-compiler-windows-20220905.0.0.tgz", + "integrity": "sha512-TZKHu6RHnrmgV90Gyen8+TGc0vgjgds80ErR+al5CqmfP9p+AskBbOe5CWZJht0bANrUhaeBMCrbs+7loFv06Q==", "dev": true, "optional": true }, "google-closure-deps": { - "version": "20220202.0.0", - "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20220202.0.0.tgz", - "integrity": "sha512-cPE4GbWRn4ix92UFE1nbjJpQw3eQ/1fGjjMDJG8mghhBEiBBXzBZUEpPALrpdEy9ZYgOdaRAr9UqAN35jfmy8g==", + "version": "20220905.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20220905.0.0.tgz", + "integrity": "sha512-W1brOBePH/oWy6TcG0CD2dM5b2g5GNephTc+OsNgVc/YOOz0chF3CsApijs3EO0VtBfz1/4c0i914k6lDdEJxg==", "dev": true, "requires": { "minimatch": "^3.0.4", @@ -16835,12 +18529,6 @@ "lodash": "^4.17.15" } }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "gulp": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", @@ -17583,9 +19271,9 @@ } }, "http-server": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.0.tgz", - "integrity": "sha512-5lYsIcZtf6pdR8tCtzAHTWrAveo4liUlJdWc7YafwK/maPgYHs+VNP6KpCClmUnSorJrARVMXqtT055zBv11Yg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", + "integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==", "dev": true, "requires": { "basic-auth": "^2.0.1", @@ -17595,7 +19283,7 @@ "html-encoding-sniffer": "^3.0.0", "http-proxy": "^1.18.1", "mime": "^1.6.0", - "minimist": "^1.2.5", + "minimist": "^1.2.6", "opener": "^1.5.1", "portfinder": "^1.0.28", "secure-compare": "3.0.1", @@ -17648,9 +19336,9 @@ "dev": true }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, "import-fresh": { @@ -17663,6 +19351,12 @@ "resolve-from": "^4.0.0" } }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -18030,27 +19724,96 @@ } }, "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", "dev": true, "peer": true, "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", + "async": "0.9.x", + "chalk": "^2.4.2", "filelist": "^1.0.1", "minimatch": "^3.0.4" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true, + "peer": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "peer": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "peer": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true, "peer": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "js-green-licenses": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/js-green-licenses/-/js-green-licenses-3.0.1.tgz", @@ -18067,6 +19830,12 @@ "strip-json-comments": "^3.0.0" } }, + "js-sdsl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", + "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -18087,6 +19856,12 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, + "jsdoc-type-pratt-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", + "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "dev": true + }, "jsdom": { "version": "15.2.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", @@ -18177,13 +19952,10 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonfile": { "version": "6.1.0", @@ -18509,6 +20281,12 @@ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", "dev": true }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "lodash.isobject": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", @@ -18791,6 +20569,12 @@ } } }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -18983,43 +20767,59 @@ "dev": true }, "mocha": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.1.tgz", - "integrity": "sha512-T7uscqjJVS46Pq1XDXyo9Uvey9gd3huT/DD9cYBb4K2Xc/vbKRPUWK067bxDQRK0yIz6Jxk73IrnimvASzBNAQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", - "debug": "4.3.3", + "debug": "4.3.4", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", "glob": "7.2.0", - "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.2.0", + "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", + "workerpool": "6.2.1", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -19100,9 +20900,9 @@ "optional": true }, "nanoid": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", - "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true }, "nanomatch": { @@ -19826,9 +21626,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -20091,16 +21891,16 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer-core": { - "version": "13.5.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.5.1.tgz", - "integrity": "sha512-dobVqWjV34ilyfQHR3BBnCYaekBYTi5MgegEYBRYd3s3uFy8jUpZEEWbaFjG9ETm+LGzR5Lmr0aF6LLuHtiuCg==", + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", + "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", "dev": true, "requires": { "cross-fetch": "3.1.5", - "debug": "4.3.3", - "devtools-protocol": "0.0.969999", + "debug": "4.3.4", + "devtools-protocol": "0.0.981744", "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", + "https-proxy-agent": "5.0.1", "pkg-dir": "4.2.0", "progress": "2.0.3", "proxy-from-env": "1.1.0", @@ -20111,11 +21911,21 @@ }, "dependencies": { "devtools-protocol": { - "version": "0.0.969999", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.969999.tgz", - "integrity": "sha512-6GfzuDWU0OFAuOvBokXpXPLxjOJ5DZ157Ue3sGQQM3LgAamb8m0R0ruSfN0DDu+XG5XJgT50i6zZ/0o8RglreQ==", + "version": "0.0.981744", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", + "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", "dev": true }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "ws": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", @@ -20136,6 +21946,12 @@ "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -20635,6 +22451,12 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rgb2hex": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", @@ -20657,12 +22479,20 @@ "dev": true, "peer": true }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "rxjs": { "version": "7.4.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", "dev": true, - "peer": true, "requires": { "tslib": "~2.1.0" }, @@ -20671,8 +22501,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true, - "peer": true + "dev": true } } }, @@ -20710,12 +22539,12 @@ "dev": true }, "selenium-standalone": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.0.9.tgz", - "integrity": "sha512-Bl5Wbaeu5bKVmpLVATYeRcPsk9Bv3fr1aUvdC39UZjG6R/bem8j8Pj+dwB9F+PsS/owQnKh0BCg1KalZcAImbw==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.0.tgz", + "integrity": "sha512-gRFJm2A91sL0/4PavIsfTVNjyqNjk+zbdJg/zAYgTMjuoWJv+BlYJh+1UbEtyjt4YvZACYif1DFAzFjQapqiOA==", "dev": true, "requires": { - "commander": "^8.3.0", + "commander": "^9.0.0", "cross-spawn": "^7.0.3", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -20732,9 +22561,9 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20834,6 +22663,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", + "dev": true + }, "sigma": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sigma/-/sigma-1.2.1.tgz", @@ -20869,6 +22704,12 @@ } } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -21144,6 +22985,12 @@ "extend-shallow": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -21330,6 +23177,12 @@ "safe-buffer": "~5.1.0" } }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -21697,6 +23550,15 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -21745,9 +23607,9 @@ "dev": true }, "typescript": { - "version": "4.5.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, "ua-parser-js": { @@ -21947,12 +23809,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -21981,6 +23837,12 @@ "builtins": "^1.0.3" } }, + "validator": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz", + "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "dev": true + }, "value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", @@ -22127,44 +23989,45 @@ } }, "webdriver": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.17.3.tgz", - "integrity": "sha512-E1V/IKYjJoVjK9zhHfSCWeqORhgNlDuYydykm0h+CchEhMSgTmtTH/LYfXSx4myXzobdlIg6xhE7Jv7XPjSkAA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.25.0.tgz", + "integrity": "sha512-fYsxVMHpYAXecJP1m+fqC3BSKrWS3fcCiI120NRnZrZ52vcodpiJSuOAedKIXegQZlzl77U4VWeSHiY1f6Iseg==", "dev": true, "requires": { - "@types/node": "^17.0.4", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@types/node": "^18.0.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "got": "^11.0.2", - "ky": "^0.30.0", + "ky": "0.30.0", "lodash.merge": "^4.6.1" }, "dependencies": { "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" } }, "@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -22174,62 +24037,92 @@ } }, "@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true }, "@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "requires": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" } }, "@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" } }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "ky": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", "dev": true + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } } } }, "webdriverio": { - "version": "7.17.4", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.17.4.tgz", - "integrity": "sha512-p7u2q7NJL7Et8FdSroq/Ltoi3KkKxERE79Srh9lFr6yRNPFqb46dJf/g4nljLhburnGkbNdYN15JWgyWYnnj9g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.0.tgz", + "integrity": "sha512-7s7PSeGpcUkZq3UTjdG8etbblAerp27Jyf/VQ4Nr0bdZACDfsCVSyvQQuD0HH880VryV+7tjXK6cSV4eYzY64Q==", "dev": true, "requires": { "@types/aria-query": "^5.0.0", - "@types/node": "^17.0.4", - "@wdio/config": "7.17.3", - "@wdio/logger": "7.17.3", - "@wdio/protocols": "7.17.3", - "@wdio/repl": "7.17.3", - "@wdio/types": "7.17.3", - "@wdio/utils": "7.17.3", + "@types/node": "^18.0.0", + "@wdio/config": "7.25.0", + "@wdio/logger": "7.19.0", + "@wdio/protocols": "7.22.0", + "@wdio/repl": "7.25.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.17.3", - "devtools-protocol": "^0.0.979353", + "devtools": "7.25.0", + "devtools-protocol": "^0.0.1049481", "fs-extra": "^10.0.0", - "get-port": "^5.1.1", "grapheme-splitter": "^1.0.2", "lodash.clonedeep": "^4.5.0", "lodash.isobject": "^3.0.2", @@ -22241,31 +24134,32 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.17.3" + "webdriver": "7.25.0" }, "dependencies": { "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "18.7.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.21.tgz", + "integrity": "sha512-rLFzK5bhM0YPyCoTC8bolBjMk7bwnZ8qeZUBslBfjZQou2ssJdWslx9CZ8DGM+Dx7QXQiiTVZ/6QO6kwtHkZCA==", "dev": true }, "@wdio/config": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.17.3.tgz", - "integrity": "sha512-MSWCsx0w1EbxbwOD8ykTxHqgx208CWoz9n4oWHx7Q1APfetqWFLM4O7K8cdZS1gV4IvH4EAV9807L91K8r0JNw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.0.tgz", + "integrity": "sha512-fttJIPu9x2H9sz6g7GsDNx0LH6S3EyXUjrk3nUz+ccwgnXtq3E3WyGgBdZsAObItvvplLNM5nSdtWNZSW0+Dzw==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", + "@wdio/utils": "7.25.0", "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "glob": "^8.0.3" } }, "@wdio/logger": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.17.3.tgz", - "integrity": "sha512-hpvJDsJMX8G/8gXHOEipxkQPjojjA+BRCZqCvZRLCVpWm2JB7tBoMzu9sUJXcpSkY03b94KAd4EwNA2uNAf9aQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", + "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -22275,29 +24169,29 @@ } }, "@wdio/protocols": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.17.3.tgz", - "integrity": "sha512-DxVRil2uMDOshk0gMOrmemC9uEZuB5Dv4bJX/ozZwXPV9AHd6oJqUrsF/fs8bT9+4AWkE58yqsRBFc/pt7sFMw==", + "version": "7.22.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", + "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", "dev": true }, "@wdio/types": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.17.3.tgz", - "integrity": "sha512-j8kYdaMl4NFRS8M1bFDuEa3GMbUZbLQY7i6XEnJSetyW0GyMDLlzwcfXI4DdX85+3JbO5624UGKxVsQcuA7T3A==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.0.tgz", + "integrity": "sha512-BET/5UZSobAiBSbpWlUzcdjU1WszuUhaGBY7Pj4aAZjlvEeU5ZW5q2/655kxAvFhqHZ4AFEgd6NXg8krOEkXaA==", "dev": true, "requires": { - "@types/node": "^17.0.4", + "@types/node": "^18.0.0", "got": "^11.8.1" } }, "@wdio/utils": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.17.3.tgz", - "integrity": "sha512-20bGTCmgBNVKa2BJs3B5kxbsryjhfEOoKDnFjZ/rAVZYT1t1sg0e/W+vRfamd++NqTaIHOY/IKGEFiEnCw5nXw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.0.tgz", + "integrity": "sha512-dRPJoVb2wsMv/GFwAVcVbp0+8CE+vVeW/+lpre6ocn36WAnDQJD6X5UGYde5oQeXGyjzj1/nMHBSsr+ifvuJRQ==", "dev": true, "requires": { - "@wdio/logger": "7.17.3", - "@wdio/types": "7.17.3", + "@wdio/logger": "7.19.0", + "@wdio/types": "7.25.0", "p-iteration": "^1.1.8" } }, @@ -22310,10 +24204,23 @@ "balanced-match": "^1.0.0" } }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -22382,9 +24289,9 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", "dev": true }, "wrap-ansi": { @@ -22439,18 +24346,31 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", + "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.0.0" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + } } }, "yargs-parser": { @@ -22605,6 +24525,27 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, + "z-schema": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.4.tgz", + "integrity": "sha512-gm/lx3hDzJNcLwseIeQVm1UcwhWIKpSB4NqH89pTBtFns4k/HDHudsICtvG05Bvw/Mv3jMyk700y5dadueLHdA==", + "dev": true, + "requires": { + "commander": "^2.20.3", + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + } + } + }, "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", diff --git a/package.json b/package.json index 3e1692de1f8..98508751713 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "8.0.5", + "version": "9.0.0", "description": "Blockly is a library for building visual programming editors.", "keywords": [ "blockly" @@ -24,16 +24,15 @@ "build-strict-log": "npm run build:strict > build-debug.log 2>&1 && tail -3 build-debug.log", "build:compiled": "gulp buildCompiled", "build:compressed": "npm run build:compiled", - "build:deps": "gulp buildDeps", + "build:deps": "gulp buildJavaScriptAndDeps", + "build:js": "gulp buildJavaScript", "build:langfiles": "gulp buildLangfiles", - "build-ts": "gulp buildTs && gulp build --compileTs", "bump": "npm --no-git-tag-version version 4.$(date +'%Y%m%d').0", "clean": "gulp clean", "clean:build": "gulp cleanBuildDir", "clean:release": "gulp cleanReleaseDir", "checkin": "gulp checkin", "checkin:built": "gulp checkinBuilt", - "checkin:typings": "gulp checkinTypings", "deployDemos": "gulp deployDemos", "deployDemos:beta": "gulp deployDemosBeta", "format": "gulp clangFormat", @@ -41,7 +40,9 @@ "generate:langfiles": "gulp generateLangfiles", "license": "gulp checkLicenses", "lint": "eslint .", + "lint:fix": "eslint . --fix", "package": "gulp package", + "prepare": "gulp prepare", "prepareDemos": "gulp prepareDemos", "publish": "gulp publish", "publish:beta": "gulp publishBeta", @@ -52,7 +53,6 @@ "test:generators": "tests/scripts/run_generators.sh", "test:mocha:interactive": "http-server ./ -o /tests/mocha/index.html -c-1", "test:compile:advanced": "gulp buildAdvancedCompilationTest --debug", - "typings": "gulp typings", "updateGithubPages": "gulp gitUpdateGithubPages" }, "main": "./index.js", @@ -67,9 +67,11 @@ "license": "Apache-2.0", "devDependencies": { "@blockly/block-test": "^2.0.1", - "@blockly/dev-tools": "^3.0.1", + "@blockly/dev-tools": "^4.0.2", "@blockly/theme-modern": "^2.1.1", "@hyperjump/json-schema": "^0.18.4", + "@microsoft/api-extractor": "^7.29.5", + "@typescript-eslint/eslint-plugin": "^5.33.1", "@wdio/selenium-standalone-service": "^7.10.1", "chai": "^4.2.0", "clang-format": "^1.6.0", @@ -77,8 +79,9 @@ "concurrently": "^7.0.0", "eslint": "^8.4.1", "eslint-config-google": "^0.14.0", - "google-closure-compiler": "^20220301.0.0", - "google-closure-deps": "^20220202.0.0", + "eslint-plugin-jsdoc": "^39.3.6", + "google-closure-compiler": "^20220905.0.0", + "google-closure-deps": "^20220905.0.0", "gulp": "^4.0.2", "gulp-clang-format": "^1.0.27", "gulp-concat": "^2.6.1", @@ -92,7 +95,7 @@ "http-server": "^14.0.0", "js-green-licenses": "^3.0.0", "json5": "^2.2.0", - "mocha": "^9.1.1", + "mocha": "^10.0.0", "readline-sync": "^1.4.10", "rimraf": "^3.0.2", "selenium-standalone": "^8.0.3", diff --git a/php_compressed.js b/php_compressed.js index 38c878cec4c..8bf1eac989d 100644 --- a/php_compressed.js +++ b/php_compressed.js @@ -8,103 +8,332 @@ module.exports = factory(require("./blockly_compressed.js")); } else { // Browser var factoryExports = factory(root.Blockly); - root.Blockly.PHP = factoryExports; + root.Blockly.PHP = factoryExports.phpGenerator; + root.Blockly.PHP.__namespace__ = factoryExports.__namespace__; } }(this, function(__parent__) { var $=__parent__.__namespace__; -var module$contents$Blockly$PHP_PHP=new $.module$exports$Blockly$Generator.Generator("PHP");module$contents$Blockly$PHP_PHP.addReservedWords("__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,clone,const,continue,declare,default,die,do,echo,else,elseif,empty,enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,final,for,foreach,function,global,goto,if,implements,include,include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,print,private,protected,public,require,require_once,return,static,switch,throw,trait,try,unset,use,var,while,xor,PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__"); -module$contents$Blockly$PHP_PHP.ORDER_ATOMIC=0;module$contents$Blockly$PHP_PHP.ORDER_CLONE=1;module$contents$Blockly$PHP_PHP.ORDER_NEW=1;module$contents$Blockly$PHP_PHP.ORDER_MEMBER=2.1;module$contents$Blockly$PHP_PHP.ORDER_FUNCTION_CALL=2.2;module$contents$Blockly$PHP_PHP.ORDER_POWER=3;module$contents$Blockly$PHP_PHP.ORDER_INCREMENT=4;module$contents$Blockly$PHP_PHP.ORDER_DECREMENT=4;module$contents$Blockly$PHP_PHP.ORDER_BITWISE_NOT=4;module$contents$Blockly$PHP_PHP.ORDER_CAST=4; -module$contents$Blockly$PHP_PHP.ORDER_SUPPRESS_ERROR=4;module$contents$Blockly$PHP_PHP.ORDER_INSTANCEOF=5;module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_NOT=6;module$contents$Blockly$PHP_PHP.ORDER_UNARY_PLUS=7.1;module$contents$Blockly$PHP_PHP.ORDER_UNARY_NEGATION=7.2;module$contents$Blockly$PHP_PHP.ORDER_MULTIPLICATION=8.1;module$contents$Blockly$PHP_PHP.ORDER_DIVISION=8.2;module$contents$Blockly$PHP_PHP.ORDER_MODULUS=8.3;module$contents$Blockly$PHP_PHP.ORDER_ADDITION=9.1; -module$contents$Blockly$PHP_PHP.ORDER_SUBTRACTION=9.2;module$contents$Blockly$PHP_PHP.ORDER_STRING_CONCAT=9.3;module$contents$Blockly$PHP_PHP.ORDER_BITWISE_SHIFT=10;module$contents$Blockly$PHP_PHP.ORDER_RELATIONAL=11;module$contents$Blockly$PHP_PHP.ORDER_EQUALITY=12;module$contents$Blockly$PHP_PHP.ORDER_REFERENCE=13;module$contents$Blockly$PHP_PHP.ORDER_BITWISE_AND=13;module$contents$Blockly$PHP_PHP.ORDER_BITWISE_XOR=14;module$contents$Blockly$PHP_PHP.ORDER_BITWISE_OR=15; -module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_AND=16;module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_OR=17;module$contents$Blockly$PHP_PHP.ORDER_IF_NULL=18;module$contents$Blockly$PHP_PHP.ORDER_CONDITIONAL=19;module$contents$Blockly$PHP_PHP.ORDER_ASSIGNMENT=20;module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_AND_WEAK=21;module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_XOR=22;module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_OR_WEAK=23;module$contents$Blockly$PHP_PHP.ORDER_NONE=99; -module$contents$Blockly$PHP_PHP.ORDER_OVERRIDES=[[module$contents$Blockly$PHP_PHP.ORDER_MEMBER,module$contents$Blockly$PHP_PHP.ORDER_FUNCTION_CALL],[module$contents$Blockly$PHP_PHP.ORDER_MEMBER,module$contents$Blockly$PHP_PHP.ORDER_MEMBER],[module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_NOT,module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_NOT],[module$contents$Blockly$PHP_PHP.ORDER_MULTIPLICATION,module$contents$Blockly$PHP_PHP.ORDER_MULTIPLICATION],[module$contents$Blockly$PHP_PHP.ORDER_ADDITION,module$contents$Blockly$PHP_PHP.ORDER_ADDITION], -[module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_AND,module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_AND],[module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_OR,module$contents$Blockly$PHP_PHP.ORDER_LOGICAL_OR]];module$contents$Blockly$PHP_PHP.isInitialized=!1; -module$contents$Blockly$PHP_PHP.init=function(a){Object.getPrototypeOf(this).init.call(this);this.nameDB_?this.nameDB_.reset():this.nameDB_=new $.module$exports$Blockly$Names.Names(this.RESERVED_WORDS_,"$");this.nameDB_.setVariableMap(a.getVariableMap());this.nameDB_.populateVariables(a);this.nameDB_.populateProcedures(a);this.isInitialized=!0}; -module$contents$Blockly$PHP_PHP.finish=function(a){var b=(0,$.module$exports$Blockly$utils$object.values)(this.definitions_);a=Object.getPrototypeOf(this).finish.call(this,a);this.isInitialized=!1;this.nameDB_.reset();return b.join("\n\n")+"\n\n\n"+a};module$contents$Blockly$PHP_PHP.scrubNakedValue=function(a){return a+";\n"};module$contents$Blockly$PHP_PHP.quote_=function(a){a=a.replace(/\\/g,"\\\\").replace(/\n/g,"\\\n").replace(/'/g,"\\'");return"'"+a+"'"}; -module$contents$Blockly$PHP_PHP.multiline_quote_=function(a){return a.split(/\n/g).map(this.quote_).join(' . "\\n" .\n')}; -module$contents$Blockly$PHP_PHP.scrub_=function(a,b,c){var d="";if(!a.outputConnection||!a.outputConnection.targetConnection){var e=a.getCommentText();e&&(e=(0,$.module$exports$Blockly$utils$string.wrap)(e,this.COMMENT_WRAP-3),d+=this.prefixLines(e,"// ")+"\n");for(var f=0;fc?h=g=this.ORDER_SUBTRACTION:d&&(h=g=this.ORDER_UNARY_NEGATION);a=this.valueToCode(a,b,g)||f;(0,$.module$exports$Blockly$utils$string.isNumber)(a)?(a=Number(a)+c,d&&(a=-a)):(0c&&(a=a+" - "+-c),d&&(a=c?"-("+a+")":"-"+a),h=Math.floor(h),e=Math.floor(e),h&&e>=h&& -(a="("+a+")"));return a};$.Blockly.PHP=module$contents$Blockly$PHP_PHP;var module$exports$Blockly$PHP$variables={};$.Blockly.PHP.variables_get=function(a){return[$.Blockly.PHP.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),$.Blockly.PHP.ORDER_ATOMIC]};$.Blockly.PHP.variables_set=function(a){var b=$.Blockly.PHP.valueToCode(a,"VALUE",$.Blockly.PHP.ORDER_ASSIGNMENT)||"0";return $.Blockly.PHP.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE)+" = "+b+";\n"};var module$exports$Blockly$PHP$variablesDynamic={};$.Blockly.PHP.variables_get_dynamic=$.Blockly.PHP.variables_get;$.Blockly.PHP.variables_set_dynamic=$.Blockly.PHP.variables_set;var module$exports$Blockly$PHP$texts={};$.Blockly.PHP.text=function(a){return[$.Blockly.PHP.quote_(a.getFieldValue("TEXT")),$.Blockly.PHP.ORDER_ATOMIC]};$.Blockly.PHP.text_multiline=function(a){a=$.Blockly.PHP.multiline_quote_(a.getFieldValue("TEXT"));var b=-1!==a.indexOf(".")?$.Blockly.PHP.ORDER_STRING_CONCAT:$.Blockly.PHP.ORDER_ATOMIC;return[a,b]}; -$.Blockly.PHP.text_join=function(a){if(0===a.itemCount_)return["''",$.Blockly.PHP.ORDER_ATOMIC];if(1===a.itemCount_)return[$.Blockly.PHP.valueToCode(a,"ADD0",$.Blockly.PHP.ORDER_NONE)||"''",$.Blockly.PHP.ORDER_NONE];if(2===a.itemCount_){var b=$.Blockly.PHP.valueToCode(a,"ADD0",$.Blockly.PHP.ORDER_STRING_CONCAT)||"''";a=$.Blockly.PHP.valueToCode(a,"ADD1",$.Blockly.PHP.ORDER_STRING_CONCAT)||"''";return[b+" . "+a,$.Blockly.PHP.ORDER_STRING_CONCAT]}b=Array(a.itemCount_);for(var c=0;c 0",$.Blockly.PHP.ORDER_RELATIONAL,$.Blockly.PHP.ORDER_RELATIONAL],NEGATIVE:[""," < 0",$.Blockly.PHP.ORDER_RELATIONAL,$.Blockly.PHP.ORDER_RELATIONAL],DIVISIBLE_BY:[null,null,$.Blockly.PHP.ORDER_MODULUS, -$.Blockly.PHP.ORDER_EQUALITY],PRIME:[null,null,$.Blockly.PHP.ORDER_NONE,$.Blockly.PHP.ORDER_FUNCTION_CALL]},c=a.getFieldValue("PROPERTY");b=$.$jscomp.makeIterator(b[c]);var d=b.next().value,e=b.next().value,f=b.next().value;b=b.next().value;f=$.Blockly.PHP.valueToCode(a,"NUMBER_TO_CHECK",f)||"0";if("PRIME"===c)a=$.Blockly.PHP.provideFunction_("math_isPrime","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if ($n == 2 || $n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {\n if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {\n return false;\n }\n }\n return true;\n}\n")+ -"("+f+")";else if("DIVISIBLE_BY"===c){a=$.Blockly.PHP.valueToCode(a,"DIVISOR",$.Blockly.PHP.ORDER_MODULUS)||"0";if("0"===a)return["false",$.Blockly.PHP.ORDER_ATOMIC];a=f+" % "+a+" == 0"}else a=d+f+e;return[a,b]};$.Blockly.PHP.math_change=function(a){var b=$.Blockly.PHP.valueToCode(a,"DELTA",$.Blockly.PHP.ORDER_ADDITION)||"0";return $.Blockly.PHP.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE)+" += "+b+";\n"};$.Blockly.PHP.math_round=$.Blockly.PHP.math_single; -$.Blockly.PHP.math_trig=$.Blockly.PHP.math_single; -$.Blockly.PHP.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=$.Blockly.PHP.provideFunction_("math_mean","\nfunction "+ -$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($myList) {\n return array_sum($myList) / count($myList);\n}\n");a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=$.Blockly.PHP.provideFunction_("math_median","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($arr) {\n sort($arr,SORT_NUMERIC);\n return (count($arr) % 2) ? $arr[floor(count($arr) / 2)] :\n ($arr[floor(count($arr) / 2)] + $arr[floor(count($arr) / 2) - 1]) / 2;\n}\n"); -a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=$.Blockly.PHP.provideFunction_("math_modes","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($values) {\n if (empty($values)) return array();\n $counts = array_count_values($values);\n arsort($counts); // Sort counts in descending order\n $modes = array_keys($counts, current($counts), true);\n return $modes;\n}\n");a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"[]"; -a=b+"("+a+")";break;case "STD_DEV":b=$.Blockly.PHP.provideFunction_("math_standard_deviation","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($numbers) {\n $n = count($numbers);\n if (!$n) return null;\n $mean = array_sum($numbers) / count($numbers);\n foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);\n return sqrt(array_sum($devs) / (count($devs) - 1));\n}\n");a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b= -$.Blockly.PHP.provideFunction_("math_random_list","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($list) {\n $x = rand(0, count($list)-1);\n return $list[$x];\n}\n");a=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw Error("Unknown operator: "+b);}return[a,$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.math_modulo=function(a){var b=$.Blockly.PHP.valueToCode(a,"DIVIDEND",$.Blockly.PHP.ORDER_MODULUS)||"0";a=$.Blockly.PHP.valueToCode(a,"DIVISOR",$.Blockly.PHP.ORDER_MODULUS)||"0";return[b+" % "+a,$.Blockly.PHP.ORDER_MODULUS]}; -$.Blockly.PHP.math_constrain=function(a){var b=$.Blockly.PHP.valueToCode(a,"VALUE",$.Blockly.PHP.ORDER_NONE)||"0",c=$.Blockly.PHP.valueToCode(a,"LOW",$.Blockly.PHP.ORDER_NONE)||"0";a=$.Blockly.PHP.valueToCode(a,"HIGH",$.Blockly.PHP.ORDER_NONE)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.math_random_int=function(a){var b=$.Blockly.PHP.valueToCode(a,"FROM",$.Blockly.PHP.ORDER_NONE)||"0";a=$.Blockly.PHP.valueToCode(a,"TO",$.Blockly.PHP.ORDER_NONE)||"0";return[$.Blockly.PHP.provideFunction_("math_random_int","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($a, $b) {\n if ($a > $b) {\n return rand($b, $a);\n }\n return rand($a, $b);\n}\n")+"("+b+", "+a+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",$.Blockly.PHP.ORDER_FUNCTION_CALL]};$.Blockly.PHP.math_atan2=function(a){var b=$.Blockly.PHP.valueToCode(a,"X",$.Blockly.PHP.ORDER_NONE)||"0";return["atan2("+($.Blockly.PHP.valueToCode(a,"Y",$.Blockly.PHP.ORDER_NONE)||"0")+", "+b+") / pi() * 180",$.Blockly.PHP.ORDER_DIVISION]};var module$exports$Blockly$PHP$loops={}; -$.Blockly.PHP.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):$.Blockly.PHP.valueToCode(a,"TIMES",$.Blockly.PHP.ORDER_ASSIGNMENT)||"0";var c=$.Blockly.PHP.statementToCode(a,"DO");c=$.Blockly.PHP.addLoopTrap(c,a);a="";var d=$.Blockly.PHP.nameDB_.getDistinctName("count",$.module$exports$Blockly$Names.NameType.VARIABLE),e=b;b.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(b)||(e=$.Blockly.PHP.nameDB_.getDistinctName("repeat_end",$.module$exports$Blockly$Names.NameType.VARIABLE), -a+=e+" = "+b+";\n");return a+("for ("+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};$.Blockly.PHP.controls_repeat=$.Blockly.PHP.controls_repeat_ext;$.Blockly.PHP.controls_whileUntil=function(a){var b="UNTIL"===a.getFieldValue("MODE"),c=$.Blockly.PHP.valueToCode(a,"BOOL",b?$.Blockly.PHP.ORDER_LOGICAL_NOT:$.Blockly.PHP.ORDER_NONE)||"false",d=$.Blockly.PHP.statementToCode(a,"DO");d=$.Blockly.PHP.addLoopTrap(d,a);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; -$.Blockly.PHP.controls_for=function(a){var b=$.Blockly.PHP.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.PHP.valueToCode(a,"FROM",$.Blockly.PHP.ORDER_ASSIGNMENT)||"0",d=$.Blockly.PHP.valueToCode(a,"TO",$.Blockly.PHP.ORDER_ASSIGNMENT)||"0",e=$.Blockly.PHP.valueToCode(a,"BY",$.Blockly.PHP.ORDER_ASSIGNMENT)||"1",f=$.Blockly.PHP.statementToCode(a,"DO");f=$.Blockly.PHP.addLoopTrap(f,a);if((0,$.module$exports$Blockly$utils$string.isNumber)(c)&&(0,$.module$exports$Blockly$utils$string.isNumber)(d)&& -(0,$.module$exports$Blockly$utils$string.isNumber)(e)){var g=Number(c)<=Number(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(e));a=(1===b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b))+(") {\n"+f+"}\n")}else a="",g=c,c.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(c)||(g=$.Blockly.PHP.nameDB_.getDistinctName(b+"_start",$.module$exports$Blockly$Names.NameType.VARIABLE),a+=g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||(0,$.module$exports$Blockly$utils$string.isNumber)(d)|| -(c=$.Blockly.PHP.nameDB_.getDistinctName(b+"_end",$.module$exports$Blockly$Names.NameType.VARIABLE),a+=c+" = "+d+";\n"),d=$.Blockly.PHP.nameDB_.getDistinctName(b+"_inc",$.module$exports$Blockly$Names.NameType.VARIABLE),a+=d+" = ",a=(0,$.module$exports$Blockly$utils$string.isNumber)(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a=a+("if ("+g+" > "+c+") {\n")+($.Blockly.PHP.INDENT+d+" = -"+d+";\n"),a+="}\n",a+="for ("+b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+ -"}\n";return a};$.Blockly.PHP.controls_forEach=function(a){var b=$.Blockly.PHP.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_ASSIGNMENT)||"[]",d=$.Blockly.PHP.statementToCode(a,"DO");d=$.Blockly.PHP.addLoopTrap(d,a);return"foreach ("+c+" as "+b+") {\n"+d+"}\n"}; -$.Blockly.PHP.controls_flow_statements=function(a){var b="";$.Blockly.PHP.STATEMENT_PREFIX&&(b+=$.Blockly.PHP.injectId($.Blockly.PHP.STATEMENT_PREFIX,a));$.Blockly.PHP.STATEMENT_SUFFIX&&(b+=$.Blockly.PHP.injectId($.Blockly.PHP.STATEMENT_SUFFIX,a));if($.Blockly.PHP.STATEMENT_PREFIX){var c=a.getSurroundLoop();c&&!c.suppressPrefixSuffix&&(b+=$.Blockly.PHP.injectId($.Blockly.PHP.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break;\n";case "CONTINUE":return b+"continue;\n"}throw Error("Unknown flow statement."); -};var module$exports$Blockly$PHP$logic={}; -$.Blockly.PHP.controls_if=function(a){var b=0,c="";$.Blockly.PHP.STATEMENT_PREFIX&&(c+=$.Blockly.PHP.injectId($.Blockly.PHP.STATEMENT_PREFIX,a));do{var d=$.Blockly.PHP.valueToCode(a,"IF"+b,$.Blockly.PHP.ORDER_NONE)||"false";var e=$.Blockly.PHP.statementToCode(a,"DO"+b);$.Blockly.PHP.STATEMENT_SUFFIX&&(e=$.Blockly.PHP.prefixLines($.Blockly.PHP.injectId($.Blockly.PHP.STATEMENT_SUFFIX,a),$.Blockly.PHP.INDENT)+e);c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="===b||"!="===b?$.Blockly.PHP.ORDER_EQUALITY:$.Blockly.PHP.ORDER_RELATIONAL,d=$.Blockly.PHP.valueToCode(a,"A",c)||"0";a=$.Blockly.PHP.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -$.Blockly.PHP.logic_operation=function(a){var b="AND"===a.getFieldValue("OP")?"&&":"||",c="&&"===b?$.Blockly.PHP.ORDER_LOGICAL_AND:$.Blockly.PHP.ORDER_LOGICAL_OR,d=$.Blockly.PHP.valueToCode(a,"A",c);a=$.Blockly.PHP.valueToCode(a,"B",c);if(d||a){var e="&&"===b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]};$.Blockly.PHP.logic_negate=function(a){var b=$.Blockly.PHP.ORDER_LOGICAL_NOT;return["!"+($.Blockly.PHP.valueToCode(a,"BOOL",b)||"true"),b]}; -$.Blockly.PHP.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",$.Blockly.PHP.ORDER_ATOMIC]};$.Blockly.PHP.logic_null=function(a){return["null",$.Blockly.PHP.ORDER_ATOMIC]}; -$.Blockly.PHP.logic_ternary=function(a){var b=$.Blockly.PHP.valueToCode(a,"IF",$.Blockly.PHP.ORDER_CONDITIONAL)||"false",c=$.Blockly.PHP.valueToCode(a,"THEN",$.Blockly.PHP.ORDER_CONDITIONAL)||"null";a=$.Blockly.PHP.valueToCode(a,"ELSE",$.Blockly.PHP.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,$.Blockly.PHP.ORDER_CONDITIONAL]};var module$exports$Blockly$PHP$lists={};$.Blockly.PHP.lists_create_empty=function(a){return["array()",$.Blockly.PHP.ORDER_FUNCTION_CALL]};$.Blockly.PHP.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;c 'strnatcasecmp',\n 'TEXT' => 'strcmp',\n 'IGNORE_CASE' => 'strcasecmp'\n );\n $sortCmp = $sortCmpFuncs[$type];\n $list2 = $list;\n usort($list2, $sortCmp);\n if ($direction == -1) {\n $list2 = array_reverse($list2);\n }\n return $list2;\n}\n")+"("+ -b+', "'+a+'", '+c+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]};$.Blockly.PHP.lists_split=function(a){var b=$.Blockly.PHP.valueToCode(a,"INPUT",$.Blockly.PHP.ORDER_NONE),c=$.Blockly.PHP.valueToCode(a,"DELIM",$.Blockly.PHP.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"===a)b||(b="''"),a="explode";else if("JOIN"===a)b||(b="array()"),a="implode";else throw Error("Unknown mode: "+a);return[a+"("+c+", "+b+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.lists_reverse=function(a){return["array_reverse("+($.Blockly.PHP.valueToCode(a,"LIST",$.Blockly.PHP.ORDER_NONE)||"[]")+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]};var module$exports$Blockly$PHP$colour={};$.Blockly.PHP.colour_picker=function(a){return[$.Blockly.PHP.quote_(a.getFieldValue("COLOUR")),$.Blockly.PHP.ORDER_ATOMIC]};$.Blockly.PHP.colour_random=function(a){return[$.Blockly.PHP.provideFunction_("colour_random","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"() {\n return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);\n}\n")+"()",$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.colour_rgb=function(a){var b=$.Blockly.PHP.valueToCode(a,"RED",$.Blockly.PHP.ORDER_NONE)||0,c=$.Blockly.PHP.valueToCode(a,"GREEN",$.Blockly.PHP.ORDER_NONE)||0;a=$.Blockly.PHP.valueToCode(a,"BLUE",$.Blockly.PHP.ORDER_NONE)||0;return[$.Blockly.PHP.provideFunction_("colour_rgb","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($r, $g, $b) {\n $r = round(max(min($r, 100), 0) * 2.55);\n $g = round(max(min($g, 100), 0) * 2.55);\n $b = round(max(min($b, 100), 0) * 2.55);\n $hex = '#';\n $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);\n return $hex;\n}\n")+ -"("+b+", "+c+", "+a+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]}; -$.Blockly.PHP.colour_blend=function(a){var b=$.Blockly.PHP.valueToCode(a,"COLOUR1",$.Blockly.PHP.ORDER_NONE)||"'#000000'",c=$.Blockly.PHP.valueToCode(a,"COLOUR2",$.Blockly.PHP.ORDER_NONE)||"'#000000'";a=$.Blockly.PHP.valueToCode(a,"RATIO",$.Blockly.PHP.ORDER_NONE)||.5;return[$.Blockly.PHP.provideFunction_("colour_blend","\nfunction "+$.Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_+"($c1, $c2, $ratio) {\n $ratio = max(min($ratio, 1), 0);\n $r1 = hexdec(substr($c1, 1, 2));\n $g1 = hexdec(substr($c1, 3, 2));\n $b1 = hexdec(substr($c1, 5, 2));\n $r2 = hexdec(substr($c2, 1, 2));\n $g2 = hexdec(substr($c2, 3, 2));\n $b2 = hexdec(substr($c2, 5, 2));\n $r = round($r1 * (1 - $ratio) + $r2 * $ratio);\n $g = round($g1 * (1 - $ratio) + $g2 * $ratio);\n $b = round($b1 * (1 - $ratio) + $b2 * $ratio);\n $hex = '#';\n $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);\n return $hex;\n}\n")+"("+ -b+", "+c+", "+a+")",$.Blockly.PHP.ORDER_FUNCTION_CALL]};var module$exports$Blockly$PHP$all={}; -$.Blockly.PHP.__namespace__=$; -return $.Blockly.PHP; +module$exports$Blockly$PHP.phpGenerator.getAdjusted=function(a,b,c,d,e){c=c||0;e=e||this.ORDER_NONE;a.workspace.options.oneBasedIndex&&c--;let f=a.workspace.options.oneBasedIndex?"1":"0",g=e,h;0c?h=g=this.ORDER_SUBTRACTION:d&&(h=g=this.ORDER_UNARY_NEGATION);a=this.valueToCode(a,b,g)||f;$.module$build$src$core$utils$string.isNumber(a)?(a=Number(a)+c,d&&(a=-a)):(0c&&(a=a+" - "+-c),d&&(a=c?"-("+a+")":"-"+a),h=Math.floor(h),e=Math.floor(e),h&&e>=h&&(a="("+ +a+")"));return a};var module$exports$Blockly$PHP$variables={},module$contents$Blockly$PHP$variables_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$PHP.phpGenerator.variables_get=function(a){return[module$exports$Blockly$PHP.phpGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$PHP.phpGenerator.variables_set=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"VALUE",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"0";return module$exports$Blockly$PHP.phpGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE)+" = "+b+";\n"};var module$exports$Blockly$PHP$variablesDynamic={};module$exports$Blockly$PHP.phpGenerator.variables_get_dynamic=module$exports$Blockly$PHP.phpGenerator.variables_get;module$exports$Blockly$PHP.phpGenerator.variables_set_dynamic=module$exports$Blockly$PHP.phpGenerator.variables_set;var module$exports$Blockly$PHP$texts={},module$contents$Blockly$PHP$texts_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$PHP.phpGenerator.text=function(a){return[module$exports$Blockly$PHP.phpGenerator.quote_(a.getFieldValue("TEXT")),module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$PHP.phpGenerator.text_multiline=function(a){a=module$exports$Blockly$PHP.phpGenerator.multiline_quote_(a.getFieldValue("TEXT"));const b=-1!==a.indexOf(".")?module$exports$Blockly$PHP.phpGenerator.ORDER_STRING_CONCAT:module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC;return[a,b]}; +module$exports$Blockly$PHP.phpGenerator.text_join=function(a){if(0===a.itemCount_)return["''",module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC];if(1===a.itemCount_)return[module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"ADD0",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"''",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE];if(2===a.itemCount_){var b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"ADD0",module$exports$Blockly$PHP.phpGenerator.ORDER_STRING_CONCAT)||"''"; +a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"ADD1",module$exports$Blockly$PHP.phpGenerator.ORDER_STRING_CONCAT)||"''";return[b+" . "+a,module$exports$Blockly$PHP.phpGenerator.ORDER_STRING_CONCAT]}b=Array(a.itemCount_);for(let c=0;c 0",module$exports$Blockly$PHP.phpGenerator.ORDER_RELATIONAL, +module$exports$Blockly$PHP.phpGenerator.ORDER_RELATIONAL],NEGATIVE:[""," < 0",module$exports$Blockly$PHP.phpGenerator.ORDER_RELATIONAL,module$exports$Blockly$PHP.phpGenerator.ORDER_RELATIONAL],DIVISIBLE_BY:[null,null,module$exports$Blockly$PHP.phpGenerator.ORDER_MODULUS,module$exports$Blockly$PHP.phpGenerator.ORDER_EQUALITY],PRIME:[null,null,module$exports$Blockly$PHP.phpGenerator.ORDER_NONE,module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]};const c=a.getFieldValue("PROPERTY"),[d,e,f,g]= +b[c];b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"NUMBER_TO_CHECK",f)||"0";if("PRIME"===c)a=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_isPrime",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($n) { + // https://en.wikipedia.org/wiki/Primality_test#Naive_methods + if ($n == 2 || $n == 3) { + return true; + } + // False if n is NaN, negative, is 1, or not whole. + // And false if n is divisible by 2 or 3. + if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) { + return false; + } + // Check all the numbers of form 6k +/- 1, up to sqrt(n). + for ($x = 6; $x <= sqrt($n) + 1; $x += 6) { + if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) { + return false; + } + } + return true; +} +`)+"("+b+")";else if("DIVISIBLE_BY"===c){a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$PHP.phpGenerator.ORDER_MODULUS)||"0";if("0"===a)return["false",module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC];a=b+" % "+a+" == 0"}else a=d+b+e;return[a,g]}; +module$exports$Blockly$PHP.phpGenerator.math_change=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"DELTA",module$exports$Blockly$PHP.phpGenerator.ORDER_ADDITION)||"0";return module$exports$Blockly$PHP.phpGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE)+" += "+b+";\n"};module$exports$Blockly$PHP.phpGenerator.math_round=module$exports$Blockly$PHP.phpGenerator.math_single;module$exports$Blockly$PHP.phpGenerator.math_trig=module$exports$Blockly$PHP.phpGenerator.math_single; +module$exports$Blockly$PHP.phpGenerator.math_on_list=function(a){var b=a.getFieldValue("OP");switch(b){case "SUM":a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL)||"array()";a="array_sum("+a+")";break;case "MIN":a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL)||"array()";a="min("+a+")";break;case "MAX":a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a, +"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL)||"array()";a="max("+a+")";break;case "AVERAGE":b=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_mean",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($myList) { + return array_sum($myList) / count($myList); +} +`);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"array()";a=b+"("+a+")";break;case "MEDIAN":b=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_median",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($arr) { + sort($arr,SORT_NUMERIC); + return (count($arr) % 2) ? $arr[floor(count($arr) / 2)] : + ($arr[floor(count($arr) / 2)] + $arr[floor(count($arr) / 2) - 1]) / 2; +} +`);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "MODE":b=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_modes",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($values) { + if (empty($values)) return array(); + $counts = array_count_values($values); + arsort($counts); // Sort counts in descending order + $modes = array_keys($counts, current($counts), true); + return $modes; +} +`);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "STD_DEV":b=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_standard_deviation",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($numbers) { + $n = count($numbers); + if (!$n) return null; + $mean = array_sum($numbers) / count($numbers); + foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2); + return sqrt(array_sum($devs) / (count($devs) - 1)); +} +`);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;case "RANDOM":b=module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_random_list",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($list) { + $x = rand(0, count($list)-1); + return $list[$x]; +} +`);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"[]";a=b+"("+a+")";break;default:throw Error("Unknown operator: "+b);}return[a,module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.math_modulo=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"DIVIDEND",module$exports$Blockly$PHP.phpGenerator.ORDER_MODULUS)||"0";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$PHP.phpGenerator.ORDER_MODULUS)||"0";return[b+" % "+a,module$exports$Blockly$PHP.phpGenerator.ORDER_MODULUS]}; +module$exports$Blockly$PHP.phpGenerator.math_constrain=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"VALUE",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0",c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LOW",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"HIGH",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"Infinity";return["min(max("+b+", "+c+"), "+a+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.math_random_int=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"FROM",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"TO",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0";return[module$exports$Blockly$PHP.phpGenerator.provideFunction_("math_random_int",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($a, $b) { + if ($a > $b) { + return rand($b, $a); + } + return rand($a, $b); +} +`)+"("+b+", "+a+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]};module$exports$Blockly$PHP.phpGenerator.math_random_float=function(a){return["(float)rand()/(float)getrandmax()",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.math_atan2=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"X",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0";return["atan2("+(module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"Y",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"0")+", "+b+") / pi() * 180",module$exports$Blockly$PHP.phpGenerator.ORDER_DIVISION]};var module$exports$Blockly$PHP$loops={},module$contents$Blockly$PHP$loops_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$PHP$loops_NameType=$.NameType$$module$build$src$core$names; +module$exports$Blockly$PHP.phpGenerator.controls_repeat_ext=function(a){let b;b=a.getField("TIMES")?String(Number(a.getFieldValue("TIMES"))):module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"TIMES",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"0";let c=module$exports$Blockly$PHP.phpGenerator.statementToCode(a,"DO");c=module$exports$Blockly$PHP.phpGenerator.addLoopTrap(c,a);a="";const d=module$exports$Blockly$PHP.phpGenerator.nameDB_.getDistinctName("count",$.NameType$$module$build$src$core$names.VARIABLE); +let e=b;b.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(b)||(e=module$exports$Blockly$PHP.phpGenerator.nameDB_.getDistinctName("repeat_end",$.NameType$$module$build$src$core$names.VARIABLE),a+=e+" = "+b+";\n");return a+("for ("+d+" = 0; "+d+" < "+e+"; "+d+"++) {\n"+c+"}\n")};module$exports$Blockly$PHP.phpGenerator.controls_repeat=module$exports$Blockly$PHP.phpGenerator.controls_repeat_ext; +module$exports$Blockly$PHP.phpGenerator.controls_whileUntil=function(a){const b="UNTIL"===a.getFieldValue("MODE");let c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"BOOL",b?module$exports$Blockly$PHP.phpGenerator.ORDER_LOGICAL_NOT:module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"false",d=module$exports$Blockly$PHP.phpGenerator.statementToCode(a,"DO");d=module$exports$Blockly$PHP.phpGenerator.addLoopTrap(d,a);b&&(c="!"+c);return"while ("+c+") {\n"+d+"}\n"}; +module$exports$Blockly$PHP.phpGenerator.controls_for=function(a){var b=module$exports$Blockly$PHP.phpGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"FROM",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"0",d=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"TO",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"0";const e=module$exports$Blockly$PHP.phpGenerator.valueToCode(a, +"BY",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"1";let f=module$exports$Blockly$PHP.phpGenerator.statementToCode(a,"DO");f=module$exports$Blockly$PHP.phpGenerator.addLoopTrap(f,a);if($.module$build$src$core$utils$string.isNumber(c)&&$.module$build$src$core$utils$string.isNumber(d)&&$.module$build$src$core$utils$string.isNumber(e)){var g=Number(c)<=Number(d);a="for ("+b+" = "+c+"; "+b+(g?" <= ":" >= ")+d+"; "+b;b=Math.abs(Number(e));a=1===b?a+(g?"++":"--"):a+((g?" += ":" -= ")+b); +a+=") {\n"+f+"}\n"}else a="",g=c,c.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(c)||(g=module$exports$Blockly$PHP.phpGenerator.nameDB_.getDistinctName(b+"_start",$.NameType$$module$build$src$core$names.VARIABLE),a+=g+" = "+c+";\n"),c=d,d.match(/^\w+$/)||$.module$build$src$core$utils$string.isNumber(d)||(c=module$exports$Blockly$PHP.phpGenerator.nameDB_.getDistinctName(b+"_end",$.NameType$$module$build$src$core$names.VARIABLE),a+=c+" = "+d+";\n"),d=module$exports$Blockly$PHP.phpGenerator.nameDB_.getDistinctName(b+ +"_inc",$.NameType$$module$build$src$core$names.VARIABLE),a+=d+" = ",a=$.module$build$src$core$utils$string.isNumber(e)?a+(Math.abs(e)+";\n"):a+("abs("+e+");\n"),a+="if ("+g+" > "+c+") {\n",a+=module$exports$Blockly$PHP.phpGenerator.INDENT+d+" = -"+d+";\n",a=a+"}\nfor ("+(b+" = "+g+"; "+d+" >= 0 ? "+b+" <= "+c+" : "+b+" >= "+c+"; "+b+" += "+d+") {\n"+f+"}\n");return a}; +module$exports$Blockly$PHP.phpGenerator.controls_forEach=function(a){const b=module$exports$Blockly$PHP.phpGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_ASSIGNMENT)||"[]";let d=module$exports$Blockly$PHP.phpGenerator.statementToCode(a,"DO");d=module$exports$Blockly$PHP.phpGenerator.addLoopTrap(d,a);return"foreach ("+c+" as "+b+") {\n"+d+ +"}\n"}; +module$exports$Blockly$PHP.phpGenerator.controls_flow_statements=function(a){let b="";module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX&&(b+=module$exports$Blockly$PHP.phpGenerator.injectId(module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX,a));module$exports$Blockly$PHP.phpGenerator.STATEMENT_SUFFIX&&(b+=module$exports$Blockly$PHP.phpGenerator.injectId(module$exports$Blockly$PHP.phpGenerator.STATEMENT_SUFFIX,a));if(module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX){const c=a.getSurroundLoop(); +c&&!c.suppressPrefixSuffix&&(b+=module$exports$Blockly$PHP.phpGenerator.injectId(module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX,c))}switch(a.getFieldValue("FLOW")){case "BREAK":return b+"break;\n";case "CONTINUE":return b+"continue;\n"}throw Error("Unknown flow statement.");};var module$exports$Blockly$PHP$logic={}; +module$exports$Blockly$PHP.phpGenerator.controls_if=function(a){let b=0,c="",d,e;module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX&&(c+=module$exports$Blockly$PHP.phpGenerator.injectId(module$exports$Blockly$PHP.phpGenerator.STATEMENT_PREFIX,a));do e=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"IF"+b,module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"false",d=module$exports$Blockly$PHP.phpGenerator.statementToCode(a,"DO"+b),module$exports$Blockly$PHP.phpGenerator.STATEMENT_SUFFIX&&(d= +module$exports$Blockly$PHP.phpGenerator.prefixLines(module$exports$Blockly$PHP.phpGenerator.injectId(module$exports$Blockly$PHP.phpGenerator.STATEMENT_SUFFIX,a),module$exports$Blockly$PHP.phpGenerator.INDENT)+d),c+=(0",GTE:">="}[a.getFieldValue("OP")],c="=="===b||"!="===b?module$exports$Blockly$PHP.phpGenerator.ORDER_EQUALITY:module$exports$Blockly$PHP.phpGenerator.ORDER_RELATIONAL,d=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"A",c)||"0";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +module$exports$Blockly$PHP.phpGenerator.logic_operation=function(a){const b="AND"===a.getFieldValue("OP")?"&&":"||",c="&&"===b?module$exports$Blockly$PHP.phpGenerator.ORDER_LOGICAL_AND:module$exports$Blockly$PHP.phpGenerator.ORDER_LOGICAL_OR;let d=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"A",c);a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"B",c);if(d||a){const e="&&"===b?"true":"false";d||(d=e);a||(a=e)}else a=d="false";return[d+" "+b+" "+a,c]}; +module$exports$Blockly$PHP.phpGenerator.logic_negate=function(a){const b=module$exports$Blockly$PHP.phpGenerator.ORDER_LOGICAL_NOT;return["!"+(module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"BOOL",b)||"true"),b]};module$exports$Blockly$PHP.phpGenerator.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"true":"false",module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC]};module$exports$Blockly$PHP.phpGenerator.logic_null=function(a){return["null",module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$PHP.phpGenerator.logic_ternary=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"IF",module$exports$Blockly$PHP.phpGenerator.ORDER_CONDITIONAL)||"false",c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"THEN",module$exports$Blockly$PHP.phpGenerator.ORDER_CONDITIONAL)||"null";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"ELSE",module$exports$Blockly$PHP.phpGenerator.ORDER_CONDITIONAL)||"null";return[b+" ? "+c+" : "+a,module$exports$Blockly$PHP.phpGenerator.ORDER_CONDITIONAL]};var module$exports$Blockly$PHP$lists={},module$contents$Blockly$PHP$lists_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$PHP$lists_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$PHP.phpGenerator.lists_create_empty=function(a){return["array()",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.lists_create_with=function(a){let b=Array(a.itemCount_);for(let c=0;c 'strnatcasecmp', + 'TEXT' => 'strcmp', + 'IGNORE_CASE' => 'strcasecmp' + ); + $sortCmp = $sortCmpFuncs[$type]; + $list2 = $list; + usort($list2, $sortCmp); + if ($direction == -1) { + $list2 = array_reverse($list2); + } + return $list2; +} +`)+"("+b+', "'+a+'", '+c+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.lists_split=function(a){let b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"INPUT",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE);const c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"DELIM",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"''";a=a.getFieldValue("MODE");if("SPLIT"===a)b||(b="''"),a="explode";else if("JOIN"===a)b||(b="array()"),a="implode";else throw Error("Unknown mode: "+a);return[a+"("+c+", "+b+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.lists_reverse=function(a){return["array_reverse("+(module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"LIST",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"[]")+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]};var module$exports$Blockly$PHP$colour={};module$exports$Blockly$PHP.phpGenerator.colour_picker=function(a){return[module$exports$Blockly$PHP.phpGenerator.quote_(a.getFieldValue("COLOUR")),module$exports$Blockly$PHP.phpGenerator.ORDER_ATOMIC]};module$exports$Blockly$PHP.phpGenerator.colour_random=function(a){return[module$exports$Blockly$PHP.phpGenerator.provideFunction_("colour_random",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}() { + return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); +} +`)+"()",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.colour_rgb=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"RED",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||0,c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"GREEN",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||0;a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"BLUE",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||0;return[module$exports$Blockly$PHP.phpGenerator.provideFunction_("colour_rgb",` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($r, $g, $b) { + $r = round(max(min($r, 100), 0) * 2.55); + $g = round(max(min($g, 100), 0) * 2.55); + $b = round(max(min($b, 100), 0) * 2.55); + $hex = '#'; + $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT); + $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT); + $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT); + return $hex; +} +`)+"("+b+", "+c+", "+a+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$PHP.phpGenerator.colour_blend=function(a){const b=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"COLOUR1",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"'#000000'",c=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"COLOUR2",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||"'#000000'";a=module$exports$Blockly$PHP.phpGenerator.valueToCode(a,"RATIO",module$exports$Blockly$PHP.phpGenerator.ORDER_NONE)||.5;return[module$exports$Blockly$PHP.phpGenerator.provideFunction_("colour_blend", +` +function ${module$exports$Blockly$PHP.phpGenerator.FUNCTION_NAME_PLACEHOLDER_}($c1, $c2, $ratio) { + $ratio = max(min($ratio, 1), 0); + $r1 = hexdec(substr($c1, 1, 2)); + $g1 = hexdec(substr($c1, 3, 2)); + $b1 = hexdec(substr($c1, 5, 2)); + $r2 = hexdec(substr($c2, 1, 2)); + $g2 = hexdec(substr($c2, 3, 2)); + $b2 = hexdec(substr($c2, 5, 2)); + $r = round($r1 * (1 - $ratio) + $r2 * $ratio); + $g = round($g1 * (1 - $ratio) + $g2 * $ratio); + $b = round($b1 * (1 - $ratio) + $b2 * $ratio); + $hex = '#'; + $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT); + $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT); + $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT); + return $hex; +} +`)+"("+b+", "+c+", "+a+")",module$exports$Blockly$PHP.phpGenerator.ORDER_FUNCTION_CALL]};var module$exports$Blockly$PHP$all=module$exports$Blockly$PHP; +module$exports$Blockly$PHP.__namespace__=$; +return module$exports$Blockly$PHP; })); diff --git a/php_compressed.js.map b/php_compressed.js.map index 1b27749f658..36565d3650e 100644 --- a/php_compressed.js.map +++ b/php_compressed.js.map @@ -1 +1 @@ -{"version":3,"sources":["generators/php.js","generators/php/variables.js","generators/php/variables_dynamic.js","generators/php/text.js","generators/php/procedures.js","generators/php/math.js","generators/php/loops.js","generators/php/logic.js","generators/php/lists.js","generators/php/colour.js","generators/php/all.js"],"names":["PHP","Generator","addReservedWords","ORDER_ATOMIC","ORDER_CLONE","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_POWER","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_CAST","ORDER_SUPPRESS_ERROR","ORDER_INSTANCEOF","ORDER_LOGICAL_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_ADDITION","ORDER_SUBTRACTION","ORDER_STRING_CONCAT","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_REFERENCE","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_LOGICAL_AND_WEAK","ORDER_LOGICAL_XOR","ORDER_LOGICAL_OR_WEAK","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","PHP.init","workspace","Object","getPrototypeOf","call","nameDB_","reset","Names","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","finish","PHP.finish","code","definitions","objectUtils","values","definitions_","join","scrubNakedValue","PHP.scrubNakedValue","line","quote_","PHP.quote_","string","replace","multiline_quote_","PHP.multiline_quote_","split","map","lines","scrub_","PHP.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","stringUtils","wrap","COMMENT_WRAP","prefixLines","i","inputList","length","type","inputTypes","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","PHP.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","outerOrder","innerOrder","at","valueToCode","isNumber","Number","Math","floor","exports","getName","getFieldValue","NameType","VARIABLE","argument0","varName","indexOf","itemCount_","element0","element1","elements","Array","value","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","text","operator","substring","errorIndex","indexAdjustment","where","Error","where1","where2","at1","at2","OPERATORS","getField","msg","sub","from","to","globals","usedVariables","Variables","allUsedVarModels","variable","name","getVars","push","devVarList","allDeveloperVariables","DEVELOPER_VARIABLE","globalStr","INDENT","funcName","PROCEDURE","xfix1","STATEMENT_PREFIX","injectId","STATEMENT_SUFFIX","loopTrap","INFINITE_LOOP_TRAP","branch","statementToCode","returnValue","xfix2","args","variables","tuple","hasReturnValue_","Infinity","argument1","arg","CONSTANTS","PROPERTIES","dropdownProperty","prefix","suffix","inputOrder","outputOrder","numberToCheck","divisor","func","list","argument2","repeats","String","addLoopTrap","loopVar","getDistinctName","endVar","match","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","getSurroundLoop","suppressPrefixSuffix","n","conditionCode","branchCode","getInput","defaultArgument","value_if","value_then","value_else","element","repeatCount","mode","cachedList","listVar","xVar","listCode","direction","value_input","value_delim","red","green","blue","c1","c2","ratio"],"mappings":"A;;;;;;;;;;;;;;AA4BA,IAAMA,gCAAM,IAAIC,CAAAA,CAAAA,gCAAAA,CAAAA,SAAJ,CAAc,KAAd,CAQZD,gCAAIE,CAAAA,gBAAJ,CAEI,mqCAFJ,CA0BAF;+BAAIG,CAAAA,YAAJ,CAAmB,CACnBH,gCAAII,CAAAA,WAAJ,CAAkB,CAClBJ,gCAAIK,CAAAA,SAAJ,CAAgB,CAChBL,gCAAIM,CAAAA,YAAJ,CAAmB,GACnBN,gCAAIO,CAAAA,mBAAJ,CAA0B,GAC1BP,gCAAIQ,CAAAA,WAAJ,CAAkB,CAClBR,gCAAIS,CAAAA,eAAJ,CAAsB,CACtBT,gCAAIU,CAAAA,eAAJ,CAAsB,CACtBV,gCAAIW,CAAAA,iBAAJ,CAAwB,CACxBX,gCAAIY,CAAAA,UAAJ,CAAiB,CACjBZ;+BAAIa,CAAAA,oBAAJ,CAA2B,CAC3Bb,gCAAIc,CAAAA,gBAAJ,CAAuB,CACvBd,gCAAIe,CAAAA,iBAAJ,CAAwB,CACxBf,gCAAIgB,CAAAA,gBAAJ,CAAuB,GACvBhB,gCAAIiB,CAAAA,oBAAJ,CAA2B,GAC3BjB,gCAAIkB,CAAAA,oBAAJ,CAA2B,GAC3BlB,gCAAImB,CAAAA,cAAJ,CAAqB,GACrBnB,gCAAIoB,CAAAA,aAAJ,CAAoB,GACpBpB,gCAAIqB,CAAAA,cAAJ,CAAqB,GACrBrB;+BAAIsB,CAAAA,iBAAJ,CAAwB,GACxBtB,gCAAIuB,CAAAA,mBAAJ,CAA0B,GAC1BvB,gCAAIwB,CAAAA,mBAAJ,CAA0B,EAC1BxB,gCAAIyB,CAAAA,gBAAJ,CAAuB,EACvBzB,gCAAI0B,CAAAA,cAAJ,CAAqB,EACrB1B,gCAAI2B,CAAAA,eAAJ,CAAsB,EACtB3B,gCAAI4B,CAAAA,iBAAJ,CAAwB,EACxB5B,gCAAI6B,CAAAA,iBAAJ,CAAwB,EACxB7B,gCAAI8B,CAAAA,gBAAJ,CAAuB,EACvB9B;+BAAI+B,CAAAA,iBAAJ,CAAwB,EACxB/B,gCAAIgC,CAAAA,gBAAJ,CAAuB,EACvBhC,gCAAIiC,CAAAA,aAAJ,CAAoB,EACpBjC,gCAAIkC,CAAAA,iBAAJ,CAAwB,EACxBlC,gCAAImC,CAAAA,gBAAJ,CAAuB,EACvBnC,gCAAIoC,CAAAA,sBAAJ,CAA6B,EAC7BpC,gCAAIqC,CAAAA,iBAAJ,CAAwB,EACxBrC,gCAAIsC,CAAAA,qBAAJ,CAA4B,EAC5BtC,gCAAIuC,CAAAA,UAAJ,CAAiB,EAMjBvC;+BAAIwC,CAAAA,eAAJ,CAAsB,CAGpB,CAACxC,+BAAIM,CAAAA,YAAL,CAAmBN,+BAAIO,CAAAA,mBAAvB,CAHoB,CAMpB,CAACP,+BAAIM,CAAAA,YAAL,CAAmBN,+BAAIM,CAAAA,YAAvB,CANoB,CAQpB,CAACN,+BAAIe,CAAAA,iBAAL,CAAwBf,+BAAIe,CAAAA,iBAA5B,CARoB,CAUpB,CAACf,+BAAIkB,CAAAA,oBAAL,CAA2BlB,+BAAIkB,CAAAA,oBAA/B,CAVoB,CAYpB,CAAClB,+BAAIqB,CAAAA,cAAL,CAAqBrB,+BAAIqB,CAAAA,cAAzB,CAZoB;AAcpB,CAACrB,+BAAI+B,CAAAA,iBAAL,CAAwB/B,+BAAI+B,CAAAA,iBAA5B,CAdoB,CAgBpB,CAAC/B,+BAAIgC,CAAAA,gBAAL,CAAuBhC,+BAAIgC,CAAAA,gBAA3B,CAhBoB,CAuBtBhC,gCAAIyC,CAAAA,aAAJ,CAAoB,CAAA,CAMpBzC;+BAAI0C,CAAAA,IAAJ,CAAWC,QAAQ,CAACC,CAAD,CAAY,CAE7BC,MAAOC,CAAAA,cAAP,CAAsB,IAAtB,CAA4BJ,CAAAA,IAAKK,CAAAA,IAAjC,CAAsC,IAAtC,CAEK,KAAKC,CAAAA,OAAV,CAGE,IAAKA,CAAAA,OAAQC,CAAAA,KAAb,EAHF,CACE,IAAKD,CAAAA,OADP,CACiB,IAAIE,CAAAA,CAAAA,4BAAAA,CAAAA,KAAJ,CAAU,IAAKC,CAAAA,eAAf,CAAgC,GAAhC,CAKjB,KAAKH,CAAAA,OAAQI,CAAAA,cAAb,CAA4BR,CAAUS,CAAAA,cAAV,EAA5B,CACA,KAAKL,CAAAA,OAAQM,CAAAA,iBAAb,CAA+BV,CAA/B,CACA,KAAKI,CAAAA,OAAQO,CAAAA,kBAAb,CAAgCX,CAAhC,CAEA,KAAKH,CAAAA,aAAL,CAAqB,CAAA,CAdQ,CAsB/BzC;+BAAIwD,CAAAA,MAAJ,CAAaC,QAAQ,CAACC,CAAD,CAAO,CAE1B,IAAMC,EAAc,GAAAC,CAAAA,CAAAA,mCAAYC,CAAAA,MAAZ,EAAmB,IAAKC,CAAAA,YAAxB,CAEpBJ,EAAA,CAAOb,MAAOC,CAAAA,cAAP,CAAsB,IAAtB,CAA4BU,CAAAA,MAAOT,CAAAA,IAAnC,CAAwC,IAAxC,CAA8CW,CAA9C,CACP,KAAKjB,CAAAA,aAAL,CAAqB,CAAA,CAErB,KAAKO,CAAAA,OAAQC,CAAAA,KAAb,EACA,OAAOU,EAAYI,CAAAA,IAAZ,CAAiB,MAAjB,CAAP,CAAkC,QAAlC,CAA6CL,CARnB,CAiB5B1D,gCAAIgE,CAAAA,eAAJ,CAAsBC,QAAQ,CAACC,CAAD,CAAO,CACnC,MAAOA,EAAP,CAAc,KADqB,CAWrClE,gCAAImE,CAAAA,MAAJ,CAAaC,QAAQ,CAACC,CAAD,CAAS,CAC5BA,CAAA,CAASA,CAAOC,CAAAA,OAAP,CAAe,KAAf,CAAsB,MAAtB,CACKA,CAAAA,OADL,CACa,KADb,CACoB,MADpB,CAEKA,CAAAA,OAFL,CAEa,IAFb,CAEmB,KAFnB,CAGT,OAAO,GAAP,CAAcD,CAAd,CAAuB,GAJK,CAc9BrE;+BAAIuE,CAAAA,gBAAJ,CAAuBC,QAAQ,CAACH,CAAD,CAAS,CAKtC,MAJcA,EAAOI,CAAAA,KAAP,CAAa,KAAb,CAAoBC,CAAAA,GAApBC,CAAwB,IAAKR,CAAAA,MAA7BQ,CAIDZ,CAAAA,IAAN,CAAW,cAAX,CAL+B,CAkBxC/D;+BAAI4E,CAAAA,MAAJ,CAAaC,QAAQ,CAACC,CAAD,CAAQpB,CAAR,CAAcqB,CAAd,CAA4B,CAC/C,IAAIC,EAAc,EAElB,IAAI,CAACF,CAAMG,CAAAA,gBAAX,EAA+B,CAACH,CAAMG,CAAAA,gBAAiBC,CAAAA,gBAAvD,CAAyE,CAEvE,IAAIC,EAAUL,CAAMM,CAAAA,cAAN,EACVD,EAAJ,GACEA,CACA,CADU,GAAAE,CAAAA,CAAAA,mCAAYC,CAAAA,IAAZ,EAAiBH,CAAjB,CAA0B,IAAKI,CAAAA,YAA/B,CAA8C,CAA9C,CACV,CAAAP,CAAA,EAAe,IAAKQ,CAAAA,WAAL,CAAiBL,CAAjB,CAA0B,KAA1B,CAAf,CAAkD,IAFpD,CAMA,KAAK,IAAIM,EAAI,CAAb,CAAgBA,CAAhB,CAAoBX,CAAMY,CAAAA,SAAUC,CAAAA,MAApC,CAA4CF,CAAA,EAA5C,CACMX,CAAMY,CAAAA,SAAN,CAAgBD,CAAhB,CAAmBG,CAAAA,IAAvB,GAAgCC,CAAAA,CAAAA,iCAAAA,CAAAA,UAAWC,CAAAA,KAA3C,GACQC,CADR,CACqBjB,CAAMY,CAAAA,SAAN,CAAgBD,CAAhB,CAAmBO,CAAAA,UAAWC,CAAAA,WAA9B,EADrB,IAGId,CAHJ,CAGc,IAAKe,CAAAA,iBAAL,CAAuBH,CAAvB,CAHd,IAKMf,CALN,EAKqB,IAAKQ,CAAAA,WAAL,CAAiBL,CAAjB,CAA0B,KAA1B,CALrB,CAVqE,CAqBnEgB,CAAAA,CAAYrB,CAAMsB,CAAAA,cAAlBD;AAAoCrB,CAAMsB,CAAAA,cAAeH,CAAAA,WAArB,EACpCI,EAAAA,CAAWtB,CAAA,CAAe,EAAf,CAAoB,IAAKuB,CAAAA,WAAL,CAAiBH,CAAjB,CACrC,OAAOnB,EAAP,CAAqBtB,CAArB,CAA4B2C,CA1BmB,CAsCjDrG;+BAAIuG,CAAAA,WAAJ,CAAkBC,QAAQ,CAAC1B,CAAD,CAAQ2B,CAAR,CAAcC,CAAd,CAAyBC,CAAzB,CAAqCC,CAArC,CAAgD,CACpEC,CAAAA,CAAQH,CAARG,EAAqB,CACrBC,EAAAA,CAAQF,CAARE,EAAqB,IAAKvE,CAAAA,UAC1BuC,EAAMlC,CAAAA,SAAUmE,CAAAA,OAAQC,CAAAA,aAA5B,EACEH,CAAA,EAEF,KAAII,EAAiBnC,CAAMlC,CAAAA,SAAUmE,CAAAA,OAAQC,CAAAA,aAAxB,CAAwC,GAAxC,CAA8C,GAAnE,CACIE,EAAaJ,CAEjB,IAAY,CAAZ,CAAID,CAAJ,CAEE,IAAAM,EADAD,CACAC,CADa,IAAK9F,CAAAA,cADpB,KAGmB,EAAZ,CAAIwF,CAAJ,CAELM,CAFK,CACLD,CADK,CACQ,IAAK5F,CAAAA,iBADb,CAGIqF,CAHJ,GAKLQ,CALK,CAILD,CAJK,CAIQ,IAAKjG,CAAAA,oBAJb,CAOHmG,EAAAA,CAAK,IAAKC,CAAAA,WAAL,CAAiBvC,CAAjB,CAAwB2B,CAAxB,CAA8BS,CAA9B,CAALE,EAAkDH,CAElD,IAAA5B,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBF,CAArB,CAAJ,EAEEA,CACA,CADKG,MAAA,CAAOH,CAAP,CACL,CADkBP,CAClB,CAAIF,CAAJ,GACES,CADF,CACO,CAACA,CADR,CAHF,GAQc,CAAZ,CAAIP,CAAJ,CACEO,CADF,CACOA,CADP,CACY,KADZ,CACoBP,CADpB,CAEmB,CAFnB,CAEWA,CAFX,GAGEO,CAHF,CAGOA,CAHP,CAGY,KAHZ,CAGoB,CAACP,CAHrB,CAcA,CATIF,CASJ,GAPIS,CAOJ,CARMP,CAAJ,CACO,IADP,CACcO,CADd,CACmB,GADnB,CAGO,GAHP,CAGaA,CAKf,EAFAD,CAEA,CAFaK,IAAKC,CAAAA,KAAL,CAAWN,CAAX,CAEb,CADAL,CACA,CADQU,IAAKC,CAAAA,KAAL,CAAWX,CAAX,CACR,CAAIK,CAAJ,EAAkBL,CAAlB,EAA2BK,CAA3B;CACEC,CADF,CACO,GADP,CACaA,CADb,CACkB,GADlB,CAtBF,CA0BA,OAAOA,EA/CiE,CAkD1EM,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAU1H,+B,CCpSV,IAAA,qCAAA,EAMAA,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAIrC,MAAO,CADH9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZjE,CAAoBoB,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApBlE,CAAgDmE,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzDpE,CACG,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAX,CAJ8B,CAOvCH,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAErC,IAAMiD,EACF/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAApC,CADE4F,EACuD,GAG7D,OADI/H,EAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZK,CAAoBlD,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApBI,CAAgDH,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzDE,CACJ,CAAiB,KAAjB,CAAyBD,CAAzB,CAAqC,KANA,C,CCbvC,IAAA,4CAAA,EAQA/H,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,qBAAA,CAA+BA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAC/BA,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,qBAAA,CAA+BA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,a,CCT/B,IAAA,iCAAA,EAMAA,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,IAAA,CAAc,QAAQ,CAAC8E,CAAD,CAAQ,CAG5B,MAAO,CADM9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImE,CAAAA,MAAJT,CAAWoB,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAXlE,CACN,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAX,CAHqB,CAM9BH,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,cAAA,CAAwB,QAAQ,CAAC8E,CAAD,CAAQ,CAEhCpB,CAAAA,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuE,CAAAA,gBAAJ,CAAqBO,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAArB,CACb,KAAMd,EACoB,CAAC,CAAvB,GAAApD,CAAKuE,CAAAA,OAAL,CAAa,GAAb,CAAA,CAA2BjI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuB,CAAAA,mBAA/B,CAAqDvB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAC7D,OAAO,CAACuD,CAAD,CAAOoD,CAAP,CAL+B,CAQxC9G;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,SAAA,CAAmB,QAAQ,CAAC8E,CAAD,CAAQ,CAEjC,GAAyB,CAAzB,GAAIA,CAAMoD,CAAAA,UAAV,CACE,MAAO,CAAC,IAAD,CAAOlI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAX,CACF,IAAyB,CAAzB,GAAI2E,CAAMoD,CAAAA,UAAV,CAGL,MAAO,CAFSlI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAET,EAF2D,IAE3D,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAX,CACF,IAAyB,CAAzB,GAAIuC,CAAMoD,CAAAA,UAAV,CAA4B,CACjC,IAAMC,EACFnI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuB,CAAAA,mBAAnC,CADE4G,EACyD,IACzDC,EAAAA,CACFpI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuB,CAAAA,mBAAnC,CADE6G,EACyD,IAE/D,OAAO,CADMD,CACN,CADiB,KACjB,CADyBC,CACzB,CAAOpI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuB,CAAAA,mBAAX,CAN0B,CAQ3B8G,CAAAA,CAAeC,KAAJ,CAAUxD,CAAMoD,CAAAA,UAAhB,CACjB,KAAK,IAAIzC,EAAI,CAAb,CAAgBA,CAAhB,CAAoBX,CAAMoD,CAAAA,UAA1B,CAAsCzC,CAAA,EAAtC,CACE4C,CAAA,CAAS5C,CAAT,CAAA;AAAczF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA+BW,CAA/B,CAAkCzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAtC,CAAd,EAAmE,IAGrE,OAAO,CADM,oBACN,CAD+B8F,CAAStE,CAAAA,IAAT,CAAc,GAAd,CAC/B,CADoD,IACpD,CAAO/D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CArBwB,CAyBnCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAMkD,EACFhI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB7C,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApB,CAAgDC,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzD,CACES,EAAAA,CAAQvI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAnC,CAARoG,EAAgE,IACtE,OAAOP,EAAP,CAAiB,MAAjB,CAA0BO,CAA1B,CAAkC,KALC,CAQrCvI;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAM0D,EAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,QAArB,CAA+B,aAA/B,CACZzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQ,CAA+B,uGAA/B,CAQfC,EAAAA,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAPoG,EAA0D,IAChE,OAAO,CAACH,CAAD,CAAgB,GAAhB,CAAsBG,CAAtB,CAA6B,GAA7B,CAAkC3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAtC,CAX4B,CAcrCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAGpC,MAAO,CAAC,QAAD,EADM9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CACN,EADyD,IACzD,EAAmB,GAAnB,CAAwBvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAA5B,CAH6B,CAMtCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAM8D,EAC6B,OAA/B,GAAA9D,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAAA,CAAyC,QAAzC,CAAoD,SADxD,CAEMiB,EAAY7I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAZsG,EAA8D,IAFpE,CAGMF,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAPoG,EAA0D,IAHhE,CAIIG,EAAa,KAJjB,CAKIC,EAAkB,EAClBjE,EAAMlC,CAAAA,SAAUmE,CAAAA,OAAQC,CAAAA,aAA5B,GACE8B,CACA,CADa,IACb,CAAAC,CAAA,CAAkB,MAFpB,CAcA,OAAO,CAVc/I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CACc,OAA/B,GAAA1D,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAAA,CAAyC,cAAzC,CACyC,kBAFxBY,CAGjB,aAHiBA,CAIZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BAJQF,CAGjB,+BAHiBA,CAKZI,CALYJ,CAGjB,+CAHiBA;AAMKM,CANLN,CAGjB,SAHiBA,CAMyBO,CANzBP,CAGjB,QAHiBA,CAUd,CADqB,GACrB,CAD2BG,CAC3B,CADkC,IAClC,CADyCE,CACzC,CADqD,GACrD,CAAO7I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAtB6B,CAyBtCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAMkE,EAAQlE,CAAM8C,CAAAA,aAAN,CAAoB,OAApB,CAARoB,EAAwC,YAA9C,CAEML,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAD4B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAChC,CAAPoG,EAAqD,IAC3D,QAAQK,CAAR,EACE,KAAK,OAAL,CAEE,MAAO,CADM,SACN,CADkBL,CAClB,CADyB,SACzB,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAET,MAAK,MAAL,CAEE,MAAO,CADM,SACN,CADkBoI,CAClB,CADyB,OACzB,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAET,MAAK,YAAL,CAGE,MAFM6G,EAEC,CAFIpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CAEJ,CAAA,CADM,SACN,CADkB6D,CAClB,CADyB,IACzB,CADgCvB,CAChC,CADqC,MACrC,CAAOpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAET,MAAK,UAAL,CAGE,MAFM6G,EAEC,CAFIpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CAA6B,CAA7B,CAAgC,CAAA,CAAhC,CAEJ;AAAA,CADM,SACN,CADkB6D,CAClB,CADyB,IACzB,CADgCvB,CAChC,CADqC,MACrC,CAAOpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAET,MAAK,QAAL,CAOE,MAAO,CANcP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,oBAArBA,CAA2C,aAA3CA,CAChBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADYF,CAA2C,6DAA3CA,CAMd,CADqB,GACrB,CAD2BG,CAC3B,CADkC,GAClC,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CA1BX,CA6BA,KAAM0I,MAAA,CAAM,iCAAN,CAAN,CAlCmC,CAqCrCjJ;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,iBAAA,CAA2B,QAAQ,CAAC8E,CAAD,CAAQ,CAEzC,IAAMoE,EAASpE,CAAM8C,CAAAA,aAAN,CAAoB,QAApB,CAAf,CACMuB,EAASrE,CAAM8C,CAAAA,aAAN,CAAoB,QAApB,CADf,CAEMe,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,QAAvB,CAAiC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAArC,CAAPoG,EAA2D,IACjE,IAAe,OAAf,GAAIO,CAAJ,EAAqC,MAArC,GAA0BC,CAA1B,CAEE,MAAO,CADMR,CACN,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAX,CAEP,KAAM6G,EAAMpJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CACNuE,EAAAA,CAAMrJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CAyBZ,OAAO,CAxBc9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,oBAArBA,CAA2C,aAA3CA,CACdxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADUF,CAA2C,moBAA3CA,CAwBd;AAFqB,GAErB,CAF2BG,CAE3B,CAFkC,KAElC,CAF2CO,CAE3C,CAFoD,KAEpD,CAF6DE,CAE7D,CADH,KACG,CADMD,CACN,CADe,KACf,CADwBE,CACxB,CAD8B,GAC9B,CAAOrJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAnCgC,CAuC3CP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyB,QAAQ,CAAC8E,CAAD,CAAQ,CAEvC,IAAM6D,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPoG,EAAyD,IAA/D,CACIjF,CACgC,YAApC,GAAIoB,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAJ,CACElE,CADF,CACS,aADT,CACyBiF,CADzB,CACgC,GADhC,CAE2C,WAApC,GAAI7D,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAJ,CACLlE,CADK,CACE,aADF,CACkBiF,CADlB,CACyB,GADzB,CAEoC,WAFpC,GAEI7D,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAFJ,GAGLlE,CAHK,CAGE,qBAHF,CAG0BiF,CAH1B,CAGiC,IAHjC,CAKP,OAAO,CAACjF,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAXgC,CAczCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,SAAA,CAAmB,QAAQ,CAAC8E,CAAD,CAAQ,CAGjC,IAAM8D,EADYU,CAAC,KAAQ,OAATA,CAAkB,MAAS,OAA3BA,CAAoC,KAAQ,MAA5CA,CACD,CAAUxE,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAV,CACXe,EAAAA,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPoG,EAAyD,IAC/D,OAAO,CAACC,CAAD,CAAY,GAAZ,CAAkBD,CAAlB,CAAyB,GAAzB,CAA8B3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAlC,CAL0B,CAQnCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAGlC,MAAO,QAAP,EADY9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CACZ,EAD8D,IAC9D,EAAwB,MAHU,CAMpCvC;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyB,QAAQ,CAAC8E,CAAD,CAAQ,CAUvC,IAAIpB,EAAO,WAAPA,EAPAoB,CAAMyE,CAAAA,QAAN,CAAe,MAAf,CAAJC,CAEQxJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAImE,CAAAA,MAAJ,CAAWW,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAX,CAFR4B,CAKQxJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CALRiH,EAK0D,IAEtD9F,EAA2B,GACkB,SACjD,GADiBoB,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CACjB,GACElE,CADF,CACS,WADT,CACuBA,CADvB,CAC8B,GAD9B,CAGA,OAAO,CAACA,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAfgC,CAkBzCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqBA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAErBA;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAClC,IAAM6D,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPoG,EAAyD,IACzDc,EAAAA,CAAMzJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAlC,CAANkH,EAAuD,IAI7D,OAAO,CAHM,SAGN,CAHkBA,CAGlB,CAHwB,mBAGxB,CAFYd,CAEZ,CAFmB,uBAEnB,CADkBA,CAClB,CADyB,IACzB,CADgCc,CAChC,CADsC,GACtC,CAAOzJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkC,CAAAA,iBAAX,CAN2B,CASpClC;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CACpC,IAAM6D,EAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPoG,EAAyD,IAA/D,CACMe,EAAO1J,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPmH,EAAyD,IACzDC,EAAAA,CAAK3J,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAjC,CAALoH,EAAqD,IAE3D,OAAO,CADM,cACN,CADuBD,CACvB,CAD8B,IAC9B,CADqCC,CACrC,CAD0C,IAC1C,CADiDhB,CACjD,CADwD,GACxD,CAAO3I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAL6B,CAQtCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAGpC,MAAO,CADM,SACN,EAFM9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAEN,EAFwD,IAExD,EADyB,GACzB,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAH6B,C,CC/OtC,IAAA,sCAAA,EAOAP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,oBAAA,CAA8B,QAAQ,CAAC8E,CAAD,CAAQ,CAO5C,IAHA,IAAM8E,EAAU,EAAhB,CACMhH,EAAYkC,CAAMlC,CAAAA,SADxB,CAEMiH,EAAgB,GAAAC,CAAAA,CAAAA,gCAAUC,CAAAA,gBAAV,EAA2BnH,CAA3B,CAAhBiH,EAAyD,EAF/D,CAGSpE,EAAI,CAHb,CAGgBuE,CAAhB,CAA0BA,CAA1B,CAAqCH,CAAA,CAAcpE,CAAd,CAArC,CAAuDA,CAAA,EAAvD,CACQuC,CACN,CADgBgC,CAASC,CAAAA,IACzB,CAAyC,CAAC,CAA1C,GAAInF,CAAMoF,CAAAA,OAAN,EAAgBjC,CAAAA,OAAhB,CAAwBD,CAAxB,CAAJ,EACE4B,CAAQO,CAAAA,IAAR,CAAanK,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoBK,CAApB,CAA6BH,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAtC,CAAb,CAIEsC,EAAAA,CAAa,GAAAN,CAAAA,CAAAA,gCAAUO,CAAAA,qBAAV,EAAgCzH,CAAhC,CACnB,KAAS6C,CAAT,CAAa,CAAb,CAAgBA,CAAhB,CAAoB2E,CAAWzE,CAAAA,MAA/B,CAAuCF,CAAA,EAAvC,CACEmE,CAAQO,CAAAA,IAAR,CACInK,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoByC,CAAA,CAAW3E,CAAX,CAApB,CAAmCoC,CAAAA,CAAAA,4BAAAA,CAAAA,QAASyC,CAAAA,kBAA5C,CADJ,CAGIC,EAAAA,CACFX,CAAQjE,CAAAA,MAAR,CAAiB3F,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAArB;AAA8B,SAA9B,CAA0CZ,CAAQ7F,CAAAA,IAAR,CAAa,IAAb,CAA1C,CAA+D,KAA/D,CAAuE,EAErE0G,EAAAA,CACFzK,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB7C,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAApB,CAAiDC,CAAAA,CAAAA,4BAAAA,CAAAA,QAAS6C,CAAAA,SAA1D,CACAC,EAAAA,CAAQ,EACR3K,EAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAR,GACED,CADF,EACW3K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAjB,CAAmC9F,CAAnC,CADX,CAGI9E,EAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAR,GACEH,CADF,EACW3K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAjB,CAAmChG,CAAnC,CADX,CAGI6F,EAAJ,GACEA,CADF,CACU3K,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwF,CAAAA,WAAJ,CAAgBmF,CAAhB,CAAuB3K,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAA3B,CADV,CAGIO,EAAAA,CAAW,EACX/K,EAAAA,CAAAA,OAAAA,CAAAA,GAAIgL,CAAAA,kBAAR,GACED,CADF,CACa/K,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwF,CAAAA,WAAJ,CACPxF,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgL,CAAAA,kBAAjB;AAAqClG,CAArC,CADO,CACsC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAD1C,CADb,CAIMS,EAAAA,CAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,OAA3B,CACf,KAAIqG,EAAcnL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,QAAvB,CAAiC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAArC,CAAd4I,EAAkE,EAAtE,CACIC,EAAQ,EACRH,EAAJ,EAAcE,CAAd,GAEEC,CAFF,CAEUT,CAFV,CAIIQ,EAAJ,GACEA,CADF,CACgBnL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MADpB,CAC6B,SAD7B,CACyCW,CADzC,CACuD,KADvD,CAKA,KAFA,IAAME,EAAO,EAAb,CACMC,EAAYxG,CAAMoF,CAAAA,OAAN,EADlB,CAESzE,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6F,CAAU3F,CAAAA,MAA9B,CAAsCF,CAAA,EAAtC,CACE4F,CAAA,CAAK5F,CAAL,CAAA,CAAUzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB2D,CAAA,CAAU7F,CAAV,CAApB,CAAkCoC,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAA3C,CAERpE,EAAAA,CAAO,WAAPA,CAAqB+G,CAArB/G,CAAgC,GAAhCA,CAAsC2H,CAAKtH,CAAAA,IAAL,CAAU,IAAV,CAAtCL,CAAwD,OAAxDA,CACA6G,CADA7G,CACYiH,CADZjH,CACoBqH,CADpBrH,CAC+BuH,CAD/BvH,CACwC0H,CADxC1H,CACgDyH,CADhDzH,CAC8D,GAClEA,EAAA,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4E,CAAAA,MAAJ,CAAWE,CAAX,CAAkBpB,CAAlB,CAEP1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAI8D,CAAAA,YAAJ,CAAiB,GAAjB,CAAuB2G,CAAvB,CAAA,CAAmC/G,CACnC,OAAO,KA3DqC,CAgE9C1D;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,sBAAA,CAAgCA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,oBAEhCA,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,qBAAA,CAA+B,QAAQ,CAAC8E,CAAD,CAAQ,CAM7C,IAJA,IAAM2F,EACFzK,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB7C,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAApB,CAAiDC,CAAAA,CAAAA,4BAAAA,CAAAA,QAAS6C,CAAAA,SAA1D,CADJ,CAEMW,EAAO,EAFb,CAGMC,EAAYxG,CAAMoF,CAAAA,OAAN,EAHlB,CAISzE,EAAI,CAAb,CAAgBA,CAAhB,CAAoB6F,CAAU3F,CAAAA,MAA9B,CAAsCF,CAAA,EAAtC,CACE4F,CAAA,CAAK5F,CAAL,CAAA,CAAUzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA+BW,CAA/B,CAAkCzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAtC,CAAV,EAA+D,MAGjE,OAAO,CADMkI,CACN,CADiB,GACjB,CADuBY,CAAKtH,CAAAA,IAAL,CAAU,IAAV,CACvB,CADyC,GACzC,CAAO/D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAVsC,CAa/CP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,uBAAA,CAAiC,QAAQ,CAAC8E,CAAD,CAAQ,CAK/C,MADc9E,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,qBAAAuL,CAA6BzG,CAA7ByG,CACP,CAAM,CAAN,CAAP,CAAkB,KAL6B,CAQjDvL;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,mBAAA,CAA6B,QAAQ,CAAC8E,CAAD,CAAQ,CAI3C,IAAIpB,EAAO,MAAPA,EADA1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,WAAvB,CAAoC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAxC,CACAmB,EADuD,OACvDA,EAA4B,OAC5B1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAR,GAGEpH,CAHF,EAIM1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwF,CAAAA,WAAJ,CAAgBxF,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAjB,CAAmChG,CAAnC,CAAhB,CAA2D9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAA/D,CAJN,CAMI1F,EAAM0G,CAAAA,eAAV,EACQjD,CACN,CADcvI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CACd,EADiE,MACjE,CAAAmB,CAAA,EAAQ1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAAZ,CAAqB,SAArB,CAAiCjC,CAAjC,CAAyC,KAF3C,EAIE7E,CAJF,EAIU1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAJd,CAIuB,WAGvB,OADA9G,EACA,CADQ,KAjBmC,C,CC9F7C,IAAA,gCAAA,EAMA1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAE/BpB,CAAAA,CAAO6D,MAAA,CAAOzC,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAAP,CACX,KAAMd,EAAgB,CAAR,EAAApD,CAAA,CAAY1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAhB,CAA+BH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIiB,CAAAA,oBACpCwK,SAAb,GAAI/H,CAAJ,CACEA,CADF,CACS,KADT,CAEoB,CAAC+H,QAFrB,GAEW/H,CAFX,GAGEA,CAHF,CAGS,MAHT,CAKA,OAAO,CAACA,CAAD,CAAOoD,CAAP,CAT4B,CAYrC9G;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyB,QAAQ,CAAC8E,CAAD,CAAQ,CASvC,IAAMyG,EAPYjC,CAChB,IAAO,CAAC,KAAD,CAAQtJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqB,CAAAA,cAAZ,CADSiI,CAEhB,MAAS,CAAC,KAAD,CAAQtJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIsB,CAAAA,iBAAZ,CAFOgI,CAGhB,SAAY,CAAC,KAAD,CAAQtJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkB,CAAAA,oBAAZ,CAHIoI,CAIhB,OAAU,CAAC,KAAD,CAAQtJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAImB,CAAAA,cAAZ,CAJMmI,CAKhB,MAAS,CAAC,MAAD,CAAStJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIQ,CAAAA,WAAb,CALO8I,CAOJ,CAAUxE,CAAM8C,CAAAA,aAAN,CAAoB,IAApB,CAAV,CAAd,CACMgB,EAAW2C,CAAA,CAAM,CAAN,CACXzE,EAAAA,CAAQyE,CAAA,CAAM,CAAN,CACd,KAAMxD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CAAZiB,EAAkD,GAClD2D,EAAAA,CAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CAAZ4E,EAAkD,GAExD,OAAO,CADM3D,CACN,CADkBa,CAClB,CAD6B8C,CAC7B,CAAO5E,CAAP,CAfgC,CAkBzC9G;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAM8D,EAAW9D,CAAM8C,CAAAA,aAAN,CAAoB,IAApB,CAGjB,IAAiB,KAAjB,GAAIgB,CAAJ,CAQE,MANA+C,EAMO,CAND3L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIiB,CAAAA,oBAAlC,CAMC,EAN0D,GAM1D,CALQ,GAKR,GALH0K,CAAA,CAAI,CAAJ,CAKG,GAHLA,CAGK,CAHC,GAGD,CAHOA,CAGP,EAAA,CADA,GACA,CADMA,CACN,CAAO3L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIiB,CAAAA,oBAAX,CAGP0K,EAAA,CADe,KAAjB,GAAI/C,CAAJ,EAAuC,KAAvC,GAA0BA,CAA1B,EAA6D,KAA7D,GAAgDA,CAAhD,CACQ5I,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImB,CAAAA,cAAlC,CADR,EAC6D,GAD7D,CAGQnB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAlC,CAHR,EAGyD,GAIzD,QAAQqG,CAAR,EACE,KAAK,KAAL,CACE,IAAAlF,EAAO,MAAPA,CAAgBiI,CAAhBjI,CAAsB,GACtB,MACF,MAAK,MAAL,CACEA,CAAA,CAAO,OAAP,CAAiBiI,CAAjB,CAAuB,GACvB,MACF,MAAK,IAAL,CACEjI,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,GACtB;KACF,MAAK,KAAL,CACEjI,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,GACtB,MACF,MAAK,OAAL,CACEjI,CAAA,CAAO,SAAP,CAAmBiI,CAAnB,CAAyB,GACzB,MACF,MAAK,OAAL,CACEjI,CAAA,CAAO,QAAP,CAAkBiI,CAAlB,CAAwB,GACxB,MACF,MAAK,SAAL,CACEjI,CAAA,CAAO,OAAP,CAAiBiI,CAAjB,CAAuB,GACvB,MACF,MAAK,WAAL,CACEjI,CAAA,CAAO,QAAP,CAAkBiI,CAAlB,CAAwB,GACxB,MACF,MAAK,KAAL,CACEjI,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,gBACtB,MACF,MAAK,KAAL,CACEjI,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,gBACtB,MACF,MAAK,KAAL,CACEjI,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,gBAhC1B,CAmCA,GAAIjI,CAAJ,CACE,MAAO,CAACA,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAIT,QAAQqI,CAAR,EACE,KAAK,OAAL,CACElF,CAAA,CAAO,MAAP,CAAgBiI,CAAhB,CAAsB,aACtB,MACF,MAAK,MAAL,CACEjI,CAAA,CAAO,OAAP,CAAiBiI,CAAjB,CAAuB,gBACvB,MACF,MAAK,MAAL,CACEjI,CAAA,CAAO,OAAP,CAAiBiI,CAAjB,CAAuB,gBACvB;KACF,MAAK,MAAL,CACEjI,CAAA,CAAO,OAAP,CAAiBiI,CAAjB,CAAuB,gBACvB,MACF,SACE,KAAM1C,MAAA,CAAM,yBAAN,CAAkCL,CAAlC,CAAN,CAdJ,CAgBA,MAAO,CAAClF,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAImB,CAAAA,cAAX,CA9E4B,CAiFrCnB,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAUrC,MARkB8G,CAChB,GAAM,CAAC,MAAD,CAAS5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAb,CADUyL,CAEhB,EAAK,CAAC,KAAD,CAAQ5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAZ,CAFWyL,CAGhB,aAAgB,CAAC,mBAAD,CAAsB5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAImB,CAAAA,cAA1B,CAHAyK,CAIhB,MAAS,CAAC,SAAD,CAAY5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAhB,CAJOyL,CAKhB,QAAW,CAAC,WAAD,CAAc5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAlB,CALKyL,CAMhB,SAAY,CAAC,KAAD,CAAQ5L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAZ,CANIyL,CAQX,CAAU9G,CAAM8C,CAAAA,aAAN,CAAoB,UAApB,CAAV,CAV8B,CAavC5H;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,oBAAA,CAA8B,QAAQ,CAAC8E,CAAD,CAAQ,CAG5C,IAAM+G,EAAa,CACjB,KAAQ,CAAC,EAAD,CAAK,WAAL,CAAkB7L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAtB,CAAqCpB,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0B,CAAAA,cAAzC,CADS,CAEjB,IAAO,CAAC,EAAD,CAAK,WAAL,CAAkB1B,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAtB,CAAqCpB,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0B,CAAAA,cAAzC,CAFU,CAGjB,MAAS,CAAC,SAAD,CAAY,GAAZ,CAAiB1B,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAArB,CAAiCvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAArC,CAHQ,CAIjB,SAAY,CAAC,EAAD,CAAK,MAAL,CAAaP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyB,CAAAA,gBAAjB,CAAmCzB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyB,CAAAA,gBAAvC,CAJK,CAKjB,SAAY,CAAC,EAAD,CAAK,MAAL,CAAazB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyB,CAAAA,gBAAjB,CAAmCzB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyB,CAAAA,gBAAvC,CALK,CAMjB,aAAgB,CAAC,IAAD,CAAO,IAAP,CAAazB,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAjB;AAAgCpB,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0B,CAAAA,cAApC,CANC,CAOjB,MAAS,CAAC,IAAD,CAAO,IAAP,CAAa1B,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAjB,CAA6BvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAjC,CAPQ,CAAnB,CASMuL,EAAmBhH,CAAM8C,CAAAA,aAAN,CAAoB,UAApB,CACnB,EAAA,CAAA,CAAA,CAAA,OAAA,CAAA,YAAA,CAA4CiE,CAAA,CAAWC,CAAX,CAA5C,CAAA,KAACC,EAAD,CAAA,CAAA,IAAA,EAAA,CAAA,KAAA,CAASC,EAAT,CAAA,CAAA,IAAA,EAAA,CAAA,KAAA,CAAiBC,EAAjB,CAAA,CAAA,IAAA,EAAA,CAAA,KAA6BC,EAAAA,CAA7B,CAAA,CAAA,IAAA,EAAA,CAAA,KACAC,EAAAA,CAAgBnM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,iBAAvB,CAClBmH,CADkB,CAAhBE,EACa,GAEnB,IAAyB,OAAzB,GAAIL,CAAJ,CAsBEpI,CAAA,CApBqB1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,cAArBA,CAAqC,aAArCA,CACdxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADUF,CAAqC,kiBAArCA,CAoBrB;AAAsB,GAAtB,CAA4B2D,CAA5B,CAA4C,GAtB9C,KAuBO,IAAyB,cAAzB,GAAIL,CAAJ,CAAyC,CACxCM,CAAAA,CAAUpM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,SAAvB,CACZ9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aADQ,CAAVgL,EACoB,GAC1B,IAAgB,GAAhB,GAAIA,CAAJ,CACE,MAAO,CAAC,OAAD,CAAUpM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAd,CAGTuD,EAAA,CAAOyI,CAAP,CAAuB,KAAvB,CAA+BC,CAA/B,CAAyC,OAPK,CAAzC,IASL1I,EAAA,CAAOqI,CAAP,CAAgBI,CAAhB,CAAgCH,CAElC,OAAO,CAACtI,CAAD,CAAOwI,CAAP,CAnDqC,CAsD9ClM,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAMiD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqB,CAAAA,cAApC,CAAZ0G,EAAmE,GAGzE,OADI/H,EAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZK,CAAoBlD,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApBI,CAAgDH,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzDE,CACJ,CAAiB,MAAjB,CAA0BD,CAA1B,CAAsC,KALH,CASrC/H,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoBA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAEpBA;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,SAAA,CAAmBA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAEnBA;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAMuH,EAAOvH,CAAM8C,CAAAA,aAAN,CAAoB,IAApB,CAGb,QAAQyE,CAAR,EACE,KAAK,KAAL,CACEC,CAAA,CACItM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAnC,CADJ,EAC+D,SAC/DmD,EAAA,CAAO,YAAP,CAAsB4I,CAAtB,CAA6B,GAC7B,MACF,MAAK,KAAL,CACEA,CAAA,CACItM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAnC,CADJ,EAC+D,SAC/DmD,EAAA,CAAO,MAAP,CAAgB4I,CAAhB,CAAuB,GACvB,MACF,MAAK,KAAL,CACEA,CAAA,CACItM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAnC,CADJ,EAC+D,SAC/DmD,EAAA,CAAO,MAAP,CAAgB4I,CAAhB,CAAuB,GACvB,MACF,MAAK,SAAL,CACQ9D,CAAAA,CAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,WAArB,CAAkC,aAAlC;AAChBzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADY,CAAkC,iEAAlC,CAKrB4D,EAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP,EAAyD,SACzDmB,EAAA,CAAO8E,CAAP,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,GACnC,MAEF,MAAK,QAAL,CACQ9D,CAAAA,CAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,aAArB,CAAoC,aAApC,CAChBzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADY,CAAoC,sLAApC,CAOrB4D;CAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP,EAAyD,IACzDmB,EAAA,CAAO8E,CAAP,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,GACnC,MAEF,MAAK,MAAL,CAIQ9D,CAAAA,CAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,YAArB,CAAmC,aAAnC,CAChBzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADY,CAAmC,qOAAnC,CASrB4D,EAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP,EAAyD,IACzDmB;CAAA,CAAO8E,CAAP,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,GACnC,MAEF,MAAK,SAAL,CACQ9D,CAAAA,CAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,yBAArB,CAAgD,aAAhD,CAChBzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADY,CAAgD,uPAAhD,CASrB4D,EAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP,EAAyD,IACzDmB,EAAA,CAAO8E,CAAP,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,GACnC,MAEF,MAAK,QAAL,CACQ9D,CAAAA;AAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,kBAArB,CAAyC,aAAzC,CAChBzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADY,CAAyC,sEAAzC,CAMrB4D,EAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP,EAAyD,IACzDmB,EAAA,CAAO8E,CAAP,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,GACnC,MAEF,SACE,KAAMrD,MAAA,CAAM,oBAAN,CAA6BoD,CAA7B,CAAN,CAjFJ,CAmFA,MAAO,CAAC3I,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAxF6B,CA2FtCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAMiD,EACF/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,UAAvB,CAAmC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAvC,CADE2G,EACuD,GACvD2D,EAAAA,CAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,SAAvB,CAAkC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAtC,CAAZsK,EAAoE,GAE1E,OAAO,CADM3D,CACN,CADkB,KAClB,CAD0B2D,CAC1B,CAAO1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIoB,CAAAA,aAAX,CAN4B,CASrCpB;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,cAAA,CAAwB,QAAQ,CAAC8E,CAAD,CAAQ,CAEtC,IAAMiD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAZwF,EAA+D,GAArE,CACM2D,EAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAlC,CAAZmJ,EAA6D,GAC7Da,EAAAA,CACFvM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CADEgK,EACgD,UAGtD,OAAO,CADH,UACG,CADUxE,CACV,CADsB,IACtB,CAD6B2D,CAC7B,CADyC,KACzC,CADiDa,CACjD,CAD6D,GAC7D,CAAOvM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAR+B,CAWxCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyB,QAAQ,CAAC8E,CAAD,CAAQ,CAEvC,IAAMiD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAZwF,EAA8D,GAC9D2D,EAAAA,CAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAjC,CAAZmJ,EAA4D,GAUlE,OAAO,CATc1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,iBAArBA,CAAwC,aAAxCA,CACZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQF,CAAwC,0FAAxCA,CASd,CADqB,GACrB,CAD2BT,CAC3B,CADuC,IACvC,CAD8C2D,CAC9C,CAD0D,GAC1D,CAAO1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAbgC,CAgBzCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,iBAAA,CAA2B,QAAQ,CAAC8E,CAAD,CAAQ,CAEzC,MAAO,CAAC,mCAAD,CAAsC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAA1C,CAFkC,CAK3CP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAElC,IAAMiD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAhC,CAAZwF,EAA2D,GAEjE,OAAO,CACL,QADK,EADW/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAhC,CACX,EAD0D,GAC1D,EACkB,IADlB,CACyBwF,CADzB,CACqC,gBADrC,CAEL/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAImB,CAAAA,cAFC,CAJ2B,C,CCzUpC,IAAA,iCAAA,EAOAnB;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,mBAAA,CAA6B,QAAQ,CAAC8E,CAAD,CAAQ,CAKzC,IAAA0H,EAFE1H,CAAMyE,CAAAA,QAAN,CAAe,OAAf,CAAJ,CAEYkD,MAAA,CAAOlF,MAAA,CAAOzC,CAAM8C,CAAAA,aAAN,CAAoB,OAApB,CAAP,CAAP,CAFZ,CAKY5H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAApC,CALZ,EAKqE,GAErE,KAAI8I,EAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,IAA3B,CACbmG,EAAA,CAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0M,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAwBnG,CAAxB,CACLpB,EAAAA,CAAO,EACX,KAAMiJ,EAAU3M,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4B,OAA5B,CAAqC/E,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAA9C,CAAhB,CACI+E,EAASL,CACRA,EAAQM,CAAAA,KAAR,CAAc,OAAd,CAAL,EAAgC,GAAAzH,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBkF,CAArB,CAAhC,GACEK,CACA,CADS7M,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4B,YAA5B,CAA0C/E,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAnD,CACT;AAAApE,CAAA,EAAQmJ,CAAR,CAAiB,KAAjB,CAAyBL,CAAzB,CAAmC,KAFrC,CAMA,OAFA9I,EAEA,EAFQ,OAER,CAFkBiJ,CAElB,CAF4B,QAE5B,CAFuCA,CAEvC,CAFiD,KAEjD,CAFyDE,CAEzD,CAFkE,IAElE,CADIF,CACJ,CADc,SACd,CAD0B1B,CAC1B,CADmC,KACnC,CArB2C,CAwB7CjL,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyBA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,mBAEzBA,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,mBAAA,CAA6B,QAAQ,CAAC8E,CAAD,CAAQ,CAE3C,IAAMiI,EAAwC,OAAxCA,GAAQjI,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAd,CACIG,EACA/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CACIvC,CADJ,CACW,MADX,CACmBiI,CAAA,CAAQ/M,CAAAA,CAAAA,OAAAA,CAAAA,GAAIe,CAAAA,iBAAZ,CAAgCf,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UADvD,CADAwF,EAGA,OAJJ,CAKIkD,EAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,IAA3B,CACbmG,EAAA,CAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0M,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAwBnG,CAAxB,CACLiI,EAAJ,GACEhF,CADF,CACc,GADd,CACoBA,CADpB,CAGA,OAAO,SAAP,CAAmBA,CAAnB,CAA+B,OAA/B,CAAyCkD,CAAzC,CAAkD,KAZP,CAe7CjL;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAMkI,EACFhN,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB7C,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApB,CAAgDC,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzD,CADJ,CAEMC,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAnC,CAAZ4F,EAAoE,GAF1E,CAGM2D,EAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAjC,CAAZuJ,EAAkE,GAHxE,CAIMuB,EAAYjN,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAjC,CAAZ8K,EAAkE,GAJxE,CAKIhC,EAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,IAA3B,CACbmG,EAAA,CAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0M,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAwBnG,CAAxB,CAET,IAAI,GAAAO,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBS,CAArB,CAAJ,EAAuC,GAAA1C,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBoE,CAArB,CAAvC;AACI,GAAArG,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqB2F,CAArB,CADJ,CACqC,CAEnC,IAAMC,EAAK3F,MAAA,CAAOQ,CAAP,CAALmF,EAA0B3F,MAAA,CAAOmE,CAAP,CAChChI,EAAA,CAAO,OAAP,CAAiBsJ,CAAjB,CAA6B,KAA7B,CAAqCjF,CAArC,CAAiD,IAAjD,CAAwDiF,CAAxD,EACKE,CAAA,CAAK,MAAL,CAAc,MADnB,EAC6BxB,CAD7B,CACyC,IADzC,CACgDsB,CAC1CG,EAAAA,CAAO3F,IAAK4F,CAAAA,GAAL,CAAS7F,MAAA,CAAO0F,CAAP,CAAT,CAMbvJ,EAAA,EALa,CAAbA,GAAIyJ,CAAJzJ,CACEA,CADFA,EACUwJ,CAAA,CAAK,IAAL,CAAY,IADtBxJ,EAGEA,CAHFA,GAGWwJ,CAAA,CAAK,MAAL,CAAc,MAHzBxJ,EAGmCyJ,CAHnCzJ,CAKA,GAAQ,OAAR,CAAkBuH,CAAlB,CAA2B,KAA3B,CAXmC,CADrC,IAcEvH,EA2BA,CA3BO,EA2BP,CAzBI2J,CAyBJ,CAzBetF,CAyBf,CAxBKA,CAAU+E,CAAAA,KAAV,CAAgB,OAAhB,CAwBL,EAxBkC,GAAAzH,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBS,CAArB,CAwBlC,GAvBEsF,CAEA,CADIrN,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4BI,CAA5B,CAAwC,QAAxC,CAAkDnF,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAA3D,CACJ,CAAApE,CAAA,EAAQ2J,CAAR,CAAmB,KAAnB,CAA2BtF,CAA3B,CAAuC,KAqBzC,EAnBI8E,CAmBJ,CAnBanB,CAmBb,CAlBKA,CAAUoB,CAAAA,KAAV,CAAgB,OAAhB,CAkBL,EAlBkC,GAAAzH,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBoE,CAArB,CAkBlC;CAjBEmB,CAEA,CADI7M,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4BI,CAA5B,CAAwC,MAAxC,CAAgDnF,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzD,CACJ,CAAApE,CAAA,EAAQmJ,CAAR,CAAiB,KAAjB,CAAyBnB,CAAzB,CAAqC,KAevC,EAXM4B,CAWN,CAVItN,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4BI,CAA5B,CAAwC,MAAxC,CAAgDnF,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzD,CAUJ,CATApE,CASA,EATQ4J,CASR,CATiB,KASjB,CAPE5J,CAOF,CARI,GAAA2B,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqB2F,CAArB,CAAJ,CACEvJ,CADF,EACU8D,IAAK4F,CAAAA,GAAL,CAASH,CAAT,CADV,CACgC,KADhC,EAGEvJ,CAHF,EAGU,MAHV,CAGmBuJ,CAHnB,CAG+B,MAH/B,CAQA,CAFAvJ,CAEA,CAHAA,CAGA,EAHQ,MAGR,CAHiB2J,CAGjB,CAH4B,KAG5B,CAHoCR,CAGpC,CAH6C,OAG7C,GAFQ7M,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MAEZ,CAFqB8C,CAErB,CAF8B,MAE9B,CAFuCA,CAEvC,CAFgD,KAEhD,EADA5J,CACA,EADQ,KACR,CAAAA,CAAA,EAAQ,OAAR,CAAkBsJ,CAAlB,CAA8B,KAA9B,CAAsCK,CAAtC,CAAiD,IAAjD,CAAwDC,CAAxD,CACI,UADJ,CACiBN,CADjB,CAC6B,MAD7B,CACsCH,CADtC,CAC+C,KAD/C,CACuDG,CADvD,CAEI,MAFJ,CAEaH,CAFb,CAEsB,IAFtB,CAE6BG,CAF7B,CAEyC,MAFzC,CAEkDM,CAFlD,CAE2D,OAF3D,CAGIrC,CAHJ;AAGa,KAEf,OAAOvH,EAxD6B,CA2DtC1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,gBAAA,CAA0B,QAAQ,CAAC8E,CAAD,CAAQ,CAExC,IAAMkI,EACFhN,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ2E,CAAAA,OAAZ,CAAoB7C,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAApB,CAAgDC,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAzD,CADJ,CAEMC,EACF/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAnC,CADE4F,EACsD,IAH5D,CAIIkD,EAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,IAA3B,CACbmG,EAAA,CAASjL,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0M,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAwBnG,CAAxB,CAIT,OADI,WACJ,CADkBiD,CAClB,CAD8B,MAC9B,CADuCiF,CACvC,CADmD,OACnD,CAD6D/B,CAC7D,CADsE,KAV9B,CAc1CjL;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,wBAAA,CAAkC,QAAQ,CAAC8E,CAAD,CAAQ,CAEhD,IAAIyI,EAAO,EACPvN,EAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAR,GAEE2C,CAFF,EAEUvN,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAjB,CAAmC9F,CAAnC,CAFV,CAII9E,EAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAR,GAGEyC,CAHF,EAGUvN,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAjB,CAAmChG,CAAnC,CAHV,CAKA,IAAI9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAR,CAA0B,CACxB,IAAM4C,EAAO1I,CAAM2I,CAAAA,eAAN,EACTD,EAAJ,EAAY,CAACA,CAAKE,CAAAA,oBAAlB,GAIEH,CAJF,EAIUvN,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAjB,CAAmC4C,CAAnC,CAJV,CAFwB,CAS1B,OAAQ1I,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAR,EACE,KAAK,OAAL,CACE,MAAO2F,EAAP,CAAc,UAChB,MAAK,UAAL,CACE,MAAOA,EAAP,CAAc,aAJlB,CAMA,KAAMtE,MAAA,CAAM,yBAAN,CAAN;AA3BgD,C,CCzHlD,IAAA,iCAAA,EAKAjJ;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAI6I,EAAI,CAAR,CACIjK,EAAO,EACP1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAR,GAEElH,CAFF,EAEU1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI4K,CAAAA,gBAAjB,CAAmC9F,CAAnC,CAFV,CAIA,GAAG,CACD,IAAA8I,EAAgB5N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA8B6I,CAA9B,CAAiC3N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAArC,CAAhBqL,EAAoE,OACpE,KAAAC,EAAa7N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,IAA3B,CAAkC6I,CAAlC,CACT3N,EAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAR,GACE+C,CADF,CACe7N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwF,CAAAA,WAAJ,CACIxF,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAjB,CAAmChG,CAAnC,CADJ,CAC+C9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MADnD,CADf,CAGMqD,CAHN,CAKAnK,EAAA,GAAa,CAAJ,CAAAiK,CAAA,CAAQ,QAAR,CAAmB,EAA5B,EAAkC,MAAlC,CAA2CC,CAA3C,CAA2D,OAA3D,CACIC,CADJ,CACiB,GACjBF,EAAA,EAVC,CAAH,MAWS7I,CAAMgJ,CAAAA,QAAN,CAAe,IAAf,CAAsBH,CAAtB,CAXT,CAaA,IAAI7I,CAAMgJ,CAAAA,QAAN,CAAe,MAAf,CAAJ;AAA8B9N,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAlC,CACE+C,CAMA,CANa7N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkL,CAAAA,eAAJ,CAAoBpG,CAApB,CAA2B,MAA3B,CAMb,CALI9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAKR,GAJE+C,CAIF,CAJe7N,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwF,CAAAA,WAAJ,CACIxF,CAAAA,CAAAA,OAAAA,CAAAA,GAAI6K,CAAAA,QAAJ,CAAa7K,CAAAA,CAAAA,OAAAA,CAAAA,GAAI8K,CAAAA,gBAAjB,CAAmChG,CAAnC,CADJ,CAC+C9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIwK,CAAAA,MADnD,CAIf,CAFMqD,CAEN,EAAAnK,CAAA,EAAQ,WAAR,CAAsBmK,CAAtB,CAAmC,GAErC,OAAOnK,EAAP,CAAc,IA9BqB,CAiCrC1D,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyBA,CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAEzBA;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAIrC,IAAM8D,EADFU,CAAC,GAAM,IAAPA,CAAa,IAAO,IAApBA,CAA0B,GAAM,GAAhCA,CAAqC,IAAO,IAA5CA,CAAkD,GAAM,GAAxDA,CAA6D,IAAO,IAApEA,CACa,CAAUxE,CAAM8C,CAAAA,aAAN,CAAoB,IAApB,CAAV,CAAjB,CACMd,EAAsB,IAAd,GAAC8B,CAAD,EAAmC,IAAnC,GAAsBA,CAAtB,CAA2C5I,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0B,CAAAA,cAA/C,CAC2C1B,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyB,CAAAA,gBAF7D,CAGMsG,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CAAZiB,EAAkD,GAClD2D,EAAAA,CAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CAAZ4E,EAAkD,GAExD,OAAO,CADM3D,CACN,CADkB,GAClB,CADwBa,CACxB,CADmC,GACnC,CADyC8C,CACzC,CAAO5E,CAAP,CAV8B,CAavC9G;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,eAAA,CAAyB,QAAQ,CAAC8E,CAAD,CAAQ,CAEvC,IAAM8D,EAA0C,KAA/B,GAAC9D,CAAM8C,CAAAA,aAAN,CAAoB,IAApB,CAAD,CAAwC,IAAxC,CAA+C,IAAhE,CACMd,EACY,IAAd,GAAC8B,CAAD,CAAsB5I,CAAAA,CAAAA,OAAAA,CAAAA,GAAI+B,CAAAA,iBAA1B,CAA8C/B,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgC,CAAAA,gBAFtD,CAGI+F,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CACZ4E,EAAAA,CAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,GAAvB,CAA4BgC,CAA5B,CAChB,IAAKiB,CAAL,EAAmB2D,CAAnB,CAIO,CAEL,IAAMqC,EAAgC,IAAd,GAACnF,CAAD,CAAsB,MAAtB,CAA+B,OAClDb,EAAL,GACEA,CADF,CACcgG,CADd,CAGKrC,EAAL,GACEA,CADF,CACcqC,CADd,CANK,CAJP,IAGErC,EAAA,CADA3D,CACA,CADY,OAad,OAAO,CADMA,CACN,CADkB,GAClB,CADwBa,CACxB,CADmC,GACnC,CADyC8C,CACzC,CAAO5E,CAAP,CAtBgC,CAyBzC9G,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAMgC,EAAQ9G,CAAAA,CAAAA,OAAAA,CAAAA,GAAIe,CAAAA,iBAGlB,OAAO,CADM,GACN,EAFWf,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+BgC,CAA/B,CAEX,EAFoD,MAEpD,EAAOA,CAAP,CAL6B,CAQtC9G;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAGrC,MAAO,CADuC,MAAjCpB,GAACoB,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAADlE,CAA2C,MAA3CA,CAAoD,OAC1D,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAX,CAH8B,CAMvCH,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAElC,MAAO,CAAC,MAAD,CAAS9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAb,CAF2B,CAKpCH;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAErC,IAAMkJ,EACFhO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkC,CAAAA,iBAAjC,CADE8L,EACqD,OAD3D,CAEMC,EACFjO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkC,CAAAA,iBAAnC,CADE+L,EACuD,MACvDC,EAAAA,CACFlO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkC,CAAAA,iBAAnC,CADEgM,EACuD,MAE7D,OAAO,CADMF,CACN,CADiB,KACjB,CADyBC,CACzB,CADsC,KACtC,CAD8CC,CAC9C,CAAOlO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIkC,CAAAA,iBAAX,CAT8B,C,CCtFvC,IAAA,iCAAA,EAOAlC,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,kBAAA,CAA4B,QAAQ,CAAC8E,CAAD,CAAQ,CAE1C,MAAO,CAAC,SAAD,CAAY9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAhB,CAFmC,CAK5CP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,iBAAA,CAA2B,QAAQ,CAAC8E,CAAD,CAAQ,CAGzC,IADA,IAAIpB,EAAW4E,KAAJ,CAAUxD,CAAMoD,CAAAA,UAAhB,CAAX,CACSzC,EAAI,CAAb,CAAgBA,CAAhB,CAAoBX,CAAMoD,CAAAA,UAA1B,CAAsCzC,CAAA,EAAtC,CACE/B,CAAA,CAAK+B,CAAL,CAAA,CAAUzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA+BW,CAA/B,CAAkCzF,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAtC,CAAV,EAA+D,MAEjEmB,EAAA,CAAO,QAAP,CAAkBA,CAAKK,CAAAA,IAAL,CAAU,IAAV,CAAlB,CAAoC,GACpC,OAAO,CAACL,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAPkC,CAU3CP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAM0D,EAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,cAArB,CAAqC,aAArC,CACZzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQ,CAAqC,8IAArC,CAArB,CASMyF,EAAUnO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAV4L,EAA4D,MAC5DC,EAAAA,CAAcpO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAlC,CAAd6L,EAA+D,GAErE,OAAO,CADM5F,CACN,CADqB,GACrB,CAD2B2F,CAC3B,CADqC,IACrC,CAD4CC,CAC5C,CAD0D,GAC1D,CAAOpO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAd6B,CAiBtCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAM0D,EAAexI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,QAArB,CAA+B,aAA/B,CACZzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQ,CAA+B,qHAA/B,CASf4D,EAAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAP+J,EAA0D,IAChE,OAAO,CAAC9D,CAAD,CAAgB,GAAhB,CAAsB8D,CAAtB,CAA6B,GAA7B,CAAkCtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAtC,CAZ6B,CAetCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAIrC,MAAO,CAAC,QAAD,EADH9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAApC,CACG,EADyD,SACzD,EAAwB,GAAxB,CAA6BP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAjC,CAJ8B,CAOvCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAErC,IAAMiD,EAAY/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAZwF,EAA8D,IAApE,CACM2D,EAAY1L,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAApC,CAAZoL,EAAiE,IADvE,CAEI5C,EAAa,KAFjB,CAGIC,EAAkB,EAClBjE,EAAMlC,CAAAA,SAAUmE,CAAAA,OAAQC,CAAAA,aAA5B,GACE8B,CACA,CADa,IACb,CAAAC,CAAA,CAAkB,MAFpB,CA6BA,OAAO,EAxB4B,OAAnCP,GAAI1D,CAAM8C,CAAAA,aAAN,CAAoB,KAApB,CAAJY,CAEiBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,SAArB,CAAgC,aAAhC,CACRzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADI,CAAgC,wIAAhC;AAGkCK,CAHlC,CAAgC,mBAAhC,CAKRD,CALQ,CAAgC,QAAhC,CAFjBN,CAYiBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJ,CAAqB,aAArB,CAAoC,aAApC,CACRzI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADI,CAAoC,oCAApC,CAEPI,CAFO,CAAoC,oHAApC,CAImCC,CAJnC,CAAoC,8BAApC,CAYV,EADqB,GACrB,CAD2B2C,CAC3B,CADuC,IACvC,CAD8C3D,CAC9C,CAD0D,GAC1D,CAAO/H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAnC8B,CAsCvCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,cAAA,CAAwB,QAAQ,CAAC8E,CAAD,CAAQ,CAEtC,IAAMuJ,EAAOvJ,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAPyG,EAAsC,KAE5C,QADcvJ,CAAM8C,CAAAA,aAAN,CAAoB,OAApB,CACd,EAD8C,YAC9C,EACE,KAAK,OAAL,CACE,GAAa,KAAb,GAAIyG,CAAJ,CAIE,MAAO,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAApC,CAEG,EAFkD,SAElD,EADa,KACb,CAAON,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAAX,CACF,IAAa,YAAb,GAAI+N,CAAJ,CAIL,MAAO,CADM,cACN,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAEG,EAFgD,SAEhD,EAD8B,GAC9B,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,QAAb,GAAI8N,CAAJ,CAGL,MAAO,cAAP,EADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CACJ;AADuD,SACvD,EAA+B,MAEjC,MACF,MAAK,MAAL,CACE,GAAa,KAAb,GAAI8L,CAAJ,CAIE,MAAO,CADM,MACN,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAEG,EAFgD,SAEhD,EADsB,GACtB,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,YAAb,GAAI8N,CAAJ,CAIL,MAAO,CADM,YACN,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAEG,EAFgD,SAEhD,EAD4B,GAC5B,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,QAAb,GAAI8N,CAAJ,CAGL,MAAO,YAAP,EADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CACJ,EADuD,SACvD,EAA6B,MAE/B,MACF,MAAK,YAAL,CACE,IAAM6E,EAAKpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB;AAAuB,IAAvB,CACX,IAAa,KAAb,GAAIuJ,CAAJ,CAIE,MAAO,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAApC,CAEG,EAFkD,SAElD,EADa,GACb,CADmB8G,CACnB,CADwB,GACxB,CAAOpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAAX,CACF,IAAa,YAAb,GAAI+N,CAAJ,CAIL,MAAO,CADM,eACN,EAFHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAEG,EAFgD,SAEhD,EAD+B,IAC/B,CADsC6E,CACtC,CAD2C,SAC3C,CAAOpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,QAAb,GAAI8N,CAAJ,CAGL,MAAO,eAAP,EADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CACJ,EADuD,SACvD,EAAgC,IAAhC,CAAuC6E,CAAvC,CAA4C,SAE9C,MAEF,MAAK,UAAL,CACE,GAAa,KAAb,GAAIiH,CAAJ,CAKE,MAJM/B,EAIC,CAHHtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB;AAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAGG,EAHgD,SAGhD,CAFD6E,CAEC,CAFIpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CAA6B,CAA7B,CAAgC,CAAA,CAAhC,CAEJ,CAAA,CADM,cACN,CADuBwH,CACvB,CAD8B,IAC9B,CADqClF,CACrC,CAD0C,SAC1C,CAAOpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,YAAb,GAAI8N,CAAJ,EAAsC,QAAtC,GAA6BA,CAA7B,CAAgD,CAC/C/B,CAAAA,CACFtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CADE+J,EACiD,SACjDlF,EAAAA,CACFpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CAA6B,CAA7B,CAAgC,CAAA,CAAhC,CAAuC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIsB,CAAAA,iBAA3C,CACEoC,EAAAA,CAAO,eAAPA,CAAyB4I,CAAzB5I,CAAgC,UAAhCA,CAA6C4I,CAA7C5I,CAAoD,MAApDA,CAA6D0D,CAA7D1D,CACF,SACJ,IAAa,YAAb,GAAI2K,CAAJ,CACE,MAAO,CAAC3K,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,QAAb,GAAI8N,CAAJ,CACL,MAAO3K,EAAP,CAAc,KAVqC,CAavD,KACF,MAAK,QAAL,CACQ4I,CAAAA;AAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAP+J,EAA0D,SAChE,IAAa,KAAb,GAAI+B,CAAJ,CAOE,MAAO,CANcrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,uBAArBA,CAA8C,aAA9CA,CAClBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADcF,CAA8C,yDAA9CA,CAMd,CADqB,GACrB,CAD2B8D,CAC3B,CADkC,GAClC,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,YAAb,GAAI8N,CAAJ,CAUL,MAAO,CARHrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,8BAArBA,CAAqD,aAArDA,CACDxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADHF,CAAqD,qGAArDA,CAQG;AADqB,GACrB,CAD2B8D,CAC3B,CADkC,GAClC,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CACF,IAAa,QAAb,GAAI8N,CAAJ,CAML,MALqBrO,EAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,0BAArBA,CAAiD,aAAjDA,CAClBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADcF,CAAiD,0DAAjDA,CAKrB,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,MAtGzC,CA2GA,KAAMrD,MAAA,CAAM,yCAAN,CAAN,CA/GsC,CAkHxCjJ;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,cAAA,CAAwB,QAAQ,CAAC8E,CAAD,CAAQ,CAGtC,IAAMuJ,EAAOvJ,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAAPyG,EAAsC,KAA5C,CACMrF,EAAQlE,CAAM8C,CAAAA,aAAN,CAAoB,OAApB,CAARoB,EAAwC,YAD9C,CAEMT,EAAQvI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,IAAvB,CAA6B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImC,CAAAA,gBAAjC,CAARoG,EAA8D,MAapE,QAAQS,CAAR,EACE,KAAK,OAAL,CACE,GAAa,KAAb,GAAIqF,CAAJ,CAGE,OADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAAnC,CACJ,EADwD,SACxD,EAAc,QAAd,CAAyBiI,CAAzB,CAAiC,KAC5B,IAAa,QAAb,GAAI8F,CAAJ,CAGL,MAAO,gBAAP,EADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CACJ,EADsD,SACtD,EAAiC,IAAjC,CAAwCgG,CAAxC,CAAgD,MAElD,MACF,MAAK,MAAL,CACQ+D,CAAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB;AAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP+J,EAAyD,SAC/D,IAAa,KAAb,GAAI+B,CAAJ,CAME,MALqBrO,EAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,qBAArBA,CAA4C,aAA5CA,CAClBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADcF,CAA4C,8DAA5CA,CAKrB,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,IAAnC,CAA0C/D,CAA1C,CAAkD,MAC7C,IAAa,QAAb,GAAI8F,CAAJ,CACL,MAAO,aAAP,CAAuB/B,CAAvB,CAA8B,IAA9B,CAAqC/D,CAArC,CAA6C,MAE/C,MAEF,MAAK,YAAL,CACQnB,CAAAA,CAAKpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CACX,IAAa,KAAb,GAAIuJ,CAAJ,CAGE,OADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIM,CAAAA,YAAnC,CACJ,EADwD,SACxD,EAAc,GAAd,CAAoB8G,CAApB,CAAyB,MAAzB,CAAkCmB,CAAlC,CAA0C,KACrC,IAAa,QAAb,GAAI8F,CAAJ,CAGL,MAAO,eAAP;CADIrO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CACJ,EADsD,SACtD,EAAgC,IAAhC,CAAuC6E,CAAvC,CAA4C,OAA5C,CAAsDmB,CAAtD,CAA8D,MAEhE,MAEF,MAAK,UAAL,CACQ+D,CAAAA,CAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP+J,EAAyD,SACzDlF,EAAAA,CAAKpH,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,IAAvB,CAA6B,CAA7B,CACX,IAAa,KAAb,GAAIuJ,CAAJ,CAME,MALqBrO,EAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,oBAArBA,CAA2C,aAA3CA,CAClBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADcF,CAA2C,qEAA3CA,CAKrB,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,IAAnC,CAA0ClF,CAA1C,CAA+C,IAA/C,CAAsDmB,CAAtD,CAA8D,MACzD,IAAa,QAAb,GAAI8F,CAAJ,CAML,MALqBrO,EAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,uBAArBA;AAA8C,aAA9CA,CAClBxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADcF,CAA8C,4FAA9CA,CAKrB,CAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,IAAnC,CAA0ClF,CAA1C,CAA+C,IAA/C,CAAsDmB,CAAtD,CAA8D,MAEhE,MAEF,MAAK,QAAL,CACE+F,CAAA,CACItO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAI2B,CAAAA,eAAnC,CADJ,EAC2D,SArE7D,IAAI2M,CAAWxB,CAAAA,KAAX,CAAiB,SAAjB,CAAJ,CACE,CAAA,CAAO,EADT,KAAA,CAGMyB,CAAAA,CAAUvO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4B,UAA5B,CAAwC/E,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAAjD,CAChB,KAAMpE,EAAO6K,CAAP7K,CAAiB,MAAjBA,CAA0B4K,CAA1B5K,CAAuC,KAC7C4K,EAAA,CAAaC,CACb,EAAA,CAAO7K,CANP,CAwEQ8K,CAAAA,CAAOxO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIgD,CAAAA,OAAQ4J,CAAAA,eAAZ,CAA4B,OAA5B,CAAqC/E,CAAAA,CAAAA,4BAAAA,CAAAA,QAASC,CAAAA,QAA9C,CACbpE;CAAA,EAAQ8K,CAAR,CAAe,mBAAf,CAAqClC,CAArC,CAA4C,SAC5C,IAAa,KAAb,GAAI+B,CAAJ,CAEE,MADA3K,EACA,EADQ4I,CACR,CADe,GACf,CADqBkC,CACrB,CAD4B,MAC5B,CADqCjG,CACrC,CAD6C,KAC7C,CACK,IAAa,QAAb,GAAI8F,CAAJ,CAEL,MADA3K,EACA,EADQ,eACR,CAD0B4I,CAC1B,CADiC,IACjC,CADwCkC,CACxC,CAD+C,OAC/C,CADyDjG,CACzD,CADiE,MACjE,CAvEN,CA2EA,KAAMU,MAAA,CAAM,yCAAN,CAAN,CA7FsC,CAgGxCjJ;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,gBAAA,CAA0B,QAAQ,CAAC8E,CAAD,CAAQ,CAExC,IAAMwH,EAAOtM,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAP+J,EAAyD,SAA/D,CACMpD,EAASpE,CAAM8C,CAAAA,aAAN,CAAoB,QAApB,CADf,CAEMuB,EAASrE,CAAM8C,CAAAA,aAAN,CAAoB,QAApB,CAEf,IAAe,OAAf,GAAIsB,CAAJ,EAAqC,MAArC,GAA0BC,CAA1B,CAEO,GACHmD,CAAKQ,CAAAA,KAAL,CAAW,SAAX,CADG,EAES,UAFT,GAEF5D,CAFE,EAEkC,YAFlC,GAEuBC,CAFvB,CAEiD,CAItD,OAAQD,CAAR,EACE,KAAK,YAAL,CACEE,CAAA,CAAMpJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CACN,MACF,MAAK,UAAL,CACEsE,CAAA,CAAMpJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CAA8B,CAA9B,CAAiC,CAAA,CAAjC,CAAwC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIsB,CAAAA,iBAA5C,CACN8H,EAAA,CAAM,QAAN,CAAiBkD,CAAjB,CAAwB,MAAxB,CAAiClD,CACjC,MACF,MAAK,OAAL,CACEA,CAAA,CAAM,GACN,MACF,SACE,KAAMH,MAAA,CAAM,sCAAN,CAAN;AAZJ,CAgBA,OAAQE,CAAR,EACE,KAAK,YAAL,CACEE,CAAA,CAAMrJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CAA8B,CAA9B,CAAiC,CAAA,CAAjC,CAAwC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIsB,CAAAA,iBAA5C,CACG+H,EAAT,EAAe,KAGb1D,EAAA,CAFE,GAAAN,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBmF,MAAA,CAAOrD,CAAP,CAArB,CAAJ,EACIqD,MAAA,CAAOrD,CAAP,CAAY0D,CAAAA,KAAZ,CAAkB,UAAlB,CADJ,CAEEnH,CAFF,CAEYyD,CAFZ,CAIEzD,CAJF,EAIY,GAJZ,CAIkByD,CAJlB,CAIwB,GAJxB,CAMAzD,EAAA,EAAU,MACV,MACF,MAAK,UAAL,CACE0D,CAAA,CAAMrJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CAA8B,CAA9B,CAAiC,CAAA,CAAjC,CAAwC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIsB,CAAAA,iBAA5C,CACNqE,EAAA,CAAS,QAAT,CAAoB2G,CAApB,CAA2B,MAA3B,CAAoCjD,CAApC,CAA0C,KAGxC1D,EAAA,CAFE,GAAAN,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBmF,MAAA,CAAOrD,CAAP,CAArB,CAAJ,EACIqD,MAAA,CAAOrD,CAAP,CAAY0D,CAAAA,KAAZ,CAAkB,UAAlB,CADJ,CAEEnH,CAFF,CAEYyD,CAFZ,CAIEzD,CAJF,EAIY,GAJZ,CAIkByD,CAJlB,CAIwB,GAJxB,CAMA,MACF,MAAK,MAAL,CACEzD,CAAA,CAAS,QAAT,CAAoB2G,CAApB,CAA2B,MAGzB3G;CAAA,CAFE,GAAAN,CAAAA,CAAAA,mCAAYiC,CAAAA,QAAZ,EAAqBmF,MAAA,CAAOrD,CAAP,CAArB,CAAJ,EACIqD,MAAA,CAAOrD,CAAP,CAAY0D,CAAAA,KAAZ,CAAkB,UAAlB,CADJ,CAEEnH,CAFF,CAEYyD,CAFZ,CAIEzD,CAJF,EAIY,GAJZ,CAIkByD,CAJlB,CAIwB,GAJxB,CAMA,MACF,SACE,KAAMH,MAAA,CAAM,sCAAN,CAAN,CAhCJ,CAkCAvF,CAAA,CAAO,cAAP,CAAwB4I,CAAxB,CAA+B,IAA/B,CAAsClD,CAAtC,CAA4C,IAA5C,CAAmDzD,CAAnD,CAA4D,GAtDN,CAFjD,IAyDA,CACL,IAAMyD,EAAMpJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CACNuE,EAAAA,CAAMrJ,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuG,CAAAA,WAAJ,CAAgBzB,CAAhB,CAAuB,KAAvB,CAuBZpB,EAAA,CAtBqB1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,mBAArBA,CAA0C,aAA1CA,CACdxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADUF,CAA0C,moBAA1CA,CAsBrB;AAAsB,GAAtB,CAA4B8D,CAA5B,CAAmC,KAAnC,CAA4CpD,CAA5C,CAAqD,KAArD,CAA8DE,CAA9D,CAAoE,KAApE,CACID,CADJ,CACa,KADb,CACsBE,CADtB,CAC4B,GA1BvB,CA4BP,MAAO,CAAC3F,CAAD,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CA7FiC,CAgG1CP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAElC,IAAM2J,EAAWzO,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAXkM,EAA6D,SAAnE,CACMC,EAAiD,GAArC,GAAA5J,CAAM8C,CAAAA,aAAN,CAAoB,WAApB,CAAA,CAA2C,CAA3C,CAA+C,CAAC,CAC5DhC,EAAAA,CAAOd,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAmBb,OAAO,CAlBc5H,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,YAArBA,CAAmC,aAAnCA,CACZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQF,CAAmC,4UAAnCA,CAkBd,CADY,GACZ;AADkBiG,CAClB,CAD6B,KAC7B,CADqC7I,CACrC,CAD4C,KAC5C,CADoD8I,CACpD,CADgE,GAChE,CAAW1O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAf,CAvB2B,CA0BpCP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,WAAA,CAAqB,QAAQ,CAAC8E,CAAD,CAAQ,CAEnC,IAAI6J,EAAc3O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAlB,CACMqM,EAAc5O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAdqM,EAAiE,IACjEP,EAAAA,CAAOvJ,CAAM8C,CAAAA,aAAN,CAAoB,MAApB,CAEb,IAAa,OAAb,GAAIyG,CAAJ,CACOM,CAGL,GAFEA,CAEF,CAFgB,IAEhB,EAAAnG,CAAA,CAAe,SAJjB,KAKO,IAAa,MAAb,GAAI6F,CAAJ,CACAM,CAGL,GAFEA,CAEF,CAFgB,SAEhB,EAAAnG,CAAA,CAAe,SAJV,KAML,MAAMS,MAAA,CAAM,gBAAN,CAAyBoF,CAAzB,CAAN,CAGF,MAAO,CADM7F,CACN,CADqB,GACrB,CAD2BoG,CAC3B,CADyC,IACzC,CADgDD,CAChD,CAD8D,GAC9D,CAAO3O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CApB4B,CAuBrCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAIrC,MAAO,CADM,gBACN,EAFM9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAEN,EAFwD,IAExD,EADgC,GAChC,CAAOvC,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAJ8B,C,CCjdvC,IAAA,kCAAA,EAKAP,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAGrC,MAAO,CADM9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAImE,CAAAA,MAAJT,CAAWoB,CAAM8C,CAAAA,aAAN,CAAoB,QAApB,CAAXlE,CACN,CAAO1D,CAAAA,CAAAA,OAAAA,CAAAA,GAAIG,CAAAA,YAAX,CAH8B,CAMvCH,EAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,aAAA,CAAuB,QAAQ,CAAC8E,CAAD,CAAQ,CAQrC,MAAO,CANc9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,eAArBA,CAAsC,aAAtCA,CACZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQF,CAAsC,wFAAtCA,CAMd,CADqB,IACrB,CAAOxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAR8B,CAWvCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,UAAA,CAAoB,QAAQ,CAAC8E,CAAD,CAAQ,CAElC,IAAM+J,EAAM7O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,KAAvB,CAA8B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAlC,CAANsM,EAAuD,CAA7D,CACMC,EAAQ9O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAARuM,EAA2D,CAC3DC,EAAAA,CAAO/O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,MAAvB,CAA+B9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAnC,CAAPwM,EAAyD,CAc/D,OAAO,CAbc/O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,YAArBA,CAAmC,aAAnCA,CACZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQF,CAAmC,0VAAnCA,CAad;AADqB,GACrB,CAD2BqG,CAC3B,CADiC,IACjC,CADwCC,CACxC,CADgD,IAChD,CADuDC,CACvD,CAD8D,GAC9D,CAAO/O,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAlB2B,CAqBpCP;CAAAA,CAAAA,OAAAA,CAAAA,GAAA,CAAA,YAAA,CAAsB,QAAQ,CAAC8E,CAAD,CAAQ,CAEpC,IAAMkK,EAAKhP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,SAAvB,CAAkC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAtC,CAALyM,EAA0D,WAAhE,CACMC,EAAKjP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,SAAvB,CAAkC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAAtC,CAAL0M,EAA0D,WAC1DC,EAAAA,CAAQlP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIqH,CAAAA,WAAJ,CAAgBvC,CAAhB,CAAuB,OAAvB,CAAgC9E,CAAAA,CAAAA,OAAAA,CAAAA,GAAIuC,CAAAA,UAApC,CAAR2M,EAA2D,EAqBjE,OAAO,CApBclP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIyI,CAAAA,gBAAJD,CAAqB,cAArBA,CAAqC,aAArCA,CACZxI,CAAAA,CAAAA,OAAAA,CAAAA,GAAI0I,CAAAA,0BADQF,CAAqC,8mBAArCA,CAoBd,CADqB,GACrB;AAD2BwG,CAC3B,CADgC,IAChC,CADuCC,CACvC,CAD4C,IAC5C,CADmDC,CACnD,CAD2D,GAC3D,CAAOlP,CAAAA,CAAAA,OAAAA,CAAAA,GAAIO,CAAAA,mBAAX,CAzB6B,C,CCzCtC,IAAA,+BAAA","file":"php_compressed.js","sourceRoot":"./"} \ No newline at end of file +{"version":3,"sources":["generators/php.js","generators/php/variables.js","generators/php/variables_dynamic.js","generators/php/text.js","generators/php/procedures.js","generators/php/math.js","generators/php/loops.js","generators/php/logic.js","generators/php/lists.js","generators/php/colour.js","generators/php/all.js"],"names":["objectUtils","stringUtils","Generator","inputTypes","Names","PHP","addReservedWords","ORDER_ATOMIC","ORDER_CLONE","ORDER_NEW","ORDER_MEMBER","ORDER_FUNCTION_CALL","ORDER_POWER","ORDER_INCREMENT","ORDER_DECREMENT","ORDER_BITWISE_NOT","ORDER_CAST","ORDER_SUPPRESS_ERROR","ORDER_INSTANCEOF","ORDER_LOGICAL_NOT","ORDER_UNARY_PLUS","ORDER_UNARY_NEGATION","ORDER_MULTIPLICATION","ORDER_DIVISION","ORDER_MODULUS","ORDER_ADDITION","ORDER_SUBTRACTION","ORDER_STRING_CONCAT","ORDER_BITWISE_SHIFT","ORDER_RELATIONAL","ORDER_EQUALITY","ORDER_REFERENCE","ORDER_BITWISE_AND","ORDER_BITWISE_XOR","ORDER_BITWISE_OR","ORDER_LOGICAL_AND","ORDER_LOGICAL_OR","ORDER_IF_NULL","ORDER_CONDITIONAL","ORDER_ASSIGNMENT","ORDER_LOGICAL_AND_WEAK","ORDER_LOGICAL_XOR","ORDER_LOGICAL_OR_WEAK","ORDER_NONE","ORDER_OVERRIDES","isInitialized","init","PHP.init","workspace","Object","getPrototypeOf","call","nameDB_","reset","RESERVED_WORDS_","setVariableMap","getVariableMap","populateVariables","populateProcedures","finish","PHP.finish","code","definitions","values","definitions_","join","scrubNakedValue","PHP.scrubNakedValue","line","quote_","PHP.quote_","string","replace","multiline_quote_","PHP.multiline_quote_","split","map","lines","scrub_","PHP.scrub_","block","opt_thisOnly","commentCode","outputConnection","targetConnection","comment","getCommentText","wrap","COMMENT_WRAP","prefixLines","i","inputList","length","type","VALUE","childBlock","connection","targetBlock","allNestedComments","nextBlock","nextConnection","nextCode","blockToCode","getAdjusted","PHP.getAdjusted","atId","opt_delta","opt_negate","opt_order","delta","order","options","oneBasedIndex","defaultAtIndex","outerOrder","innerOrder","at","valueToCode","isNumber","Number","Math","floor","NameType","getName","getFieldValue","VARIABLE","argument0","varName","indexOf","itemCount_","element0","element1","elements","Array","value","functionName","provideFunction_","FUNCTION_NAME_PLACEHOLDER_","text","operator","substring","errorIndex","indexAdjustment","where","Error","where1","where2","at1","at2","OPERATORS","getField","msg","sub","from","to","Variables","globals","usedVariables","allUsedVarModels","variable","name","getVars","push","devVarList","allDeveloperVariables","DEVELOPER_VARIABLE","globalStr","INDENT","funcName","PROCEDURE","xfix1","STATEMENT_PREFIX","injectId","STATEMENT_SUFFIX","loopTrap","INFINITE_LOOP_TRAP","branch","statementToCode","returnValue","xfix2","args","variables","tuple","hasReturnValue_","Infinity","argument1","arg","CONSTANTS","PROPERTIES","dropdownProperty","prefix","suffix","inputOrder","outputOrder","numberToCheck","divisor","func","list","argument2","repeats","String","addLoopTrap","loopVar","getDistinctName","endVar","match","until","variable0","increment","up","step","abs","startVar","incVar","xfix","loop","getSurroundLoop","suppressPrefixSuffix","n","branchCode","conditionCode","getInput","defaultArgument","value_if","value_then","value_else","element","repeatCount","mode","cachedList","listVar","xVar","listCode","direction","value_input","value_delim","red","green","blue","c1","c2","ratio","exports","moduleExports"],"mappings":"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","file":"php_compressed.js","sourcesContent":["/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Helper functions for generating PHP for blocks.\n * @suppress {checkTypes|globalThis}\n */\n'use strict';\n\ngoog.module('Blockly.PHP');\n\nconst objectUtils = goog.require('Blockly.utils.object');\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {Block} = goog.requireType('Blockly.Block');\nconst {Generator} = goog.require('Blockly.Generator');\nconst {inputTypes} = goog.require('Blockly.inputTypes');\nconst {Names} = goog.require('Blockly.Names');\nconst {Workspace} = goog.requireType('Blockly.Workspace');\n\n\n/**\n * PHP code generator.\n * @type {!Generator}\n */\nconst PHP = new Generator('PHP');\n\n/**\n * List of illegal variable names.\n * This is not intended to be a security feature. Blockly is 100% client-side,\n * so bypassing this list is trivial. This is intended to prevent users from\n * accidentally clobbering a built-in object or function.\n */\nPHP.addReservedWords(\n // http://php.net/manual/en/reserved.keywords.php\n '__halt_compiler,abstract,and,array,as,break,callable,case,catch,class,' +\n 'clone,const,continue,declare,default,die,do,echo,else,elseif,empty,' +\n 'enddeclare,endfor,endforeach,endif,endswitch,endwhile,eval,exit,extends,' +\n 'final,for,foreach,function,global,goto,if,implements,include,' +\n 'include_once,instanceof,insteadof,interface,isset,list,namespace,new,or,' +\n 'print,private,protected,public,require,require_once,return,static,' +\n 'switch,throw,trait,try,unset,use,var,while,xor,' +\n // http://php.net/manual/en/reserved.constants.php\n 'PHP_VERSION,PHP_MAJOR_VERSION,PHP_MINOR_VERSION,PHP_RELEASE_VERSION,' +\n 'PHP_VERSION_ID,PHP_EXTRA_VERSION,PHP_ZTS,PHP_DEBUG,PHP_MAXPATHLEN,' +\n 'PHP_OS,PHP_SAPI,PHP_EOL,PHP_INT_MAX,PHP_INT_SIZE,DEFAULT_INCLUDE_PATH,' +\n 'PEAR_INSTALL_DIR,PEAR_EXTENSION_DIR,PHP_EXTENSION_DIR,PHP_PREFIX,' +\n 'PHP_BINDIR,PHP_BINARY,PHP_MANDIR,PHP_LIBDIR,PHP_DATADIR,PHP_SYSCONFDIR,' +\n 'PHP_LOCALSTATEDIR,PHP_CONFIG_FILE_PATH,PHP_CONFIG_FILE_SCAN_DIR,' +\n 'PHP_SHLIB_SUFFIX,E_ERROR,E_WARNING,E_PARSE,E_NOTICE,E_CORE_ERROR,' +\n 'E_CORE_WARNING,E_COMPILE_ERROR,E_COMPILE_WARNING,E_USER_ERROR,' +\n 'E_USER_WARNING,E_USER_NOTICE,E_DEPRECATED,E_USER_DEPRECATED,E_ALL,' +\n 'E_STRICT,__COMPILER_HALT_OFFSET__,TRUE,FALSE,NULL,__CLASS__,__DIR__,' +\n '__FILE__,__FUNCTION__,__LINE__,__METHOD__,__NAMESPACE__,__TRAIT__');\n\n/**\n * Order of operation ENUMs.\n * http://php.net/manual/en/language.operators.precedence.php\n */\nPHP.ORDER_ATOMIC = 0; // 0 \"\" ...\nPHP.ORDER_CLONE = 1; // clone\nPHP.ORDER_NEW = 1; // new\nPHP.ORDER_MEMBER = 2.1; // []\nPHP.ORDER_FUNCTION_CALL = 2.2; // ()\nPHP.ORDER_POWER = 3; // **\nPHP.ORDER_INCREMENT = 4; // ++\nPHP.ORDER_DECREMENT = 4; // --\nPHP.ORDER_BITWISE_NOT = 4; // ~\nPHP.ORDER_CAST = 4; // (int) (float) (string) (array) ...\nPHP.ORDER_SUPPRESS_ERROR = 4; // @\nPHP.ORDER_INSTANCEOF = 5; // instanceof\nPHP.ORDER_LOGICAL_NOT = 6; // !\nPHP.ORDER_UNARY_PLUS = 7.1; // +\nPHP.ORDER_UNARY_NEGATION = 7.2; // -\nPHP.ORDER_MULTIPLICATION = 8.1; // *\nPHP.ORDER_DIVISION = 8.2; // /\nPHP.ORDER_MODULUS = 8.3; // %\nPHP.ORDER_ADDITION = 9.1; // +\nPHP.ORDER_SUBTRACTION = 9.2; // -\nPHP.ORDER_STRING_CONCAT = 9.3; // .\nPHP.ORDER_BITWISE_SHIFT = 10; // << >>\nPHP.ORDER_RELATIONAL = 11; // < <= > >=\nPHP.ORDER_EQUALITY = 12; // == != === !== <> <=>\nPHP.ORDER_REFERENCE = 13; // &\nPHP.ORDER_BITWISE_AND = 13; // &\nPHP.ORDER_BITWISE_XOR = 14; // ^\nPHP.ORDER_BITWISE_OR = 15; // |\nPHP.ORDER_LOGICAL_AND = 16; // &&\nPHP.ORDER_LOGICAL_OR = 17; // ||\nPHP.ORDER_IF_NULL = 18; // ??\nPHP.ORDER_CONDITIONAL = 19; // ?:\nPHP.ORDER_ASSIGNMENT = 20; // = += -= *= /= %= <<= >>= ...\nPHP.ORDER_LOGICAL_AND_WEAK = 21; // and\nPHP.ORDER_LOGICAL_XOR = 22; // xor\nPHP.ORDER_LOGICAL_OR_WEAK = 23; // or\nPHP.ORDER_NONE = 99; // (...)\n\n/**\n * List of outer-inner pairings that do NOT require parentheses.\n * @type {!Array>}\n */\nPHP.ORDER_OVERRIDES = [\n // (foo()).bar() -> foo().bar()\n // (foo())[0] -> foo()[0]\n [PHP.ORDER_MEMBER, PHP.ORDER_FUNCTION_CALL],\n // (foo[0])[1] -> foo[0][1]\n // (foo.bar).baz -> foo.bar.baz\n [PHP.ORDER_MEMBER, PHP.ORDER_MEMBER],\n // !(!foo) -> !!foo\n [PHP.ORDER_LOGICAL_NOT, PHP.ORDER_LOGICAL_NOT],\n // a * (b * c) -> a * b * c\n [PHP.ORDER_MULTIPLICATION, PHP.ORDER_MULTIPLICATION],\n // a + (b + c) -> a + b + c\n [PHP.ORDER_ADDITION, PHP.ORDER_ADDITION],\n // a && (b && c) -> a && b && c\n [PHP.ORDER_LOGICAL_AND, PHP.ORDER_LOGICAL_AND],\n // a || (b || c) -> a || b || c\n [PHP.ORDER_LOGICAL_OR, PHP.ORDER_LOGICAL_OR]\n];\n\n/**\n * Whether the init method has been called.\n * @type {?boolean}\n */\nPHP.isInitialized = false;\n\n/**\n * Initialise the database of variable names.\n * @param {!Workspace} workspace Workspace to generate code from.\n */\nPHP.init = function(workspace) {\n // Call Blockly.Generator's init.\n Object.getPrototypeOf(this).init.call(this);\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_, '$');\n } else {\n this.nameDB_.reset();\n }\n\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n this.isInitialized = true;\n};\n\n/**\n * Prepend the generated code with the variable definitions.\n * @param {string} code Generated code.\n * @return {string} Completed code.\n */\nPHP.finish = function(code) {\n // Convert the definitions dictionary into a list.\n const definitions = objectUtils.values(this.definitions_);\n // Call Blockly.Generator's finish.\n code = Object.getPrototypeOf(this).finish.call(this, code);\n this.isInitialized = false;\n\n this.nameDB_.reset();\n return definitions.join('\\n\\n') + '\\n\\n\\n' + code;\n};\n\n/**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything. A trailing semicolon is needed to make this legal.\n * @param {string} line Line of generated code.\n * @return {string} Legal line of code.\n */\nPHP.scrubNakedValue = function(line) {\n return line + ';\\n';\n};\n\n/**\n * Encode a string as a properly escaped PHP string, complete with\n * quotes.\n * @param {string} string Text to encode.\n * @return {string} PHP string.\n * @protected\n */\nPHP.quote_ = function(string) {\n string = string.replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\n/g, '\\\\\\n')\n .replace(/'/g, '\\\\\\'');\n return '\\'' + string + '\\'';\n};\n\n/**\n * Encode a string as a properly escaped multiline PHP string, complete with\n * quotes.\n * @param {string} string Text to encode.\n * @return {string} PHP string.\n * @protected\n */\nPHP.multiline_quote_ = function(string) {\n const lines = string.split(/\\n/g).map(this.quote_);\n // Join with the following, plus a newline:\n // . \"\\n\" .\n // Newline escaping only works in double-quoted strings.\n return lines.join(' . \\\"\\\\n\\\" .\\n');\n};\n\n/**\n * Common tasks for generating PHP from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n * @param {!Block} block The current block.\n * @param {string} code The PHP code created for this block.\n * @param {boolean=} opt_thisOnly True to generate code for only this statement.\n * @return {string} PHP code with comments and subsequent blocks added.\n * @protected\n */\nPHP.scrub_ = function(block, code, opt_thisOnly) {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment, '// ') + '\\n';\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '// ');\n }\n }\n }\n }\n }\n const nextBlock = block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = opt_thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n};\n\n/**\n * Gets a property and adjusts the value while taking into account indexing.\n * @param {!Block} block The block.\n * @param {string} atId The property ID of the element to get.\n * @param {number=} opt_delta Value to add.\n * @param {boolean=} opt_negate Whether to negate the value.\n * @param {number=} opt_order The highest order acting on this value.\n * @return {string|number}\n */\nPHP.getAdjusted = function(block, atId, opt_delta, opt_negate, opt_order) {\n let delta = opt_delta || 0;\n let order = opt_order || this.ORDER_NONE;\n if (block.workspace.options.oneBasedIndex) {\n delta--;\n }\n let defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\n let outerOrder = order;\n let innerOrder;\n if (delta > 0) {\n outerOrder = this.ORDER_ADDITION;\n innerOrder = this.ORDER_ADDITION;\n } else if (delta < 0) {\n outerOrder = this.ORDER_SUBTRACTION;\n innerOrder = this.ORDER_SUBTRACTION;\n } else if (opt_negate) {\n outerOrder = this.ORDER_UNARY_NEGATION;\n innerOrder = this.ORDER_UNARY_NEGATION;\n }\n let at = this.valueToCode(block, atId, outerOrder) || defaultAtIndex;\n\n if (stringUtils.isNumber(at)) {\n // If the index is a naked number, adjust it right now.\n at = Number(at) + delta;\n if (opt_negate) {\n at = -at;\n }\n } else {\n // If the index is dynamic, adjust it in code.\n if (delta > 0) {\n at = at + ' + ' + delta;\n } else if (delta < 0) {\n at = at + ' - ' + -delta;\n }\n if (opt_negate) {\n if (delta) {\n at = '-(' + at + ')';\n } else {\n at = '-' + at;\n }\n }\n innerOrder = Math.floor(innerOrder);\n order = Math.floor(order);\n if (innerOrder && order >= innerOrder) {\n at = '(' + at + ')';\n }\n }\n return at;\n};\n\nexports.phpGenerator = PHP;\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.variables');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['variables_get'] = function(block) {\n // Variable getter.\n const code =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return [code, PHP.ORDER_ATOMIC];\n};\n\nPHP['variables_set'] = function(block) {\n // Variable setter.\n const argument0 =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_ASSIGNMENT) || '0';\n const varName =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = ' + argument0 + ';\\n';\n};\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for dynamic variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.variablesDynamic');\n\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.PHP.variables');\n\n\n// PHP is dynamically typed.\nPHP['variables_get_dynamic'] = PHP['variables_get'];\nPHP['variables_set_dynamic'] = PHP['variables_set'];\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for text blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.texts');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['text'] = function(block) {\n // Text value.\n const code = PHP.quote_(block.getFieldValue('TEXT'));\n return [code, PHP.ORDER_ATOMIC];\n};\n\nPHP['text_multiline'] = function(block) {\n // Text value.\n const code = PHP.multiline_quote_(block.getFieldValue('TEXT'));\n const order =\n code.indexOf('.') !== -1 ? PHP.ORDER_STRING_CONCAT : PHP.ORDER_ATOMIC;\n return [code, order];\n};\n\nPHP['text_join'] = function(block) {\n // Create a string made up of any number of elements of any type.\n if (block.itemCount_ === 0) {\n return [\"''\", PHP.ORDER_ATOMIC];\n } else if (block.itemCount_ === 1) {\n const element = PHP.valueToCode(block, 'ADD0', PHP.ORDER_NONE) || \"''\";\n const code = element;\n return [code, PHP.ORDER_NONE];\n } else if (block.itemCount_ === 2) {\n const element0 =\n PHP.valueToCode(block, 'ADD0', PHP.ORDER_STRING_CONCAT) || \"''\";\n const element1 =\n PHP.valueToCode(block, 'ADD1', PHP.ORDER_STRING_CONCAT) || \"''\";\n const code = element0 + ' . ' + element1;\n return [code, PHP.ORDER_STRING_CONCAT];\n } else {\n const elements = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] = PHP.valueToCode(block, 'ADD' + i, PHP.ORDER_NONE) || \"''\";\n }\n const code = 'implode(\\'\\', array(' + elements.join(',') + '))';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n};\n\nPHP['text_append'] = function(block) {\n // Append to a variable in place.\n const varName =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const value = PHP.valueToCode(block, 'TEXT', PHP.ORDER_ASSIGNMENT) || \"''\";\n return varName + ' .= ' + value + ';\\n';\n};\n\nPHP['text_length'] = function(block) {\n // String or array length.\n const functionName = PHP.provideFunction_('length', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($value) {\n if (is_string($value)) {\n return strlen($value);\n }\n return count($value);\n}\n`);\n const text = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || \"''\";\n return [functionName + '(' + text + ')', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const text = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || \"''\";\n return ['empty(' + text + ')', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_indexOf'] = function(block) {\n // Search the text for a substring.\n const operator =\n block.getFieldValue('END') === 'FIRST' ? 'strpos' : 'strrpos';\n const substring = PHP.valueToCode(block, 'FIND', PHP.ORDER_NONE) || \"''\";\n const text = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || \"''\";\n let errorIndex = ' -1';\n let indexAdjustment = '';\n if (block.workspace.options.oneBasedIndex) {\n errorIndex = ' 0';\n indexAdjustment = ' + 1';\n }\n const functionName = PHP.provideFunction_(\n block.getFieldValue('END') === 'FIRST' ? 'text_indexOf' :\n 'text_lastIndexOf',\n `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($text, $search) {\n $pos = ${operator}($text, $search);\n return $pos === false ? ${errorIndex} : $pos${indexAdjustment};\n}\n`);\n const code = functionName + '(' + text + ', ' + substring + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_charAt'] = function(block) {\n // Get letter at index.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const textOrder = (where === 'RANDOM') ? PHP.ORDER_NONE : PHP.ORDER_NONE;\n const text = PHP.valueToCode(block, 'VALUE', textOrder) || \"''\";\n switch (where) {\n case 'FIRST': {\n const code = 'substr(' + text + ', 0, 1)';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n case 'LAST': {\n const code = 'substr(' + text + ', -1)';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n case 'FROM_START': {\n const at = PHP.getAdjusted(block, 'AT');\n const code = 'substr(' + text + ', ' + at + ', 1)';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n case 'FROM_END': {\n const at = PHP.getAdjusted(block, 'AT', 1, true);\n const code = 'substr(' + text + ', ' + at + ', 1)';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n case 'RANDOM': {\n const functionName = PHP.provideFunction_('text_random_letter', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($text) {\n return $text[rand(0, strlen($text) - 1)];\n}\n`);\n const code = functionName + '(' + text + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n }\n throw Error('Unhandled option (text_charAt).');\n};\n\nPHP['text_getSubstring'] = function(block) {\n // Get substring.\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const text = PHP.valueToCode(block, 'STRING', PHP.ORDER_NONE) || \"''\";\n if (where1 === 'FIRST' && where2 === 'LAST') {\n const code = text;\n return [code, PHP.ORDER_NONE];\n } else {\n const at1 = PHP.getAdjusted(block, 'AT1');\n const at2 = PHP.getAdjusted(block, 'AT2');\n const functionName = PHP.provideFunction_('text_get_substring', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($text, $where1, $at1, $where2, $at2) {\n if ($where1 == 'FROM_END') {\n $at1 = strlen($text) - 1 - $at1;\n } else if ($where1 == 'FIRST') {\n $at1 = 0;\n } else if ($where1 != 'FROM_START') {\n throw new Exception('Unhandled option (text_get_substring).');\n }\n $length = 0;\n if ($where2 == 'FROM_START') {\n $length = $at2 - $at1 + 1;\n } else if ($where2 == 'FROM_END') {\n $length = strlen($text) - $at1 - $at2;\n } else if ($where2 == 'LAST') {\n $length = strlen($text) - $at1;\n } else {\n throw new Exception('Unhandled option (text_get_substring).');\n }\n return substr($text, $at1, $length);\n}\n`);\n const code = functionName + '(' + text + ', \\'' + where1 + '\\', ' + at1 +\n ', \\'' + where2 + '\\', ' + at2 + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n};\n\nPHP['text_changeCase'] = function(block) {\n // Change capitalization.\n const text = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n let code;\n if (block.getFieldValue('CASE') === 'UPPERCASE') {\n code = 'strtoupper(' + text + ')';\n } else if (block.getFieldValue('CASE') === 'LOWERCASE') {\n code = 'strtolower(' + text + ')';\n } else if (block.getFieldValue('CASE') === 'TITLECASE') {\n code = 'ucwords(strtolower(' + text + '))';\n }\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_trim'] = function(block) {\n // Trim spaces.\n const OPERATORS = {'LEFT': 'ltrim', 'RIGHT': 'rtrim', 'BOTH': 'trim'};\n const operator = OPERATORS[block.getFieldValue('MODE')];\n const text = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n return [operator + '(' + text + ')', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_print'] = function(block) {\n // Print statement.\n const msg = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n return 'print(' + msg + ');\\n';\n};\n\nPHP['text_prompt_ext'] = function(block) {\n // Prompt function.\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = PHP.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n }\n let code = 'readline(' + msg + ')';\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'floatval(' + code + ')';\n }\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_prompt'] = PHP['text_prompt_ext'];\n\nPHP['text_count'] = function(block) {\n const text = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n const sub = PHP.valueToCode(block, 'SUB', PHP.ORDER_NONE) || \"''\";\n const code = 'strlen(' + sub + ') === 0' +\n ' ? strlen(' + text + ') + 1' +\n ' : substr_count(' + text + ', ' + sub + ')';\n return [code, PHP.ORDER_CONDITIONAL];\n};\n\nPHP['text_replace'] = function(block) {\n const text = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n const from = PHP.valueToCode(block, 'FROM', PHP.ORDER_NONE) || \"''\";\n const to = PHP.valueToCode(block, 'TO', PHP.ORDER_NONE) || \"''\";\n const code = 'str_replace(' + from + ', ' + to + ', ' + text + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['text_reverse'] = function(block) {\n const text = PHP.valueToCode(block, 'TEXT', PHP.ORDER_NONE) || \"''\";\n const code = 'strrev(' + text + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for procedure blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.procedures');\n\nconst Variables = goog.require('Blockly.Variables');\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['procedures_defreturn'] = function(block) {\n // Define a procedure with a return value.\n // First, add a 'global' statement for every variable that is not shadowed by\n // a local parameter.\n const globals = [];\n const workspace = block.workspace;\n const usedVariables = Variables.allUsedVarModels(workspace) || [];\n for (let i = 0, variable; variable = usedVariables[i]; i++) {\n const varName = variable.name;\n if (block.getVars().indexOf(varName) === -1) {\n globals.push(PHP.nameDB_.getName(varName, NameType.VARIABLE));\n }\n }\n // Add developer variables.\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n globals.push(\n PHP.nameDB_.getName(devVarList[i], NameType.DEVELOPER_VARIABLE));\n }\n const globalStr =\n globals.length ? PHP.INDENT + 'global ' + globals.join(', ') + ';\\n' : '';\n\n const funcName =\n PHP.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n let xfix1 = '';\n if (PHP.STATEMENT_PREFIX) {\n xfix1 += PHP.injectId(PHP.STATEMENT_PREFIX, block);\n }\n if (PHP.STATEMENT_SUFFIX) {\n xfix1 += PHP.injectId(PHP.STATEMENT_SUFFIX, block);\n }\n if (xfix1) {\n xfix1 = PHP.prefixLines(xfix1, PHP.INDENT);\n }\n let loopTrap = '';\n if (PHP.INFINITE_LOOP_TRAP) {\n loopTrap = PHP.prefixLines(\n PHP.injectId(PHP.INFINITE_LOOP_TRAP, block), PHP.INDENT);\n }\n const branch = PHP.statementToCode(block, 'STACK');\n let returnValue = PHP.valueToCode(block, 'RETURN', PHP.ORDER_NONE) || '';\n let xfix2 = '';\n if (branch && returnValue) {\n // After executing the function body, revisit this block for the return.\n xfix2 = xfix1;\n }\n if (returnValue) {\n returnValue = PHP.INDENT + 'return ' + returnValue + ';\\n';\n }\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = PHP.nameDB_.getName(variables[i], NameType.VARIABLE);\n }\n let code = 'function ' + funcName + '(' + args.join(', ') + ') {\\n' +\n globalStr + xfix1 + loopTrap + branch + xfix2 + returnValue + '}';\n code = PHP.scrub_(block, code);\n // Add % so as not to collide with helper functions in definitions list.\n PHP.definitions_['%' + funcName] = code;\n return null;\n};\n\n// Defining a procedure without a return value uses the same generator as\n// a procedure with a return value.\nPHP['procedures_defnoreturn'] = PHP['procedures_defreturn'];\n\nPHP['procedures_callreturn'] = function(block) {\n // Call a procedure with a return value.\n const funcName =\n PHP.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = PHP.valueToCode(block, 'ARG' + i, PHP.ORDER_NONE) || 'null';\n }\n const code = funcName + '(' + args.join(', ') + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['procedures_callnoreturn'] = function(block) {\n // Call a procedure with no return value.\n // Generated code is for a function call as a statement is the same as a\n // function call as a value, with the addition of line ending.\n const tuple = PHP['procedures_callreturn'](block);\n return tuple[0] + ';\\n';\n};\n\nPHP['procedures_ifreturn'] = function(block) {\n // Conditionally return value from a procedure.\n const condition =\n PHP.valueToCode(block, 'CONDITION', PHP.ORDER_NONE) || 'false';\n let code = 'if (' + condition + ') {\\n';\n if (PHP.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the return is triggered.\n code +=\n PHP.prefixLines(PHP.injectId(PHP.STATEMENT_SUFFIX, block), PHP.INDENT);\n }\n if (block.hasReturnValue_) {\n const value = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'null';\n code += PHP.INDENT + 'return ' + value + ';\\n';\n } else {\n code += PHP.INDENT + 'return;\\n';\n }\n code += '}\\n';\n return code;\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for math blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.math');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['math_number'] = function(block) {\n // Numeric value.\n let code = Number(block.getFieldValue('NUM'));\n const order = code >= 0 ? PHP.ORDER_ATOMIC : PHP.ORDER_UNARY_NEGATION;\n if (code === Infinity) {\n code = 'INF';\n } else if (code === -Infinity) {\n code = '-INF';\n }\n return [code, order];\n};\n\nPHP['math_arithmetic'] = function(block) {\n // Basic arithmetic operators, and power.\n const OPERATORS = {\n 'ADD': [' + ', PHP.ORDER_ADDITION],\n 'MINUS': [' - ', PHP.ORDER_SUBTRACTION],\n 'MULTIPLY': [' * ', PHP.ORDER_MULTIPLICATION],\n 'DIVIDE': [' / ', PHP.ORDER_DIVISION],\n 'POWER': [' ** ', PHP.ORDER_POWER],\n };\n const tuple = OPERATORS[block.getFieldValue('OP')];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = PHP.valueToCode(block, 'A', order) || '0';\n const argument1 = PHP.valueToCode(block, 'B', order) || '0';\n const code = argument0 + operator + argument1;\n return [code, order];\n};\n\nPHP['math_single'] = function(block) {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let code;\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n arg = PHP.valueToCode(block, 'NUM', PHP.ORDER_UNARY_NEGATION) || '0';\n if (arg[0] === '-') {\n // --3 is not legal in JS.\n arg = ' ' + arg;\n }\n code = '-' + arg;\n return [code, PHP.ORDER_UNARY_NEGATION];\n }\n if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {\n arg = PHP.valueToCode(block, 'NUM', PHP.ORDER_DIVISION) || '0';\n } else {\n arg = PHP.valueToCode(block, 'NUM', PHP.ORDER_NONE) || '0';\n }\n // First, handle cases which generate values that don't need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ABS':\n code = 'abs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'log(' + arg + ')';\n break;\n case 'EXP':\n code = 'exp(' + arg + ')';\n break;\n case 'POW10':\n code = 'pow(10,' + arg + ')';\n break;\n case 'ROUND':\n code = 'round(' + arg + ')';\n break;\n case 'ROUNDUP':\n code = 'ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'sin(' + arg + ' / 180 * pi())';\n break;\n case 'COS':\n code = 'cos(' + arg + ' / 180 * pi())';\n break;\n case 'TAN':\n code = 'tan(' + arg + ' / 180 * pi())';\n break;\n }\n if (code) {\n return [code, PHP.ORDER_FUNCTION_CALL];\n }\n // Second, handle cases which generate values that may need parentheses\n // wrapping the code.\n switch (operator) {\n case 'LOG10':\n code = 'log(' + arg + ') / log(10)';\n break;\n case 'ASIN':\n code = 'asin(' + arg + ') / pi() * 180';\n break;\n case 'ACOS':\n code = 'acos(' + arg + ') / pi() * 180';\n break;\n case 'ATAN':\n code = 'atan(' + arg + ') / pi() * 180';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, PHP.ORDER_DIVISION];\n};\n\nPHP['math_constant'] = function(block) {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS = {\n 'PI': ['M_PI', PHP.ORDER_ATOMIC],\n 'E': ['M_E', PHP.ORDER_ATOMIC],\n 'GOLDEN_RATIO': ['(1 + sqrt(5)) / 2', PHP.ORDER_DIVISION],\n 'SQRT2': ['M_SQRT2', PHP.ORDER_ATOMIC],\n 'SQRT1_2': ['M_SQRT1_2', PHP.ORDER_ATOMIC],\n 'INFINITY': ['INF', PHP.ORDER_ATOMIC],\n };\n return CONSTANTS[block.getFieldValue('CONSTANT')];\n};\n\nPHP['math_number_property'] = function(block) {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES = {\n 'EVEN': ['', ' % 2 == 0', PHP.ORDER_MODULUS, PHP.ORDER_EQUALITY],\n 'ODD': ['', ' % 2 == 1', PHP.ORDER_MODULUS, PHP.ORDER_EQUALITY],\n 'WHOLE': ['is_int(', ')', PHP.ORDER_NONE, PHP.ORDER_FUNCTION_CALL],\n 'POSITIVE': ['', ' > 0', PHP.ORDER_RELATIONAL, PHP.ORDER_RELATIONAL],\n 'NEGATIVE': ['', ' < 0', PHP.ORDER_RELATIONAL, PHP.ORDER_RELATIONAL],\n 'DIVISIBLE_BY': [null, null, PHP.ORDER_MODULUS, PHP.ORDER_EQUALITY],\n 'PRIME': [null, null, PHP.ORDER_NONE, PHP.ORDER_FUNCTION_CALL],\n };\n const dropdownProperty = block.getFieldValue('PROPERTY');\n const [prefix, suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck = PHP.valueToCode(block, 'NUMBER_TO_CHECK',\n inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n const functionName = PHP.provideFunction_('math_isPrime', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($n) {\n // https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n if ($n == 2 || $n == 3) {\n return true;\n }\n // False if n is NaN, negative, is 1, or not whole.\n // And false if n is divisible by 2 or 3.\n if (!is_numeric($n) || $n <= 1 || $n % 1 != 0 || $n % 2 == 0 || $n % 3 == 0) {\n return false;\n }\n // Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for ($x = 6; $x <= sqrt($n) + 1; $x += 6) {\n if ($n % ($x - 1) == 0 || $n % ($x + 1) == 0) {\n return false;\n }\n }\n return true;\n}\n`);\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor = PHP.valueToCode(block, 'DIVISOR',\n PHP.ORDER_MODULUS) || '0';\n if (divisor === '0') {\n return ['false', PHP.ORDER_ATOMIC];\n\n }\n code = numberToCheck + ' % ' + divisor + ' == 0';\n } else {\n code = prefix + numberToCheck + suffix;\n }\n return [code, outputOrder];\n};\n\nPHP['math_change'] = function(block) {\n // Add to a variable in place.\n const argument0 = PHP.valueToCode(block, 'DELTA', PHP.ORDER_ADDITION) || '0';\n const varName =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' += ' + argument0 + ';\\n';\n};\n\n// Rounding functions have a single operand.\nPHP['math_round'] = PHP['math_single'];\n// Trigonometry functions have a single operand.\nPHP['math_trig'] = PHP['math_single'];\n\nPHP['math_on_list'] = function(block) {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n let list;\n let code;\n switch (func) {\n case 'SUM':\n list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_FUNCTION_CALL) || 'array()';\n code = 'array_sum(' + list + ')';\n break;\n case 'MIN':\n list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_FUNCTION_CALL) || 'array()';\n code = 'min(' + list + ')';\n break;\n case 'MAX':\n list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_FUNCTION_CALL) || 'array()';\n code = 'max(' + list + ')';\n break;\n case 'AVERAGE': {\n const functionName = PHP.provideFunction_('math_mean', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($myList) {\n return array_sum($myList) / count($myList);\n}\n`);\n list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MEDIAN': {\n const functionName = PHP.provideFunction_('math_median', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($arr) {\n sort($arr,SORT_NUMERIC);\n return (count($arr) % 2) ? $arr[floor(count($arr) / 2)] :\n ($arr[floor(count($arr) / 2)] + $arr[floor(count($arr) / 2) - 1]) / 2;\n}\n`);\n list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MODE': {\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1].\n const functionName = PHP.provideFunction_('math_modes', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($values) {\n if (empty($values)) return array();\n $counts = array_count_values($values);\n arsort($counts); // Sort counts in descending order\n $modes = array_keys($counts, current($counts), true);\n return $modes;\n}\n`);\n list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'STD_DEV': {\n const functionName = PHP.provideFunction_('math_standard_deviation', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($numbers) {\n $n = count($numbers);\n if (!$n) return null;\n $mean = array_sum($numbers) / count($numbers);\n foreach($numbers as $key => $num) $devs[$key] = pow($num - $mean, 2);\n return sqrt(array_sum($devs) / (count($devs) - 1));\n}\n`);\n list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n case 'RANDOM': {\n const functionName = PHP.provideFunction_('math_random_list', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($list) {\n $x = rand(0, count($list)-1);\n return $list[$x];\n}\n`);\n list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || '[]';\n code = functionName + '(' + list + ')';\n break;\n }\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['math_modulo'] = function(block) {\n // Remainder computation.\n const argument0 =\n PHP.valueToCode(block, 'DIVIDEND', PHP.ORDER_MODULUS) || '0';\n const argument1 = PHP.valueToCode(block, 'DIVISOR', PHP.ORDER_MODULUS) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, PHP.ORDER_MODULUS];\n};\n\nPHP['math_constrain'] = function(block) {\n // Constrain a number between two limits.\n const argument0 = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || '0';\n const argument1 = PHP.valueToCode(block, 'LOW', PHP.ORDER_NONE) || '0';\n const argument2 =\n PHP.valueToCode(block, 'HIGH', PHP.ORDER_NONE) || 'Infinity';\n const code =\n 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['math_random_int'] = function(block) {\n // Random integer between [X] and [Y].\n const argument0 = PHP.valueToCode(block, 'FROM', PHP.ORDER_NONE) || '0';\n const argument1 = PHP.valueToCode(block, 'TO', PHP.ORDER_NONE) || '0';\n const functionName = PHP.provideFunction_('math_random_int', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($a, $b) {\n if ($a > $b) {\n return rand($b, $a);\n }\n return rand($a, $b);\n}\n`);\n const code = functionName + '(' + argument0 + ', ' + argument1 + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['math_random_float'] = function(block) {\n // Random fraction between 0 and 1.\n return ['(float)rand()/(float)getrandmax()', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['math_atan2'] = function(block) {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n const argument0 = PHP.valueToCode(block, 'X', PHP.ORDER_NONE) || '0';\n const argument1 = PHP.valueToCode(block, 'Y', PHP.ORDER_NONE) || '0';\n return [\n 'atan2(' + argument1 + ', ' + argument0 + ') / pi() * 180',\n PHP.ORDER_DIVISION\n ];\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for loop blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.loops');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['controls_repeat_ext'] = function(block) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(Number(block.getFieldValue('TIMES')));\n } else {\n // External number.\n repeats = PHP.valueToCode(block, 'TIMES', PHP.ORDER_ASSIGNMENT) || '0';\n }\n let branch = PHP.statementToCode(block, 'DO');\n branch = PHP.addLoopTrap(branch, block);\n let code = '';\n const loopVar = PHP.nameDB_.getDistinctName('count', NameType.VARIABLE);\n let endVar = repeats;\n if (!repeats.match(/^\\w+$/) && !stringUtils.isNumber(repeats)) {\n endVar = PHP.nameDB_.getDistinctName('repeat_end', NameType.VARIABLE);\n code += endVar + ' = ' + repeats + ';\\n';\n }\n code += 'for (' + loopVar + ' = 0; ' + loopVar + ' < ' + endVar + '; ' +\n loopVar + '++) {\\n' + branch + '}\\n';\n return code;\n};\n\nPHP['controls_repeat'] = PHP['controls_repeat_ext'];\n\nPHP['controls_whileUntil'] = function(block) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 =\n PHP.valueToCode(\n block, 'BOOL', until ? PHP.ORDER_LOGICAL_NOT : PHP.ORDER_NONE) ||\n 'false';\n let branch = PHP.statementToCode(block, 'DO');\n branch = PHP.addLoopTrap(branch, block);\n if (until) {\n argument0 = '!' + argument0;\n }\n return 'while (' + argument0 + ') {\\n' + branch + '}\\n';\n};\n\nPHP['controls_for'] = function(block) {\n // For loop.\n const variable0 =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 = PHP.valueToCode(block, 'FROM', PHP.ORDER_ASSIGNMENT) || '0';\n const argument1 = PHP.valueToCode(block, 'TO', PHP.ORDER_ASSIGNMENT) || '0';\n const increment = PHP.valueToCode(block, 'BY', PHP.ORDER_ASSIGNMENT) || '1';\n let branch = PHP.statementToCode(block, 'DO');\n branch = PHP.addLoopTrap(branch, block);\n let code;\n if (stringUtils.isNumber(argument0) && stringUtils.isNumber(argument1) &&\n stringUtils.isNumber(increment)) {\n // All arguments are simple numbers.\n const up = Number(argument0) <= Number(argument1);\n code = 'for (' + variable0 + ' = ' + argument0 + '; ' + variable0 +\n (up ? ' <= ' : ' >= ') + argument1 + '; ' + variable0;\n const step = Math.abs(Number(increment));\n if (step === 1) {\n code += up ? '++' : '--';\n } else {\n code += (up ? ' += ' : ' -= ') + step;\n }\n code += ') {\\n' + branch + '}\\n';\n } else {\n code = '';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n let startVar = argument0;\n if (!argument0.match(/^\\w+$/) && !stringUtils.isNumber(argument0)) {\n startVar =\n PHP.nameDB_.getDistinctName(variable0 + '_start', NameType.VARIABLE);\n code += startVar + ' = ' + argument0 + ';\\n';\n }\n let endVar = argument1;\n if (!argument1.match(/^\\w+$/) && !stringUtils.isNumber(argument1)) {\n endVar =\n PHP.nameDB_.getDistinctName(variable0 + '_end', NameType.VARIABLE);\n code += endVar + ' = ' + argument1 + ';\\n';\n }\n // Determine loop direction at start, in case one of the bounds\n // changes during loop execution.\n const incVar =\n PHP.nameDB_.getDistinctName(variable0 + '_inc', NameType.VARIABLE);\n code += incVar + ' = ';\n if (stringUtils.isNumber(increment)) {\n code += Math.abs(increment) + ';\\n';\n } else {\n code += 'abs(' + increment + ');\\n';\n }\n code += 'if (' + startVar + ' > ' + endVar + ') {\\n';\n code += PHP.INDENT + incVar + ' = -' + incVar + ';\\n';\n code += '}\\n';\n code += 'for (' + variable0 + ' = ' + startVar + '; ' + incVar +\n ' >= 0 ? ' + variable0 + ' <= ' + endVar + ' : ' + variable0 +\n ' >= ' + endVar + '; ' + variable0 + ' += ' + incVar + ') {\\n' +\n branch + '}\\n';\n }\n return code;\n};\n\nPHP['controls_forEach'] = function(block) {\n // For each loop.\n const variable0 =\n PHP.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_ASSIGNMENT) || '[]';\n let branch = PHP.statementToCode(block, 'DO');\n branch = PHP.addLoopTrap(branch, block);\n let code = '';\n code +=\n 'foreach (' + argument0 + ' as ' + variable0 + ') {\\n' + branch + '}\\n';\n return code;\n};\n\nPHP['controls_flow_statements'] = function(block) {\n // Flow statements: continue, break.\n let xfix = '';\n if (PHP.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += PHP.injectId(PHP.STATEMENT_PREFIX, block);\n }\n if (PHP.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += PHP.injectId(PHP.STATEMENT_SUFFIX, block);\n }\n if (PHP.STATEMENT_PREFIX) {\n const loop = block.getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += PHP.injectId(PHP.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break;\\n';\n case 'CONTINUE':\n return xfix + 'continue;\\n';\n }\n throw Error('Unknown flow statement.');\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for logic blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.logic');\n\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['controls_if'] = function(block) {\n // If/elseif/else condition.\n let n = 0;\n let code = '', branchCode, conditionCode;\n if (PHP.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += PHP.injectId(PHP.STATEMENT_PREFIX, block);\n }\n do {\n conditionCode = PHP.valueToCode(block, 'IF' + n, PHP.ORDER_NONE) || 'false';\n branchCode = PHP.statementToCode(block, 'DO' + n);\n if (PHP.STATEMENT_SUFFIX) {\n branchCode = PHP.prefixLines(\n PHP.injectId(PHP.STATEMENT_SUFFIX, block), PHP.INDENT) +\n branchCode;\n }\n code += (n > 0 ? ' else ' : '') + 'if (' + conditionCode + ') {\\n' +\n branchCode + '}';\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || PHP.STATEMENT_SUFFIX) {\n branchCode = PHP.statementToCode(block, 'ELSE');\n if (PHP.STATEMENT_SUFFIX) {\n branchCode = PHP.prefixLines(\n PHP.injectId(PHP.STATEMENT_SUFFIX, block), PHP.INDENT) +\n branchCode;\n }\n code += ' else {\\n' + branchCode + '}';\n }\n return code + '\\n';\n};\n\nPHP['controls_ifelse'] = PHP['controls_if'];\n\nPHP['logic_compare'] = function(block) {\n // Comparison operator.\n const OPERATORS =\n {'EQ': '==', 'NEQ': '!=', 'LT': '<', 'LTE': '<=', 'GT': '>', 'GTE': '>='};\n const operator = OPERATORS[block.getFieldValue('OP')];\n const order = (operator === '==' || operator === '!=') ? PHP.ORDER_EQUALITY :\n PHP.ORDER_RELATIONAL;\n const argument0 = PHP.valueToCode(block, 'A', order) || '0';\n const argument1 = PHP.valueToCode(block, 'B', order) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nPHP['logic_operation'] = function(block) {\n // Operations 'and', 'or'.\n const operator = (block.getFieldValue('OP') === 'AND') ? '&&' : '||';\n const order =\n (operator === '&&') ? PHP.ORDER_LOGICAL_AND : PHP.ORDER_LOGICAL_OR;\n let argument0 = PHP.valueToCode(block, 'A', order);\n let argument1 = PHP.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'false';\n argument1 = 'false';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = (operator === '&&') ? 'true' : 'false';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nPHP['logic_negate'] = function(block) {\n // Negation.\n const order = PHP.ORDER_LOGICAL_NOT;\n const argument0 = PHP.valueToCode(block, 'BOOL', order) || 'true';\n const code = '!' + argument0;\n return [code, order];\n};\n\nPHP['logic_boolean'] = function(block) {\n // Boolean values true and false.\n const code = (block.getFieldValue('BOOL') === 'TRUE') ? 'true' : 'false';\n return [code, PHP.ORDER_ATOMIC];\n};\n\nPHP['logic_null'] = function(block) {\n // Null data type.\n return ['null', PHP.ORDER_ATOMIC];\n};\n\nPHP['logic_ternary'] = function(block) {\n // Ternary operator.\n const value_if =\n PHP.valueToCode(block, 'IF', PHP.ORDER_CONDITIONAL) || 'false';\n const value_then =\n PHP.valueToCode(block, 'THEN', PHP.ORDER_CONDITIONAL) || 'null';\n const value_else =\n PHP.valueToCode(block, 'ELSE', PHP.ORDER_CONDITIONAL) || 'null';\n const code = value_if + ' ? ' + value_then + ' : ' + value_else;\n return [code, PHP.ORDER_CONDITIONAL];\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for list blocks.\n */\n\n/**\n * Lists in PHP are known to break when non-variables are passed into blocks\n * that require a list. PHP, unlike other languages, passes arrays as reference\n * value instead of value so we are unable to support it to the extent we can\n * for the other languages.\n * For example, a ternary operator with two arrays will return the array by\n * value and that cannot be passed into any of the built-in array functions for\n * PHP (because only variables can be passed by reference).\n * ex: end(true ? list1 : list2)\n */\n'use strict';\n\ngoog.module('Blockly.PHP.lists');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\nPHP['lists_create_empty'] = function(block) {\n // Create an empty list.\n return ['array()', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_create_with'] = function(block) {\n // Create a list with any number of elements of any type.\n let code = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n code[i] = PHP.valueToCode(block, 'ADD' + i, PHP.ORDER_NONE) || 'null';\n }\n code = 'array(' + code.join(', ') + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_repeat'] = function(block) {\n // Create a list with one element repeated.\n const functionName = PHP.provideFunction_('lists_repeat', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($value, $count) {\n $array = array();\n for ($index = 0; $index < $count; $index++) {\n $array[] = $value;\n }\n return $array;\n}\n`);\n const element = PHP.valueToCode(block, 'ITEM', PHP.ORDER_NONE) || 'null';\n const repeatCount = PHP.valueToCode(block, 'NUM', PHP.ORDER_NONE) || '0';\n const code = functionName + '(' + element + ', ' + repeatCount + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_length'] = function(block) {\n // String or array length.\n const functionName = PHP.provideFunction_('length', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($value) {\n if (is_string($value)) {\n return strlen($value);\n } else {\n return count($value);\n }\n}\n`);\n const list = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || \"''\";\n return [functionName + '(' + list + ')', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const argument0 =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_FUNCTION_CALL) || 'array()';\n return ['empty(' + argument0 + ')', PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_indexOf'] = function(block) {\n // Find an item in the list.\n const argument0 = PHP.valueToCode(block, 'FIND', PHP.ORDER_NONE) || \"''\";\n const argument1 = PHP.valueToCode(block, 'VALUE', PHP.ORDER_MEMBER) || '[]';\n let errorIndex = ' -1';\n let indexAdjustment = '';\n if (block.workspace.options.oneBasedIndex) {\n errorIndex = ' 0';\n indexAdjustment = ' + 1';\n }\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n // indexOf\n functionName = PHP.provideFunction_('indexOf', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($haystack, $needle) {\n for ($index = 0; $index < count($haystack); $index++) {\n if ($haystack[$index] == $needle) return $index${indexAdjustment};\n }\n return ${errorIndex};\n}\n`);\n } else {\n // lastIndexOf\n functionName = PHP.provideFunction_('lastIndexOf', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($haystack, $needle) {\n $last = ${errorIndex};\n for ($index = 0; $index < count($haystack); $index++) {\n if ($haystack[$index] == $needle) $last = $index${indexAdjustment};\n }\n return $last;\n}\n`);\n }\n\n const code = functionName + '(' + argument1 + ', ' + argument0 + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_getIndex'] = function(block) {\n // Get element at index.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n switch (where) {\n case 'FIRST':\n if (mode === 'GET') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_MEMBER) || 'array()';\n const code = list + '[0]';\n return [code, PHP.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const code = 'array_shift(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n return 'array_shift(' + list + ');\\n';\n }\n break;\n case 'LAST':\n if (mode === 'GET') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const code = 'end(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'GET_REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const code = 'array_pop(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n return 'array_pop(' + list + ');\\n';\n }\n break;\n case 'FROM_START': {\n const at = PHP.getAdjusted(block, 'AT');\n if (mode === 'GET') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_MEMBER) || 'array()';\n const code = list + '[' + at + ']';\n return [code, PHP.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const code = 'array_splice(' + list + ', ' + at + ', 1)[0]';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n return 'array_splice(' + list + ', ' + at + ', 1);\\n';\n }\n break;\n }\n case 'FROM_END':\n if (mode === 'GET') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const at = PHP.getAdjusted(block, 'AT', 1, true);\n const code = 'array_slice(' + list + ', ' + at + ', 1)[0]';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'GET_REMOVE' || mode === 'REMOVE') {\n const list =\n PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n const at =\n PHP.getAdjusted(block, 'AT', 1, false, PHP.ORDER_SUBTRACTION);\n const code = 'array_splice(' + list + ', count(' + list + ') - ' + at +\n ', 1)[0]';\n if (mode === 'GET_REMOVE') {\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return code + ';\\n';\n }\n }\n break;\n case 'RANDOM': {\n const list = PHP.valueToCode(block, 'VALUE', PHP.ORDER_NONE) || 'array()';\n if (mode === 'GET') {\n const functionName = PHP.provideFunction_('lists_get_random_item', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($list) {\n return $list[rand(0,count($list)-1)];\n}\n`);\n const code = functionName + '(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'GET_REMOVE') {\n const functionName =\n PHP.provideFunction_('lists_get_remove_random_item', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}(&$list) {\n $x = rand(0,count($list)-1);\n unset($list[$x]);\n return array_values($list);\n}\n`);\n const code = functionName + '(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n const functionName = PHP.provideFunction_('lists_remove_random_item', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}(&$list) {\n unset($list[rand(0,count($list)-1)]);\n}\n`);\n return functionName + '(' + list + ');\\n';\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_getIndex).');\n};\n\nPHP['lists_setIndex'] = function(block) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const value = PHP.valueToCode(block, 'TO', PHP.ORDER_ASSIGNMENT) || 'null';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n // Closure, which accesses and modifies 'list'.\n let cachedList;\n function cacheList() {\n if (cachedList.match(/^\\$\\w+$/)) {\n return '';\n }\n const listVar = PHP.nameDB_.getDistinctName('tmp_list', NameType.VARIABLE);\n const code = listVar + ' = &' + cachedList + ';\\n';\n cachedList = listVar;\n return code;\n }\n switch (where) {\n case 'FIRST':\n if (mode === 'SET') {\n const list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_MEMBER) || 'array()';\n return list + '[0] = ' + value + ';\\n';\n } else if (mode === 'INSERT') {\n const list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n return 'array_unshift(' + list + ', ' + value + ');\\n';\n }\n break;\n case 'LAST': {\n const list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n if (mode === 'SET') {\n const functionName = PHP.provideFunction_('lists_set_last_item', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}(&$list, $value) {\n $list[count($list) - 1] = $value;\n}\n`);\n return functionName + '(' + list + ', ' + value + ');\\n';\n } else if (mode === 'INSERT') {\n return 'array_push(' + list + ', ' + value + ');\\n';\n }\n break;\n }\n case 'FROM_START': {\n const at = PHP.getAdjusted(block, 'AT');\n if (mode === 'SET') {\n const list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_MEMBER) || 'array()';\n return list + '[' + at + '] = ' + value + ';\\n';\n } else if (mode === 'INSERT') {\n const list =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n return 'array_splice(' + list + ', ' + at + ', 0, ' + value + ');\\n';\n }\n break;\n }\n case 'FROM_END': {\n const list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n const at = PHP.getAdjusted(block, 'AT', 1);\n if (mode === 'SET') {\n const functionName = PHP.provideFunction_('lists_set_from_end', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}(&$list, $at, $value) {\n $list[count($list) - $at] = $value;\n}\n`);\n return functionName + '(' + list + ', ' + at + ', ' + value + ');\\n';\n } else if (mode === 'INSERT') {\n const functionName = PHP.provideFunction_('lists_insert_from_end', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}(&$list, $at, $value) {\n return array_splice($list, count($list) - $at, 0, $value);\n}\n`);\n return functionName + '(' + list + ', ' + at + ', ' + value + ');\\n';\n }\n break;\n }\n case 'RANDOM':\n cachedList =\n PHP.valueToCode(block, 'LIST', PHP.ORDER_REFERENCE) || 'array()';\n let code = cacheList();\n const list = cachedList;\n const xVar = PHP.nameDB_.getDistinctName('tmp_x', NameType.VARIABLE);\n code += xVar + ' = rand(0, count(' + list + ')-1);\\n';\n if (mode === 'SET') {\n code += list + '[' + xVar + '] = ' + value + ';\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += 'array_splice(' + list + ', ' + xVar + ', 0, ' + value + ');\\n';\n return code;\n }\n break;\n }\n throw Error('Unhandled combination (lists_setIndex).');\n};\n\nPHP['lists_getSublist'] = function(block) {\n // Get sublist.\n const list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n let code;\n if (where1 === 'FIRST' && where2 === 'LAST') {\n code = list;\n } else if (\n list.match(/^\\$\\w+$/) ||\n (where1 !== 'FROM_END' && where2 === 'FROM_START')) {\n // If the list is a simple value or doesn't require a call for length, don't\n // generate a helper function.\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = PHP.getAdjusted(block, 'AT1');\n break;\n case 'FROM_END':\n at1 = PHP.getAdjusted(block, 'AT1', 1, false, PHP.ORDER_SUBTRACTION);\n at1 = 'count(' + list + ') - ' + at1;\n break;\n case 'FIRST':\n at1 = '0';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist).');\n }\n let at2;\n let length;\n switch (where2) {\n case 'FROM_START':\n at2 = PHP.getAdjusted(block, 'AT2', 0, false, PHP.ORDER_SUBTRACTION);\n length = at2 + ' - ';\n if (stringUtils.isNumber(String(at1)) ||\n String(at1).match(/^\\(.+\\)$/)) {\n length += at1;\n } else {\n length += '(' + at1 + ')';\n }\n length += ' + 1';\n break;\n case 'FROM_END':\n at2 = PHP.getAdjusted(block, 'AT2', 0, false, PHP.ORDER_SUBTRACTION);\n length = 'count(' + list + ') - ' + at2 + ' - ';\n if (stringUtils.isNumber(String(at1)) ||\n String(at1).match(/^\\(.+\\)$/)) {\n length += at1;\n } else {\n length += '(' + at1 + ')';\n }\n break;\n case 'LAST':\n length = 'count(' + list + ') - ';\n if (stringUtils.isNumber(String(at1)) ||\n String(at1).match(/^\\(.+\\)$/)) {\n length += at1;\n } else {\n length += '(' + at1 + ')';\n }\n break;\n default:\n throw Error('Unhandled option (lists_getSublist).');\n }\n code = 'array_slice(' + list + ', ' + at1 + ', ' + length + ')';\n } else {\n const at1 = PHP.getAdjusted(block, 'AT1');\n const at2 = PHP.getAdjusted(block, 'AT2');\n const functionName = PHP.provideFunction_('lists_get_sublist', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($list, $where1, $at1, $where2, $at2) {\n if ($where1 == 'FROM_END') {\n $at1 = count($list) - 1 - $at1;\n } else if ($where1 == 'FIRST') {\n $at1 = 0;\n } else if ($where1 != 'FROM_START') {\n throw new Exception('Unhandled option (lists_get_sublist).');\n }\n $length = 0;\n if ($where2 == 'FROM_START') {\n $length = $at2 - $at1 + 1;\n } else if ($where2 == 'FROM_END') {\n $length = count($list) - $at1 - $at2;\n } else if ($where2 == 'LAST') {\n $length = count($list) - $at1;\n } else {\n throw new Exception('Unhandled option (lists_get_sublist).');\n }\n return array_slice($list, $at1, $length);\n}\n`);\n code = functionName + '(' + list + ', \\'' + where1 + '\\', ' + at1 + ', \\'' +\n where2 + '\\', ' + at2 + ')';\n }\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_sort'] = function(block) {\n // Block for sorting a list.\n const listCode = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || 'array()';\n const direction = block.getFieldValue('DIRECTION') === '1' ? 1 : -1;\n const type = block.getFieldValue('TYPE');\n const functionName = PHP.provideFunction_('lists_sort', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($list, $type, $direction) {\n $sortCmpFuncs = array(\n 'NUMERIC' => 'strnatcasecmp',\n 'TEXT' => 'strcmp',\n 'IGNORE_CASE' => 'strcasecmp'\n );\n $sortCmp = $sortCmpFuncs[$type];\n $list2 = $list;\n usort($list2, $sortCmp);\n if ($direction == -1) {\n $list2 = array_reverse($list2);\n }\n return $list2;\n}\n`);\n const sortCode =\n functionName + '(' + listCode + ', \"' + type + '\", ' + direction + ')';\n return [sortCode, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_split'] = function(block) {\n // Block for splitting text into a list, or joining a list into text.\n let value_input = PHP.valueToCode(block, 'INPUT', PHP.ORDER_NONE);\n const value_delim = PHP.valueToCode(block, 'DELIM', PHP.ORDER_NONE) || \"''\";\n const mode = block.getFieldValue('MODE');\n let functionName;\n if (mode === 'SPLIT') {\n if (!value_input) {\n value_input = \"''\";\n }\n functionName = 'explode';\n } else if (mode === 'JOIN') {\n if (!value_input) {\n value_input = 'array()';\n }\n functionName = 'implode';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n const code = functionName + '(' + value_delim + ', ' + value_input + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['lists_reverse'] = function(block) {\n // Block for reversing a list.\n const list = PHP.valueToCode(block, 'LIST', PHP.ORDER_NONE) || '[]';\n const code = 'array_reverse(' + list + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2015 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating PHP for colour blocks.\n */\n'use strict';\n\ngoog.module('Blockly.PHP.colour');\n\nconst {phpGenerator: PHP} = goog.require('Blockly.PHP');\n\n\nPHP['colour_picker'] = function(block) {\n // Colour picker.\n const code = PHP.quote_(block.getFieldValue('COLOUR'));\n return [code, PHP.ORDER_ATOMIC];\n};\n\nPHP['colour_random'] = function(block) {\n // Generate a random colour.\n const functionName = PHP.provideFunction_('colour_random', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}() {\n return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);\n}\n`);\n const code = functionName + '()';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['colour_rgb'] = function(block) {\n // Compose a colour from RGB components expressed as percentages.\n const red = PHP.valueToCode(block, 'RED', PHP.ORDER_NONE) || 0;\n const green = PHP.valueToCode(block, 'GREEN', PHP.ORDER_NONE) || 0;\n const blue = PHP.valueToCode(block, 'BLUE', PHP.ORDER_NONE) || 0;\n const functionName = PHP.provideFunction_('colour_rgb', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($r, $g, $b) {\n $r = round(max(min($r, 100), 0) * 2.55);\n $g = round(max(min($g, 100), 0) * 2.55);\n $b = round(max(min($b, 100), 0) * 2.55);\n $hex = '#';\n $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);\n return $hex;\n}\n`);\n const code = functionName + '(' + red + ', ' + green + ', ' + blue + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n\nPHP['colour_blend'] = function(block) {\n // Blend two colours together.\n const c1 = PHP.valueToCode(block, 'COLOUR1', PHP.ORDER_NONE) || \"'#000000'\";\n const c2 = PHP.valueToCode(block, 'COLOUR2', PHP.ORDER_NONE) || \"'#000000'\";\n const ratio = PHP.valueToCode(block, 'RATIO', PHP.ORDER_NONE) || 0.5;\n const functionName = PHP.provideFunction_('colour_blend', `\nfunction ${PHP.FUNCTION_NAME_PLACEHOLDER_}($c1, $c2, $ratio) {\n $ratio = max(min($ratio, 1), 0);\n $r1 = hexdec(substr($c1, 1, 2));\n $g1 = hexdec(substr($c1, 3, 2));\n $b1 = hexdec(substr($c1, 5, 2));\n $r2 = hexdec(substr($c2, 1, 2));\n $g2 = hexdec(substr($c2, 3, 2));\n $b2 = hexdec(substr($c2, 5, 2));\n $r = round($r1 * (1 - $ratio) + $r2 * $ratio);\n $g = round($g1 * (1 - $ratio) + $g2 * $ratio);\n $b = round($b1 * (1 - $ratio) + $b2 * $ratio);\n $hex = '#';\n $hex .= str_pad(dechex($r), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($g), 2, '0', STR_PAD_LEFT);\n $hex .= str_pad(dechex($b), 2, '0', STR_PAD_LEFT);\n return $hex;\n}\n`);\n const code = functionName + '(' + c1 + ', ' + c2 + ', ' + ratio + ')';\n return [code, PHP.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Complete helper functions for generating PHP for\n * blocks. This is the entrypoint for php_compressed.js.\n * @suppress {extraRequire}\n */\n'use strict';\n\ngoog.module('Blockly.PHP.all');\n\nconst moduleExports = goog.require('Blockly.PHP');\ngoog.require('Blockly.PHP.colour');\ngoog.require('Blockly.PHP.lists');\ngoog.require('Blockly.PHP.logic');\ngoog.require('Blockly.PHP.loops');\ngoog.require('Blockly.PHP.math');\ngoog.require('Blockly.PHP.procedures');\ngoog.require('Blockly.PHP.texts');\ngoog.require('Blockly.PHP.variables');\ngoog.require('Blockly.PHP.variablesDynamic');\n\nexports = moduleExports;\n"]} \ No newline at end of file diff --git a/python_compressed.js b/python_compressed.js index 55cacf1b6d2..9b83d3bfe15 100644 --- a/python_compressed.js +++ b/python_compressed.js @@ -8,99 +8,246 @@ module.exports = factory(require("./blockly_compressed.js")); } else { // Browser var factoryExports = factory(root.Blockly); - root.Blockly.Python = factoryExports; + root.Blockly.Python = factoryExports.pythonGenerator; + root.Blockly.Python.__namespace__ = factoryExports.__namespace__; } }(this, function(__parent__) { var $=__parent__.__namespace__; -var module$contents$Blockly$Python_Python=new $.module$exports$Blockly$Generator.Generator("Python");module$contents$Blockly$Python_Python.addReservedWords("False,None,True,and,as,assert,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,nonlocal,not,or,pass,print,raise,return,try,while,with,yield,NotImplemented,Ellipsis,__debug__,quit,exit,copyright,license,credits,ArithmeticError,AssertionError,AttributeError,BaseException,BlockingIOError,BrokenPipeError,BufferError,BytesWarning,ChildProcessError,ConnectionAbortedError,ConnectionError,ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,ImportWarning,IndentationError,IndexError,InterruptedError,IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,PermissionError,ProcessLookupError,RecursionError,ReferenceError,ResourceWarning,RuntimeError,RuntimeWarning,StandardError,StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,UnicodeDecodeError,UnicodeEncodeError,UnicodeError,UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,vars,xrange,zip"); -module$contents$Blockly$Python_Python.ORDER_ATOMIC=0;module$contents$Blockly$Python_Python.ORDER_COLLECTION=1;module$contents$Blockly$Python_Python.ORDER_STRING_CONVERSION=1;module$contents$Blockly$Python_Python.ORDER_MEMBER=2.1;module$contents$Blockly$Python_Python.ORDER_FUNCTION_CALL=2.2;module$contents$Blockly$Python_Python.ORDER_EXPONENTIATION=3;module$contents$Blockly$Python_Python.ORDER_UNARY_SIGN=4;module$contents$Blockly$Python_Python.ORDER_BITWISE_NOT=4; -module$contents$Blockly$Python_Python.ORDER_MULTIPLICATIVE=5;module$contents$Blockly$Python_Python.ORDER_ADDITIVE=6;module$contents$Blockly$Python_Python.ORDER_BITWISE_SHIFT=7;module$contents$Blockly$Python_Python.ORDER_BITWISE_AND=8;module$contents$Blockly$Python_Python.ORDER_BITWISE_XOR=9;module$contents$Blockly$Python_Python.ORDER_BITWISE_OR=10;module$contents$Blockly$Python_Python.ORDER_RELATIONAL=11;module$contents$Blockly$Python_Python.ORDER_LOGICAL_NOT=12; -module$contents$Blockly$Python_Python.ORDER_LOGICAL_AND=13;module$contents$Blockly$Python_Python.ORDER_LOGICAL_OR=14;module$contents$Blockly$Python_Python.ORDER_CONDITIONAL=15;module$contents$Blockly$Python_Python.ORDER_LAMBDA=16;module$contents$Blockly$Python_Python.ORDER_NONE=99; -module$contents$Blockly$Python_Python.ORDER_OVERRIDES=[[module$contents$Blockly$Python_Python.ORDER_FUNCTION_CALL,module$contents$Blockly$Python_Python.ORDER_MEMBER],[module$contents$Blockly$Python_Python.ORDER_FUNCTION_CALL,module$contents$Blockly$Python_Python.ORDER_FUNCTION_CALL],[module$contents$Blockly$Python_Python.ORDER_MEMBER,module$contents$Blockly$Python_Python.ORDER_MEMBER],[module$contents$Blockly$Python_Python.ORDER_MEMBER,module$contents$Blockly$Python_Python.ORDER_FUNCTION_CALL],[module$contents$Blockly$Python_Python.ORDER_LOGICAL_NOT, -module$contents$Blockly$Python_Python.ORDER_LOGICAL_NOT],[module$contents$Blockly$Python_Python.ORDER_LOGICAL_AND,module$contents$Blockly$Python_Python.ORDER_LOGICAL_AND],[module$contents$Blockly$Python_Python.ORDER_LOGICAL_OR,module$contents$Blockly$Python_Python.ORDER_LOGICAL_OR]];module$contents$Blockly$Python_Python.isInitialized=!1; -module$contents$Blockly$Python_Python.init=function(a){Object.getPrototypeOf(this).init.call(this);this.PASS=this.INDENT+"pass\n";this.nameDB_?this.nameDB_.reset():this.nameDB_=new $.module$exports$Blockly$Names.Names(this.RESERVED_WORDS_);this.nameDB_.setVariableMap(a.getVariableMap());this.nameDB_.populateVariables(a);this.nameDB_.populateProcedures(a);for(var b=[],c=(0,$.module$exports$Blockly$Variables.allDeveloperVariables)(a),d=0;dc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};$.Blockly.Python=module$contents$Blockly$Python_Python;var module$exports$Blockly$Python$variables={};$.Blockly.Python.variables_get=function(a){return[$.Blockly.Python.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),$.Blockly.Python.ORDER_ATOMIC]};$.Blockly.Python.variables_set=function(a){var b=$.Blockly.Python.valueToCode(a,"VALUE",$.Blockly.Python.ORDER_NONE)||"0";return $.Blockly.Python.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE)+" = "+b+"\n"};var module$exports$Blockly$Python$variablesDynamic={};$.Blockly.Python.variables_get_dynamic=$.Blockly.Python.variables_get;$.Blockly.Python.variables_set_dynamic=$.Blockly.Python.variables_set;var module$exports$Blockly$Python$texts={};$.Blockly.Python.text=function(a){return[$.Blockly.Python.quote_(a.getFieldValue("TEXT")),$.Blockly.Python.ORDER_ATOMIC]};$.Blockly.Python.text_multiline=function(a){a=$.Blockly.Python.multiline_quote_(a.getFieldValue("TEXT"));var b=-1!==a.indexOf("+")?$.Blockly.Python.ORDER_ADDITIVE:$.Blockly.Python.ORDER_ATOMIC;return[a,b]}; -var module$contents$Blockly$Python$texts_strRegExp=/^\s*'([^']|\\')*'\s*$/,module$contents$Blockly$Python$texts_forceString=function(a){return module$contents$Blockly$Python$texts_strRegExp.test(a)?[a,$.Blockly.Python.ORDER_ATOMIC]:["str("+a+")",$.Blockly.Python.ORDER_FUNCTION_CALL]}; -$.Blockly.Python.text_join=function(a){switch(a.itemCount_){case 0:return["''",$.Blockly.Python.ORDER_ATOMIC];case 1:return a=$.Blockly.Python.valueToCode(a,"ADD0",$.Blockly.Python.ORDER_NONE)||"''",module$contents$Blockly$Python$texts_forceString(a);case 2:var b=$.Blockly.Python.valueToCode(a,"ADD0",$.Blockly.Python.ORDER_NONE)||"''";a=$.Blockly.Python.valueToCode(a,"ADD1",$.Blockly.Python.ORDER_NONE)||"''";return[module$contents$Blockly$Python$texts_forceString(b)[0]+" + "+module$contents$Blockly$Python$texts_forceString(a)[0], -$.Blockly.Python.ORDER_ADDITIVE];default:b=[];for(var c=0;ca?$.Blockly.Python.ORDER_UNARY_SIGN:$.Blockly.Python.ORDER_ATOMIC;return[a,b]}; -$.Blockly.Python.math_arithmetic=function(a){var b={ADD:[" + ",$.Blockly.Python.ORDER_ADDITIVE],MINUS:[" - ",$.Blockly.Python.ORDER_ADDITIVE],MULTIPLY:[" * ",$.Blockly.Python.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",$.Blockly.Python.ORDER_MULTIPLICATIVE],POWER:[" ** ",$.Blockly.Python.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")],c=b[0];b=b[1];var d=$.Blockly.Python.valueToCode(a,"A",b)||"0";a=$.Blockly.Python.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; -$.Blockly.Python.math_single=function(a){var b=a.getFieldValue("OP");if("NEG"===b){var c=$.Blockly.Python.valueToCode(a,"NUM",$.Blockly.Python.ORDER_UNARY_SIGN)||"0";return["-"+c,$.Blockly.Python.ORDER_UNARY_SIGN]}$.Blockly.Python.definitions_.import_math="import math";a="SIN"===b||"COS"===b||"TAN"===b?$.Blockly.Python.valueToCode(a,"NUM",$.Blockly.Python.ORDER_MULTIPLICATIVE)||"0":$.Blockly.Python.valueToCode(a,"NUM",$.Blockly.Python.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break; -case "ROOT":c="math.sqrt("+a+")";break;case "LN":c="math.log("+a+")";break;case "LOG10":c="math.log10("+a+")";break;case "EXP":c="math.exp("+a+")";break;case "POW10":c="math.pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c="math.ceil("+a+")";break;case "ROUNDDOWN":c="math.floor("+a+")";break;case "SIN":c="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":c="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":c="math.tan("+a+" / 180.0 * math.pi)"}if(c)return[c,$.Blockly.Python.ORDER_FUNCTION_CALL]; -switch(b){case "ASIN":c="math.asin("+a+") / math.pi * 180";break;case "ACOS":c="math.acos("+a+") / math.pi * 180";break;case "ATAN":c="math.atan("+a+") / math.pi * 180";break;default:throw Error("Unknown math operator: "+b);}return[c,$.Blockly.Python.ORDER_MULTIPLICATIVE]}; -$.Blockly.Python.math_constant=function(a){var b={PI:["math.pi",$.Blockly.Python.ORDER_MEMBER],E:["math.e",$.Blockly.Python.ORDER_MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",$.Blockly.Python.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",$.Blockly.Python.ORDER_MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",$.Blockly.Python.ORDER_MEMBER],INFINITY:["float('inf')",$.Blockly.Python.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!==a&&($.Blockly.Python.definitions_.import_math="import math");return b[a]}; -$.Blockly.Python.math_number_property=function(a){var b={EVEN:[" % 2 == 0",$.Blockly.Python.ORDER_MULTIPLICATIVE,$.Blockly.Python.ORDER_RELATIONAL],ODD:[" % 2 == 1",$.Blockly.Python.ORDER_MULTIPLICATIVE,$.Blockly.Python.ORDER_RELATIONAL],WHOLE:[" % 1 == 0",$.Blockly.Python.ORDER_MULTIPLICATIVE,$.Blockly.Python.ORDER_RELATIONAL],POSITIVE:[" > 0",$.Blockly.Python.ORDER_RELATIONAL,$.Blockly.Python.ORDER_RELATIONAL],NEGATIVE:[" < 0",$.Blockly.Python.ORDER_RELATIONAL,$.Blockly.Python.ORDER_RELATIONAL], -DIVISIBLE_BY:[null,$.Blockly.Python.ORDER_MULTIPLICATIVE,$.Blockly.Python.ORDER_RELATIONAL],PRIME:[null,$.Blockly.Python.ORDER_NONE,$.Blockly.Python.ORDER_FUNCTION_CALL]},c=a.getFieldValue("PROPERTY");b=$.$jscomp.makeIterator(b[c]);var d=b.next().value,e=b.next().value;b=b.next().value;e=$.Blockly.Python.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";if("PRIME"===c)$.Blockly.Python.definitions_.import_math="import math",$.Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number", -a=$.Blockly.Python.provideFunction_("math_isPrime","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(n):\n # https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n # If n is not a number but a string, try parsing it.\n if not isinstance(n, Number):\n try:\n n = float(n)\n except:\n return False\n if n == 2 or n == 3:\n return True\n # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3.\n if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:\n return False\n # Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x in range(6, int(math.sqrt(n)) + 2, 6):\n if n % (x - 1) == 0 or n % (x + 1) == 0:\n return False\n return True\n")+ -"("+e+")";else if("DIVISIBLE_BY"===c){a=$.Blockly.Python.valueToCode(a,"DIVISOR",$.Blockly.Python.ORDER_MULTIPLICATIVE)||"0";if("0"===a)return["False",$.Blockly.Python.ORDER_ATOMIC];a=e+" % "+a+" == 0"}else a=e+d;return[a,b]}; -$.Blockly.Python.math_change=function(a){$.Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";var b=$.Blockly.Python.valueToCode(a,"DELTA",$.Blockly.Python.ORDER_ADDITIVE)||"0";a=$.Blockly.Python.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE);return a+" = ("+a+" if isinstance("+a+", Number) else 0) + "+b+"\n"};$.Blockly.Python.math_round=$.Blockly.Python.math_single;$.Blockly.Python.math_trig=$.Blockly.Python.math_single; -$.Blockly.Python.math_on_list=function(a){var b=a.getFieldValue("OP");a=$.Blockly.Python.valueToCode(a,"LIST",$.Blockly.Python.ORDER_NONE)||"[]";switch(b){case "SUM":b="sum("+a+")";break;case "MIN":b="min("+a+")";break;case "MAX":b="max("+a+")";break;case "AVERAGE":$.Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=$.Blockly.Python.provideFunction_("math_mean","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):\n localList = [e for e in myList if isinstance(e, Number)]\n if not localList: return\n return float(sum(localList)) / len(localList)\n")+ -"("+a+")";break;case "MEDIAN":$.Blockly.Python.definitions_.from_numbers_import_Number="from numbers import Number";b=$.Blockly.Python.provideFunction_("math_median","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(myList):\n localList = sorted([e for e in myList if isinstance(e, Number)])\n if not localList: return\n if len(localList) % 2 == 0:\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\n else:\n return localList[(len(localList) - 1) // 2]\n")+ -"("+a+")";break;case "MODE":b=$.Blockly.Python.provideFunction_("math_modes","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+'(some_list):\n modes = []\n # Using a lists of [item, count] to keep count rather than dict\n # to avoid "unhashable" errors when the counted item is itself a list or dict.\n counts = []\n maxCount = 1\n for item in some_list:\n found = False\n for count in counts:\n if count[0] == item:\n count[1] += 1\n maxCount = max(maxCount, count[1])\n found = True\n if not found:\n counts.append([item, 1])\n for counted_item, item_count in counts:\n if item_count == maxCount:\n modes.append(counted_item)\n return modes\n')+ -"("+a+")";break;case "STD_DEV":$.Blockly.Python.definitions_.import_math="import math";b=$.Blockly.Python.provideFunction_("math_standard_deviation","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(numbers):\n n = len(numbers)\n if n == 0: return\n mean = float(sum(numbers)) / n\n variance = sum((x - mean) ** 2 for x in numbers) / n\n return math.sqrt(variance)\n")+"("+a+")";break;case "RANDOM":$.Blockly.Python.definitions_.import_random="import random";b="random.choice("+a+")";break;default:throw Error("Unknown operator: "+ -b);}return[b,$.Blockly.Python.ORDER_FUNCTION_CALL]};$.Blockly.Python.math_modulo=function(a){var b=$.Blockly.Python.valueToCode(a,"DIVIDEND",$.Blockly.Python.ORDER_MULTIPLICATIVE)||"0";a=$.Blockly.Python.valueToCode(a,"DIVISOR",$.Blockly.Python.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,$.Blockly.Python.ORDER_MULTIPLICATIVE]}; -$.Blockly.Python.math_constrain=function(a){var b=$.Blockly.Python.valueToCode(a,"VALUE",$.Blockly.Python.ORDER_NONE)||"0",c=$.Blockly.Python.valueToCode(a,"LOW",$.Blockly.Python.ORDER_NONE)||"0";a=$.Blockly.Python.valueToCode(a,"HIGH",$.Blockly.Python.ORDER_NONE)||"float('inf')";return["min(max("+b+", "+c+"), "+a+")",$.Blockly.Python.ORDER_FUNCTION_CALL]}; -$.Blockly.Python.math_random_int=function(a){$.Blockly.Python.definitions_.import_random="import random";var b=$.Blockly.Python.valueToCode(a,"FROM",$.Blockly.Python.ORDER_NONE)||"0";a=$.Blockly.Python.valueToCode(a,"TO",$.Blockly.Python.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",$.Blockly.Python.ORDER_FUNCTION_CALL]};$.Blockly.Python.math_random_float=function(a){$.Blockly.Python.definitions_.import_random="import random";return["random.random()",$.Blockly.Python.ORDER_FUNCTION_CALL]}; -$.Blockly.Python.math_atan2=function(a){$.Blockly.Python.definitions_.import_math="import math";var b=$.Blockly.Python.valueToCode(a,"X",$.Blockly.Python.ORDER_NONE)||"0";return["math.atan2("+($.Blockly.Python.valueToCode(a,"Y",$.Blockly.Python.ORDER_NONE)||"0")+", "+b+") / math.pi * 180",$.Blockly.Python.ORDER_MULTIPLICATIVE]};var module$exports$Blockly$Python$loops={}; -$.Blockly.Python.controls_repeat_ext=function(a){var b=a.getField("TIMES")?String(parseInt(a.getFieldValue("TIMES"),10)):$.Blockly.Python.valueToCode(a,"TIMES",$.Blockly.Python.ORDER_NONE)||"0";b=(0,$.module$exports$Blockly$utils$string.isNumber)(b)?parseInt(b,10):"int("+b+")";var c=$.Blockly.Python.statementToCode(a,"DO");c=$.Blockly.Python.addLoopTrap(c,a)||$.Blockly.Python.PASS;return"for "+$.Blockly.Python.nameDB_.getDistinctName("count",$.module$exports$Blockly$Names.NameType.VARIABLE)+" in range("+ -b+"):\n"+c};$.Blockly.Python.controls_repeat=$.Blockly.Python.controls_repeat_ext;$.Blockly.Python.controls_whileUntil=function(a){var b="UNTIL"===a.getFieldValue("MODE"),c=$.Blockly.Python.valueToCode(a,"BOOL",b?$.Blockly.Python.ORDER_LOGICAL_NOT:$.Blockly.Python.ORDER_NONE)||"False",d=$.Blockly.Python.statementToCode(a,"DO");d=$.Blockly.Python.addLoopTrap(d,a)||$.Blockly.Python.PASS;b&&(c="not "+c);return"while "+c+":\n"+d}; -$.Blockly.Python.controls_for=function(a){var b=$.Blockly.Python.nameDB_.getName(a.getFieldValue("VAR"),$.module$exports$Blockly$Names.NameType.VARIABLE),c=$.Blockly.Python.valueToCode(a,"FROM",$.Blockly.Python.ORDER_NONE)||"0",d=$.Blockly.Python.valueToCode(a,"TO",$.Blockly.Python.ORDER_NONE)||"0",e=$.Blockly.Python.valueToCode(a,"BY",$.Blockly.Python.ORDER_NONE)||"1",f=$.Blockly.Python.statementToCode(a,"DO");f=$.Blockly.Python.addLoopTrap(f,a)||$.Blockly.Python.PASS;var g="";a=function(){return $.Blockly.Python.provideFunction_("upRange", -"\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):\n while start <= stop:\n yield start\n start += abs(step)\n")};var h=function(){return $.Blockly.Python.provideFunction_("downRange","\ndef "+$.Blockly.Python.FUNCTION_NAME_PLACEHOLDER_+"(start, stop, step):\n while start >= stop:\n yield start\n start -= abs(step)\n")};if((0,$.module$exports$Blockly$utils$string.isNumber)(c)&&(0,$.module$exports$Blockly$utils$string.isNumber)(d)&&(0,$.module$exports$Blockly$utils$string.isNumber)(e))c= -Number(c),d=Number(d),e=Math.abs(Number(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0===c&&1===e?d:c+", "+d,1!==e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=c",GTE:">="}[a.getFieldValue("OP")],c=$.Blockly.Python.ORDER_RELATIONAL,d=$.Blockly.Python.valueToCode(a,"A",c)||"0";a=$.Blockly.Python.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; -$.Blockly.Python.logic_operation=function(a){var b="AND"===a.getFieldValue("OP")?"and":"or",c="and"===b?$.Blockly.Python.ORDER_LOGICAL_AND:$.Blockly.Python.ORDER_LOGICAL_OR,d=$.Blockly.Python.valueToCode(a,"A",c);a=$.Blockly.Python.valueToCode(a,"B",c);if(d||a){var e="and"===b?"True":"False";d||(d=e);a||(a=e)}else a=d="False";return[d+" "+b+" "+a,c]};$.Blockly.Python.logic_negate=function(a){return["not "+($.Blockly.Python.valueToCode(a,"BOOL",$.Blockly.Python.ORDER_LOGICAL_NOT)||"True"),$.Blockly.Python.ORDER_LOGICAL_NOT]}; -$.Blockly.Python.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"True":"False",$.Blockly.Python.ORDER_ATOMIC]};$.Blockly.Python.logic_null=function(a){return["None",$.Blockly.Python.ORDER_ATOMIC]}; -$.Blockly.Python.logic_ternary=function(a){var b=$.Blockly.Python.valueToCode(a,"IF",$.Blockly.Python.ORDER_CONDITIONAL)||"False",c=$.Blockly.Python.valueToCode(a,"THEN",$.Blockly.Python.ORDER_CONDITIONAL)||"None";a=$.Blockly.Python.valueToCode(a,"ELSE",$.Blockly.Python.ORDER_CONDITIONAL)||"None";return[c+" if "+b+" else "+a,$.Blockly.Python.ORDER_CONDITIONAL]};var module$exports$Blockly$Python$lists={};$.Blockly.Python.lists_create_empty=function(a){return["[]",$.Blockly.Python.ORDER_ATOMIC]};$.Blockly.Python.lists_create_with=function(a){for(var b=Array(a.itemCount_),c=0;cc?"int("+a+" - "+-c+")":"int("+a+")",d&&(a="-"+a));return a};var module$exports$Blockly$Python$variables={},module$contents$Blockly$Python$variables_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$Python.pythonGenerator.variables_get=function(a){return[module$exports$Blockly$Python.pythonGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE),module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Python.pythonGenerator.variables_set=function(a){const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"VALUE",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";return module$exports$Blockly$Python.pythonGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE)+" = "+b+"\n"};var module$exports$Blockly$Python$variablesDynamic={};module$exports$Blockly$Python.pythonGenerator.variables_get_dynamic=module$exports$Blockly$Python.pythonGenerator.variables_get;module$exports$Blockly$Python.pythonGenerator.variables_set_dynamic=module$exports$Blockly$Python.pythonGenerator.variables_set;var module$exports$Blockly$Python$texts={},module$contents$Blockly$Python$texts_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$Python$texts_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$Python.pythonGenerator.text=function(a){return[module$exports$Blockly$Python.pythonGenerator.quote_(a.getFieldValue("TEXT")),module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Python.pythonGenerator.text_multiline=function(a){a=module$exports$Blockly$Python.pythonGenerator.multiline_quote_(a.getFieldValue("TEXT"));const b=-1!==a.indexOf("+")?module$exports$Blockly$Python.pythonGenerator.ORDER_ADDITIVE:module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC;return[a,b]}; +var module$contents$Blockly$Python$texts_strRegExp=/^\s*'([^']|\\')*'\s*$/,module$contents$Blockly$Python$texts_forceString=function(a){return module$contents$Blockly$Python$texts_strRegExp.test(a)?[a,module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]:["str("+a+")",module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$Python.pythonGenerator.text_join=function(a){switch(a.itemCount_){case 0:return["''",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC];case 1:return a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"ADD0",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"''",module$contents$Blockly$Python$texts_forceString(a);case 2:var b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"ADD0",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)|| +"''";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"ADD1",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"''";return[module$contents$Blockly$Python$texts_forceString(b)[0]+" + "+module$contents$Blockly$Python$texts_forceString(a)[0],module$exports$Blockly$Python.pythonGenerator.ORDER_ADDITIVE];default:b=[];for(let c=0;ca?module$exports$Blockly$Python.pythonGenerator.ORDER_UNARY_SIGN:module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC;return[a,b]}; +module$exports$Blockly$Python.pythonGenerator.math_arithmetic=function(a){var b={ADD:[" + ",module$exports$Blockly$Python.pythonGenerator.ORDER_ADDITIVE],MINUS:[" - ",module$exports$Blockly$Python.pythonGenerator.ORDER_ADDITIVE],MULTIPLY:[" * ",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE],DIVIDE:[" / ",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE],POWER:[" ** ",module$exports$Blockly$Python.pythonGenerator.ORDER_EXPONENTIATION]}[a.getFieldValue("OP")]; +const c=b[0];b=b[1];const d=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"A",b)||"0";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"B",b)||"0";return[d+c+a,b]}; +module$exports$Blockly$Python.pythonGenerator.math_single=function(a){const b=a.getFieldValue("OP");let c;if("NEG"===b)return c=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"NUM",module$exports$Blockly$Python.pythonGenerator.ORDER_UNARY_SIGN)||"0",["-"+c,module$exports$Blockly$Python.pythonGenerator.ORDER_UNARY_SIGN];module$exports$Blockly$Python.pythonGenerator.definitions_.import_math="import math";a="SIN"===b||"COS"===b||"TAN"===b?module$exports$Blockly$Python.pythonGenerator.valueToCode(a, +"NUM",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE)||"0":module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"NUM",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";switch(b){case "ABS":c="math.fabs("+a+")";break;case "ROOT":c="math.sqrt("+a+")";break;case "LN":c="math.log("+a+")";break;case "LOG10":c="math.log10("+a+")";break;case "EXP":c="math.exp("+a+")";break;case "POW10":c="math.pow(10,"+a+")";break;case "ROUND":c="round("+a+")";break;case "ROUNDUP":c= +"math.ceil("+a+")";break;case "ROUNDDOWN":c="math.floor("+a+")";break;case "SIN":c="math.sin("+a+" / 180.0 * math.pi)";break;case "COS":c="math.cos("+a+" / 180.0 * math.pi)";break;case "TAN":c="math.tan("+a+" / 180.0 * math.pi)"}if(c)return[c,module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL];switch(b){case "ASIN":c="math.asin("+a+") / math.pi * 180";break;case "ACOS":c="math.acos("+a+") / math.pi * 180";break;case "ATAN":c="math.atan("+a+") / math.pi * 180";break;default:throw Error("Unknown math operator: "+ +b);}return[c,module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE]}; +module$exports$Blockly$Python.pythonGenerator.math_constant=function(a){const b={PI:["math.pi",module$exports$Blockly$Python.pythonGenerator.ORDER_MEMBER],E:["math.e",module$exports$Blockly$Python.pythonGenerator.ORDER_MEMBER],GOLDEN_RATIO:["(1 + math.sqrt(5)) / 2",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE],SQRT2:["math.sqrt(2)",module$exports$Blockly$Python.pythonGenerator.ORDER_MEMBER],SQRT1_2:["math.sqrt(1.0 / 2)",module$exports$Blockly$Python.pythonGenerator.ORDER_MEMBER], +INFINITY:["float('inf')",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]};a=a.getFieldValue("CONSTANT");"INFINITY"!==a&&(module$exports$Blockly$Python.pythonGenerator.definitions_.import_math="import math");return b[a]}; +module$exports$Blockly$Python.pythonGenerator.math_number_property=function(a){var b={EVEN:[" % 2 == 0",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL],ODD:[" % 2 == 1",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL],WHOLE:[" % 1 == 0",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL], +POSITIVE:[" > 0",module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL],NEGATIVE:[" < 0",module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL],DIVISIBLE_BY:[null,module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE,module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL],PRIME:[null,module$exports$Blockly$Python.pythonGenerator.ORDER_NONE, +module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]};const c=a.getFieldValue("PROPERTY"),[d,e,f]=b[c];b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"NUMBER_TO_CHECK",e)||"0";if("PRIME"===c)module$exports$Blockly$Python.pythonGenerator.definitions_.import_math="import math",module$exports$Blockly$Python.pythonGenerator.definitions_.from_numbers_import_Number="from numbers import Number",a=module$exports$Blockly$Python.pythonGenerator.provideFunction_("math_isPrime",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(n): + # https://en.wikipedia.org/wiki/Primality_test#Naive_methods + # If n is not a number but a string, try parsing it. + if not isinstance(n, Number): + try: + n = float(n) + except: + return False + if n == 2 or n == 3: + return True + # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3. + if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0: + return False + # Check all the numbers of form 6k +/- 1, up to sqrt(n). + for x in range(6, int(math.sqrt(n)) + 2, 6): + if n % (x - 1) == 0 or n % (x + 1) == 0: + return False + return True +`)+"("+b+")";else if("DIVISIBLE_BY"===c){a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE)||"0";if("0"===a)return["False",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC];a=b+" % "+a+" == 0"}else a=b+d;return[a,f]}; +module$exports$Blockly$Python.pythonGenerator.math_change=function(a){module$exports$Blockly$Python.pythonGenerator.definitions_.from_numbers_import_Number="from numbers import Number";const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"DELTA",module$exports$Blockly$Python.pythonGenerator.ORDER_ADDITIVE)||"0";a=module$exports$Blockly$Python.pythonGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE);return a+" = ("+a+" if isinstance("+ +a+", Number) else 0) + "+b+"\n"};module$exports$Blockly$Python.pythonGenerator.math_round=module$exports$Blockly$Python.pythonGenerator.math_single;module$exports$Blockly$Python.pythonGenerator.math_trig=module$exports$Blockly$Python.pythonGenerator.math_single; +module$exports$Blockly$Python.pythonGenerator.math_on_list=function(a){var b=a.getFieldValue("OP");a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"LIST",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"[]";switch(b){case "SUM":b="sum("+a+")";break;case "MIN":b="min("+a+")";break;case "MAX":b="max("+a+")";break;case "AVERAGE":module$exports$Blockly$Python.pythonGenerator.definitions_.from_numbers_import_Number="from numbers import Number";b=module$exports$Blockly$Python.pythonGenerator.provideFunction_("math_mean", +` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(myList): + localList = [e for e in myList if isinstance(e, Number)] + if not localList: return + return float(sum(localList)) / len(localList) +`)+"("+a+")";break;case "MEDIAN":module$exports$Blockly$Python.pythonGenerator.definitions_.from_numbers_import_Number="from numbers import Number";b=module$exports$Blockly$Python.pythonGenerator.provideFunction_("math_median",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(myList): + localList = sorted([e for e in myList if isinstance(e, Number)]) + if not localList: return + if len(localList) % 2 == 0: + return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0 + else: + return localList[(len(localList) - 1) // 2] +`)+"("+a+")";break;case "MODE":b=module$exports$Blockly$Python.pythonGenerator.provideFunction_("math_modes",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(some_list): + modes = [] + # Using a lists of [item, count] to keep count rather than dict + # to avoid "unhashable" errors when the counted item is itself a list or dict. + counts = [] + maxCount = 1 + for item in some_list: + found = False + for count in counts: + if count[0] == item: + count[1] += 1 + maxCount = max(maxCount, count[1]) + found = True + if not found: + counts.append([item, 1]) + for counted_item, item_count in counts: + if item_count == maxCount: + modes.append(counted_item) + return modes +`)+"("+a+")";break;case "STD_DEV":module$exports$Blockly$Python.pythonGenerator.definitions_.import_math="import math";b=module$exports$Blockly$Python.pythonGenerator.provideFunction_("math_standard_deviation",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(numbers): + n = len(numbers) + if n == 0: return + mean = float(sum(numbers)) / n + variance = sum((x - mean) ** 2 for x in numbers) / n + return math.sqrt(variance) +`)+"("+a+")";break;case "RANDOM":module$exports$Blockly$Python.pythonGenerator.definitions_.import_random="import random";b="random.choice("+a+")";break;default:throw Error("Unknown operator: "+b);}return[b,module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$Python.pythonGenerator.math_modulo=function(a){const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"DIVIDEND",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE)||"0";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"DIVISOR",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE)||"0";return[b+" % "+a,module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE]}; +module$exports$Blockly$Python.pythonGenerator.math_constrain=function(a){const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"VALUE",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0",c=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"LOW",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"HIGH",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"float('inf')";return["min(max("+ +b+", "+c+"), "+a+")",module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$Python.pythonGenerator.math_random_int=function(a){module$exports$Blockly$Python.pythonGenerator.definitions_.import_random="import random";const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"FROM",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"TO",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";return["random.randint("+b+", "+a+")",module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$Python.pythonGenerator.math_random_float=function(a){module$exports$Blockly$Python.pythonGenerator.definitions_.import_random="import random";return["random.random()",module$exports$Blockly$Python.pythonGenerator.ORDER_FUNCTION_CALL]}; +module$exports$Blockly$Python.pythonGenerator.math_atan2=function(a){module$exports$Blockly$Python.pythonGenerator.definitions_.import_math="import math";const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"X",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";return["math.atan2("+(module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"Y",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0")+", "+b+") / math.pi * 180",module$exports$Blockly$Python.pythonGenerator.ORDER_MULTIPLICATIVE]};var module$exports$Blockly$Python$loops={},module$contents$Blockly$Python$loops_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$Python$loops_NameType=$.NameType$$module$build$src$core$names; +module$exports$Blockly$Python.pythonGenerator.controls_repeat_ext=function(a){let b;b=a.getField("TIMES")?String(parseInt(a.getFieldValue("TIMES"),10)):module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"TIMES",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0";b=$.module$build$src$core$utils$string.isNumber(b)?parseInt(b,10):"int("+b+")";let c=module$exports$Blockly$Python.pythonGenerator.statementToCode(a,"DO");c=module$exports$Blockly$Python.pythonGenerator.addLoopTrap(c,a)|| +module$exports$Blockly$Python.pythonGenerator.PASS;return"for "+module$exports$Blockly$Python.pythonGenerator.nameDB_.getDistinctName("count",$.NameType$$module$build$src$core$names.VARIABLE)+" in range("+b+"):\n"+c};module$exports$Blockly$Python.pythonGenerator.controls_repeat=module$exports$Blockly$Python.pythonGenerator.controls_repeat_ext; +module$exports$Blockly$Python.pythonGenerator.controls_whileUntil=function(a){const b="UNTIL"===a.getFieldValue("MODE");let c=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"BOOL",b?module$exports$Blockly$Python.pythonGenerator.ORDER_LOGICAL_NOT:module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"False",d=module$exports$Blockly$Python.pythonGenerator.statementToCode(a,"DO");d=module$exports$Blockly$Python.pythonGenerator.addLoopTrap(d,a)||module$exports$Blockly$Python.pythonGenerator.PASS; +b&&(c="not "+c);return"while "+c+":\n"+d}; +module$exports$Blockly$Python.pythonGenerator.controls_for=function(a){const b=module$exports$Blockly$Python.pythonGenerator.nameDB_.getName(a.getFieldValue("VAR"),$.NameType$$module$build$src$core$names.VARIABLE);var c=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"FROM",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0",d=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"TO",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"0",e=module$exports$Blockly$Python.pythonGenerator.valueToCode(a, +"BY",module$exports$Blockly$Python.pythonGenerator.ORDER_NONE)||"1";let f=module$exports$Blockly$Python.pythonGenerator.statementToCode(a,"DO");f=module$exports$Blockly$Python.pythonGenerator.addLoopTrap(f,a)||module$exports$Blockly$Python.pythonGenerator.PASS;let g="";const h=function(){return module$exports$Blockly$Python.pythonGenerator.provideFunction_("upRange",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step): + while start <= stop: + yield start + start += abs(step) +`)},k=function(){return module$exports$Blockly$Python.pythonGenerator.provideFunction_("downRange",` +def ${module$exports$Blockly$Python.pythonGenerator.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step): + while start >= stop: + yield start + start -= abs(step) +`)};a=function(l,m,n){return"("+l+" <= "+m+") and "+h()+"("+l+", "+m+", "+n+") or "+k()+"("+l+", "+m+", "+n+")"};if($.module$build$src$core$utils$string.isNumber(c)&&$.module$build$src$core$utils$string.isNumber(d)&&$.module$build$src$core$utils$string.isNumber(e))c=Number(c),d=Number(d),e=Math.abs(Number(e)),0===c%1&&0===d%1&&0===e%1?(c<=d?(d++,a=0===c&&1===e?d:c+", "+d,1!==e&&(a+=", "+e)):(d--,a=c+", "+d+", -"+e),a="range("+a+")"):(a=c",GTE:">="}[a.getFieldValue("OP")],c=module$exports$Blockly$Python.pythonGenerator.ORDER_RELATIONAL,d=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"A",c)||"0";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"B",c)||"0";return[d+" "+b+" "+a,c]}; +module$exports$Blockly$Python.pythonGenerator.logic_operation=function(a){const b="AND"===a.getFieldValue("OP")?"and":"or",c="and"===b?module$exports$Blockly$Python.pythonGenerator.ORDER_LOGICAL_AND:module$exports$Blockly$Python.pythonGenerator.ORDER_LOGICAL_OR;let d=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"A",c);a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"B",c);if(d||a){const e="and"===b?"True":"False";d||(d=e);a||(a=e)}else a=d="False";return[d+" "+b+" "+a, +c]};module$exports$Blockly$Python.pythonGenerator.logic_negate=function(a){return["not "+(module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"BOOL",module$exports$Blockly$Python.pythonGenerator.ORDER_LOGICAL_NOT)||"True"),module$exports$Blockly$Python.pythonGenerator.ORDER_LOGICAL_NOT]};module$exports$Blockly$Python.pythonGenerator.logic_boolean=function(a){return["TRUE"===a.getFieldValue("BOOL")?"True":"False",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Python.pythonGenerator.logic_null=function(a){return["None",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Python.pythonGenerator.logic_ternary=function(a){const b=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"IF",module$exports$Blockly$Python.pythonGenerator.ORDER_CONDITIONAL)||"False",c=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"THEN",module$exports$Blockly$Python.pythonGenerator.ORDER_CONDITIONAL)||"None";a=module$exports$Blockly$Python.pythonGenerator.valueToCode(a,"ELSE",module$exports$Blockly$Python.pythonGenerator.ORDER_CONDITIONAL)||"None"; +return[c+" if "+b+" else "+a,module$exports$Blockly$Python.pythonGenerator.ORDER_CONDITIONAL]};var module$exports$Blockly$Python$lists={},module$contents$Blockly$Python$lists_stringUtils=$.module$build$src$core$utils$string,module$contents$Blockly$Python$lists_NameType=$.NameType$$module$build$src$core$names;module$exports$Blockly$Python.pythonGenerator.lists_create_empty=function(a){return["[]",module$exports$Blockly$Python.pythonGenerator.ORDER_ATOMIC]}; +module$exports$Blockly$Python.pythonGenerator.lists_create_with=function(a){const b=Array(a.itemCount_);for(let c=0;c>> print(','.join(sorted(dir(__builtins__))))\n // https://docs.python.org/3/library/functions.html\n // https://docs.python.org/2/library/functions.html\n 'ArithmeticError,AssertionError,AttributeError,BaseException,' +\n 'BlockingIOError,BrokenPipeError,BufferError,BytesWarning,' +\n 'ChildProcessError,ConnectionAbortedError,ConnectionError,' +\n 'ConnectionRefusedError,ConnectionResetError,DeprecationWarning,EOFError,' +\n 'Ellipsis,EnvironmentError,Exception,FileExistsError,FileNotFoundError,' +\n 'FloatingPointError,FutureWarning,GeneratorExit,IOError,ImportError,' +\n 'ImportWarning,IndentationError,IndexError,InterruptedError,' +\n 'IsADirectoryError,KeyError,KeyboardInterrupt,LookupError,MemoryError,' +\n 'ModuleNotFoundError,NameError,NotADirectoryError,NotImplemented,' +\n 'NotImplementedError,OSError,OverflowError,PendingDeprecationWarning,' +\n 'PermissionError,ProcessLookupError,RecursionError,ReferenceError,' +\n 'ResourceWarning,RuntimeError,RuntimeWarning,StandardError,' +\n 'StopAsyncIteration,StopIteration,SyntaxError,SyntaxWarning,SystemError,' +\n 'SystemExit,TabError,TimeoutError,TypeError,UnboundLocalError,' +\n 'UnicodeDecodeError,UnicodeEncodeError,UnicodeError,' +\n 'UnicodeTranslateError,UnicodeWarning,UserWarning,ValueError,Warning,' +\n 'ZeroDivisionError,_,__build_class__,__debug__,__doc__,__import__,' +\n '__loader__,__name__,__package__,__spec__,abs,all,any,apply,ascii,' +\n 'basestring,bin,bool,buffer,bytearray,bytes,callable,chr,classmethod,cmp,' +\n 'coerce,compile,complex,copyright,credits,delattr,dict,dir,divmod,' +\n 'enumerate,eval,exec,execfile,exit,file,filter,float,format,frozenset,' +\n 'getattr,globals,hasattr,hash,help,hex,id,input,int,intern,isinstance,' +\n 'issubclass,iter,len,license,list,locals,long,map,max,memoryview,min,' +\n 'next,object,oct,open,ord,pow,print,property,quit,range,raw_input,reduce,' +\n 'reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,' +\n 'sum,super,tuple,type,unichr,unicode,vars,xrange,zip');\n\n/**\n * Order of operation ENUMs.\n * http://docs.python.org/reference/expressions.html#summary\n */\nPython.ORDER_ATOMIC = 0; // 0 \"\" ...\nPython.ORDER_COLLECTION = 1; // tuples, lists, dictionaries\nPython.ORDER_STRING_CONVERSION = 1; // `expression...`\nPython.ORDER_MEMBER = 2.1; // . []\nPython.ORDER_FUNCTION_CALL = 2.2; // ()\nPython.ORDER_EXPONENTIATION = 3; // **\nPython.ORDER_UNARY_SIGN = 4; // + -\nPython.ORDER_BITWISE_NOT = 4; // ~\nPython.ORDER_MULTIPLICATIVE = 5; // * / // %\nPython.ORDER_ADDITIVE = 6; // + -\nPython.ORDER_BITWISE_SHIFT = 7; // << >>\nPython.ORDER_BITWISE_AND = 8; // &\nPython.ORDER_BITWISE_XOR = 9; // ^\nPython.ORDER_BITWISE_OR = 10; // |\nPython.ORDER_RELATIONAL = 11; // in, not in, is, is not,\n // <, <=, >, >=, <>, !=, ==\nPython.ORDER_LOGICAL_NOT = 12; // not\nPython.ORDER_LOGICAL_AND = 13; // and\nPython.ORDER_LOGICAL_OR = 14; // or\nPython.ORDER_CONDITIONAL = 15; // if else\nPython.ORDER_LAMBDA = 16; // lambda\nPython.ORDER_NONE = 99; // (...)\n\n/**\n * List of outer-inner pairings that do NOT require parentheses.\n * @type {!Array>}\n */\nPython.ORDER_OVERRIDES = [\n // (foo()).bar -> foo().bar\n // (foo())[0] -> foo()[0]\n [Python.ORDER_FUNCTION_CALL, Python.ORDER_MEMBER],\n // (foo())() -> foo()()\n [Python.ORDER_FUNCTION_CALL, Python.ORDER_FUNCTION_CALL],\n // (foo.bar).baz -> foo.bar.baz\n // (foo.bar)[0] -> foo.bar[0]\n // (foo[0]).bar -> foo[0].bar\n // (foo[0])[1] -> foo[0][1]\n [Python.ORDER_MEMBER, Python.ORDER_MEMBER],\n // (foo.bar)() -> foo.bar()\n // (foo[0])() -> foo[0]()\n [Python.ORDER_MEMBER, Python.ORDER_FUNCTION_CALL],\n\n // not (not foo) -> not not foo\n [Python.ORDER_LOGICAL_NOT, Python.ORDER_LOGICAL_NOT],\n // a and (b and c) -> a and b and c\n [Python.ORDER_LOGICAL_AND, Python.ORDER_LOGICAL_AND],\n // a or (b or c) -> a or b or c\n [Python.ORDER_LOGICAL_OR, Python.ORDER_LOGICAL_OR]\n];\n\n/**\n * Whether the init method has been called.\n * @type {?boolean}\n */\nPython.isInitialized = false;\n\n/**\n * Initialise the database of variable names.\n * @param {!Workspace} workspace Workspace to generate code from.\n * @this {Generator}\n */\nPython.init = function(workspace) {\n // Call Blockly.Generator's init.\n Object.getPrototypeOf(this).init.call(this);\n\n /**\n * Empty loops or conditionals are not allowed in Python.\n */\n this.PASS = this.INDENT + 'pass\\n';\n\n if (!this.nameDB_) {\n this.nameDB_ = new Names(this.RESERVED_WORDS_);\n } else {\n this.nameDB_.reset();\n }\n\n this.nameDB_.setVariableMap(workspace.getVariableMap());\n this.nameDB_.populateVariables(workspace);\n this.nameDB_.populateProcedures(workspace);\n\n const defvars = [];\n // Add developer variables (not created or named by the user).\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n defvars.push(\n this.nameDB_.getName(devVarList[i], Names.DEVELOPER_VARIABLE_TYPE) +\n ' = None');\n }\n\n // Add user variables, but only ones that are being used.\n const variables = Variables.allUsedVarModels(workspace);\n for (let i = 0; i < variables.length; i++) {\n defvars.push(\n this.nameDB_.getName(variables[i].getId(), NameType.VARIABLE) +\n ' = None');\n }\n\n this.definitions_['variables'] = defvars.join('\\n');\n this.isInitialized = true;\n};\n\n/**\n * Prepend the generated code with import statements and variable definitions.\n * @param {string} code Generated code.\n * @return {string} Completed code.\n */\nPython.finish = function(code) {\n // Convert the definitions dictionary into a list.\n const imports = [];\n const definitions = [];\n for (let name in this.definitions_) {\n const def = this.definitions_[name];\n if (def.match(/^(from\\s+\\S+\\s+)?import\\s+\\S+/)) {\n imports.push(def);\n } else {\n definitions.push(def);\n }\n }\n // Call Blockly.Generator's finish.\n code = Object.getPrototypeOf(this).finish.call(this, code);\n this.isInitialized = false;\n\n this.nameDB_.reset();\n const allDefs = imports.join('\\n') + '\\n\\n' + definitions.join('\\n\\n');\n return allDefs.replace(/\\n\\n+/g, '\\n\\n').replace(/\\n*$/, '\\n\\n\\n') + code;\n};\n\n/**\n * Naked values are top-level blocks with outputs that aren't plugged into\n * anything.\n * @param {string} line Line of generated code.\n * @return {string} Legal line of code.\n */\nPython.scrubNakedValue = function(line) {\n return line + '\\n';\n};\n\n/**\n * Encode a string as a properly escaped Python string, complete with quotes.\n * @param {string} string Text to encode.\n * @return {string} Python string.\n * @protected\n */\nPython.quote_ = function(string) {\n // Can't use goog.string.quote since % must also be escaped.\n string = string.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\\\n');\n\n // Follow the CPython behaviour of repr() for a non-byte string.\n let quote = '\\'';\n if (string.indexOf('\\'') !== -1) {\n if (string.indexOf('\"') === -1) {\n quote = '\"';\n } else {\n string = string.replace(/'/g, '\\\\\\'');\n }\n }\n return quote + string + quote;\n};\n\n/**\n * Encode a string as a properly escaped multiline Python string, complete\n * with quotes.\n * @param {string} string Text to encode.\n * @return {string} Python string.\n * @protected\n */\nPython.multiline_quote_ = function(string) {\n const lines = string.split(/\\n/g).map(this.quote_);\n // Join with the following, plus a newline:\n // + '\\n' +\n return lines.join(' + \\'\\\\n\\' + \\n');\n};\n\n/**\n * Common tasks for generating Python from blocks.\n * Handles comments for the specified block and any connected value blocks.\n * Calls any statements following this block.\n * @param {!Block} block The current block.\n * @param {string} code The Python code created for this block.\n * @param {boolean=} opt_thisOnly True to generate code for only this statement.\n * @return {string} Python code with comments and subsequent blocks added.\n * @protected\n */\nPython.scrub_ = function(block, code, opt_thisOnly) {\n let commentCode = '';\n // Only collect comments for blocks that aren't inline.\n if (!block.outputConnection || !block.outputConnection.targetConnection) {\n // Collect comment for this block.\n let comment = block.getCommentText();\n if (comment) {\n comment = stringUtils.wrap(comment, this.COMMENT_WRAP - 3);\n commentCode += this.prefixLines(comment + '\\n', '# ');\n }\n // Collect comments for all value arguments.\n // Don't collect comments for nested statements.\n for (let i = 0; i < block.inputList.length; i++) {\n if (block.inputList[i].type === inputTypes.VALUE) {\n const childBlock = block.inputList[i].connection.targetBlock();\n if (childBlock) {\n comment = this.allNestedComments(childBlock);\n if (comment) {\n commentCode += this.prefixLines(comment, '# ');\n }\n }\n }\n }\n }\n const nextBlock = block.nextConnection && block.nextConnection.targetBlock();\n const nextCode = opt_thisOnly ? '' : this.blockToCode(nextBlock);\n return commentCode + code + nextCode;\n};\n\n/**\n * Gets a property and adjusts the value, taking into account indexing.\n * If a static int, casts to an integer, otherwise returns a code string.\n * @param {!Block} block The block.\n * @param {string} atId The property ID of the element to get.\n * @param {number=} opt_delta Value to add.\n * @param {boolean=} opt_negate Whether to negate the value.\n * @return {string|number}\n */\nPython.getAdjustedInt = function(block, atId, opt_delta, opt_negate) {\n let delta = opt_delta || 0;\n if (block.workspace.options.oneBasedIndex) {\n delta--;\n }\n const defaultAtIndex = block.workspace.options.oneBasedIndex ? '1' : '0';\n const atOrder = delta ? this.ORDER_ADDITIVE : this.ORDER_NONE;\n let at = this.valueToCode(block, atId, atOrder) || defaultAtIndex;\n\n if (stringUtils.isNumber(at)) {\n // If the index is a naked number, adjust it right now.\n at = parseInt(at, 10) + delta;\n if (opt_negate) {\n at = -at;\n }\n } else {\n // If the index is dynamic, adjust it in code.\n if (delta > 0) {\n at = 'int(' + at + ' + ' + delta + ')';\n } else if (delta < 0) {\n at = 'int(' + at + ' - ' + -delta + ')';\n } else {\n at = 'int(' + at + ')';\n }\n if (opt_negate) {\n at = '-' + at;\n }\n }\n return at;\n};\n\nexports.pythonGenerator = Python;\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.variables');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['variables_get'] = function(block) {\n // Variable getter.\n const code =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return [code, Python.ORDER_ATOMIC];\n};\n\nPython['variables_set'] = function(block) {\n // Variable setter.\n const argument0 =\n Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || '0';\n const varName =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = ' + argument0 + '\\n';\n};\n","/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for dynamic variable blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.variablesDynamic');\n\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n/** @suppress {extraRequire} */\ngoog.require('Blockly.Python.variables');\n\n\n// Python is dynamically typed.\nPython['variables_get_dynamic'] = Python['variables_get'];\nPython['variables_set_dynamic'] = Python['variables_set'];\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for text blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.texts');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['text'] = function(block) {\n // Text value.\n const code = Python.quote_(block.getFieldValue('TEXT'));\n return [code, Python.ORDER_ATOMIC];\n};\n\nPython['text_multiline'] = function(block) {\n // Text value.\n const code = Python.multiline_quote_(block.getFieldValue('TEXT'));\n const order =\n code.indexOf('+') !== -1 ? Python.ORDER_ADDITIVE : Python.ORDER_ATOMIC;\n return [code, order];\n};\n\n/**\n * Regular expression to detect a single-quoted string literal.\n */\nconst strRegExp = /^\\s*'([^']|\\\\')*'\\s*$/;\n\n/**\n * Enclose the provided value in 'str(...)' function.\n * Leave string literals alone.\n * @param {string} value Code evaluating to a value.\n * @return {Array} Array containing code evaluating to a string\n * and\n * the order of the returned code.[string, number]\n */\nconst forceString = function(value) {\n if (strRegExp.test(value)) {\n return [value, Python.ORDER_ATOMIC];\n }\n return ['str(' + value + ')', Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_join'] = function(block) {\n // Create a string made up of any number of elements of any type.\n // Should we allow joining by '-' or ',' or any other characters?\n switch (block.itemCount_) {\n case 0:\n return [\"''\", Python.ORDER_ATOMIC];\n case 1: {\n const element =\n Python.valueToCode(block, 'ADD0', Python.ORDER_NONE) || \"''\";\n const codeAndOrder = forceString(element);\n return codeAndOrder;\n }\n case 2: {\n const element0 =\n Python.valueToCode(block, 'ADD0', Python.ORDER_NONE) || \"''\";\n const element1 =\n Python.valueToCode(block, 'ADD1', Python.ORDER_NONE) || \"''\";\n const code = forceString(element0)[0] + ' + ' + forceString(element1)[0];\n return [code, Python.ORDER_ADDITIVE];\n }\n default: {\n const elements = [];\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] =\n Python.valueToCode(block, 'ADD' + i, Python.ORDER_NONE) || \"''\";\n }\n const tempVar = Python.nameDB_.getDistinctName('x', NameType.VARIABLE);\n const code = '\\'\\'.join([str(' + tempVar + ') for ' + tempVar + ' in [' +\n elements.join(', ') + ']])';\n return [code, Python.ORDER_FUNCTION_CALL];\n }\n }\n};\n\nPython['text_append'] = function(block) {\n // Append to a variable in place.\n const varName =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const value = Python.valueToCode(block, 'TEXT', Python.ORDER_NONE) || \"''\";\n return varName + ' = str(' + varName + ') + ' + forceString(value)[0] + '\\n';\n};\n\nPython['text_length'] = function(block) {\n // Is the string null or array empty?\n const text = Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || \"''\";\n return ['len(' + text + ')', Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const text = Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || \"''\";\n const code = 'not len(' + text + ')';\n return [code, Python.ORDER_LOGICAL_NOT];\n};\n\nPython['text_indexOf'] = function(block) {\n // Search the text for a substring.\n // Should we allow for non-case sensitive???\n const operator = block.getFieldValue('END') === 'FIRST' ? 'find' : 'rfind';\n const substring =\n Python.valueToCode(block, 'FIND', Python.ORDER_NONE) || \"''\";\n const text =\n Python.valueToCode(block, 'VALUE', Python.ORDER_MEMBER) || \"''\";\n const code = text + '.' + operator + '(' + substring + ')';\n if (block.workspace.options.oneBasedIndex) {\n return [code + ' + 1', Python.ORDER_ADDITIVE];\n }\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_charAt'] = function(block) {\n // Get letter at index.\n // Note: Until January 2013 this block did not have the WHERE input.\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const textOrder =\n (where === 'RANDOM') ? Python.ORDER_NONE : Python.ORDER_MEMBER;\n const text = Python.valueToCode(block, 'VALUE', textOrder) || \"''\";\n switch (where) {\n case 'FIRST': {\n const code = text + '[0]';\n return [code, Python.ORDER_MEMBER];\n }\n case 'LAST': {\n const code = text + '[-1]';\n return [code, Python.ORDER_MEMBER];\n }\n case 'FROM_START': {\n const at = Python.getAdjustedInt(block, 'AT');\n const code = text + '[' + at + ']';\n return [code, Python.ORDER_MEMBER];\n }\n case 'FROM_END': {\n const at = Python.getAdjustedInt(block, 'AT', 1, true);\n const code = text + '[' + at + ']';\n return [code, Python.ORDER_MEMBER];\n }\n case 'RANDOM': {\n Python.definitions_['import_random'] = 'import random';\n const functionName = Python.provideFunction_('text_random_letter', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(text):\n x = int(random.random() * len(text))\n return text[x]\n`);\n const code = functionName + '(' + text + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n }\n }\n throw Error('Unhandled option (text_charAt).');\n};\n\nPython['text_getSubstring'] = function(block) {\n // Get substring.\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n const text =\n Python.valueToCode(block, 'STRING', Python.ORDER_MEMBER) || \"''\";\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = Python.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = Python.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = Python.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = Python.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n Python.definitions_['import_sys'] = 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (text_getSubstring)');\n }\n const code = text + '[' + at1 + ' : ' + at2 + ']';\n return [code, Python.ORDER_MEMBER];\n};\n\nPython['text_changeCase'] = function(block) {\n // Change capitalization.\n const OPERATORS = {\n 'UPPERCASE': '.upper()',\n 'LOWERCASE': '.lower()',\n 'TITLECASE': '.title()'\n };\n const operator = OPERATORS[block.getFieldValue('CASE')];\n const text = Python.valueToCode(block, 'TEXT', Python.ORDER_MEMBER) || \"''\";\n const code = text + operator;\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_trim'] = function(block) {\n // Trim spaces.\n const OPERATORS = {\n 'LEFT': '.lstrip()',\n 'RIGHT': '.rstrip()',\n 'BOTH': '.strip()'\n };\n const operator = OPERATORS[block.getFieldValue('MODE')];\n const text = Python.valueToCode(block, 'TEXT', Python.ORDER_MEMBER) || \"''\";\n const code = text + operator;\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_print'] = function(block) {\n // Print statement.\n const msg = Python.valueToCode(block, 'TEXT', Python.ORDER_NONE) || \"''\";\n return 'print(' + msg + ')\\n';\n};\n\nPython['text_prompt_ext'] = function(block) {\n // Prompt function.\n const functionName = Python.provideFunction_('text_prompt', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(msg):\n try:\n return raw_input(msg)\n except NameError:\n return input(msg)\n`);\n let msg;\n if (block.getField('TEXT')) {\n // Internal message.\n msg = Python.quote_(block.getFieldValue('TEXT'));\n } else {\n // External message.\n msg = Python.valueToCode(block, 'TEXT', Python.ORDER_NONE) || \"''\";\n }\n let code = functionName + '(' + msg + ')';\n const toNumber = block.getFieldValue('TYPE') === 'NUMBER';\n if (toNumber) {\n code = 'float(' + code + ')';\n }\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_prompt'] = Python['text_prompt_ext'];\n\nPython['text_count'] = function(block) {\n const text = Python.valueToCode(block, 'TEXT', Python.ORDER_MEMBER) || \"''\";\n const sub = Python.valueToCode(block, 'SUB', Python.ORDER_NONE) || \"''\";\n const code = text + '.count(' + sub + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['text_replace'] = function(block) {\n const text = Python.valueToCode(block, 'TEXT', Python.ORDER_MEMBER) || \"''\";\n const from = Python.valueToCode(block, 'FROM', Python.ORDER_NONE) || \"''\";\n const to = Python.valueToCode(block, 'TO', Python.ORDER_NONE) || \"''\";\n const code = text + '.replace(' + from + ', ' + to + ')';\n return [code, Python.ORDER_MEMBER];\n};\n\nPython['text_reverse'] = function(block) {\n const text = Python.valueToCode(block, 'TEXT', Python.ORDER_MEMBER) || \"''\";\n const code = text + '[::-1]';\n return [code, Python.ORDER_MEMBER];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for procedure blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.procedures');\n\nconst Variables = goog.require('Blockly.Variables');\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['procedures_defreturn'] = function(block) {\n // Define a procedure with a return value.\n // First, add a 'global' statement for every variable that is not shadowed by\n // a local parameter.\n const globals = [];\n const workspace = block.workspace;\n const usedVariables = Variables.allUsedVarModels(workspace) || [];\n for (let i = 0, variable; (variable = usedVariables[i]); i++) {\n const varName = variable.name;\n if (block.getVars().indexOf(varName) === -1) {\n globals.push(Python.nameDB_.getName(varName, NameType.VARIABLE));\n }\n }\n // Add developer variables.\n const devVarList = Variables.allDeveloperVariables(workspace);\n for (let i = 0; i < devVarList.length; i++) {\n globals.push(\n Python.nameDB_.getName(devVarList[i], NameType.DEVELOPER_VARIABLE));\n }\n\n const globalString = globals.length ?\n Python.INDENT + 'global ' + globals.join(', ') + '\\n' :\n '';\n const funcName =\n Python.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n let xfix1 = '';\n if (Python.STATEMENT_PREFIX) {\n xfix1 += Python.injectId(Python.STATEMENT_PREFIX, block);\n }\n if (Python.STATEMENT_SUFFIX) {\n xfix1 += Python.injectId(Python.STATEMENT_SUFFIX, block);\n }\n if (xfix1) {\n xfix1 = Python.prefixLines(xfix1, Python.INDENT);\n }\n let loopTrap = '';\n if (Python.INFINITE_LOOP_TRAP) {\n loopTrap = Python.prefixLines(\n Python.injectId(Python.INFINITE_LOOP_TRAP, block), Python.INDENT);\n }\n let branch = Python.statementToCode(block, 'STACK');\n let returnValue =\n Python.valueToCode(block, 'RETURN', Python.ORDER_NONE) || '';\n let xfix2 = '';\n if (branch && returnValue) {\n // After executing the function body, revisit this block for the return.\n xfix2 = xfix1;\n }\n if (returnValue) {\n returnValue = Python.INDENT + 'return ' + returnValue + '\\n';\n } else if (!branch) {\n branch = Python.PASS;\n }\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = Python.nameDB_.getName(variables[i], NameType.VARIABLE);\n }\n let code = 'def ' + funcName + '(' + args.join(', ') + '):\\n' + globalString +\n xfix1 + loopTrap + branch + xfix2 + returnValue;\n code = Python.scrub_(block, code);\n // Add % so as not to collide with helper functions in definitions list.\n Python.definitions_['%' + funcName] = code;\n return null;\n};\n\n// Defining a procedure without a return value uses the same generator as\n// a procedure with a return value.\nPython['procedures_defnoreturn'] = Python['procedures_defreturn'];\n\nPython['procedures_callreturn'] = function(block) {\n // Call a procedure with a return value.\n const funcName =\n Python.nameDB_.getName(block.getFieldValue('NAME'), NameType.PROCEDURE);\n const args = [];\n const variables = block.getVars();\n for (let i = 0; i < variables.length; i++) {\n args[i] = Python.valueToCode(block, 'ARG' + i, Python.ORDER_NONE) || 'None';\n }\n const code = funcName + '(' + args.join(', ') + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['procedures_callnoreturn'] = function(block) {\n // Call a procedure with no return value.\n // Generated code is for a function call as a statement is the same as a\n // function call as a value, with the addition of line ending.\n const tuple = Python['procedures_callreturn'](block);\n return tuple[0] + '\\n';\n};\n\nPython['procedures_ifreturn'] = function(block) {\n // Conditionally return value from a procedure.\n const condition =\n Python.valueToCode(block, 'CONDITION', Python.ORDER_NONE) || 'False';\n let code = 'if ' + condition + ':\\n';\n if (Python.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the return is triggered.\n code += Python.prefixLines(\n Python.injectId(Python.STATEMENT_SUFFIX, block), Python.INDENT);\n }\n if (block.hasReturnValue_) {\n const value =\n Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || 'None';\n code += Python.INDENT + 'return ' + value + '\\n';\n } else {\n code += Python.INDENT + 'return\\n';\n }\n return code;\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for math blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.math');\n\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\n// If any new block imports any library, add that library name here.\nPython.addReservedWords('math,random,Number');\n\nPython['math_number'] = function(block) {\n // Numeric value.\n let code = Number(block.getFieldValue('NUM'));\n let order;\n if (code === Infinity) {\n code = 'float(\"inf\")';\n order = Python.ORDER_FUNCTION_CALL;\n } else if (code === -Infinity) {\n code = '-float(\"inf\")';\n order = Python.ORDER_UNARY_SIGN;\n } else {\n order = code < 0 ? Python.ORDER_UNARY_SIGN : Python.ORDER_ATOMIC;\n }\n return [code, order];\n};\n\nPython['math_arithmetic'] = function(block) {\n // Basic arithmetic operators, and power.\n const OPERATORS = {\n 'ADD': [' + ', Python.ORDER_ADDITIVE],\n 'MINUS': [' - ', Python.ORDER_ADDITIVE],\n 'MULTIPLY': [' * ', Python.ORDER_MULTIPLICATIVE],\n 'DIVIDE': [' / ', Python.ORDER_MULTIPLICATIVE],\n 'POWER': [' ** ', Python.ORDER_EXPONENTIATION],\n };\n const tuple = OPERATORS[block.getFieldValue('OP')];\n const operator = tuple[0];\n const order = tuple[1];\n const argument0 = Python.valueToCode(block, 'A', order) || '0';\n const argument1 = Python.valueToCode(block, 'B', order) || '0';\n const code = argument0 + operator + argument1;\n return [code, order];\n // In case of 'DIVIDE', division between integers returns different results\n // in Python 2 and 3. However, is not an issue since Blockly does not\n // guarantee identical results in all languages. To do otherwise would\n // require every operator to be wrapped in a function call. This would kill\n // legibility of the generated code.\n};\n\nPython['math_single'] = function(block) {\n // Math operators with single operand.\n const operator = block.getFieldValue('OP');\n let code;\n let arg;\n if (operator === 'NEG') {\n // Negation is a special case given its different operator precedence.\n code = Python.valueToCode(block, 'NUM', Python.ORDER_UNARY_SIGN) || '0';\n return ['-' + code, Python.ORDER_UNARY_SIGN];\n }\n Python.definitions_['import_math'] = 'import math';\n if (operator === 'SIN' || operator === 'COS' || operator === 'TAN') {\n arg = Python.valueToCode(block, 'NUM', Python.ORDER_MULTIPLICATIVE) || '0';\n } else {\n arg = Python.valueToCode(block, 'NUM', Python.ORDER_NONE) || '0';\n }\n // First, handle cases which generate values that don't need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ABS':\n code = 'math.fabs(' + arg + ')';\n break;\n case 'ROOT':\n code = 'math.sqrt(' + arg + ')';\n break;\n case 'LN':\n code = 'math.log(' + arg + ')';\n break;\n case 'LOG10':\n code = 'math.log10(' + arg + ')';\n break;\n case 'EXP':\n code = 'math.exp(' + arg + ')';\n break;\n case 'POW10':\n code = 'math.pow(10,' + arg + ')';\n break;\n case 'ROUND':\n code = 'round(' + arg + ')';\n break;\n case 'ROUNDUP':\n code = 'math.ceil(' + arg + ')';\n break;\n case 'ROUNDDOWN':\n code = 'math.floor(' + arg + ')';\n break;\n case 'SIN':\n code = 'math.sin(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'COS':\n code = 'math.cos(' + arg + ' / 180.0 * math.pi)';\n break;\n case 'TAN':\n code = 'math.tan(' + arg + ' / 180.0 * math.pi)';\n break;\n }\n if (code) {\n return [code, Python.ORDER_FUNCTION_CALL];\n }\n // Second, handle cases which generate values that may need parentheses\n // wrapping the code.\n switch (operator) {\n case 'ASIN':\n code = 'math.asin(' + arg + ') / math.pi * 180';\n break;\n case 'ACOS':\n code = 'math.acos(' + arg + ') / math.pi * 180';\n break;\n case 'ATAN':\n code = 'math.atan(' + arg + ') / math.pi * 180';\n break;\n default:\n throw Error('Unknown math operator: ' + operator);\n }\n return [code, Python.ORDER_MULTIPLICATIVE];\n};\n\nPython['math_constant'] = function(block) {\n // Constants: PI, E, the Golden Ratio, sqrt(2), 1/sqrt(2), INFINITY.\n const CONSTANTS = {\n 'PI': ['math.pi', Python.ORDER_MEMBER],\n 'E': ['math.e', Python.ORDER_MEMBER],\n 'GOLDEN_RATIO': ['(1 + math.sqrt(5)) / 2', Python.ORDER_MULTIPLICATIVE],\n 'SQRT2': ['math.sqrt(2)', Python.ORDER_MEMBER],\n 'SQRT1_2': ['math.sqrt(1.0 / 2)', Python.ORDER_MEMBER],\n 'INFINITY': ['float(\\'inf\\')', Python.ORDER_ATOMIC],\n };\n const constant = block.getFieldValue('CONSTANT');\n if (constant !== 'INFINITY') {\n Python.definitions_['import_math'] = 'import math';\n }\n return CONSTANTS[constant];\n};\n\nPython['math_number_property'] = function(block) {\n // Check if a number is even, odd, prime, whole, positive, or negative\n // or if it is divisible by certain number. Returns true or false.\n const PROPERTIES = {\n 'EVEN': [' % 2 == 0', Python.ORDER_MULTIPLICATIVE, Python.ORDER_RELATIONAL],\n 'ODD': [' % 2 == 1', Python.ORDER_MULTIPLICATIVE, Python.ORDER_RELATIONAL],\n 'WHOLE': [' % 1 == 0', Python.ORDER_MULTIPLICATIVE,\n Python.ORDER_RELATIONAL],\n 'POSITIVE': [' > 0', Python.ORDER_RELATIONAL, Python.ORDER_RELATIONAL],\n 'NEGATIVE': [' < 0', Python.ORDER_RELATIONAL, Python.ORDER_RELATIONAL],\n 'DIVISIBLE_BY': [null, Python.ORDER_MULTIPLICATIVE,\n Python.ORDER_RELATIONAL],\n 'PRIME': [null, Python.ORDER_NONE, Python.ORDER_FUNCTION_CALL],\n }\n const dropdownProperty = block.getFieldValue('PROPERTY');\n const [suffix, inputOrder, outputOrder] = PROPERTIES[dropdownProperty];\n const numberToCheck = Python.valueToCode(block, 'NUMBER_TO_CHECK',\n inputOrder) || '0';\n let code;\n if (dropdownProperty === 'PRIME') {\n // Prime is a special case as it is not a one-liner test.\n Python.definitions_['import_math'] = 'import math';\n Python.definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n const functionName = Python.provideFunction_('math_isPrime', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(n):\n # https://en.wikipedia.org/wiki/Primality_test#Naive_methods\n # If n is not a number but a string, try parsing it.\n if not isinstance(n, Number):\n try:\n n = float(n)\n except:\n return False\n if n == 2 or n == 3:\n return True\n # False if n is negative, is 1, or not whole, or if n is divisible by 2 or 3.\n if n <= 1 or n % 1 != 0 or n % 2 == 0 or n % 3 == 0:\n return False\n # Check all the numbers of form 6k +/- 1, up to sqrt(n).\n for x in range(6, int(math.sqrt(n)) + 2, 6):\n if n % (x - 1) == 0 or n % (x + 1) == 0:\n return False\n return True\n`);\n code = functionName + '(' + numberToCheck + ')';\n } else if (dropdownProperty === 'DIVISIBLE_BY') {\n const divisor = Python.valueToCode(block, 'DIVISOR',\n Python.ORDER_MULTIPLICATIVE) || '0';\n // If 'divisor' is some code that evals to 0, Python will raise an error.\n if (divisor === '0') {\n return ['False', Python.ORDER_ATOMIC];\n }\n code = numberToCheck + ' % ' + divisor + ' == 0';\n } else {\n code = numberToCheck + suffix;\n };\n return [code, outputOrder];\n};\n\nPython['math_change'] = function(block) {\n // Add to a variable in place.\n Python.definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n const argument0 =\n Python.valueToCode(block, 'DELTA', Python.ORDER_ADDITIVE) || '0';\n const varName =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n return varName + ' = (' + varName + ' if isinstance(' + varName +\n ', Number) else 0) + ' + argument0 + '\\n';\n};\n\n// Rounding functions have a single operand.\nPython['math_round'] = Python['math_single'];\n// Trigonometry functions have a single operand.\nPython['math_trig'] = Python['math_single'];\n\nPython['math_on_list'] = function(block) {\n // Math functions for lists.\n const func = block.getFieldValue('OP');\n const list = Python.valueToCode(block, 'LIST', Python.ORDER_NONE) || '[]';\n let code;\n switch (func) {\n case 'SUM':\n code = 'sum(' + list + ')';\n break;\n case 'MIN':\n code = 'min(' + list + ')';\n break;\n case 'MAX':\n code = 'max(' + list + ')';\n break;\n case 'AVERAGE': {\n Python.definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n // This operation excludes null and values that aren't int or float:\n // math_mean([null, null, \"aString\", 1, 9]) -> 5.0\n const functionName = Python.provideFunction_('math_mean', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = [e for e in myList if isinstance(e, Number)]\n if not localList: return\n return float(sum(localList)) / len(localList)\n`);\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MEDIAN': {\n Python.definitions_['from_numbers_import_Number'] =\n 'from numbers import Number';\n // This operation excludes null values:\n // math_median([null, null, 1, 3]) -> 2.0\n const functionName = Python.provideFunction_( 'math_median', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(myList):\n localList = sorted([e for e in myList if isinstance(e, Number)])\n if not localList: return\n if len(localList) % 2 == 0:\n return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0\n else:\n return localList[(len(localList) - 1) // 2]\n`);\n code = functionName + '(' + list + ')';\n break;\n }\n case 'MODE': {\n // As a list of numbers can contain more than one mode,\n // the returned result is provided as an array.\n // Mode of [3, 'x', 'x', 1, 1, 2, '3'] -> ['x', 1]\n const functionName = Python.provideFunction_('math_modes', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(some_list):\n modes = []\n # Using a lists of [item, count] to keep count rather than dict\n # to avoid \"unhashable\" errors when the counted item is itself a list or dict.\n counts = []\n maxCount = 1\n for item in some_list:\n found = False\n for count in counts:\n if count[0] == item:\n count[1] += 1\n maxCount = max(maxCount, count[1])\n found = True\n if not found:\n counts.append([item, 1])\n for counted_item, item_count in counts:\n if item_count == maxCount:\n modes.append(counted_item)\n return modes\n`);\n code = functionName + '(' + list + ')';\n break;\n }\n case 'STD_DEV': {\n Python.definitions_['import_math'] = 'import math';\n const functionName = Python.provideFunction_('math_standard_deviation', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(numbers):\n n = len(numbers)\n if n == 0: return\n mean = float(sum(numbers)) / n\n variance = sum((x - mean) ** 2 for x in numbers) / n\n return math.sqrt(variance)\n`);\n code = functionName + '(' + list + ')';\n break;\n }\n case 'RANDOM':\n Python.definitions_['import_random'] = 'import random';\n code = 'random.choice(' + list + ')';\n break;\n default:\n throw Error('Unknown operator: ' + func);\n }\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['math_modulo'] = function(block) {\n // Remainder computation.\n const argument0 =\n Python.valueToCode(block, 'DIVIDEND', Python.ORDER_MULTIPLICATIVE) || '0';\n const argument1 =\n Python.valueToCode(block, 'DIVISOR', Python.ORDER_MULTIPLICATIVE) || '0';\n const code = argument0 + ' % ' + argument1;\n return [code, Python.ORDER_MULTIPLICATIVE];\n};\n\nPython['math_constrain'] = function(block) {\n // Constrain a number between two limits.\n const argument0 =\n Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || '0';\n const argument1 = Python.valueToCode(block, 'LOW', Python.ORDER_NONE) || '0';\n const argument2 =\n Python.valueToCode(block, 'HIGH', Python.ORDER_NONE) || 'float(\\'inf\\')';\n const code =\n 'min(max(' + argument0 + ', ' + argument1 + '), ' + argument2 + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['math_random_int'] = function(block) {\n // Random integer between [X] and [Y].\n Python.definitions_['import_random'] = 'import random';\n const argument0 = Python.valueToCode(block, 'FROM', Python.ORDER_NONE) || '0';\n const argument1 = Python.valueToCode(block, 'TO', Python.ORDER_NONE) || '0';\n const code = 'random.randint(' + argument0 + ', ' + argument1 + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['math_random_float'] = function(block) {\n // Random fraction between 0 and 1.\n Python.definitions_['import_random'] = 'import random';\n return ['random.random()', Python.ORDER_FUNCTION_CALL];\n};\n\nPython['math_atan2'] = function(block) {\n // Arctangent of point (X, Y) in degrees from -180 to 180.\n Python.definitions_['import_math'] = 'import math';\n const argument0 = Python.valueToCode(block, 'X', Python.ORDER_NONE) || '0';\n const argument1 = Python.valueToCode(block, 'Y', Python.ORDER_NONE) || '0';\n return [\n 'math.atan2(' + argument1 + ', ' + argument0 + ') / math.pi * 180',\n Python.ORDER_MULTIPLICATIVE\n ];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for loop blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.loops');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['controls_repeat_ext'] = function(block) {\n // Repeat n times.\n let repeats;\n if (block.getField('TIMES')) {\n // Internal number.\n repeats = String(parseInt(block.getFieldValue('TIMES'), 10));\n } else {\n // External number.\n repeats = Python.valueToCode(block, 'TIMES', Python.ORDER_NONE) || '0';\n }\n if (stringUtils.isNumber(repeats)) {\n repeats = parseInt(repeats, 10);\n } else {\n repeats = 'int(' + repeats + ')';\n }\n let branch = Python.statementToCode(block, 'DO');\n branch = Python.addLoopTrap(branch, block) || Python.PASS;\n const loopVar = Python.nameDB_.getDistinctName('count', NameType.VARIABLE);\n const code = 'for ' + loopVar + ' in range(' + repeats + '):\\n' + branch;\n return code;\n};\n\nPython['controls_repeat'] = Python['controls_repeat_ext'];\n\nPython['controls_whileUntil'] = function(block) {\n // Do while/until loop.\n const until = block.getFieldValue('MODE') === 'UNTIL';\n let argument0 = Python.valueToCode(\n block, 'BOOL',\n until ? Python.ORDER_LOGICAL_NOT : Python.ORDER_NONE) ||\n 'False';\n let branch = Python.statementToCode(block, 'DO');\n branch = Python.addLoopTrap(branch, block) || Python.PASS;\n if (until) {\n argument0 = 'not ' + argument0;\n }\n return 'while ' + argument0 + ':\\n' + branch;\n};\n\nPython['controls_for'] = function(block) {\n // For loop.\n const variable0 =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n let argument0 = Python.valueToCode(block, 'FROM', Python.ORDER_NONE) || '0';\n let argument1 = Python.valueToCode(block, 'TO', Python.ORDER_NONE) || '0';\n let increment = Python.valueToCode(block, 'BY', Python.ORDER_NONE) || '1';\n let branch = Python.statementToCode(block, 'DO');\n branch = Python.addLoopTrap(branch, block) || Python.PASS;\n\n let code = '';\n let range;\n\n // Helper functions.\n const defineUpRange = function() {\n return Python.provideFunction_('upRange', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n while start <= stop:\n yield start\n start += abs(step)\n`);\n };\n const defineDownRange = function() {\n return Python.provideFunction_('downRange', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(start, stop, step):\n while start >= stop:\n yield start\n start -= abs(step)\n`);\n };\n // Arguments are legal Python code (numbers or strings returned by scrub()).\n const generateUpDownRange = function(start, end, inc) {\n return '(' + start + ' <= ' + end + ') and ' + defineUpRange() + '(' +\n start + ', ' + end + ', ' + inc + ') or ' + defineDownRange() + '(' +\n start + ', ' + end + ', ' + inc + ')';\n };\n\n if (stringUtils.isNumber(argument0) && stringUtils.isNumber(argument1) &&\n stringUtils.isNumber(increment)) {\n // All parameters are simple numbers.\n argument0 = Number(argument0);\n argument1 = Number(argument1);\n increment = Math.abs(Number(increment));\n if (argument0 % 1 === 0 && argument1 % 1 === 0 && increment % 1 === 0) {\n // All parameters are integers.\n if (argument0 <= argument1) {\n // Count up.\n argument1++;\n if (argument0 === 0 && increment === 1) {\n // If starting index is 0, omit it.\n range = argument1;\n } else {\n range = argument0 + ', ' + argument1;\n }\n // If increment isn't 1, it must be explicit.\n if (increment !== 1) {\n range += ', ' + increment;\n }\n } else {\n // Count down.\n argument1--;\n range = argument0 + ', ' + argument1 + ', -' + increment;\n }\n range = 'range(' + range + ')';\n } else {\n // At least one of the parameters is not an integer.\n if (argument0 < argument1) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + argument0 + ', ' + argument1 + ', ' + increment + ')';\n }\n } else {\n // Cache non-trivial values to variables to prevent repeated look-ups.\n const scrub = function(arg, suffix) {\n if (stringUtils.isNumber(arg)) {\n // Simple number.\n arg = Number(arg);\n } else if (!arg.match(/^\\w+$/)) {\n // Not a variable, it's complicated.\n const varName = Python.nameDB_.getDistinctName(\n variable0 + suffix, NameType.VARIABLE);\n code += varName + ' = ' + arg + '\\n';\n arg = varName;\n }\n return arg;\n };\n const startVar = scrub(argument0, '_start');\n const endVar = scrub(argument1, '_end');\n const incVar = scrub(increment, '_inc');\n\n if (typeof startVar === 'number' && typeof endVar === 'number') {\n if (startVar < endVar) {\n range = defineUpRange();\n } else {\n range = defineDownRange();\n }\n range += '(' + startVar + ', ' + endVar + ', ' + incVar + ')';\n } else {\n // We cannot determine direction statically.\n range = generateUpDownRange(startVar, endVar, incVar);\n }\n }\n code += 'for ' + variable0 + ' in ' + range + ':\\n' + branch;\n return code;\n};\n\nPython['controls_forEach'] = function(block) {\n // For each loop.\n const variable0 =\n Python.nameDB_.getName(block.getFieldValue('VAR'), NameType.VARIABLE);\n const argument0 =\n Python.valueToCode(block, 'LIST', Python.ORDER_RELATIONAL) || '[]';\n let branch = Python.statementToCode(block, 'DO');\n branch = Python.addLoopTrap(branch, block) || Python.PASS;\n const code = 'for ' + variable0 + ' in ' + argument0 + ':\\n' + branch;\n return code;\n};\n\nPython['controls_flow_statements'] = function(block) {\n // Flow statements: continue, break.\n let xfix = '';\n if (Python.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n xfix += Python.injectId(Python.STATEMENT_PREFIX, block);\n }\n if (Python.STATEMENT_SUFFIX) {\n // Inject any statement suffix here since the regular one at the end\n // will not get executed if the break/continue is triggered.\n xfix += Python.injectId(Python.STATEMENT_SUFFIX, block);\n }\n if (Python.STATEMENT_PREFIX) {\n const loop = block.getSurroundLoop();\n if (loop && !loop.suppressPrefixSuffix) {\n // Inject loop's statement prefix here since the regular one at the end\n // of the loop will not get executed if 'continue' is triggered.\n // In the case of 'break', a prefix is needed due to the loop's suffix.\n xfix += Python.injectId(Python.STATEMENT_PREFIX, loop);\n }\n }\n switch (block.getFieldValue('FLOW')) {\n case 'BREAK':\n return xfix + 'break\\n';\n case 'CONTINUE':\n return xfix + 'continue\\n';\n }\n throw Error('Unknown flow statement.');\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for logic blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.logic');\n\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['controls_if'] = function(block) {\n // If/elseif/else condition.\n let n = 0;\n let code = '', branchCode, conditionCode;\n if (Python.STATEMENT_PREFIX) {\n // Automatic prefix insertion is switched off for this block. Add manually.\n code += Python.injectId(Python.STATEMENT_PREFIX, block);\n }\n do {\n conditionCode =\n Python.valueToCode(block, 'IF' + n, Python.ORDER_NONE) || 'False';\n branchCode = Python.statementToCode(block, 'DO' + n) || Python.PASS;\n if (Python.STATEMENT_SUFFIX) {\n branchCode =\n Python.prefixLines(\n Python.injectId(Python.STATEMENT_SUFFIX, block), Python.INDENT) +\n branchCode;\n }\n code += (n === 0 ? 'if ' : 'elif ') + conditionCode + ':\\n' + branchCode;\n n++;\n } while (block.getInput('IF' + n));\n\n if (block.getInput('ELSE') || Python.STATEMENT_SUFFIX) {\n branchCode = Python.statementToCode(block, 'ELSE') || Python.PASS;\n if (Python.STATEMENT_SUFFIX) {\n branchCode =\n Python.prefixLines(\n Python.injectId(Python.STATEMENT_SUFFIX, block), Python.INDENT) +\n branchCode;\n }\n code += 'else:\\n' + branchCode;\n }\n return code;\n};\n\nPython['controls_ifelse'] = Python['controls_if'];\n\nPython['logic_compare'] = function(block) {\n // Comparison operator.\n const OPERATORS =\n {'EQ': '==', 'NEQ': '!=', 'LT': '<', 'LTE': '<=', 'GT': '>', 'GTE': '>='};\n const operator = OPERATORS[block.getFieldValue('OP')];\n const order = Python.ORDER_RELATIONAL;\n const argument0 = Python.valueToCode(block, 'A', order) || '0';\n const argument1 = Python.valueToCode(block, 'B', order) || '0';\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nPython['logic_operation'] = function(block) {\n // Operations 'and', 'or'.\n const operator = (block.getFieldValue('OP') === 'AND') ? 'and' : 'or';\n const order =\n (operator === 'and') ? Python.ORDER_LOGICAL_AND : Python.ORDER_LOGICAL_OR;\n let argument0 = Python.valueToCode(block, 'A', order);\n let argument1 = Python.valueToCode(block, 'B', order);\n if (!argument0 && !argument1) {\n // If there are no arguments, then the return value is false.\n argument0 = 'False';\n argument1 = 'False';\n } else {\n // Single missing arguments have no effect on the return value.\n const defaultArgument = (operator === 'and') ? 'True' : 'False';\n if (!argument0) {\n argument0 = defaultArgument;\n }\n if (!argument1) {\n argument1 = defaultArgument;\n }\n }\n const code = argument0 + ' ' + operator + ' ' + argument1;\n return [code, order];\n};\n\nPython['logic_negate'] = function(block) {\n // Negation.\n const argument0 =\n Python.valueToCode(block, 'BOOL', Python.ORDER_LOGICAL_NOT) || 'True';\n const code = 'not ' + argument0;\n return [code, Python.ORDER_LOGICAL_NOT];\n};\n\nPython['logic_boolean'] = function(block) {\n // Boolean values true and false.\n const code = (block.getFieldValue('BOOL') === 'TRUE') ? 'True' : 'False';\n return [code, Python.ORDER_ATOMIC];\n};\n\nPython['logic_null'] = function(block) {\n // Null data type.\n return ['None', Python.ORDER_ATOMIC];\n};\n\nPython['logic_ternary'] = function(block) {\n // Ternary operator.\n const value_if =\n Python.valueToCode(block, 'IF', Python.ORDER_CONDITIONAL) || 'False';\n const value_then =\n Python.valueToCode(block, 'THEN', Python.ORDER_CONDITIONAL) || 'None';\n const value_else =\n Python.valueToCode(block, 'ELSE', Python.ORDER_CONDITIONAL) || 'None';\n const code = value_then + ' if ' + value_if + ' else ' + value_else;\n return [code, Python.ORDER_CONDITIONAL];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for list blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.lists');\n\nconst stringUtils = goog.require('Blockly.utils.string');\nconst {NameType} = goog.require('Blockly.Names');\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['lists_create_empty'] = function(block) {\n // Create an empty list.\n return ['[]', Python.ORDER_ATOMIC];\n};\n\nPython['lists_create_with'] = function(block) {\n // Create a list with any number of elements of any type.\n const elements = new Array(block.itemCount_);\n for (let i = 0; i < block.itemCount_; i++) {\n elements[i] =\n Python.valueToCode(block, 'ADD' + i, Python.ORDER_NONE) || 'None';\n }\n const code = '[' + elements.join(', ') + ']';\n return [code, Python.ORDER_ATOMIC];\n};\n\nPython['lists_repeat'] = function(block) {\n // Create a list with one element repeated.\n const item = Python.valueToCode(block, 'ITEM', Python.ORDER_NONE) || 'None';\n const times =\n Python.valueToCode(block, 'NUM', Python.ORDER_MULTIPLICATIVE) || '0';\n const code = '[' + item + '] * ' + times;\n return [code, Python.ORDER_MULTIPLICATIVE];\n};\n\nPython['lists_length'] = function(block) {\n // String or array length.\n const list = Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || '[]';\n return ['len(' + list + ')', Python.ORDER_FUNCTION_CALL];\n};\n\nPython['lists_isEmpty'] = function(block) {\n // Is the string null or array empty?\n const list = Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || '[]';\n const code = 'not len(' + list + ')';\n return [code, Python.ORDER_LOGICAL_NOT];\n};\n\nPython['lists_indexOf'] = function(block) {\n // Find an item in the list.\n const item = Python.valueToCode(block, 'FIND', Python.ORDER_NONE) || '[]';\n const list = Python.valueToCode(block, 'VALUE', Python.ORDER_NONE) || \"''\";\n let errorIndex = ' -1';\n let firstIndexAdjustment = '';\n let lastIndexAdjustment = ' - 1';\n\n if (block.workspace.options.oneBasedIndex) {\n errorIndex = ' 0';\n firstIndexAdjustment = ' + 1';\n lastIndexAdjustment = '';\n }\n\n let functionName;\n if (block.getFieldValue('END') === 'FIRST') {\n functionName = Python.provideFunction_('first_index', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = my_list.index(elem)${firstIndexAdjustment}\n except: index =${errorIndex}\n return index\n`);\n } else {\n functionName = Python.provideFunction_('last_index', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(my_list, elem):\n try: index = len(my_list) - my_list[::-1].index(elem)${lastIndexAdjustment}\n except: index =${errorIndex}\n return index\n`);\n }\n const code = functionName + '(' + list + ', ' + item + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['lists_getIndex'] = function(block) {\n // Get element at index.\n // Note: Until January 2013 this block did not have MODE or WHERE inputs.\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const listOrder =\n (where === 'RANDOM') ? Python.ORDER_NONE : Python.ORDER_MEMBER;\n const list = Python.valueToCode(block, 'VALUE', listOrder) || '[]';\n\n switch (where) {\n case 'FIRST':\n if (mode === 'GET') {\n const code = list + '[0]';\n return [code, Python.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(0)';\n return [code, Python.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(0)\\n';\n }\n break;\n case 'LAST':\n if (mode === 'GET') {\n const code = list + '[-1]';\n return [code, Python.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop()';\n return [code, Python.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop()\\n';\n }\n break;\n case 'FROM_START': {\n const at = Python.getAdjustedInt(block, 'AT');\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Python.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = Python.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'GET') {\n const code = list + '[' + at + ']';\n return [code, Python.ORDER_MEMBER];\n } else if (mode === 'GET_REMOVE') {\n const code = list + '.pop(' + at + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return list + '.pop(' + at + ')\\n';\n }\n break;\n }\n case 'RANDOM':\n Python.definitions_['import_random'] = 'import random';\n if (mode === 'GET') {\n const code = 'random.choice(' + list + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n } else {\n const functionName =\n Python.provideFunction_('lists_remove_random_item', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(myList):\n x = int(random.random() * len(myList))\n return myList.pop(x)\n`);\n const code = functionName + '(' + list + ')';\n if (mode === 'GET_REMOVE') {\n return [code, Python.ORDER_FUNCTION_CALL];\n } else if (mode === 'REMOVE') {\n return code + '\\n';\n }\n }\n break;\n }\n throw Error('Unhandled combination (lists_getIndex).');\n};\n\nPython['lists_setIndex'] = function(block) {\n // Set element at index.\n // Note: Until February 2013 this block did not have MODE or WHERE inputs.\n let list = Python.valueToCode(block, 'LIST', Python.ORDER_MEMBER) || '[]';\n const mode = block.getFieldValue('MODE') || 'GET';\n const where = block.getFieldValue('WHERE') || 'FROM_START';\n const value = Python.valueToCode(block, 'TO', Python.ORDER_NONE) || 'None';\n // Cache non-trivial values to variables to prevent repeated look-ups.\n // Closure, which accesses and modifies 'list'.\n function cacheList() {\n if (list.match(/^\\w+$/)) {\n return '';\n }\n const listVar =\n Python.nameDB_.getDistinctName('tmp_list', NameType.VARIABLE);\n const code = listVar + ' = ' + list + '\\n';\n list = listVar;\n return code;\n }\n\n switch (where) {\n case 'FIRST':\n if (mode === 'SET') {\n return list + '[0] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(0, ' + value + ')\\n';\n }\n break;\n case 'LAST':\n if (mode === 'SET') {\n return list + '[-1] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.append(' + value + ')\\n';\n }\n break;\n case 'FROM_START': {\n const at = Python.getAdjustedInt(block, 'AT');\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'FROM_END': {\n const at = Python.getAdjustedInt(block, 'AT', 1, true);\n if (mode === 'SET') {\n return list + '[' + at + '] = ' + value + '\\n';\n } else if (mode === 'INSERT') {\n return list + '.insert(' + at + ', ' + value + ')\\n';\n }\n break;\n }\n case 'RANDOM': {\n Python.definitions_['import_random'] = 'import random';\n let code = cacheList();\n const xVar = Python.nameDB_.getDistinctName('tmp_x', NameType.VARIABLE);\n code += xVar + ' = int(random.random() * len(' + list + '))\\n';\n if (mode === 'SET') {\n code += list + '[' + xVar + '] = ' + value + '\\n';\n return code;\n } else if (mode === 'INSERT') {\n code += list + '.insert(' + xVar + ', ' + value + ')\\n';\n return code;\n }\n break;\n }\n }\n throw Error('Unhandled combination (lists_setIndex).');\n};\n\nPython['lists_getSublist'] = function(block) {\n // Get sublist.\n const list = Python.valueToCode(block, 'LIST', Python.ORDER_MEMBER) || '[]';\n const where1 = block.getFieldValue('WHERE1');\n const where2 = block.getFieldValue('WHERE2');\n let at1;\n switch (where1) {\n case 'FROM_START':\n at1 = Python.getAdjustedInt(block, 'AT1');\n if (at1 === 0) {\n at1 = '';\n }\n break;\n case 'FROM_END':\n at1 = Python.getAdjustedInt(block, 'AT1', 1, true);\n break;\n case 'FIRST':\n at1 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n\n let at2;\n switch (where2) {\n case 'FROM_START':\n at2 = Python.getAdjustedInt(block, 'AT2', 1);\n break;\n case 'FROM_END':\n at2 = Python.getAdjustedInt(block, 'AT2', 0, true);\n // Ensure that if the result calculated is 0 that sub-sequence will\n // include all elements as expected.\n if (!stringUtils.isNumber(String(at2))) {\n Python.definitions_['import_sys'] = 'import sys';\n at2 += ' or sys.maxsize';\n } else if (at2 === 0) {\n at2 = '';\n }\n break;\n case 'LAST':\n at2 = '';\n break;\n default:\n throw Error('Unhandled option (lists_getSublist)');\n }\n const code = list + '[' + at1 + ' : ' + at2 + ']';\n return [code, Python.ORDER_MEMBER];\n};\n\nPython['lists_sort'] = function(block) {\n // Block for sorting a list.\n const list = (Python.valueToCode(block, 'LIST', Python.ORDER_NONE) || '[]');\n const type = block.getFieldValue('TYPE');\n const reverse = block.getFieldValue('DIRECTION') === '1' ? 'False' : 'True';\n const sortFunctionName = Python.provideFunction_('lists_sort', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(my_list, type, reverse):\n def try_float(s):\n try:\n return float(s)\n except:\n return 0\n key_funcs = {\n \"NUMERIC\": try_float,\n \"TEXT\": str,\n \"IGNORE_CASE\": lambda s: str(s).lower()\n }\n key_func = key_funcs[type]\n list_cpy = list(my_list)\n return sorted(list_cpy, key=key_func, reverse=reverse)\n`);\n\n const code =\n sortFunctionName + '(' + list + ', \"' + type + '\", ' + reverse + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['lists_split'] = function(block) {\n // Block for splitting text into a list, or joining a list into text.\n const mode = block.getFieldValue('MODE');\n let code;\n if (mode === 'SPLIT') {\n const value_input =\n Python.valueToCode(block, 'INPUT', Python.ORDER_MEMBER) || \"''\";\n const value_delim = Python.valueToCode(block, 'DELIM', Python.ORDER_NONE);\n code = value_input + '.split(' + value_delim + ')';\n } else if (mode === 'JOIN') {\n const value_input =\n Python.valueToCode(block, 'INPUT', Python.ORDER_NONE) || '[]';\n const value_delim =\n Python.valueToCode(block, 'DELIM', Python.ORDER_MEMBER) || \"''\";\n code = value_delim + '.join(' + value_input + ')';\n } else {\n throw Error('Unknown mode: ' + mode);\n }\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['lists_reverse'] = function(block) {\n // Block for reversing a list.\n const list = Python.valueToCode(block, 'LIST', Python.ORDER_NONE) || '[]';\n const code = 'list(reversed(' + list + '))';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2012 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Generating Python for colour blocks.\n */\n'use strict';\n\ngoog.module('Blockly.Python.colour');\n\nconst {pythonGenerator: Python} = goog.require('Blockly.Python');\n\n\nPython['colour_picker'] = function(block) {\n // Colour picker.\n const code = Python.quote_(block.getFieldValue('COLOUR'));\n return [code, Python.ORDER_ATOMIC];\n};\n\nPython['colour_random'] = function(block) {\n // Generate a random colour.\n Python.definitions_['import_random'] = 'import random';\n const code = '\\'#%06x\\' % random.randint(0, 2**24 - 1)';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['colour_rgb'] = function(block) {\n // Compose a colour from RGB components expressed as percentages.\n const functionName = Python.provideFunction_('colour_rgb', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(r, g, b):\n r = round(min(100, max(0, r)) * 2.55)\n g = round(min(100, max(0, g)) * 2.55)\n b = round(min(100, max(0, b)) * 2.55)\n return '#%02x%02x%02x' % (r, g, b)\n`);\n const r = Python.valueToCode(block, 'RED', Python.ORDER_NONE) || 0;\n const g = Python.valueToCode(block, 'GREEN', Python.ORDER_NONE) || 0;\n const b = Python.valueToCode(block, 'BLUE', Python.ORDER_NONE) || 0;\n const code = functionName + '(' + r + ', ' + g + ', ' + b + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n\nPython['colour_blend'] = function(block) {\n // Blend two colours together.\n const functionName = Python.provideFunction_('colour_blend', `\ndef ${Python.FUNCTION_NAME_PLACEHOLDER_}(colour1, colour2, ratio):\n r1, r2 = int(colour1[1:3], 16), int(colour2[1:3], 16)\n g1, g2 = int(colour1[3:5], 16), int(colour2[3:5], 16)\n b1, b2 = int(colour1[5:7], 16), int(colour2[5:7], 16)\n ratio = min(1, max(0, ratio))\n r = round(r1 * (1 - ratio) + r2 * ratio)\n g = round(g1 * (1 - ratio) + g2 * ratio)\n b = round(b1 * (1 - ratio) + b2 * ratio)\n return '#%02x%02x%02x' % (r, g, b)\n`);\n const colour1 =\n Python.valueToCode(block, 'COLOUR1', Python.ORDER_NONE) || '\\'#000000\\'';\n const colour2 =\n Python.valueToCode(block, 'COLOUR2', Python.ORDER_NONE) || '\\'#000000\\'';\n const ratio = Python.valueToCode(block, 'RATIO', Python.ORDER_NONE) || 0;\n const code =\n functionName + '(' + colour1 + ', ' + colour2 + ', ' + ratio + ')';\n return [code, Python.ORDER_FUNCTION_CALL];\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * @fileoverview Complete helper functions for generating Python for\n * blocks. This is the entrypoint for python_compressed.js.\n * @suppress {extraRequire}\n */\n'use strict';\n\ngoog.module('Blockly.Python.all');\n\nconst moduleExports = goog.require('Blockly.Python');\ngoog.require('Blockly.Python.colour');\ngoog.require('Blockly.Python.lists');\ngoog.require('Blockly.Python.logic');\ngoog.require('Blockly.Python.loops');\ngoog.require('Blockly.Python.math');\ngoog.require('Blockly.Python.procedures');\ngoog.require('Blockly.Python.texts');\ngoog.require('Blockly.Python.variables');\ngoog.require('Blockly.Python.variablesDynamic');\n\nexports = moduleExports;\n"]} \ No newline at end of file diff --git a/release-please-config.json b/release-please-config.json index 518b7a8ea7d..1a90aca04ef 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -1,5 +1,4 @@ { - "bootstrap-sha": "428574d499b99c7d89189abe9d2f9a4dd3d4c79a", "packages": { ".": {} }, diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index 47b3241646a..8f0cecfeb4c 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -15,7 +15,7 @@ gulp.sourcemaps = require('gulp-sourcemaps'); var path = require('path'); var fs = require('fs'); -var execSync = require('child_process').execSync; +const {exec, execSync} = require('child_process'); var through2 = require('through2'); const clangFormat = require('clang-format'); @@ -25,7 +25,7 @@ var closureDeps = require('google-closure-deps'); var argv = require('yargs').argv; var rimraf = require('rimraf'); -var {BUILD_DIR, TSC_OUTPUT_DIR} = require('./config'); +var {BUILD_DIR, DEPS_FILE, TEST_DEPS_FILE, TSC_OUTPUT_DIR, TYPINGS_BUILD_DIR} = require('./config'); var {getPackageJson} = require('./helper_tasks'); //////////////////////////////////////////////////////////// @@ -33,16 +33,14 @@ var {getPackageJson} = require('./helper_tasks'); //////////////////////////////////////////////////////////// /** - * Suffix to add to compiled output files. + * Directory in which core/ can be found after passing through tsc. */ -const COMPILED_SUFFIX = '_compressed'; +const CORE_DIR = path.join(TSC_OUTPUT_DIR, 'core'); /** - * Checked-in file to cache output of closure-calculate-chunks, to - * allow for testing on node.js v12 (or earlier) which is not - * compatible with closure-calculate-chunks. + * Suffix to add to compiled output files. */ -const CHUNK_CACHE_FILE = 'scripts/gulpfiles/chunks.json' +const COMPILED_SUFFIX = '_compressed'; /** * Name of an object to be used as a shared "global" namespace by @@ -82,8 +80,14 @@ const NAMESPACE_PROPERTY = '__namespace__'; * will be written to. * - .entry: the source .js file which is the entrypoint for the * chunk. + * - .exports: an expression evaluating to the exports/Module object + * of module that is the chunk's entrypoint / top level module. * - .reexport: if running in a browser, save the chunk's exports - * object at this location in the global namespace. + * object (or a single export of it; see reexportOnly, below) at + * this location in the global namespace. + * - .reexportOnly: if reexporting and this property is set, + * save only the correspondingly-named export. Otherwise + * save the whole export object. * * The function getChunkOptions will, after running * closure-calculate-chunks, update each chunk to add the following @@ -98,38 +102,50 @@ const NAMESPACE_PROPERTY = '__namespace__'; const chunks = [ { name: 'blockly', - entry: 'core/blockly.js', + entry: path.join(CORE_DIR, 'main.js'), + exports: 'module$build$src$core$blockly', reexport: 'Blockly', }, { name: 'blocks', entry: 'blocks/blocks.js', + exports: 'module$exports$Blockly$libraryBlocks', reexport: 'Blockly.libraryBlocks', }, { name: 'javascript', entry: 'generators/javascript/all.js', + exports: 'module$exports$Blockly$JavaScript', reexport: 'Blockly.JavaScript', + reexportOnly: 'javascriptGenerator', }, { name: 'python', entry: 'generators/python/all.js', + exports: 'module$exports$Blockly$Python', reexport: 'Blockly.Python', + reexportOnly: 'pythonGenerator', }, { name: 'php', entry: 'generators/php/all.js', + exports: 'module$exports$Blockly$PHP', reexport: 'Blockly.PHP', + reexportOnly: 'phpGenerator', }, { name: 'lua', entry: 'generators/lua/all.js', + exports: 'module$exports$Blockly$Lua', reexport: 'Blockly.Lua', + reexportOnly: 'luaGenerator', }, { name: 'dart', entry: 'generators/dart/all.js', + exports: 'module$exports$Blockly$Dart', reexport: 'Blockly.Dart', + reexportOnly: 'dartGenerator', } ]; @@ -167,9 +183,9 @@ function stripApacheLicense() { */ var JSCOMP_ERROR = [ // 'accessControls', // Deprecated; means same as visibility. - 'checkPrototypalTypes', + // 'checkPrototypalTypes', // override annotations are stripped by tsc. 'checkRegExp', - 'checkTypes', + // 'checkTypes', // Disabled; see note in JSCOMP_OFF. 'checkVars', 'conformanceViolations', 'const', @@ -181,19 +197,19 @@ var JSCOMP_ERROR = [ 'externsValidation', 'extraRequire', // Undocumented but valid. 'functionParams', - 'globalThis', + // 'globalThis', // This types are stripped by tsc. 'invalidCasts', 'misplacedTypeAnnotation', // 'missingOverride', // There are many of these, which should be fixed. 'missingPolyfill', - 'missingProperties', + // 'missingProperties', // Unset static properties are stripped by tsc. 'missingProvide', 'missingRequire', 'missingReturn', // 'missingSourcesWarnings', // Group of several other options. 'moduleLoad', 'msgDescriptions', - 'nonStandardJsDocs', + // 'nonStandardJsDocs', // Disabled; see note in JSCOMP_OFF. // 'partialAlias', // Don't want this to be an error yet; only warning. // 'polymer', // Not applicable. // 'reportUnknownTypes', // VERY verbose. @@ -207,7 +223,7 @@ var JSCOMP_ERROR = [ 'undefinedVars', 'underscore', 'unknownDefines', - 'unusedLocalVariables', + // 'unusedLocalVariables', // Disabled; see note in JSCOMP_OFF. 'unusedPrivateMembers', 'uselessCode', 'untranspilableFeatures', @@ -217,21 +233,44 @@ var JSCOMP_ERROR = [ /** * Closure compiler diagnostic groups we want to be treated as warnings. * These are effected when the --debug or --strict flags are passed. + * + * For most (all?) diagnostic groups this is the default level, so + * it's generally sufficient to remove them from JSCOMP_ERROR. */ var JSCOMP_WARNING = [ ]; /** - * Closure compiler diagnostic groups we want to be ignored. - * These suppressions are always effected by default. + * Closure compiler diagnostic groups we want to be ignored. These + * suppressions are always effected by default. + * + * Make sure that anything added here is commented out of JSCOMP_ERROR + * above, as that takes precedence.) */ var JSCOMP_OFF = [ + /* The removal of Closure type system types from our JSDoc + * annotations means that the closure compiler now generates certain + * diagnostics because it no longer has enough information to be + * sure that the input code is correct. The following diagnostic + * groups are turned off to suppress such errors. + * + * When adding additional items to this list it may be helpful to + * search the compiler source code + * (https://github.com/google/closure-compiler/) for the JSC_* + * disagnostic name (omitting the JSC_ prefix) to find the corresponding + * DiagnosticGroup. + */ + 'checkTypes', + 'nonStandardJsDocs', // Due to @internal + 'unusedLocalVariables', // Due to code generated for merged namespaces. + /* In order to transition to ES modules, modules will need to import - * one another by relative paths. This means that the existing + * one another by relative paths. This means that the previous * practice of moving all source files into the same directory for - * compilation (see docs for flattenCorePaths) would break - * imports. Not flattening files in this way breaks our usage - * of @package however; files were flattened so that all Blockly + * compilation would break imports. + * + * Not flattening files in this way breaks our usage + * of @package however: files were flattened so that all Blockly * source files are in the same directory and can use @package to * mark methods that are only allowed for use by Blockly, while * still allowing access between e.g. core/events/* and @@ -246,20 +285,49 @@ var JSCOMP_OFF = [ ]; /** - * This task updates tests/deps.js, used by blockly_uncompressed.js - * when loading Blockly in uncompiled mode. + * The npm prepare script, run by npm install after installing modules + * and as part of the packaging process. * - * Also updates tests/deps.mocha.js, used by the mocha test suite. + * This does just enough of the build that npm start should work. + * + * Exception: when running in the CI environment, we don't build + * anything. We don't need to, because npm test will build everything + * needed, and we don't want to, because a tsc error would prevent + * other workflows (like lint and format) from completing. */ -function buildDeps(done) { - const closurePath = argv.closureLibrary ? - 'node_modules/google-closure-library/closure/goog' : - 'closure/goog'; +function prepare(done) { + if (process.env.CI) { + done(); + return; + } + return buildJavaScriptAndDeps(done); +} + +const buildJavaScriptAndDeps = gulp.series(buildJavaScript, buildDeps); + +/** + * Builds Blockly as a JS program, by running tsc on all the files in + * the core directory. This must be run before buildDeps or + * buildCompiled. + */ +function buildJavaScript(done) { + execSync( + `tsc -outDir "${TSC_OUTPUT_DIR}" -declarationDir "${TYPINGS_BUILD_DIR}"`, + {stdio: 'inherit'}); + done(); +} - const coreDir = argv.compileTs ? path.join(TSC_OUTPUT_DIR, 'core') : 'core'; +/** + * This task updates DEPS_FILE (deps.js), used by + * bootstrap.js when loading Blockly in uncompiled mode. + * + * Also updates TEST_DEPS_FILE (deps.mocha.js), used by the mocha test + * suite. + */ +function buildDeps(done) { const roots = [ - closurePath, - coreDir, + path.join(TSC_OUTPUT_DIR, 'closure', 'goog', 'base.js'), + TSC_OUTPUT_DIR, 'blocks', 'generators', ]; @@ -269,15 +337,48 @@ function buildDeps(done) { 'tests/mocha' ]; - const args = roots.map(root => `--root '${root}' `).join(''); - execSync(`closure-make-deps ${args} > tests/deps.js`, {stdio: 'inherit'}); + function filterErrors(text) { + return text.split('\n') + .filter( + (line) => !/^WARNING /.test(line) || + !(/Missing type declaration./.test(line) || + /illegal use of unknown JSDoc tag/.test(line))) + .join('\n'); + } - // Use grep to filter out the entries that are already in deps.js. - const testArgs = testRoots.map(root => `--root '${root}' `).join(''); - execSync(`closure-make-deps ${testArgs} | grep 'tests/mocha'` + - ' > tests/deps.mocha.js', {stdio: 'inherit'}); - done(); -}; + new Promise((resolve, reject) => { + const args = roots.map(root => `--root '${root}' `).join(''); + exec( + `closure-make-deps ${args} >'${DEPS_FILE}'`, + {stdio: ['inherit', 'inherit', 'pipe']}, + (error, stdout, stderr) => { + console.warn(filterErrors(stderr)); + if (error) { + reject(error); + } else { + resolve(); + } + }); + }).then(() => new Promise((resolve, reject) => { + // Use grep to filter out the entries that are already in deps.js. + const testArgs = + testRoots.map(root => `--root '${root}' `).join(''); + exec( + `closure-make-deps ${testArgs} 2>/dev/null\ + | grep 'tests/mocha' > '${TEST_DEPS_FILE}'`, + {stdio: ['inherit', 'inherit', 'pipe']}, + (error, stdout, stderr) => { + console.warn(filterErrors(stderr)); + if (error) { + reject(error); + } else { + resolve(); + } + }); + })).then(() => { + done(); + }); +} /** * This task regenrates msg/json/en.js and msg/json/qqq.js from @@ -307,7 +408,7 @@ this removal! `); done(); -}; +} /** * This task builds Blockly's lang files. @@ -333,7 +434,7 @@ function buildLangfiles(done) { execSync(createMessagesCmd, {stdio: 'inherit'}); done(); -}; +} /** * A helper method to return an closure compiler chunk wrapper that @@ -365,16 +466,20 @@ function chunkWrapper(chunk) { namespaceExpr = `${factoryArgs}.${NAMESPACE_PROPERTY}`; } - // Expression that evaluates the the value of the exports object for - // the specified chunk. For now we guess the name that is created - // by the module's goog.module.delcareLegacyNamespace call based on - // chunk.reexport. - const exportsExpression = `${NAMESPACE_VARIABLE}.${chunk.reexport}`; - // In near future we might try to guess the internally-generated - // name for the ES module's exports object. - // const exportsExpression = - // 'module$' + chunk.entry.replace(/\.m?js$/, '').replace(/\//g, '$'); - + // Code to assign the result of the factory function to the desired + // export location when running in a browser. When + // chunk.reexportOnly is set, this additionally does two other + // things: + // - It ensures that only the desired property of the exports object + // is assigned to the specified reexport location. + // - It ensures that the namesspace object is accessible via the + // selected sub-object, so that any dependent modules can obtain + // it. + const browserExportStatements = chunk.reexportOnly ? + `root.${chunk.reexport} = factoryExports.${chunk.reexportOnly};\n` + + ` root.${chunk.reexport}.${NAMESPACE_PROPERTY} = ` + + `factoryExports.${NAMESPACE_PROPERTY};` : + `root.${chunk.reexport} = factoryExports;`; // Note that when loading in a browser the base of the exported path // (e.g. Blockly.blocks.all - see issue #5932) might not exist @@ -391,16 +496,16 @@ function chunkWrapper(chunk) { module.exports = factory(${cjsDepsExpr}); } else { // Browser var factoryExports = factory(${browserDepsExpr}); - root.${chunk.reexport} = factoryExports; + ${browserExportStatements} } }(this, function(${factoryArgs}) { var ${NAMESPACE_VARIABLE}=${namespaceExpr}; %output% -${exportsExpression}.${NAMESPACE_PROPERTY}=${NAMESPACE_VARIABLE}; -return ${exportsExpression}; +${chunk.exports}.${NAMESPACE_PROPERTY}=${NAMESPACE_VARIABLE}; +return ${chunk.exports}; })); `; -}; +} /** * Get chunking options to pass to Closure Compiler by using @@ -413,43 +518,21 @@ return ${exportsExpression}; * @return {{chunk: !Array, js: !Array}} The chunking * information, in the same form as emitted by * closure-calculate-chunks. - * - * TODO(cpcallen): maybeAddClosureLibrary? Or maybe remove base.js? */ function getChunkOptions() { if (argv.compileTs) { chunks[0].entry = path.join(TSC_OUTPUT_DIR, chunks[0].entry); } + const basePath = + path.join(TSC_OUTPUT_DIR, 'closure', 'goog', 'base_minimal.js'); const cccArgs = [ - '--closure-library-base-js-path ./closure/goog/base_minimal.js', - '--deps-file ./tests/deps.js', + `--closure-library-base-js-path ./${basePath}`, + `--deps-file './${DEPS_FILE}'`, ...(chunks.map(chunk => `--entrypoint '${chunk.entry}'`)), ]; const cccCommand = `closure-calculate-chunks ${cccArgs.join(' ')}`; - // Because (as of 2021-11-25) closure-calculate-chunks v3.0.2 - // requries node.js v14 or later, we save the output of cccCommand - // in a checked-in .json file, so we can use the contents of that - // file when building on older versions of node. - // - // When this is no longer necessary the following section can be - // replaced with: - // - // const rawOptions = JSON.parse(execSync(cccCommand)); - const nodeMajorVersion = /v(\d+)\./.exec(process.version)[1]; - let rawOptions; - if (nodeMajorVersion >= 14) { - rawOptions = JSON.parse(String(execSync(cccCommand))); - // Replace absolute paths with relative ones, so they will be - // valid on other machines. Only needed because we're saving this - // output to use later on another machine. - rawOptions.js = rawOptions.js.map(p => p.replace(process.cwd(), '.')); - fs.writeFileSync(CHUNK_CACHE_FILE, - JSON.stringify(rawOptions, null, 2) + '\n'); - } else { - console.log(`Warning: using pre-computed chunks from ${CHUNK_CACHE_FILE}`); - rawOptions = JSON.parse(String(fs.readFileSync(CHUNK_CACHE_FILE))); - } + const rawOptions = JSON.parse(execSync(cccCommand)); // rawOptions should now be of the form: // @@ -462,8 +545,8 @@ function getChunkOptions() { // /* ... remaining handful of chunks */ // ], // js: [ - // './core/serialization/workspaces.js', - // './core/serialization/variables.js', + // './build/ts/core/serialization/workspaces.js', + // './build/ts/core/serialization/variables.js', // /* ... remaining several hundred files */ // ], // } @@ -514,43 +597,6 @@ function getChunkOptions() { */ const pathSepRegExp = new RegExp(path.sep.replace(/\\/, '\\\\'), "g"); -/** - * Modify the supplied gulp.rename path object to relax @package - * restrictions in core/. - * - * Background: subdirectories of core/ are used to group similar files - * together but are not intended to limit access to names - * marked @package; instead, that annotation is intended to mean only - * that the annotated name not part of the public API. - * - * To make @package behave less strictly in core/, this function can - * be used to as a gulp.rename filter, modifying the path object to - * flatten all files in core/** so that they're in the same directory, - * while ensuring that files with the same base name don't conflict. - * - * @param {{dirname: string, basename: string, extname: string}} - * pathObject The path argument supplied by gulp.rename to its - * callback. Modified in place. - */ -function flattenCorePaths(pathObject) { - const dirs = pathObject.dirname.split(path.sep); - const coreIndex = argv.compileTs ? 2 : 0; - if (dirs[coreIndex] === 'core') { - pathObject.dirname = path.join(...dirs.slice(0, coreIndex + 1)); - pathObject.basename = - dirs.slice(coreIndex + 1).concat(pathObject.basename).join('-slash-'); - } -} - -/** - * Undo the effects of flattenCorePaths on a single path string. - * @param string pathString The flattened path. - * @return string The path after unflattening. - */ -function unflattenCorePaths(pathString) { - return pathString.replace(/-slash-/g, path.sep); -} - /** * Helper method for calling the Closure compiler, establishing * default options (that can be overridden by the caller). @@ -562,10 +608,17 @@ function compile(options) { compilation_level: 'SIMPLE_OPTIMIZATIONS', warning_level: argv.verbose ? 'VERBOSE' : 'DEFAULT', language_in: 'ECMASCRIPT_2020', - language_out: 'ECMASCRIPT5_STRICT', + language_out: 'ECMASCRIPT_2015', jscomp_off: [...JSCOMP_OFF], rewrite_polyfills: true, - hide_warnings_for: 'node_modules', + // N.B.: goog.js refers to lots of properties on goog that are not + // declared by base_minimal.js, while if you compile against + // base.js instead you will discover that it uses @deprecated + // inherits, forwardDeclare etc. + hide_warnings_for: [ + 'node_modules', + path.join(TSC_OUTPUT_DIR, 'closure', 'goog', 'goog.js'), + ], define: ['COMPILED=true'], }; if (argv.debug || argv.strict) { @@ -593,7 +646,13 @@ function buildCompiled() { // Closure Compiler options. const packageJson = getPackageJson(); // For version number. const options = { - define: 'Blockly.VERSION="' + packageJson.version + '"', + // The documentation for @define claims you can't use it on a + // non-global, but the closure compiler turns everything in to a + // global - you just have to know what the new name is! With + // declareLegacyNamespace this was very straightforward. Without + // it, we have to rely on implmentation details. See + // https://github.com/google/closure-compiler/issues/1601#issuecomment-483452226 + define: `VERSION$$${chunks[0].exports}='${packageJson.version}'`, chunk: chunkOptions.chunk, chunk_wrapper: chunkOptions.chunk_wrapper, rename_prefix_namespace: NAMESPACE_VARIABLE, @@ -605,25 +664,21 @@ function buildCompiled() { return gulp.src(chunkOptions.js, {base: './'}) .pipe(stripApacheLicense()) .pipe(gulp.sourcemaps.init()) - // .pipe(gulp.rename(flattenCorePaths)) .pipe(compile(options)) .pipe(gulp.rename({suffix: COMPILED_SUFFIX})) - // .pipe(gulp.sourcemaps.mapSources(unflattenCorePaths)) - .pipe( - gulp.sourcemaps.write('.', {includeContent: false, sourceRoot: './'})) + .pipe(gulp.sourcemaps.write('.')) .pipe(gulp.dest(BUILD_DIR)); -}; +} /** * This task builds Blockly core, blocks and generators together and uses * closure compiler's ADVANCED_COMPILATION mode. */ function buildAdvancedCompilationTest() { - const coreSrcs = argv.compileTs ? - TSC_OUTPUT_DIR + '/core/**/*.js' : 'core/**/*.js'; const srcs = [ - 'closure/goog/base_minimal.js', - coreSrcs, + TSC_OUTPUT_DIR + '/closure/goog/base_minimal.js', + TSC_OUTPUT_DIR + '/closure/goog/goog.js', + TSC_OUTPUT_DIR + '/core/**/*.js', 'blocks/**/*.js', 'generators/**/*.js', 'tests/compile/main.js', @@ -640,9 +695,7 @@ function buildAdvancedCompilationTest() { return gulp.src(srcs, {base: './'}) .pipe(stripApacheLicense()) .pipe(gulp.sourcemaps.init()) - // .pipe(gulp.rename(flattenCorePaths)) .pipe(compile(options)) - // .pipe(gulp.sourcemaps.mapSources(unflattenCorePaths)) .pipe(gulp.sourcemaps.write( '.', {includeContent: false, sourceRoot: '../../'})) .pipe(gulp.dest('./tests/compile/')); @@ -657,12 +710,11 @@ function buildAdvancedCompilationTest() { * php_compressed.js * lua_compressed.js * dart_compressed.js - * blockly_uncompressed.js * msg/json/*.js * test/deps*.js */ const build = gulp.parallel( - gulp.series(buildDeps, buildCompiled), + gulp.series(buildJavaScript, buildDeps, buildCompiled), buildLangfiles, ); @@ -672,12 +724,11 @@ const build = gulp.parallel( */ function checkinBuilt() { return gulp.src([ - `${BUILD_DIR}/**.js`, - `${BUILD_DIR}/**.js.map`, - `${BUILD_DIR}/**/**.js`, - `${BUILD_DIR}/**/**.js.map`, - ]).pipe(gulp.dest('.')); -}; + `${BUILD_DIR}/*_compressed.js`, + `${BUILD_DIR}/*_compressed.js.map`, + `${BUILD_DIR}/msg/js/*.js`, + ], {base: BUILD_DIR}).pipe(gulp.dest('.')); +} /** * This task cleans the build directory (by deleting it). @@ -694,18 +745,19 @@ function cleanBuildDir(done) { * Runs clang format on all files in the core directory. */ function format() { - return gulp.src(['core/**/*.js', 'blocks/**/*.js'], {base: '.'}) + return gulp.src([ + 'core/**/*.js', 'core/**/*.ts', + 'blocks/**/*.js', 'blocks/**/*.ts' + ], {base: '.'}) .pipe(clangFormatter.format('file', clangFormat)) .pipe(gulp.dest('.')); -}; - -function buildTypescript(done) { - execSync('npx tsc', {stdio: 'inherit'}); - done(); } module.exports = { + prepare: prepare, build: build, + javaScriptAndDeps: buildJavaScriptAndDeps, + javaScript: buildJavaScript, deps: buildDeps, generateLangfiles: generateLangfiles, langfiles: buildLangfiles, @@ -714,5 +766,4 @@ module.exports = { checkinBuilt: checkinBuilt, cleanBuildDir: cleanBuildDir, advancedCompilationTest: buildAdvancedCompilationTest, - buildTypescript: buildTypescript } diff --git a/scripts/gulpfiles/chunks.json b/scripts/gulpfiles/chunks.json index fce78801fd7..a220f59ba7a 100644 --- a/scripts/gulpfiles/chunks.json +++ b/scripts/gulpfiles/chunks.json @@ -1,274 +1,243 @@ { "chunk": [ - "blockly:260", - "blocks:10:blockly", - "all:11:blockly", - "all1:11:blockly", - "all2:11:blockly", - "all3:11:blockly", - "all4:11:blockly" + "main:229", + "blocks:10:main", + "all:11:main", + "all1:11:main", + "all2:11:main", + "all3:11:main", + "all4:11:main" ], "js": [ - "./core/inject.js", - "./core/flyout_vertical.js", - "./core/toolbox/toolbox.js", - "./core/interfaces/i_styleable.js", - "./core/flyout_horizontal.js", - "./core/generator.js", - "./core/flyout_base.js", - "./core/flyout_metrics_manager.js", - "./core/field_variable.js", - "./core/field_number.js", - "./core/field_multilineinput.js", - "./core/field_label_serializable.js", - "./core/field_colour.js", - "./core/field_checkbox.js", - "./core/field_angle.js", - "./core/toolbox/collapsible_category.js", - "./core/renderers/zelos/zelos.js", - "./core/renderers/thrasos/renderer.js", - "./core/renderers/thrasos/info.js", - "./core/renderers/thrasos/thrasos.js", - "./core/serialization/workspaces.js", - "./core/serialization/variables.js", - "./core/renderers/minimalist/renderer.js", - "./core/renderers/minimalist/info.js", - "./core/renderers/minimalist/drawer.js", - "./core/renderers/minimalist/constants.js", - "./core/renderers/minimalist/minimalist.js", - "./core/renderers/geras/measurables/statement_input.js", - "./core/renderers/geras/path_object.js", - "./core/renderers/geras/renderer.js", - "./core/renderers/geras/info.js", - "./core/renderers/geras/measurables/inline_input.js", - "./core/renderers/geras/highlight_constants.js", - "./core/renderers/geras/highlighter.js", - "./core/renderers/geras/drawer.js", - "./core/renderers/geras/constants.js", - "./core/renderers/geras/geras.js", - "./core/theme/zelos.js", - "./core/theme/themes.js", - "./core/shortcut_items.js", - "./core/events/workspace_events.js", - "./core/events/events_toolbox_item_select.js", - "./core/events/events_ui.js", - "./core/events/events.js", - "./core/contextmenu_items.js", - "./core/widgetdiv.js", - "./core/clipboard.js", - "./core/contextmenu.js", - "./core/utils/global.js", - "./core/utils/useragent.js", - "./core/utils/svg.js", - "./core/utils/dom.js", - "./core/utils/idgenerator.js", - "./core/connection_checker.js", - "./core/toolbox/separator.js", - "./core/toolbox/toolbox_item.js", - "./core/interfaces/i_selectable_toolbox_item.js", - "./core/interfaces/i_collapsible_toolbox_item.js", - "./core/toolbox/category.js", - "./core/serialization/exceptions.js", - "./core/interfaces/i_serializer.js", - "./core/serialization/registry.js", - "./core/serialization/priorities.js", - "./core/serialization/blocks.js", - "./core/utils/toolbox.js", - "./core/utils/math.js", - "./core/utils/array.js", - "./core/workspace.js", - "./core/menu.js", - "./core/menuitem.js", - "./core/keyboard_nav/basic_cursor.js", - "./core/keyboard_nav/tab_navigate_cursor.js", - "./core/mutator.js", - "./core/warning.js", - "./core/comment.js", - "./core/events/events_block_drag.js", - "./core/events/events_block_move.js", - "./core/bump_objects.js", - "./core/block_dragger.js", - "./core/workspace_dragger.js", - "./core/interfaces/i_block_dragger.js", - "./core/events/events_viewport.js", - "./core/events/events_theme_change.js", - "./core/events/events_block_create.js", - "./core/events/events_click.js", - "./core/zoom_controls.js", - "./core/workspace_drag_surface_svg.js", - "./core/events/events_selected.js", - "./core/events/events_comment_delete.js", - "./core/events/events_comment_change.js", - "./core/workspace_comment.js", - "./core/events/events_comment_create.js", - "./core/events/events_comment_base.js", - "./core/events/events_comment_move.js", - "./core/workspace_comment_svg.js", - "./core/workspace_audio.js", - "./core/events/events_trashcan_open.js", - "./core/sprites.js", - "./core/drag_target.js", - "./core/delete_area.js", - "./core/events/events_block_delete.js", - "./core/positionable_helpers.js", - "./core/trashcan.js", - "./core/touch_gesture.js", - "./core/theme_manager.js", - "./core/scrollbar_pair.js", - "./core/options.js", - "./core/interfaces/i_movable.js", - "./core/interfaces/i_selectable.js", - "./core/interfaces/i_copyable.js", - "./core/interfaces/i_bounded_element.js", - "./core/grid.js", - "./core/css.js", - "./core/flyout_button.js", - "./core/contextmenu_registry.js", - "./core/theme/classic.js", - "./core/blockly_options.js", - "./core/utils.js", - "./core/renderers/zelos/measurables/top_row.js", - "./core/renderers/zelos/measurables/row_elements.js", - "./core/renderers/zelos/marker_svg.js", - "./core/renderers/zelos/measurables/inputs.js", - "./core/renderers/zelos/path_object.js", - "./core/renderers/zelos/drawer.js", - "./core/renderers/zelos/renderer.js", - "./core/field_textinput.js", - "./core/field_image.js", - "./core/renderers/zelos/constants.js", - "./core/renderers/zelos/measurables/bottom_row.js", - "./core/renderers/zelos/info.js", - "./core/renderers/measurables/top_row.js", - "./core/renderers/measurables/square_corner.js", - "./core/renderers/measurables/spacer_row.js", - "./core/renderers/measurables/round_corner.js", - "./core/renderers/common/path_object.js", - "./core/interfaces/i_positionable.js", - "./core/interfaces/i_drag_target.js", - "./core/interfaces/i_delete_area.js", - "./core/interfaces/i_component.js", - "./core/interfaces/i_autohideable.js", - "./core/component_manager.js", - "./core/insertion_marker_manager.js", - "./core/renderers/common/i_path_object.js", - "./core/renderers/common/drawer.js", - "./core/renderers/common/renderer.js", - "./core/renderers/measurables/previous_connection.js", - "./core/renderers/measurables/output_connection.js", - "./core/renderers/measurables/jagged_edge.js", - "./core/renderers/measurables/statement_input.js", - "./core/renderers/measurables/input_row.js", - "./core/renderers/measurables/inline_input.js", - "./core/scrollbar.js", - "./core/interfaces/i_toolbox_item.js", - "./core/interfaces/i_toolbox.js", - "./core/utils/metrics.js", - "./core/interfaces/i_metrics_manager.js", - "./core/interfaces/i_flyout.js", - "./core/metrics_manager.js", - "./core/interfaces/i_deletable.js", - "./core/interfaces/i_draggable.js", - "./core/interfaces/i_contextmenu.js", - "./core/interfaces/i_bubble.js", - "./core/block_drag_surface.js", - "./core/bubble.js", - "./core/icon.js", - "./core/renderers/measurables/icon.js", - "./core/renderers/measurables/hat.js", - "./core/renderers/measurables/external_value_input.js", - "./core/renderers/common/info.js", - "./core/renderers/measurables/field.js", - "./core/renderers/common/debugger.js", - "./core/renderers/measurables/input_connection.js", - "./core/renderers/measurables/in_row_spacer.js", - "./core/renderers/measurables/row.js", - "./core/renderers/measurables/types.js", - "./core/renderers/measurables/base.js", - "./core/renderers/measurables/connection.js", - "./core/renderers/measurables/next_connection.js", - "./core/renderers/measurables/bottom_row.js", - "./core/renderers/common/debug.js", - "./core/renderers/common/block_rendering.js", - "./core/variables_dynamic.js", - "./core/events/events_var_rename.js", - "./core/events/events_var_delete.js", - "./core/variable_map.js", - "./core/names.js", - "./core/events/events_block_base.js", - "./core/events/events_block_change.js", - "./core/events/events_marker_move.js", - "./core/renderers/common/marker_svg.js", - "./core/keyboard_nav/marker.js", - "./core/keyboard_nav/ast_node.js", - "./core/keyboard_nav/cursor.js", - "./core/marker_manager.js", - "./core/utils/sentinel.js", - "./core/field_label.js", - "./core/input_types.js", - "./core/interfaces/i_registrable_field.js", - "./core/field_registry.js", - "./core/input.js", - "./core/interfaces/i_registrable.js", - "./core/utils/keycodes.js", - "./core/shortcut_registry.js", - "./core/interfaces/i_keyboard_accessible.js", - "./core/interfaces/i_ast_node_location_with_block.js", - "./core/interfaces/i_ast_node_location.js", - "./core/interfaces/i_ast_node_location_svg.js", - "./core/theme.js", - "./core/constants.js", - "./core/interfaces/i_connection_checker.js", - "./core/connection_db.js", - "./core/config.js", - "./core/rendered_connection.js", - "./core/utils/svg_paths.js", - "./core/renderers/common/constants.js", - "./core/field.js", - "./core/events/events_ui_base.js", - "./core/events/events_bubble_open.js", - "./core/procedures.js", - "./core/workspace_svg.js", - "./core/utils/rect.js", - "./core/utils/deprecation.js", - "./core/utils/svg_math.js", - "./core/bubble_dragger.js", - "./core/connection_type.js", - "./core/internal_constants.js", - "./core/block_animations.js", - "./core/gesture.js", - "./core/touch.js", - "./core/browser_events.js", - "./core/tooltip.js", - "./core/block_svg.js", - "./core/utils/size.js", - "./core/utils/coordinate.js", - "./core/utils/style.js", - "./core/dropdowndiv.js", - "./core/utils/aria.js", - "./core/field_dropdown.js", - "./core/msg.js", - "./core/utils/colour.js", - "./core/utils/parsing.js", - "./core/extensions.js", - "./core/block.js", - "./core/utils/string.js", - "./core/dialog.js", - "./core/utils/xml.js", - "./core/events/events_var_base.js", - "./core/events/events_var_create.js", - "./core/variable_model.js", - "./core/variables.js", - "./core/utils/object.js", - "./core/events/events_abstract.js", - "./core/registry.js", - "./core/events/utils.js", - "./core/xml.js", - "./core/connection.js", - "./core/common.js", - "./core/blocks.js", - "./closure/goog/base_minimal.js", - "./core/blockly.js", + "./build/src/core/trashcan.js", + "./build/src/core/toolbox/toolbox.js", + "./build/src/core/toolbox/separator.js", + "./build/src/core/toolbox/collapsible_category.js", + "./build/src/core/toolbox/toolbox_item.js", + "./build/src/core/toolbox/category.js", + "./build/src/core/theme/zelos.js", + "./build/src/core/theme/themes.js", + "./build/src/core/shortcut_items.js", + "./build/src/core/serialization/workspaces.js", + "./build/src/core/serialization/variables.js", + "./build/src/core/renderers/zelos/renderer.js", + "./build/src/core/renderers/zelos/path_object.js", + "./build/src/core/renderers/zelos/marker_svg.js", + "./build/src/core/renderers/zelos/measurables/top_row.js", + "./build/src/core/renderers/zelos/measurables/row_elements.js", + "./build/src/core/renderers/zelos/measurables/inputs.js", + "./build/src/core/renderers/zelos/measurables/bottom_row.js", + "./build/src/core/renderers/zelos/info.js", + "./build/src/core/renderers/zelos/drawer.js", + "./build/src/core/renderers/zelos/constants.js", + "./build/src/core/renderers/zelos/zelos.js", + "./build/src/core/renderers/thrasos/renderer.js", + "./build/src/core/renderers/thrasos/info.js", + "./build/src/core/renderers/thrasos/thrasos.js", + "./build/src/core/renderers/minimalist/renderer.js", + "./build/src/core/renderers/minimalist/info.js", + "./build/src/core/renderers/minimalist/drawer.js", + "./build/src/core/renderers/minimalist/constants.js", + "./build/src/core/renderers/minimalist/minimalist.js", + "./build/src/core/renderers/geras/renderer.js", + "./build/src/core/renderers/geras/path_object.js", + "./build/src/core/renderers/geras/measurables/statement_input.js", + "./build/src/core/renderers/geras/measurables/inline_input.js", + "./build/src/core/renderers/geras/info.js", + "./build/src/core/renderers/geras/highlight_constants.js", + "./build/src/core/renderers/geras/highlighter.js", + "./build/src/core/renderers/geras/drawer.js", + "./build/src/core/renderers/geras/constants.js", + "./build/src/core/renderers/geras/geras.js", + "./build/src/core/workspace_drag_surface_svg.js", + "./build/src/core/shortcut_registry.js", + "./build/src/core/inject.js", + "./build/src/core/generator.js", + "./build/src/core/flyout_vertical.js", + "./build/src/core/flyout_horizontal.js", + "./build/src/core/sprites.js", + "./build/src/core/positionable_helpers.js", + "./build/src/core/zoom_controls.js", + "./build/src/core/workspace_audio.js", + "./build/src/core/variable_map.js", + "./build/src/core/workspace.js", + "./build/src/core/variables_dynamic.js", + "./build/src/core/utils.js", + "./build/src/core/touch_gesture.js", + "./build/src/core/theme_manager.js", + "./build/src/core/renderers/common/renderer.js", + "./build/src/core/renderers/common/path_object.js", + "./build/src/core/renderers/common/marker_svg.js", + "./build/src/core/renderers/common/info.js", + "./build/src/core/renderers/common/drawer.js", + "./build/src/core/renderers/common/debugger.js", + "./build/src/core/renderers/common/debug.js", + "./build/src/core/renderers/common/constants.js", + "./build/src/core/renderers/measurables/top_row.js", + "./build/src/core/renderers/measurables/square_corner.js", + "./build/src/core/renderers/measurables/spacer_row.js", + "./build/src/core/renderers/measurables/round_corner.js", + "./build/src/core/renderers/measurables/previous_connection.js", + "./build/src/core/renderers/measurables/output_connection.js", + "./build/src/core/renderers/measurables/next_connection.js", + "./build/src/core/renderers/measurables/jagged_edge.js", + "./build/src/core/renderers/measurables/statement_input.js", + "./build/src/core/renderers/measurables/input_row.js", + "./build/src/core/renderers/measurables/inline_input.js", + "./build/src/core/renderers/measurables/in_row_spacer.js", + "./build/src/core/renderers/measurables/icon.js", + "./build/src/core/renderers/measurables/hat.js", + "./build/src/core/renderers/measurables/field.js", + "./build/src/core/renderers/measurables/input_connection.js", + "./build/src/core/renderers/measurables/external_value_input.js", + "./build/src/core/renderers/measurables/connection.js", + "./build/src/core/renderers/measurables/row.js", + "./build/src/core/renderers/measurables/bottom_row.js", + "./build/src/core/renderers/measurables/types.js", + "./build/src/core/renderers/measurables/base.js", + "./build/src/core/renderers/common/block_rendering.js", + "./build/src/core/names.js", + "./build/src/core/procedures.js", + "./build/src/core/grid.js", + "./build/src/core/workspace_dragger.js", + "./build/src/core/gesture.js", + "./build/src/core/workspace_svg.js", + "./build/src/core/scrollbar_pair.js", + "./build/src/core/metrics_manager.js", + "./build/src/core/flyout_metrics_manager.js", + "./build/src/core/flyout_button.js", + "./build/src/core/flyout_base.js", + "./build/src/core/field_variable.js", + "./build/src/core/field_number.js", + "./build/src/core/field_multilineinput.js", + "./build/src/core/field_label_serializable.js", + "./build/src/core/field_image.js", + "./build/src/core/field_colour.js", + "./build/src/core/field_checkbox.js", + "./build/src/core/field_textinput.js", + "./build/src/core/field_angle.js", + "./build/src/core/drag_target.js", + "./build/src/core/delete_area.js", + "./build/src/core/events/events_block_move.js", + "./build/src/core/events/events_click.js", + "./build/src/core/events/events_comment_base.js", + "./build/src/core/events/events_comment_change.js", + "./build/src/core/events/events_comment_create.js", + "./build/src/core/events/events_comment_delete.js", + "./build/src/core/events/events_comment_move.js", + "./build/src/core/events/events_marker_move.js", + "./build/src/core/events/events_theme_change.js", + "./build/src/core/events/events_toolbox_item_select.js", + "./build/src/core/events/events_trashcan_open.js", + "./build/src/core/events/events_var_delete.js", + "./build/src/core/events/events_var_rename.js", + "./build/src/core/events/events_viewport.js", + "./build/src/core/events/events.js", + "./build/src/core/contextmenu_items.js", + "./build/src/core/connection_db.js", + "./build/src/core/connection_checker.js", + "./build/src/core/bubble_dragger.js", + "./build/src/core/warning.js", + "./build/src/core/utils/svg_paths.js", + "./build/src/core/rendered_connection.js", + "./build/src/core/keyboard_nav/marker.js", + "./build/src/core/keyboard_nav/cursor.js", + "./build/src/core/keyboard_nav/basic_cursor.js", + "./build/src/core/keyboard_nav/tab_navigate_cursor.js", + "./build/src/core/internal_constants.js", + "./build/src/core/contextmenu_registry.js", + "./build/src/core/clipboard.js", + "./build/src/core/contextmenu.js", + "./build/src/core/comment.js", + "./build/src/core/block_svg.js", + "./build/src/core/component_manager.js", + "./build/src/core/insertion_marker_manager.js", + "./build/src/core/bump_objects.js", + "./build/src/core/events/events_block_drag.js", + "./build/src/core/block_dragger.js", + "./build/src/core/block_drag_surface.js", + "./build/src/core/block_animations.js", + "./build/src/core/utils/array.js", + "./build/src/core/keyboard_nav/ast_node.js", + "./build/src/core/utils/toolbox.js", + "./build/src/core/theme/classic.js", + "./build/src/core/theme.js", + "./build/src/core/options.js", + "./build/src/core/icon.js", + "./build/src/core/config.js", + "./build/src/core/scrollbar.js", + "./build/src/core/bubble.js", + "./build/src/core/events/events_bubble_open.js", + "./build/src/core/mutator.js", + "./build/src/core/menuitem.js", + "./build/src/core/utils/keycodes.js", + "./build/src/core/utils/aria.js", + "./build/src/core/menu.js", + "./build/src/core/field_registry.js", + "./build/src/core/widgetdiv.js", + "./build/src/core/utils/sentinel.js", + "./build/src/core/utils/colour.js", + "./build/src/core/utils/parsing.js", + "./build/src/core/tooltip.js", + "./build/src/core/marker_manager.js", + "./build/src/core/field.js", + "./build/src/core/utils/math.js", + "./build/src/core/dropdowndiv.js", + "./build/src/core/field_dropdown.js", + "./build/src/core/extensions.js", + "./build/src/core/constants.js", + "./build/src/core/connection_type.js", + "./build/src/core/connection.js", + "./build/src/core/events/events_block_delete.js", + "./build/src/core/events/events_block_change.js", + "./build/src/core/block.js", + "./build/src/core/field_label.js", + "./build/src/core/input.js", + "./build/src/core/utils/object.js", + "./build/src/core/utils/string.js", + "./build/src/core/events/events_ui.js", + "./build/src/core/events/workspace_events.js", + "./build/src/core/events/events_block_base.js", + "./build/src/core/serialization/registry.js", + "./build/src/core/serialization/priorities.js", + "./build/src/core/serialization/exceptions.js", + "./build/src/core/utils/useragent.js", + "./build/src/core/utils/dom.js", + "./build/src/core/dialog.js", + "./build/src/core/msg.js", + "./build/src/core/events/events_abstract.js", + "./build/src/core/events/events_var_base.js", + "./build/src/core/events/events_var_create.js", + "./build/src/core/variable_model.js", + "./build/src/core/variables.js", + "./build/src/core/utils/coordinate.js", + "./build/src/core/workspace_comment.js", + "./build/src/core/events/events_ui_base.js", + "./build/src/core/events/events_selected.js", + "./build/src/core/touch.js", + "./build/src/core/browser_events.js", + "./build/src/core/utils/deprecation.js", + "./build/src/core/css.js", + "./build/src/core/utils/rect.js", + "./build/src/core/utils/svg.js", + "./build/src/core/utils/style.js", + "./build/src/core/utils/svg_math.js", + "./build/src/core/workspace_comment_svg.js", + "./build/src/core/xml.js", + "./build/src/core/utils/xml.js", + "./build/src/core/utils/size.js", + "./build/src/core/input_types.js", + "./build/src/core/utils/idgenerator.js", + "./build/src/core/blocks.js", + "./build/src/core/common.js", + "./build/src/core/events/utils.js", + "./build/src/core/serialization/blocks.js", + "./build/src/core/registry.js", + "./build/src/core/events/events_block_create.js", + "./build/src/closure/goog/goog.js", + "./build/src/core/blockly.js", + "./build/src/closure/goog/base_minimal.js", + "./build/src/core/main.js", "./blocks/variables_dynamic.js", "./blocks/variables.js", "./blocks/text.js", @@ -287,8 +256,8 @@ "./generators/javascript/loops.js", "./generators/javascript/logic.js", "./generators/javascript/lists.js", - "./generators/javascript.js", "./generators/javascript/colour.js", + "./generators/javascript.js", "./generators/javascript/all.js", "./generators/python/variables_dynamic.js", "./generators/python/variables.js", @@ -298,8 +267,8 @@ "./generators/python/loops.js", "./generators/python/logic.js", "./generators/python/lists.js", - "./generators/python.js", "./generators/python/colour.js", + "./generators/python.js", "./generators/python/all.js", "./generators/php/variables_dynamic.js", "./generators/php/variables.js", @@ -309,8 +278,8 @@ "./generators/php/loops.js", "./generators/php/logic.js", "./generators/php/lists.js", - "./generators/php.js", "./generators/php/colour.js", + "./generators/php.js", "./generators/php/all.js", "./generators/lua/variables_dynamic.js", "./generators/lua/variables.js", @@ -320,8 +289,8 @@ "./generators/lua/loops.js", "./generators/lua/logic.js", "./generators/lua/lists.js", - "./generators/lua.js", "./generators/lua/colour.js", + "./generators/lua.js", "./generators/lua/all.js", "./generators/dart/variables_dynamic.js", "./generators/dart/variables.js", @@ -331,8 +300,8 @@ "./generators/dart/loops.js", "./generators/dart/logic.js", "./generators/dart/lists.js", - "./generators/dart.js", "./generators/dart/colour.js", + "./generators/dart.js", "./generators/dart/all.js" ] } diff --git a/scripts/gulpfiles/config.js b/scripts/gulpfiles/config.js index f8ee8c1a8b3..200d6ac45a4 100644 --- a/scripts/gulpfiles/config.js +++ b/scripts/gulpfiles/config.js @@ -18,18 +18,26 @@ var path = require('path'); // // - tests/scripts/compile_typings.sh // - tests/scripts/check_metadata.sh -module.exports = { - // Directory to write compiled output to. - BUILD_DIR: 'build', +// - tests/scripts/update_metadata.sh +// - tests/bootstrap.js (for location of deps.js) +// - tests/mocha/index.html (for location of deps.mocha.js) - // Directory in which to assemble (and from which to publish) the - // blockly npm package. - RELEASE_DIR: 'dist', +// Directory to write compiled output to. +exports.BUILD_DIR = 'build'; - // Directory to write typings output to. - TYPINGS_BUILD_DIR: path.join('build', 'typings'), +// Dependencies file (used by bootstrap.js in uncompiled mode): +exports.DEPS_FILE = path.join(exports.BUILD_DIR, 'deps.js'); - // Directory where typescript compiler output can be found. - // Matches the value in tsconfig.json: outDir - TSC_OUTPUT_DIR: path.join('build', 'ts'), -}; +// Mocha test dependencies file (used by tests/mocha/index.html): +exports.TEST_DEPS_FILE = path.join(exports.BUILD_DIR, 'deps.mocha.js'); + +// Directory to write typings output to. +exports.TYPINGS_BUILD_DIR = path.join(exports.BUILD_DIR, 'declarations'); + +// Directory where typescript compiler output can be found. +// Matches the value in tsconfig.json: outDir +exports.TSC_OUTPUT_DIR = path.join(exports.BUILD_DIR, 'src'); + +// Directory in which to assemble (and from which to publish) the +// blockly npm package. +exports.RELEASE_DIR = 'dist'; diff --git a/scripts/gulpfiles/package_tasks.js b/scripts/gulpfiles/package_tasks.js index 5297ddf079e..479d1c856ef 100644 --- a/scripts/gulpfiles/package_tasks.js +++ b/scripts/gulpfiles/package_tasks.js @@ -14,6 +14,7 @@ gulp.replace = require('gulp-replace'); gulp.rename = require('gulp-rename'); gulp.insert = require('gulp-insert'); gulp.umd = require('gulp-umd'); +gulp.replace = require('gulp-replace'); var path = require('path'); var fs = require('fs'); @@ -78,15 +79,6 @@ function checkBuildDir(done) { done(); } -/** - * This task copies source files into the release directory. - */ -function packageSources() { - return gulp.src(['core/**/**.js', 'blocks/**.js', 'generators/**/**.js'], - {base: '.'}) - .pipe(gulp.dest(RELEASE_DIR)); -}; - /** * This task copies the compressed files and their source maps into * the release directory. @@ -377,20 +369,19 @@ function packageReadme() { }; /** - * This task copies the typings/blockly.d.ts TypeScript definition - * file into the release directory. The bundled declaration file is - * referenced in package.json in the types property. - * As of Q4 2021 this simply copies the existing ts definition files, since - * generation through typescript-closure-tools does not work with goog.module. - * TODO(5621): Regenerate definition files and copy them into the release dir as - * needed. + * This task copies the generated .d.ts files in build/declarations and the + * hand-written .d.ts files in typings/ into the release directory. The main + * entrypoint file (index.d.ts) is referenced in package.json in the types + * property. */ function packageDTS() { const handwrittenSrcs = [ 'typings/*.d.ts', - 'typings/msg/msg.d.ts', + 'typings/msg/*.d.ts', ]; return gulp.src(handwrittenSrcs, {base: 'typings'}) + .pipe(gulp.src(`${TYPINGS_BUILD_DIR}/**/*.d.ts`)) + .pipe(gulp.replace('AnyDuringMigration', 'any')) .pipe(gulp.dest(RELEASE_DIR)); }; @@ -414,7 +405,6 @@ const package = gulp.series( cleanReleaseDir, gulp.parallel( packageIndex, - packageSources, packageCompressed, packageBrowser, packageNode, diff --git a/scripts/gulpfiles/release_tasks.js b/scripts/gulpfiles/release_tasks.js index d44928ca34d..2841ad05e62 100644 --- a/scripts/gulpfiles/release_tasks.js +++ b/scripts/gulpfiles/release_tasks.js @@ -82,8 +82,7 @@ function checkBranch(done) { // Sanity check that the RELASE_DIR directory exists, and that certain // files are in it. function checkReleaseDir(done) { - const sanityFiles = ['blockly_compressed.js', 'blocks_compressed.js', - 'core', 'blocks', 'generators']; + const sanityFiles = ['blockly_compressed.js', 'blocks_compressed.js']; // Check that directory exists. if (fs.existsSync(RELEASE_DIR)) { // Sanity check that certain files exist in RELASE_DIR. @@ -153,10 +152,6 @@ const rebuildAll = gulp.series( buildTasks.cleanBuildDir, buildTasks.build, buildTasks.checkinBuilt, - // TODO(5621): Re-enable once typings generation is fixed. - // typings.typings, - // typings.msgTypings, - // typings.checkinTypings, ); // Package and publish to npm. diff --git a/scripts/migration/renamings.json5 b/scripts/migration/renamings.json5 index 2de068b491f..cbe6c8b47f6 100644 --- a/scripts/migration/renamings.json5 +++ b/scripts/migration/renamings.json5 @@ -1337,5 +1337,87 @@ }, ], - 'develop': [ ], + '9.0.0': [ + { + 'oldName': 'Blockly.utils.global', + 'newPath': 'globalThis', + }, + { + oldName: 'Blockly.Dart', + newExport: 'dartGenerator', + newPath: 'Blockly.Dart', + }, + { + oldName: 'Blockly.JavaScript', + newExport: 'javascriptGenerator', + newPath: 'Blockly.JavaScript', + }, + { + oldName: 'Blockly.Lua', + newExport: 'luaGenerator', + newPath: 'Blockly.Lua', + }, + { + oldName: 'Blockly.PHP', + newExport: 'phpGenerator', + newPath: 'Blockly.php', + }, + { + oldName: 'Blockly.Python', + newExport: 'pythonGenerator', + newPath: 'Blockly.Python', + 'oldName': 'Blockly.ContextMenuRegistry', + exports: { + 'ContextMenuRegistry.ScopeType': { + oldPath: 'Blockly.ContextMenuRegistry.ScopeType', + newExport: 'ScopeType', + newPath: 'Blockly.ContextMenuRegistry.ScopeType', + }, + 'ContextMenuRegistry.Scope': { + oldPath: 'Blockly.ContextMenuRegistry.Scope', + newExport: 'Scope', + newPath: 'Blockly.ContextMenuRegistry.Scope', + }, + 'ContextMenuRegistry.RegistryItem': { + oldPath: 'Blockly.ContextMenuRegistry.RegistryItem', + newExport: 'RegistryItem', + newPath: 'Blockly.ContextMenuRegistry.RegistryItem', + }, + 'ContextMenuRegistry.ContextMenuOption': { + oldPath: 'Blockly.ContextMenuRegistry.ContextMenuOption', + newExport: 'ContextMenuOption', + newPath: 'Blockly.ContextMenuRegistry.ContextMenuOption', + }, + 'ContextMenuRegistry.LegacyContextMenuOption': { + oldPath: 'Blockly.ContextMenuRegistry.LegacyContextMenuOption', + newExport: 'LegacyContextMenuOption', + newPath: 'Blockly.ContextMenuRegistry.LegacyContextMenuOption', + }, + }, + }, + { + 'oldName': 'Blockly.Input', + exports: { + 'Input.Align': { + oldPath: 'Blockly.Input.Align', + newExport: 'Align', + newPath: 'Blockly.Input.Align', + }, + }, + }, + { + 'oldName': 'Blockly.Names', + exports: { + 'Names.NameType': { + oldPath: 'Blockly.Names.NameType', + newExport: 'NameType', + newPath: 'Blockly.Names.NameType', + }, + }, + }, + ], + + 'develop': [ + // New renamings go here! + ] } diff --git a/scripts/package/README.md b/scripts/package/README.md index b4f0cf3b802..6140edfeff8 100644 --- a/scripts/package/README.md +++ b/scripts/package/README.md @@ -49,16 +49,16 @@ import * as Blockly from 'blockly/core'; #### Blockly built in blocks ```js -import 'blockly/blocks'; +import * as libraryBlocks from 'blockly/blocks'; ``` #### Blockly Generators If your application needs to generate code from the Blockly blocks, you'll want to include a generator. ```js -import 'blockly/python'; +import {pythonGenerator} from 'blockly/python'; ``` -to include the Python generator, you can also import ``blockly/javascript``, ``blockly/php``, ``blockly/dart`` and ``blockly/lua``. +to include the Python generator. You can also import `{javascriptGenerator} from 'blockly/javascript'`, `{phpGenerator} from 'blockly/php'`, `{dartGenerator} from 'blockly/dart'` and `{luaGenerator} from 'blockly/lua'`. #### Blockly Languages diff --git a/scripts/package/browser/core.js b/scripts/package/browser/core.js index a0b0d92593a..7471feda61d 100644 --- a/scripts/package/browser/core.js +++ b/scripts/package/browser/core.js @@ -12,9 +12,3 @@ /* eslint-disable */ 'use strict'; -// Add a helper method to set the Blockly locale. -Blockly.setLocale = function (locale) { - Object.keys(locale).forEach(function (k) { - Blockly.Msg[k] = locale[k]; - }); -}; diff --git a/scripts/package/node/core.js b/scripts/package/node/core.js index 36a5addd21a..11e77b5b6a9 100644 --- a/scripts/package/node/core.js +++ b/scripts/package/node/core.js @@ -12,21 +12,14 @@ /* eslint-disable */ 'use strict'; -// Add a helper method to set the Blockly locale. -Blockly.setLocale = function (locale) { - Object.keys(locale).forEach(function (k) { - Blockly.Msg[k] = locale[k]; - }); -}; // Override textToDomDocument and provide Node.js alternatives to DOMParser and // XMLSerializer. -const globalThis = Blockly.utils.global; if (typeof globalThis.document !== 'object') { const jsdom = require('jsdom/lib/jsdom/living'); globalThis.DOMParser = jsdom.DOMParser; globalThis.XMLSerializer = jsdom.XMLSerializer; const xmlDocument = Blockly.utils.xml.textToDomDocument( - ``); + ``); Blockly.utils.xml.setDocument(xmlDocument); } diff --git a/tests/.eslintrc.json b/tests/.eslintrc.json new file mode 100644 index 00000000000..d60a0bd41de --- /dev/null +++ b/tests/.eslintrc.json @@ -0,0 +1,10 @@ +{ + "globals": { + "Blockly": true, + "dartGenerator": true, + "javascriptGenerator": true, + "luaGenerator": true, + "phpGenerator": true, + "pythonGenerator": true + } +} diff --git a/tests/bootstrap.js b/tests/bootstrap.js new file mode 100644 index 00000000000..9fe73d7f0d6 --- /dev/null +++ b/tests/bootstrap.js @@ -0,0 +1,229 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Bootstrap code to load Blockly, typically in + * uncompressed mode. + * + * Load this file in a ` + ); + + // Prevent spurious transpilation warnings. + document.write(''); + + // Load dependency graph info from the specified deps files - + // typically just build/deps.js. To update deps after changing + // any module's goog.requires / imports, run `npm run build:deps`. + for (const depsFile of options.depsFiles) { + document.write(``); + } + + // Record require targets for bootstrap_helper.js. + window.bootstrapInfo.requires = options.requires; + + // Assemble a list of module targets to bootstrap. + // + // The first group of targets are those listed in + // options.requires. + // + // The next target is a fake one that will load + // bootstrap_helper.js. We generate a call to goog.addDependency + // to tell the debug module loader that it can be loaded via a + // fake module name, and that it depends on all the targets in the + // first group (and indeed bootstrap_helper.js will make a call to + // goog.require for each one). + // + // We then create another target for each of + // options.additionalScripts, again generating calls to + // goog.addDependency for each one making it dependent on the + // previous one. + let requires = options.requires.slice(); + const scripts = + ['tests/bootstrap_helper.js', ...options.additionalScripts]; + const scriptDeps = []; + for (const script of scripts) { + const fakeModuleName = `script.${script.replace(/[./]/g, '-')}`; + scriptDeps.push( + `goog.addDependency(${quote('../../../../' + script)}, ` + + `[${quote(fakeModuleName)}], [${requires.map(quote).join()}], ` + + `{'lang': 'es6'});`); + requires = [fakeModuleName]; + } + + // Finally, write out a script containing the generated + // goog.addDependency calls and a call to goog.bootstrap + // requesting the loading of the final target, which will cause + // all the previous ones to be loaded recursively. Wrap this in a + // promise and save it so it can be awaited in bootstrap_done.mjs. + document.write(``); + } else { + // We need to load Blockly in compressed mode. Load + // blockly_compressed.js et al. using `); + } + } + + return; // All done. Only helper functions after this point. + + /** + * Convert a string into a string literal. Strictly speaking we + * only need to escape backslash, \r, \n, \u2028 (line separator), + * \u2029 (paragraph separator) and whichever quote character we're + * using, but for simplicity we escape all the control characters. + * + * Based on https://github.com/google/CodeCity/blob/master/server/code.js + * + * @param {string} str The string to convert. + * @return {string} The value s as a eval-able string literal. + */ + function quote(str) { + /* eslint-disable no-control-regex, no-multi-spaces */ + /** Regexp for characters to be escaped in a single-quoted string. */ + const singleRE = /[\x00-\x1f\\\u2028\u2029']/g; + + /** Map of control character replacements. */ + const replacements = { + '\x00': '\\0', '\x01': '\\x01', '\x02': '\\x02', '\x03': '\\x03', + '\x04': '\\x04', '\x05': '\\x05', '\x06': '\\x06', '\x07': '\\x07', + '\x08': '\\b', '\x09': '\\t', '\x0a': '\\n', '\x0b': '\\v', + '\x0c': '\\f', '\x0d': '\\r', '\x0e': '\\x0e', '\x0f': '\\x0f', + '"': '\\"', "'": "\\'", '\\': '\\\\', + '\u2028': '\\u2028', '\u2029': '\\u2029', + }; + /* eslint-enable no-control-regex, no-multi-spaces */ + + return "'" + str.replace(singleRE, (c) => replacements[c]) + "'"; + } +})(); diff --git a/tests/playgrounds/blockly.mjs b/tests/bootstrap_done.mjs similarity index 57% rename from tests/playgrounds/blockly.mjs rename to tests/bootstrap_done.mjs index cb836f5399b..d6d0c9b31a3 100644 --- a/tests/playgrounds/blockly.mjs +++ b/tests/bootstrap_done.mjs @@ -20,20 +20,20 @@ * * See tests/playground.html for example usage. */ +if (!window.bootstrapInfo) { + throw new Error('window.bootstrapInfo not found. ' + + 'Make sure to load bootstrap.js before importing bootstrap_done.mjs.'); +} -let Blockly; - -if (window.BlocklyLoader) { - // Uncompiled mode. Use top-level await +if (window.bootstrapInfo.compressed) { + // Compiled mode. Nothing more to do. +} else { + // Uncompressed mode. Use top-level await // (https://v8.dev/features/top-level-await) to block loading of // this module until goog.bootstrap()ping of Blockly is finished. - await window.BlocklyLoader; - Blockly = globalThis.Blockly; -} else if (window.Blockly) { - // Compiled mode. Retrieve the pre-installed Blockly global. - Blockly = globalThis.Blockly; -} else { - throw new Error('neither window.Blockly nor window.BlocklyLoader found'); + await window.bootstrapInfo.done; + // Note that this module previously did an export default of the + // value returned by the bootstrapInfo.done promise. This was + // changed in PR #5995 because library blocks and generators cannot + // be accessed via that the core/blockly.js exports object. } - -export default Blockly; diff --git a/tests/bootstrap_helper.js b/tests/bootstrap_helper.js new file mode 100644 index 00000000000..e9e7cd68ae6 --- /dev/null +++ b/tests/bootstrap_helper.js @@ -0,0 +1,43 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Helper script for bootstrap.js + * + * This is loaded, via goog.bootstrap(), after the other top-level + * Blockly modules. It simply calls goog.require() for each of them, + * to force the debug module loader to finish loading them before any + * non-module scripts (like msg/messages.js) that might have + * undeclared dependencies on them. + */ + +/* eslint-disable-next-line no-undef */ +for (const require of window.bootstrapInfo.requires) { + goog.require(require); + + // If require is a top-level chunk, create a global variable for it. + // This replaces the goog.module.declareLegacyNamespace calls that + // previously existed in each chunk entrypoint. + const exportName = { + 'Blockly.Dart': 'dartGenerator', + 'Blockly.Dart.all': 'dartGenerator', + 'Blockly.JavaScript': 'javascriptGenerator', + 'Blockly.JavaScript.all': 'javascriptGenerator', + 'Blockly.Lua': 'luaGenerator', + 'Blockly.Lua.all': 'luaGenerator', + 'Blockly.PHP': 'phpGenerator', + 'Blockly.PHP.all': 'phpGenerator', + 'Blockly.Python': 'pythonGenerator', + 'Blockly.Python.all': 'pythonGenerator', + }[require]; + if (exportName) { + window[exportName] = goog.module.get(require)[exportName]; + } else if (require === 'Blockly') { + window.Blockly = goog.module.get(require); + } else if (require === 'Blockly.libraryBlocks') { + window.libraryBlocks = goog.module.get(require); + } +} diff --git a/tests/compile/main.js b/tests/compile/main.js index b5d20a770cd..9e4aad1d7ec 100644 --- a/tests/compile/main.js +++ b/tests/compile/main.js @@ -9,7 +9,8 @@ goog.module('Main'); // Core // Either require 'Blockly.requires', or just the components you use: /* eslint-disable-next-line no-unused-vars */ -const {BlocklyOptions} = goog.requireType('Blockly.BlocklyOptions'); +// TODO: I think we need to make sure these get exported? +// const {BlocklyOptions} = goog.requireType('Blockly.BlocklyOptions'); const {inject} = goog.require('Blockly.inject'); /** @suppress {extraRequire} */ goog.require('Blockly.geras.Renderer'); @@ -25,7 +26,7 @@ goog.require('Blockly.libraryBlocks.math'); /** @suppress {extraRequire} */ goog.require('Blockly.libraryBlocks.texts'); /** @suppress {extraRequire} */ -goog.require('Blockly.libraryBlocks.testBlocks'); +goog.require('testBlocks'); function init() { diff --git a/tests/compile/test_blocks.js b/tests/compile/test_blocks.js index 2b8cc6621bc..8dbbe1c0668 100644 --- a/tests/compile/test_blocks.js +++ b/tests/compile/test_blocks.js @@ -9,9 +9,9 @@ */ 'use strict'; -goog.provide('Blockly.libraryBlocks.testBlocks'); +goog.module('testBlocks'); -goog.require('Blockly'); +const Blockly = goog.require('Blockly'); Blockly.defineBlocksWithJsonArray([ { diff --git a/tests/deps.js b/tests/deps.js deleted file mode 100644 index 317703f1a39..00000000000 --- a/tests/deps.js +++ /dev/null @@ -1,328 +0,0 @@ -goog.addDependency('../../blocks/blocks.js', ['Blockly.libraryBlocks'], ['Blockly.libraryBlocks.colour', 'Blockly.libraryBlocks.lists', 'Blockly.libraryBlocks.logic', 'Blockly.libraryBlocks.loops', 'Blockly.libraryBlocks.math', 'Blockly.libraryBlocks.procedures', 'Blockly.libraryBlocks.texts', 'Blockly.libraryBlocks.variables', 'Blockly.libraryBlocks.variablesDynamic'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/colour.js', ['Blockly.libraryBlocks.colour'], ['Blockly.FieldColour', 'Blockly.common'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/lists.js', ['Blockly.libraryBlocks.lists'], ['Blockly.ConnectionType', 'Blockly.FieldDropdown', 'Blockly.FieldDropdown', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/logic.js', ['Blockly.libraryBlocks.logic'], ['Blockly.Events', 'Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldLabel', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/loops.js', ['Blockly.libraryBlocks.loops'], ['Blockly.ContextMenu', 'Blockly.Events', 'Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldLabel', 'Blockly.FieldNumber', 'Blockly.FieldVariable', 'Blockly.Msg', 'Blockly.Variables', 'Blockly.Warning', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/math.js', ['Blockly.libraryBlocks.math'], ['Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldLabel', 'Blockly.FieldNumber', 'Blockly.FieldVariable', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/procedures.js', ['Blockly.libraryBlocks.procedures'], ['Blockly.Comment', 'Blockly.ContextMenu', 'Blockly.Events', 'Blockly.FieldCheckbox', 'Blockly.FieldLabel', 'Blockly.FieldTextInput', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.Names', 'Blockly.Procedures', 'Blockly.Variables', 'Blockly.Warning', 'Blockly.Xml', 'Blockly.common', 'Blockly.config', 'Blockly.utils.xml'], {'lang': 'es9', 'module': 'goog'}); -goog.addDependency('../../blocks/text.js', ['Blockly.libraryBlocks.texts'], ['Blockly.ConnectionType', 'Blockly.Extensions', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldMultilineInput', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.Input', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es9', 'module': 'goog'}); -goog.addDependency('../../blocks/variables.js', ['Blockly.libraryBlocks.variables'], ['Blockly.ContextMenu', 'Blockly.Extensions', 'Blockly.FieldLabel', 'Blockly.FieldVariable', 'Blockly.Msg', 'Blockly.Variables', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../blocks/variables_dynamic.js', ['Blockly.libraryBlocks.variablesDynamic'], ['Blockly.ContextMenu', 'Blockly.Extensions', 'Blockly.FieldLabel', 'Blockly.FieldVariable', 'Blockly.Msg', 'Blockly.Variables', 'Blockly.common', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/block.js', ['Blockly.Block'], ['Blockly.ASTNode', 'Blockly.Connection', 'Blockly.ConnectionType', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockMove', 'Blockly.Events.utils', 'Blockly.Extensions', 'Blockly.IASTNodeLocation', 'Blockly.IDeletable', 'Blockly.Input', 'Blockly.Tooltip', 'Blockly.blocks', 'Blockly.common', 'Blockly.constants', 'Blockly.fieldRegistry', 'Blockly.inputTypes', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.array', 'Blockly.utils.idGenerator', 'Blockly.utils.object', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/block_animations.js', ['Blockly.blockAnimations'], ['Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/block_drag_surface.js', ['Blockly.BlockDragSurfaceSvg'], ['Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/block_dragger.js', ['Blockly.BlockDragger'], ['Blockly.Events.BlockDrag', 'Blockly.Events.BlockMove', 'Blockly.Events.utils', 'Blockly.IBlockDragger', 'Blockly.InsertionMarkerManager', 'Blockly.blockAnimations', 'Blockly.bumpObjects', 'Blockly.common', 'Blockly.registry', 'Blockly.utils.Coordinate', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/block_svg.js', ['Blockly.BlockSvg'], ['Blockly.ASTNode', 'Blockly.Block', 'Blockly.ConnectionType', 'Blockly.ContextMenu', 'Blockly.ContextMenuRegistry', 'Blockly.Events.BlockMove', 'Blockly.Events.Selected', 'Blockly.Events.utils', 'Blockly.FieldLabel', 'Blockly.IASTNodeLocationSvg', 'Blockly.IBoundedElement', 'Blockly.ICopyable', 'Blockly.IDraggable', 'Blockly.MarkerManager', 'Blockly.Msg', 'Blockly.RenderedConnection', 'Blockly.TabNavigateCursor', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.blockAnimations', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.config', 'Blockly.constants', 'Blockly.internalConstants', 'Blockly.serialization.blocks', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/blockly.js', ['Blockly'], ['Blockly.ASTNode', 'Blockly.BasicCursor', 'Blockly.Block', 'Blockly.BlockDragSurfaceSvg', 'Blockly.BlockDragger', 'Blockly.BlockSvg', 'Blockly.BlocklyOptions', 'Blockly.Bubble', 'Blockly.BubbleDragger', 'Blockly.CollapsibleToolboxCategory', 'Blockly.Comment', 'Blockly.ComponentManager', 'Blockly.Connection', 'Blockly.ConnectionChecker', 'Blockly.ConnectionDB', 'Blockly.ConnectionType', 'Blockly.ContextMenu', 'Blockly.ContextMenuItems', 'Blockly.ContextMenuRegistry', 'Blockly.Css', 'Blockly.Cursor', 'Blockly.DeleteArea', 'Blockly.DragTarget', 'Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Events.FinishedLoading', 'Blockly.Events.Ui', 'Blockly.Events.UiBase', 'Blockly.Events.VarCreate', 'Blockly.Extensions', 'Blockly.Field', 'Blockly.FieldAngle', 'Blockly.FieldCheckbox', 'Blockly.FieldColour', 'Blockly.FieldDropdown', 'Blockly.FieldImage', 'Blockly.FieldLabel', 'Blockly.FieldLabelSerializable', 'Blockly.FieldMultilineInput', 'Blockly.FieldNumber', 'Blockly.FieldTextInput', 'Blockly.FieldVariable', 'Blockly.Flyout', 'Blockly.FlyoutButton', 'Blockly.FlyoutMetricsManager', 'Blockly.Generator', 'Blockly.Gesture', 'Blockly.Grid', 'Blockly.HorizontalFlyout', 'Blockly.IASTNodeLocation', 'Blockly.IASTNodeLocationSvg', 'Blockly.IASTNodeLocationWithBlock', 'Blockly.IAutoHideable', 'Blockly.IBlockDragger', 'Blockly.IBoundedElement', 'Blockly.IBubble', 'Blockly.ICollapsibleToolboxItem', 'Blockly.IComponent', 'Blockly.IConnectionChecker', 'Blockly.IContextMenu', 'Blockly.ICopyable', 'Blockly.IDeletable', 'Blockly.IDeleteArea', 'Blockly.IDragTarget', 'Blockly.IDraggable', 'Blockly.IFlyout', 'Blockly.IKeyboardAccessible', 'Blockly.IMetricsManager', 'Blockly.IMovable', 'Blockly.IPositionable', 'Blockly.IRegistrable', 'Blockly.IRegistrableField', 'Blockly.ISelectable', 'Blockly.ISelectableToolboxItem', 'Blockly.IStyleable', 'Blockly.IToolbox', 'Blockly.IToolboxItem', 'Blockly.Icon', 'Blockly.Input', 'Blockly.InsertionMarkerManager', 'Blockly.Marker', 'Blockly.MarkerManager', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.MetricsManager', 'Blockly.Msg', 'Blockly.Mutator', 'Blockly.Names', 'Blockly.Options', 'Blockly.Procedures', 'Blockly.RenderedConnection', 'Blockly.Scrollbar', 'Blockly.ScrollbarPair', 'Blockly.ShortcutItems', 'Blockly.ShortcutRegistry', 'Blockly.TabNavigateCursor', 'Blockly.Theme', 'Blockly.ThemeManager', 'Blockly.Themes', 'Blockly.Toolbox', 'Blockly.ToolboxCategory', 'Blockly.ToolboxItem', 'Blockly.ToolboxSeparator', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.TouchGesture', 'Blockly.Trashcan', 'Blockly.VariableMap', 'Blockly.VariableModel', 'Blockly.Variables', 'Blockly.VariablesDynamic', 'Blockly.VerticalFlyout', 'Blockly.Warning', 'Blockly.WidgetDiv', 'Blockly.Workspace', 'Blockly.WorkspaceAudio', 'Blockly.WorkspaceComment', 'Blockly.WorkspaceCommentSvg', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.WorkspaceDragger', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.ZoomControls', 'Blockly.blockAnimations', 'Blockly.blockRendering', 'Blockly.blocks', 'Blockly.browserEvents', 'Blockly.bumpObjects', 'Blockly.clipboard', 'Blockly.common', 'Blockly.config', 'Blockly.constants', 'Blockly.dialog', 'Blockly.dropDownDiv', 'Blockly.fieldRegistry', 'Blockly.geras', 'Blockly.inject', 'Blockly.inputTypes', 'Blockly.internalConstants', 'Blockly.minimalist', 'Blockly.registry', 'Blockly.serialization.ISerializer', 'Blockly.serialization.blocks', 'Blockly.serialization.exceptions', 'Blockly.serialization.priorities', 'Blockly.serialization.registry', 'Blockly.serialization.variables', 'Blockly.serialization.workspaces', 'Blockly.thrasos', 'Blockly.uiPosition', 'Blockly.utils', 'Blockly.utils.colour', 'Blockly.utils.deprecation', 'Blockly.utils.global', 'Blockly.utils.svgMath', 'Blockly.utils.toolbox', 'Blockly.zelos'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/blockly_options.js', ['Blockly.BlocklyOptions'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/blocks.js', ['Blockly.blocks'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/browser_events.js', ['Blockly.browserEvents'], ['Blockly.Touch', 'Blockly.utils.global', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/bubble.js', ['Blockly.Bubble'], ['Blockly.IBubble', 'Blockly.Scrollbar', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/bubble_dragger.js', ['Blockly.BubbleDragger'], ['Blockly.Bubble', 'Blockly.ComponentManager', 'Blockly.Events.CommentMove', 'Blockly.Events.utils', 'Blockly.constants', 'Blockly.utils.Coordinate', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/bump_objects.js', ['Blockly.bumpObjects'], ['Blockly.Events.utils', 'Blockly.utils.math'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/clipboard.js', ['Blockly.clipboard'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/comment.js', ['Blockly.Comment'], ['Blockly.Bubble', 'Blockly.Css', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Events.utils', 'Blockly.Icon', 'Blockly.Warning', 'Blockly.browserEvents', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/common.js', ['Blockly.common'], ['Blockly.blocks'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/component_manager.js', ['Blockly.ComponentManager'], ['Blockly.utils.array'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/config.js', ['Blockly.config'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/connection.js', ['Blockly.Connection'], ['Blockly.ConnectionType', 'Blockly.Events.BlockMove', 'Blockly.Events.utils', 'Blockly.IASTNodeLocationWithBlock', 'Blockly.Xml', 'Blockly.constants', 'Blockly.serialization.blocks'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/connection_checker.js', ['Blockly.ConnectionChecker'], ['Blockly.Connection', 'Blockly.ConnectionType', 'Blockly.IConnectionChecker', 'Blockly.common', 'Blockly.internalConstants', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/connection_db.js', ['Blockly.ConnectionDB'], ['Blockly.ConnectionType', 'Blockly.constants'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/connection_type.js', ['Blockly.ConnectionType'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/constants.js', ['Blockly.constants'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/contextmenu.js', ['Blockly.ContextMenu'], ['Blockly.Events.BlockCreate', 'Blockly.Events.utils', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.Msg', 'Blockly.WidgetDiv', 'Blockly.Xml', 'Blockly.browserEvents', 'Blockly.clipboard', 'Blockly.config', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.deprecation', 'Blockly.utils.dom', 'Blockly.utils.svgMath', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/contextmenu_items.js', ['Blockly.ContextMenuItems'], ['Blockly.ContextMenuRegistry', 'Blockly.Events', 'Blockly.Events.utils', 'Blockly.Msg', 'Blockly.clipboard', 'Blockly.dialog', 'Blockly.inputTypes', 'Blockly.utils.idGenerator', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/contextmenu_registry.js', ['Blockly.ContextMenuRegistry'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/css.js', ['Blockly.Css'], ['Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/delete_area.js', ['Blockly.DeleteArea'], ['Blockly.BlockSvg', 'Blockly.DragTarget', 'Blockly.IDeleteArea'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/dialog.js', ['Blockly.dialog'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/drag_target.js', ['Blockly.DragTarget'], ['Blockly.IDragTarget'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/dropdowndiv.js', ['Blockly.dropDownDiv'], ['Blockly.common', 'Blockly.utils.Rect', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.style'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events.js', ['Blockly.Events'], ['Blockly.Events.Abstract', 'Blockly.Events.BlockBase', 'Blockly.Events.BlockChange', 'Blockly.Events.BlockCreate', 'Blockly.Events.BlockDelete', 'Blockly.Events.BlockDrag', 'Blockly.Events.BlockMove', 'Blockly.Events.BubbleOpen', 'Blockly.Events.Click', 'Blockly.Events.CommentBase', 'Blockly.Events.CommentChange', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove', 'Blockly.Events.FinishedLoading', 'Blockly.Events.MarkerMove', 'Blockly.Events.Selected', 'Blockly.Events.ThemeChange', 'Blockly.Events.ToolboxItemSelect', 'Blockly.Events.TrashcanOpen', 'Blockly.Events.Ui', 'Blockly.Events.UiBase', 'Blockly.Events.VarBase', 'Blockly.Events.VarCreate', 'Blockly.Events.VarDelete', 'Blockly.Events.VarRename', 'Blockly.Events.ViewportChange', 'Blockly.Events.utils', 'Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_abstract.js', ['Blockly.Events.Abstract'], ['Blockly.Events.utils'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_base.js', ['Blockly.Events.BlockBase'], ['Blockly.Events.Abstract'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_change.js', ['Blockly.Events.BlockChange'], ['Blockly.Events.BlockBase', 'Blockly.Events.utils', 'Blockly.Xml', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_create.js', ['Blockly.Events.BlockCreate'], ['Blockly.Events.BlockBase', 'Blockly.Events.utils', 'Blockly.Xml', 'Blockly.registry', 'Blockly.serialization.blocks'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_delete.js', ['Blockly.Events.BlockDelete'], ['Blockly.Events.BlockBase', 'Blockly.Events.utils', 'Blockly.Xml', 'Blockly.registry', 'Blockly.serialization.blocks'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_drag.js', ['Blockly.Events.BlockDrag'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_block_move.js', ['Blockly.Events.BlockMove'], ['Blockly.ConnectionType', 'Blockly.Events.BlockBase', 'Blockly.Events.utils', 'Blockly.registry', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_bubble_open.js', ['Blockly.Events.BubbleOpen'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_click.js', ['Blockly.Events.Click'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_comment_base.js', ['Blockly.Events.CommentBase'], ['Blockly.Events.Abstract', 'Blockly.Events.utils', 'Blockly.Xml', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_comment_change.js', ['Blockly.Events.CommentChange'], ['Blockly.Events.CommentBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_comment_create.js', ['Blockly.Events.CommentCreate'], ['Blockly.Events.CommentBase', 'Blockly.Events.utils', 'Blockly.Xml', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_comment_delete.js', ['Blockly.Events.CommentDelete'], ['Blockly.Events.CommentBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_comment_move.js', ['Blockly.Events.CommentMove'], ['Blockly.Events.CommentBase', 'Blockly.Events.utils', 'Blockly.registry', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_marker_move.js', ['Blockly.Events.MarkerMove'], ['Blockly.ASTNode', 'Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_selected.js', ['Blockly.Events.Selected'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_theme_change.js', ['Blockly.Events.ThemeChange'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_toolbox_item_select.js', ['Blockly.Events.ToolboxItemSelect'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_trashcan_open.js', ['Blockly.Events.TrashcanOpen'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_ui.js', ['Blockly.Events.Ui'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_ui_base.js', ['Blockly.Events.UiBase'], ['Blockly.Events.Abstract'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_var_base.js', ['Blockly.Events.VarBase'], ['Blockly.Events.Abstract'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_var_create.js', ['Blockly.Events.VarCreate'], ['Blockly.Events.VarBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_var_delete.js', ['Blockly.Events.VarDelete'], ['Blockly.Events.VarBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_var_rename.js', ['Blockly.Events.VarRename'], ['Blockly.Events.VarBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/events_viewport.js', ['Blockly.Events.ViewportChange'], ['Blockly.Events.UiBase', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/utils.js', ['Blockly.Events.utils'], ['Blockly.registry', 'Blockly.utils.idGenerator'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/events/workspace_events.js', ['Blockly.Events.FinishedLoading'], ['Blockly.Events.Abstract', 'Blockly.Events.utils', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/extensions.js', ['Blockly.Extensions'], ['Blockly.FieldDropdown', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field.js', ['Blockly.Field'], ['Blockly.Events.BlockChange', 'Blockly.Events.utils', 'Blockly.Gesture', 'Blockly.IASTNodeLocationSvg', 'Blockly.IASTNodeLocationWithBlock', 'Blockly.IKeyboardAccessible', 'Blockly.IRegistrable', 'Blockly.MarkerManager', 'Blockly.Tooltip', 'Blockly.WidgetDiv', 'Blockly.Xml', 'Blockly.browserEvents', 'Blockly.dropDownDiv', 'Blockly.utils.Rect', 'Blockly.utils.Sentinel', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.parsing', 'Blockly.utils.style', 'Blockly.utils.userAgent', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_angle.js', ['Blockly.FieldAngle'], ['Blockly.Css', 'Blockly.Field', 'Blockly.FieldTextInput', 'Blockly.WidgetDiv', 'Blockly.browserEvents', 'Blockly.dropDownDiv', 'Blockly.fieldRegistry', 'Blockly.utils.KeyCodes', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_checkbox.js', ['Blockly.FieldCheckbox'], ['Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_colour.js', ['Blockly.FieldColour'], ['Blockly.Css', 'Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.browserEvents', 'Blockly.dropDownDiv', 'Blockly.fieldRegistry', 'Blockly.utils.KeyCodes', 'Blockly.utils.Size', 'Blockly.utils.aria', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.idGenerator'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_dropdown.js', ['Blockly.FieldDropdown'], ['Blockly.Field', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.dropDownDiv', 'Blockly.fieldRegistry', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.parsing', 'Blockly.utils.string', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_image.js', ['Blockly.FieldImage'], ['Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_label.js', ['Blockly.FieldLabel'], ['Blockly.Field', 'Blockly.fieldRegistry', 'Blockly.utils.dom', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_label_serializable.js', ['Blockly.FieldLabelSerializable'], ['Blockly.FieldLabel', 'Blockly.fieldRegistry', 'Blockly.utils.parsing'], {'lang': 'es_2020', 'module': 'goog'}); -goog.addDependency('../../core/field_multilineinput.js', ['Blockly.FieldMultilineInput'], ['Blockly.Css', 'Blockly.Field', 'Blockly.FieldTextInput', 'Blockly.WidgetDiv', 'Blockly.fieldRegistry', 'Blockly.utils.KeyCodes', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.parsing', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_number.js', ['Blockly.FieldNumber'], ['Blockly.Field', 'Blockly.FieldTextInput', 'Blockly.fieldRegistry', 'Blockly.utils.aria'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_registry.js', ['Blockly.fieldRegistry'], ['Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_textinput.js', ['Blockly.FieldTextInput'], ['Blockly.Events.BlockChange', 'Blockly.Events.utils', 'Blockly.Field', 'Blockly.Msg', 'Blockly.WidgetDiv', 'Blockly.browserEvents', 'Blockly.dialog', 'Blockly.dropDownDiv', 'Blockly.fieldRegistry', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.parsing', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/field_variable.js', ['Blockly.FieldVariable'], ['Blockly.Events.BlockChange', 'Blockly.Field', 'Blockly.FieldDropdown', 'Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Variables', 'Blockly.Xml', 'Blockly.fieldRegistry', 'Blockly.internalConstants', 'Blockly.utils.Size', 'Blockly.utils.parsing'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/flyout_base.js', ['Blockly.Flyout'], ['Blockly.ComponentManager', 'Blockly.DeleteArea', 'Blockly.Events.BlockCreate', 'Blockly.Events.VarCreate', 'Blockly.Events.utils', 'Blockly.FlyoutMetricsManager', 'Blockly.Gesture', 'Blockly.IFlyout', 'Blockly.ScrollbarPair', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Variables', 'Blockly.WorkspaceSvg', 'Blockly.Xml', 'Blockly.blockRendering', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.serialization.blocks', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.idGenerator', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/flyout_button.js', ['Blockly.FlyoutButton'], ['Blockly.Css', 'Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.parsing', 'Blockly.utils.style'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/flyout_horizontal.js', ['Blockly.HorizontalFlyout'], ['Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.browserEvents', 'Blockly.dropDownDiv', 'Blockly.registry', 'Blockly.utils.Rect', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/flyout_metrics_manager.js', ['Blockly.FlyoutMetricsManager'], ['Blockly.MetricsManager'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/flyout_vertical.js', ['Blockly.VerticalFlyout'], ['Blockly.Block', 'Blockly.Flyout', 'Blockly.Scrollbar', 'Blockly.WidgetDiv', 'Blockly.browserEvents', 'Blockly.constants', 'Blockly.dropDownDiv', 'Blockly.registry', 'Blockly.utils.Rect', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/generator.js', ['Blockly.Generator'], ['Blockly.Names', 'Blockly.common', 'Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/gesture.js', ['Blockly.Gesture'], ['Blockly.BlockDragger', 'Blockly.BubbleDragger', 'Blockly.Events.Click', 'Blockly.Events.utils', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.WorkspaceDragger', 'Blockly.blockAnimations', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.config', 'Blockly.internalConstants', 'Blockly.registry', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/grid.js', ['Blockly.Grid'], ['Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/icon.js', ['Blockly.Icon'], ['Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/inject.js', ['Blockly.inject'], ['Blockly.BlockDragSurfaceSvg', 'Blockly.Css', 'Blockly.Grid', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ScrollbarPair', 'Blockly.ShortcutRegistry', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.WidgetDiv', 'Blockly.Workspace', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.WorkspaceSvg', 'Blockly.browserEvents', 'Blockly.bumpObjects', 'Blockly.common', 'Blockly.dropDownDiv', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/input.js', ['Blockly.Input'], ['Blockly.FieldLabel', 'Blockly.fieldRegistry', 'Blockly.inputTypes'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/input_types.js', ['Blockly.inputTypes'], ['Blockly.ConnectionType'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/insertion_marker_manager.js', ['Blockly.InsertionMarkerManager'], ['Blockly.ComponentManager', 'Blockly.ConnectionType', 'Blockly.Events.utils', 'Blockly.blockAnimations', 'Blockly.common', 'Blockly.config', 'Blockly.constants'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_ast_node_location.js', ['Blockly.IASTNodeLocation'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_ast_node_location_svg.js', ['Blockly.IASTNodeLocationSvg'], ['Blockly.IASTNodeLocation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_ast_node_location_with_block.js', ['Blockly.IASTNodeLocationWithBlock'], ['Blockly.IASTNodeLocation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_autohideable.js', ['Blockly.IAutoHideable'], ['Blockly.IComponent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_block_dragger.js', ['Blockly.IBlockDragger'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_bounded_element.js', ['Blockly.IBoundedElement'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_bubble.js', ['Blockly.IBubble'], ['Blockly.IContextMenu', 'Blockly.IDraggable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_collapsible_toolbox_item.js', ['Blockly.ICollapsibleToolboxItem'], ['Blockly.ISelectableToolboxItem'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_component.js', ['Blockly.IComponent'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_connection_checker.js', ['Blockly.IConnectionChecker'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_contextmenu.js', ['Blockly.IContextMenu'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_copyable.js', ['Blockly.ICopyable'], ['Blockly.ISelectable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_deletable.js', ['Blockly.IDeletable'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_delete_area.js', ['Blockly.IDeleteArea'], ['Blockly.IDragTarget'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_drag_target.js', ['Blockly.IDragTarget'], ['Blockly.IComponent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_draggable.js', ['Blockly.IDraggable'], ['Blockly.IDeletable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_flyout.js', ['Blockly.IFlyout'], ['Blockly.IRegistrable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_keyboard_accessible.js', ['Blockly.IKeyboardAccessible'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_metrics_manager.js', ['Blockly.IMetricsManager'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_movable.js', ['Blockly.IMovable'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_positionable.js', ['Blockly.IPositionable'], ['Blockly.IComponent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_registrable.js', ['Blockly.IRegistrable'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_registrable_field.js', ['Blockly.IRegistrableField'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_selectable.js', ['Blockly.ISelectable'], ['Blockly.IDeletable', 'Blockly.IMovable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_selectable_toolbox_item.js', ['Blockly.ISelectableToolboxItem'], ['Blockly.IToolboxItem'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_serializer.js', ['Blockly.serialization.ISerializer'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_styleable.js', ['Blockly.IStyleable'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_toolbox.js', ['Blockly.IToolbox'], ['Blockly.IRegistrable'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/interfaces/i_toolbox_item.js', ['Blockly.IToolboxItem'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/internal_constants.js', ['Blockly.internalConstants'], ['Blockly.ConnectionType'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/keyboard_nav/ast_node.js', ['Blockly.ASTNode'], ['Blockly.ConnectionType', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/keyboard_nav/basic_cursor.js', ['Blockly.BasicCursor'], ['Blockly.ASTNode', 'Blockly.Cursor', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/keyboard_nav/cursor.js', ['Blockly.Cursor'], ['Blockly.ASTNode', 'Blockly.Marker', 'Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/keyboard_nav/marker.js', ['Blockly.Marker'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/keyboard_nav/tab_navigate_cursor.js', ['Blockly.TabNavigateCursor'], ['Blockly.ASTNode', 'Blockly.BasicCursor'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/marker_manager.js', ['Blockly.MarkerManager'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/menu.js', ['Blockly.Menu'], ['Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.style'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/menuitem.js', ['Blockly.MenuItem'], ['Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.idGenerator'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/metrics_manager.js', ['Blockly.MetricsManager'], ['Blockly.IMetricsManager', 'Blockly.registry', 'Blockly.utils.Size', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/msg.js', ['Blockly.Msg'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/mutator.js', ['Blockly.Mutator'], ['Blockly.Bubble', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Events.utils', 'Blockly.Icon', 'Blockly.Options', 'Blockly.WorkspaceSvg', 'Blockly.config', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.toolbox', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/names.js', ['Blockly.Names'], ['Blockly.Msg', 'Blockly.Variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/options.js', ['Blockly.Options'], ['Blockly.Theme', 'Blockly.Themes.Classic', 'Blockly.registry', 'Blockly.utils.idGenerator', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/positionable_helpers.js', ['Blockly.uiPosition'], ['Blockly.Scrollbar', 'Blockly.utils.Rect', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/procedures.js', ['Blockly.Procedures'], ['Blockly.Events.BlockChange', 'Blockly.Events.utils', 'Blockly.Msg', 'Blockly.Names', 'Blockly.Variables', 'Blockly.Workspace', 'Blockly.Xml', 'Blockly.blocks', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/registry.js', ['Blockly.registry'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/rendered_connection.js', ['Blockly.RenderedConnection'], ['Blockly.Connection', 'Blockly.ConnectionType', 'Blockly.Events.utils', 'Blockly.common', 'Blockly.config', 'Blockly.internalConstants', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/block_rendering.js', ['Blockly.blockRendering'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.Connection', 'Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.Debug', 'Blockly.blockRendering.Drawer', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.Field', 'Blockly.blockRendering.Hat', 'Blockly.blockRendering.IPathObject', 'Blockly.blockRendering.Icon', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.JaggedEdge', 'Blockly.blockRendering.MarkerSvg', 'Blockly.blockRendering.Measurable', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PathObject', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Renderer', 'Blockly.blockRendering.RoundCorner', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.SquareCorner', 'Blockly.blockRendering.StatementInput', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.blockRendering.debug', 'Blockly.registry', 'Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/constants.js', ['Blockly.blockRendering.ConstantProvider'], ['Blockly.ConnectionType', 'Blockly.utils.Svg', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.parsing', 'Blockly.utils.svgPaths', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/debug.js', ['Blockly.blockRendering.debug'], ['Blockly.utils.deprecation'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/debugger.js', ['Blockly.blockRendering.Debug'], ['Blockly.ConnectionType', 'Blockly.FieldLabel', 'Blockly.blockRendering.Field', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Types', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/drawer.js', ['Blockly.blockRendering.Drawer'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Types', 'Blockly.blockRendering.debug', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/i_path_object.js', ['Blockly.blockRendering.IPathObject'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/info.js', ['Blockly.blockRendering.RenderInfo'], ['Blockly.Input', 'Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.Field', 'Blockly.blockRendering.Hat', 'Blockly.blockRendering.Icon', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.InlineInput', 'Blockly.blockRendering.InputRow', 'Blockly.blockRendering.JaggedEdge', 'Blockly.blockRendering.NextConnection', 'Blockly.blockRendering.OutputConnection', 'Blockly.blockRendering.PreviousConnection', 'Blockly.blockRendering.RoundCorner', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.SquareCorner', 'Blockly.blockRendering.StatementInput', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.inputTypes'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/marker_svg.js', ['Blockly.blockRendering.MarkerSvg'], ['Blockly.ASTNode', 'Blockly.ConnectionType', 'Blockly.Events.MarkerMove', 'Blockly.Events.utils', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/path_object.js', ['Blockly.blockRendering.PathObject'], ['Blockly.blockRendering.IPathObject', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/common/renderer.js', ['Blockly.blockRendering.Renderer'], ['Blockly.Connection', 'Blockly.ConnectionType', 'Blockly.IRegistrable', 'Blockly.InsertionMarkerManager', 'Blockly.blockRendering.ConstantProvider', 'Blockly.blockRendering.Drawer', 'Blockly.blockRendering.MarkerSvg', 'Blockly.blockRendering.PathObject', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.debug', 'Blockly.utils.object'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/constants.js', ['Blockly.geras.ConstantProvider'], ['Blockly.blockRendering.ConstantProvider'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/drawer.js', ['Blockly.geras.Drawer'], ['Blockly.blockRendering.Drawer', 'Blockly.blockRendering.debug', 'Blockly.geras.Highlighter', 'Blockly.geras.InlineInput', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/geras.js', ['Blockly.geras'], ['Blockly.geras.ConstantProvider', 'Blockly.geras.Drawer', 'Blockly.geras.HighlightConstantProvider', 'Blockly.geras.Highlighter', 'Blockly.geras.InlineInput', 'Blockly.geras.PathObject', 'Blockly.geras.RenderInfo', 'Blockly.geras.Renderer', 'Blockly.geras.StatementInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/highlight_constants.js', ['Blockly.geras.HighlightConstantProvider'], ['Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/highlighter.js', ['Blockly.geras.Highlighter'], ['Blockly.blockRendering.BottomRow', 'Blockly.blockRendering.SpacerRow', 'Blockly.blockRendering.TopRow', 'Blockly.blockRendering.Types', 'Blockly.geras.InlineInput', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/info.js', ['Blockly.geras.RenderInfo'], ['Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Types', 'Blockly.geras.InlineInput', 'Blockly.geras.StatementInput', 'Blockly.inputTypes'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/measurables/inline_input.js', ['Blockly.geras.InlineInput'], ['Blockly.blockRendering.InlineInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/measurables/statement_input.js', ['Blockly.geras.StatementInput'], ['Blockly.blockRendering.StatementInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/path_object.js', ['Blockly.geras.PathObject'], ['Blockly.blockRendering.PathObject', 'Blockly.utils.Svg', 'Blockly.utils.colour', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/geras/renderer.js', ['Blockly.geras.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.geras.ConstantProvider', 'Blockly.geras.Drawer', 'Blockly.geras.HighlightConstantProvider', 'Blockly.geras.PathObject', 'Blockly.geras.RenderInfo'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/base.js', ['Blockly.blockRendering.Measurable'], ['Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/bottom_row.js', ['Blockly.blockRendering.BottomRow'], ['Blockly.blockRendering.Row', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/connection.js', ['Blockly.blockRendering.Connection'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/external_value_input.js', ['Blockly.blockRendering.ExternalValueInput'], ['Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/field.js', ['Blockly.blockRendering.Field'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/hat.js', ['Blockly.blockRendering.Hat'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/icon.js', ['Blockly.blockRendering.Icon'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/in_row_spacer.js', ['Blockly.blockRendering.InRowSpacer'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/inline_input.js', ['Blockly.blockRendering.InlineInput'], ['Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/input_connection.js', ['Blockly.blockRendering.InputConnection'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/input_row.js', ['Blockly.blockRendering.InputRow'], ['Blockly.blockRendering.ExternalValueInput', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.StatementInput', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/jagged_edge.js', ['Blockly.blockRendering.JaggedEdge'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/next_connection.js', ['Blockly.blockRendering.NextConnection'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/output_connection.js', ['Blockly.blockRendering.OutputConnection'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/previous_connection.js', ['Blockly.blockRendering.PreviousConnection'], ['Blockly.blockRendering.Connection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/round_corner.js', ['Blockly.blockRendering.RoundCorner'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/row.js', ['Blockly.blockRendering.Row'], ['Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/spacer_row.js', ['Blockly.blockRendering.SpacerRow'], ['Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/square_corner.js', ['Blockly.blockRendering.SquareCorner'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/statement_input.js', ['Blockly.blockRendering.StatementInput'], ['Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/top_row.js', ['Blockly.blockRendering.TopRow'], ['Blockly.blockRendering.Hat', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/measurables/types.js', ['Blockly.blockRendering.Types'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/minimalist/constants.js', ['Blockly.minimalist.ConstantProvider'], ['Blockly.blockRendering.ConstantProvider'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/minimalist/drawer.js', ['Blockly.minimalist.Drawer'], ['Blockly.blockRendering.Drawer'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/minimalist/info.js', ['Blockly.minimalist.RenderInfo'], ['Blockly.blockRendering.RenderInfo'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/minimalist/minimalist.js', ['Blockly.minimalist'], ['Blockly.minimalist.ConstantProvider', 'Blockly.minimalist.Drawer', 'Blockly.minimalist.RenderInfo', 'Blockly.minimalist.Renderer'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/minimalist/renderer.js', ['Blockly.minimalist.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.minimalist.ConstantProvider', 'Blockly.minimalist.Drawer', 'Blockly.minimalist.RenderInfo'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/thrasos/info.js', ['Blockly.thrasos.RenderInfo'], ['Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/thrasos/renderer.js', ['Blockly.thrasos.Renderer'], ['Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.thrasos.RenderInfo'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/thrasos/thrasos.js', ['Blockly.thrasos'], ['Blockly.thrasos.RenderInfo', 'Blockly.thrasos.Renderer'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/constants.js', ['Blockly.zelos.ConstantProvider'], ['Blockly.ConnectionType', 'Blockly.blockRendering.ConstantProvider', 'Blockly.utils.Svg', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/drawer.js', ['Blockly.zelos.Drawer'], ['Blockly.blockRendering.Drawer', 'Blockly.blockRendering.Types', 'Blockly.blockRendering.debug', 'Blockly.utils.svgPaths'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/info.js', ['Blockly.zelos.RenderInfo'], ['Blockly.FieldImage', 'Blockly.FieldLabel', 'Blockly.FieldTextInput', 'Blockly.Input', 'Blockly.blockRendering.Field', 'Blockly.blockRendering.InRowSpacer', 'Blockly.blockRendering.InputConnection', 'Blockly.blockRendering.RenderInfo', 'Blockly.blockRendering.Row', 'Blockly.blockRendering.Types', 'Blockly.inputTypes', 'Blockly.zelos.BottomRow', 'Blockly.zelos.RightConnectionShape', 'Blockly.zelos.StatementInput', 'Blockly.zelos.TopRow'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/marker_svg.js', ['Blockly.zelos.MarkerSvg'], ['Blockly.blockRendering.MarkerSvg', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/measurables/bottom_row.js', ['Blockly.zelos.BottomRow'], ['Blockly.blockRendering.BottomRow'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/measurables/inputs.js', ['Blockly.zelos.StatementInput'], ['Blockly.blockRendering.StatementInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/measurables/row_elements.js', ['Blockly.zelos.RightConnectionShape'], ['Blockly.blockRendering.Measurable', 'Blockly.blockRendering.Types'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/measurables/top_row.js', ['Blockly.zelos.TopRow'], ['Blockly.blockRendering.TopRow'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/path_object.js', ['Blockly.zelos.PathObject'], ['Blockly.blockRendering.PathObject', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/renderer.js', ['Blockly.zelos.Renderer'], ['Blockly.ConnectionType', 'Blockly.InsertionMarkerManager', 'Blockly.blockRendering', 'Blockly.blockRendering.Renderer', 'Blockly.zelos.ConstantProvider', 'Blockly.zelos.Drawer', 'Blockly.zelos.MarkerSvg', 'Blockly.zelos.PathObject', 'Blockly.zelos.RenderInfo'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/renderers/zelos/zelos.js', ['Blockly.zelos'], ['Blockly.zelos.BottomRow', 'Blockly.zelos.ConstantProvider', 'Blockly.zelos.Drawer', 'Blockly.zelos.MarkerSvg', 'Blockly.zelos.PathObject', 'Blockly.zelos.RenderInfo', 'Blockly.zelos.Renderer', 'Blockly.zelos.RightConnectionShape', 'Blockly.zelos.StatementInput', 'Blockly.zelos.TopRow'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/scrollbar.js', ['Blockly.Scrollbar'], ['Blockly.Touch', 'Blockly.browserEvents', 'Blockly.utils.Coordinate', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/scrollbar_pair.js', ['Blockly.ScrollbarPair'], ['Blockly.Events.utils', 'Blockly.Scrollbar', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/serialization/blocks.js', ['Blockly.serialization.blocks'], ['Blockly.Events.utils', 'Blockly.Xml', 'Blockly.inputTypes', 'Blockly.serialization.ISerializer', 'Blockly.serialization.exceptions', 'Blockly.serialization.priorities', 'Blockly.serialization.registry', 'Blockly.utils.Size'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/serialization/exceptions.js', ['Blockly.serialization.exceptions'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/serialization/priorities.js', ['Blockly.serialization.priorities'], [], {'module': 'goog'}); -goog.addDependency('../../core/serialization/registry.js', ['Blockly.serialization.registry'], ['Blockly.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/serialization/variables.js', ['Blockly.serialization.variables'], ['Blockly.serialization.ISerializer', 'Blockly.serialization.priorities', 'Blockly.serialization.registry'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/serialization/workspaces.js', ['Blockly.serialization.workspaces'], ['Blockly.Events.utils', 'Blockly.Workspace', 'Blockly.WorkspaceSvg', 'Blockly.registry', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/shortcut_items.js', ['Blockly.ShortcutItems'], ['Blockly.Gesture', 'Blockly.ShortcutRegistry', 'Blockly.clipboard', 'Blockly.common', 'Blockly.utils.KeyCodes'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/shortcut_registry.js', ['Blockly.ShortcutRegistry'], ['Blockly.utils.KeyCodes', 'Blockly.utils.object'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/sprites.js', ['Blockly.sprite'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/theme.js', ['Blockly.Theme'], ['Blockly.registry', 'Blockly.utils.object'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/theme/classic.js', ['Blockly.Themes.Classic'], ['Blockly.Theme'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/theme/themes.js', ['Blockly.Themes'], ['Blockly.Themes.Classic', 'Blockly.Themes.Zelos'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/theme/zelos.js', ['Blockly.Themes.Zelos'], ['Blockly.Theme'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/theme_manager.js', ['Blockly.ThemeManager'], ['Blockly.utils.array', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/toolbox/category.js', ['Blockly.ToolboxCategory'], ['Blockly.Css', 'Blockly.ISelectableToolboxItem', 'Blockly.ToolboxItem', 'Blockly.registry', 'Blockly.utils.aria', 'Blockly.utils.colour', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.parsing', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/toolbox/collapsible_category.js', ['Blockly.CollapsibleToolboxCategory'], ['Blockly.ICollapsibleToolboxItem', 'Blockly.ToolboxCategory', 'Blockly.ToolboxSeparator', 'Blockly.registry', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/toolbox/separator.js', ['Blockly.ToolboxSeparator'], ['Blockly.Css', 'Blockly.ToolboxItem', 'Blockly.registry', 'Blockly.utils.dom', 'Blockly.utils.object'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/toolbox/toolbox.js', ['Blockly.Toolbox'], ['Blockly.BlockSvg', 'Blockly.CollapsibleToolboxCategory', 'Blockly.ComponentManager', 'Blockly.Css', 'Blockly.DeleteArea', 'Blockly.Events.ToolboxItemSelect', 'Blockly.Events.utils', 'Blockly.IAutoHideable', 'Blockly.IKeyboardAccessible', 'Blockly.IStyleable', 'Blockly.IToolbox', 'Blockly.Options', 'Blockly.Touch', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.registry', 'Blockly.utils.KeyCodes', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/toolbox/toolbox_item.js', ['Blockly.ToolboxItem'], ['Blockly.IToolboxItem', 'Blockly.utils.idGenerator'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/tooltip.js', ['Blockly.Tooltip'], ['Blockly.browserEvents', 'Blockly.common', 'Blockly.utils.deprecation', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/touch.js', ['Blockly.Touch'], ['Blockly.utils.global', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/touch_gesture.js', ['Blockly.TouchGesture'], ['Blockly.Gesture', 'Blockly.Touch', 'Blockly.browserEvents', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/trashcan.js', ['Blockly.Trashcan'], ['Blockly.ComponentManager', 'Blockly.DeleteArea', 'Blockly.Events.TrashcanOpen', 'Blockly.Events.utils', 'Blockly.IAutoHideable', 'Blockly.IPositionable', 'Blockly.Options', 'Blockly.browserEvents', 'Blockly.registry', 'Blockly.sprite', 'Blockly.uiPosition', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.toolbox'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils.js', ['Blockly.utils'], ['Blockly.Extensions', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.utils.Coordinate', 'Blockly.utils.KeyCodes', 'Blockly.utils.Metrics', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.array', 'Blockly.utils.colour', 'Blockly.utils.deprecation', 'Blockly.utils.dom', 'Blockly.utils.global', 'Blockly.utils.idGenerator', 'Blockly.utils.math', 'Blockly.utils.object', 'Blockly.utils.parsing', 'Blockly.utils.string', 'Blockly.utils.style', 'Blockly.utils.svgMath', 'Blockly.utils.svgPaths', 'Blockly.utils.toolbox', 'Blockly.utils.userAgent', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/aria.js', ['Blockly.utils.aria'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/array.js', ['Blockly.utils.array'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/colour.js', ['Blockly.utils.colour'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/coordinate.js', ['Blockly.utils.Coordinate'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/deprecation.js', ['Blockly.utils.deprecation'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/dom.js', ['Blockly.utils.dom'], ['Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/global.js', ['Blockly.utils.global'], [], {'module': 'goog'}); -goog.addDependency('../../core/utils/idgenerator.js', ['Blockly.utils.idGenerator'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/keycodes.js', ['Blockly.utils.KeyCodes'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/math.js', ['Blockly.utils.math'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/metrics.js', ['Blockly.utils.Metrics'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/object.js', ['Blockly.utils.object'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/parsing.js', ['Blockly.utils.parsing'], ['Blockly.Msg', 'Blockly.utils.colour', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/rect.js', ['Blockly.utils.Rect'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/sentinel.js', ['Blockly.utils.Sentinel'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/size.js', ['Blockly.utils.Size'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/string.js', ['Blockly.utils.string'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/style.js', ['Blockly.utils.style'], ['Blockly.utils.Coordinate', 'Blockly.utils.Size'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/svg.js', ['Blockly.utils.Svg'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/svg_math.js', ['Blockly.utils.svgMath'], ['Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.deprecation', 'Blockly.utils.global', 'Blockly.utils.style', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/svg_paths.js', ['Blockly.utils.svgPaths'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/toolbox.js', ['Blockly.utils.toolbox'], ['Blockly.Xml', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/useragent.js', ['Blockly.utils.userAgent'], ['Blockly.utils.global'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/utils/xml.js', ['Blockly.utils.xml'], ['Blockly.utils.global'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/variable_map.js', ['Blockly.VariableMap'], ['Blockly.Events.VarDelete', 'Blockly.Events.VarRename', 'Blockly.Events.utils', 'Blockly.Msg', 'Blockly.Names', 'Blockly.VariableModel', 'Blockly.dialog', 'Blockly.utils.array', 'Blockly.utils.idGenerator', 'Blockly.utils.object'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/variable_model.js', ['Blockly.VariableModel'], ['Blockly.Events.VarCreate', 'Blockly.Events.utils', 'Blockly.utils.idGenerator'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/variables.js', ['Blockly.Variables'], ['Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Xml', 'Blockly.blocks', 'Blockly.dialog', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/variables_dynamic.js', ['Blockly.VariablesDynamic'], ['Blockly.Msg', 'Blockly.VariableModel', 'Blockly.Variables', 'Blockly.blocks', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/warning.js', ['Blockly.Warning'], ['Blockly.Bubble', 'Blockly.Events.BubbleOpen', 'Blockly.Events.utils', 'Blockly.Icon', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/widgetdiv.js', ['Blockly.WidgetDiv'], ['Blockly.common', 'Blockly.utils.deprecation', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace.js', ['Blockly.Workspace'], ['Blockly.ConnectionChecker', 'Blockly.Events.utils', 'Blockly.IASTNodeLocation', 'Blockly.Options', 'Blockly.VariableMap', 'Blockly.registry', 'Blockly.utils.array', 'Blockly.utils.idGenerator', 'Blockly.utils.math'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_audio.js', ['Blockly.WorkspaceAudio'], ['Blockly.utils.global', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_comment.js', ['Blockly.WorkspaceComment'], ['Blockly.Events.CommentChange', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove', 'Blockly.Events.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.idGenerator', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_comment_svg.js', ['Blockly.WorkspaceCommentSvg'], ['Blockly.ContextMenu', 'Blockly.Css', 'Blockly.Events.CommentCreate', 'Blockly.Events.CommentDelete', 'Blockly.Events.CommentMove', 'Blockly.Events.Selected', 'Blockly.Events.utils', 'Blockly.IBoundedElement', 'Blockly.IBubble', 'Blockly.ICopyable', 'Blockly.Touch', 'Blockly.WorkspaceComment', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_drag_surface_svg.js', ['Blockly.WorkspaceDragSurfaceSvg'], ['Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.svgMath'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_dragger.js', ['Blockly.WorkspaceDragger'], ['Blockly.common', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/workspace_svg.js', ['Blockly.WorkspaceSvg'], ['Blockly.BlockSvg', 'Blockly.ComponentManager', 'Blockly.ConnectionDB', 'Blockly.ContextMenu', 'Blockly.ContextMenuRegistry', 'Blockly.Events.BlockCreate', 'Blockly.Events.ThemeChange', 'Blockly.Events.ViewportChange', 'Blockly.Events.utils', 'Blockly.Gesture', 'Blockly.Grid', 'Blockly.IASTNodeLocationSvg', 'Blockly.MarkerManager', 'Blockly.MetricsManager', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ThemeManager', 'Blockly.Themes.Classic', 'Blockly.Tooltip', 'Blockly.TouchGesture', 'Blockly.WidgetDiv', 'Blockly.Workspace', 'Blockly.WorkspaceAudio', 'Blockly.Xml', 'Blockly.blockRendering', 'Blockly.browserEvents', 'Blockly.common', 'Blockly.config', 'Blockly.dropDownDiv', 'Blockly.registry', 'Blockly.serialization.blocks', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.array', 'Blockly.utils.dom', 'Blockly.utils.svgMath', 'Blockly.utils.toolbox', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/xml.js', ['Blockly.Xml'], ['Blockly.Events.utils', 'Blockly.inputTypes', 'Blockly.utils.Size', 'Blockly.utils.dom', 'Blockly.utils.xml'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/zoom_controls.js', ['Blockly.ZoomControls'], ['Blockly.ComponentManager', 'Blockly.Css', 'Blockly.Events.Click', 'Blockly.Events.utils', 'Blockly.IPositionable', 'Blockly.Touch', 'Blockly.browserEvents', 'Blockly.sprite', 'Blockly.uiPosition', 'Blockly.utils.Rect', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart.js', ['Blockly.Dart'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.Variables', 'Blockly.inputTypes', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/all.js', ['Blockly.Dart.all'], ['Blockly.Dart.colour', 'Blockly.Dart.lists', 'Blockly.Dart.logic', 'Blockly.Dart.loops', 'Blockly.Dart.math', 'Blockly.Dart.procedures', 'Blockly.Dart.texts', 'Blockly.Dart.variables', 'Blockly.Dart.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/dart/colour.js', ['Blockly.Dart.colour'], ['Blockly.Dart'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/lists.js', ['Blockly.Dart.lists'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/logic.js', ['Blockly.Dart.logic'], ['Blockly.Dart'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/loops.js', ['Blockly.Dart.loops'], ['Blockly.Dart', 'Blockly.Names', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/math.js', ['Blockly.Dart.math'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/procedures.js', ['Blockly.Dart.procedures'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/text.js', ['Blockly.Dart.texts'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/variables.js', ['Blockly.Dart.variables'], ['Blockly.Dart', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/dart/variables_dynamic.js', ['Blockly.Dart.variablesDynamic'], ['Blockly.Dart', 'Blockly.Dart.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript.js', ['Blockly.JavaScript'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.Variables', 'Blockly.inputTypes', 'Blockly.utils.global', 'Blockly.utils.object', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/all.js', ['Blockly.JavaScript.all'], ['Blockly.JavaScript.colour', 'Blockly.JavaScript.lists', 'Blockly.JavaScript.logic', 'Blockly.JavaScript.loops', 'Blockly.JavaScript.math', 'Blockly.JavaScript.procedures', 'Blockly.JavaScript.texts', 'Blockly.JavaScript.variables', 'Blockly.JavaScript.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/javascript/colour.js', ['Blockly.JavaScript.colour'], ['Blockly.JavaScript'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/lists.js', ['Blockly.JavaScript.lists'], ['Blockly.JavaScript', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/logic.js', ['Blockly.JavaScript.logic'], ['Blockly.JavaScript'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/loops.js', ['Blockly.JavaScript.loops'], ['Blockly.JavaScript', 'Blockly.Names', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/math.js', ['Blockly.JavaScript.math'], ['Blockly.JavaScript', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/procedures.js', ['Blockly.JavaScript.procedures'], ['Blockly.JavaScript', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/text.js', ['Blockly.JavaScript.texts'], ['Blockly.JavaScript', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/variables.js', ['Blockly.JavaScript.variables'], ['Blockly.JavaScript', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/javascript/variables_dynamic.js', ['Blockly.JavaScript.variablesDynamic'], ['Blockly.JavaScript', 'Blockly.JavaScript.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua.js', ['Blockly.Lua'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.inputTypes', 'Blockly.utils.object', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/all.js', ['Blockly.Lua.all'], ['Blockly.Lua.colour', 'Blockly.Lua.lists', 'Blockly.Lua.logic', 'Blockly.Lua.loops', 'Blockly.Lua.math', 'Blockly.Lua.procedures', 'Blockly.Lua.texts', 'Blockly.Lua.variables', 'Blockly.Lua.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/lua/colour.js', ['Blockly.Lua.colour'], ['Blockly.Lua'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/lists.js', ['Blockly.Lua.lists'], ['Blockly.Lua', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/logic.js', ['Blockly.Lua.logic'], ['Blockly.Lua'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/loops.js', ['Blockly.Lua.loops'], ['Blockly.Lua', 'Blockly.Names', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/math.js', ['Blockly.Lua.math'], ['Blockly.Lua', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/procedures.js', ['Blockly.Lua.procedures'], ['Blockly.Lua', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/text.js', ['Blockly.Lua.texts'], ['Blockly.Lua', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/variables.js', ['Blockly.Lua.variables'], ['Blockly.Lua', 'Blockly.Names'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/lua/variables_dynamic.js', ['Blockly.Lua.variablesDynamic'], ['Blockly.Lua', 'Blockly.Lua.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php.js', ['Blockly.PHP'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.inputTypes', 'Blockly.utils.object', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/all.js', ['Blockly.PHP.all'], ['Blockly.PHP.colour', 'Blockly.PHP.lists', 'Blockly.PHP.logic', 'Blockly.PHP.loops', 'Blockly.PHP.math', 'Blockly.PHP.procedures', 'Blockly.PHP.texts', 'Blockly.PHP.variables', 'Blockly.PHP.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/php/colour.js', ['Blockly.PHP.colour'], ['Blockly.PHP'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/lists.js', ['Blockly.PHP.lists'], ['Blockly.Names', 'Blockly.PHP', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/logic.js', ['Blockly.PHP.logic'], ['Blockly.PHP'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/loops.js', ['Blockly.PHP.loops'], ['Blockly.Names', 'Blockly.PHP', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/math.js', ['Blockly.PHP.math'], ['Blockly.Names', 'Blockly.PHP'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/procedures.js', ['Blockly.PHP.procedures'], ['Blockly.Names', 'Blockly.PHP', 'Blockly.Variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/text.js', ['Blockly.PHP.texts'], ['Blockly.Names', 'Blockly.PHP'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/variables.js', ['Blockly.PHP.variables'], ['Blockly.Names', 'Blockly.PHP'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/php/variables_dynamic.js', ['Blockly.PHP.variablesDynamic'], ['Blockly.PHP', 'Blockly.PHP.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python.js', ['Blockly.Python'], ['Blockly.Generator', 'Blockly.Names', 'Blockly.Variables', 'Blockly.inputTypes', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/all.js', ['Blockly.Python.all'], ['Blockly.Python.colour', 'Blockly.Python.lists', 'Blockly.Python.logic', 'Blockly.Python.loops', 'Blockly.Python.math', 'Blockly.Python.procedures', 'Blockly.Python.texts', 'Blockly.Python.variables', 'Blockly.Python.variablesDynamic'], {'module': 'goog'}); -goog.addDependency('../../generators/python/colour.js', ['Blockly.Python.colour'], ['Blockly.Python'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/lists.js', ['Blockly.Python.lists'], ['Blockly.Names', 'Blockly.Python', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/logic.js', ['Blockly.Python.logic'], ['Blockly.Python'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/loops.js', ['Blockly.Python.loops'], ['Blockly.Names', 'Blockly.Python', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/math.js', ['Blockly.Python.math'], ['Blockly.Names', 'Blockly.Python'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/procedures.js', ['Blockly.Python.procedures'], ['Blockly.Names', 'Blockly.Python', 'Blockly.Variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/text.js', ['Blockly.Python.texts'], ['Blockly.Names', 'Blockly.Python', 'Blockly.utils.string'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/variables.js', ['Blockly.Python.variables'], ['Blockly.Names', 'Blockly.Python'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../generators/python/variables_dynamic.js', ['Blockly.Python.variablesDynamic'], ['Blockly.Python', 'Blockly.Python.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('base.js', [], []); -goog.addDependency('base_minimal.js', [], []); -goog.addDependency('goog.js', [], [], {'lang': 'es6', 'module': 'es6'}); - diff --git a/tests/deps.mocha.js b/tests/deps.mocha.js deleted file mode 100644 index ba58a1b3151..00000000000 --- a/tests/deps.mocha.js +++ /dev/null @@ -1,74 +0,0 @@ -goog.addDependency('../../tests/mocha/.mocharc.js', [], []); -goog.addDependency('../../tests/mocha/astnode_test.js', ['Blockly.test.astNode'], ['Blockly.ASTNode', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/block_change_event_test.js', ['Blockly.test.blockChangeEvent'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/block_create_event_test.js', ['Blockly.test.blockCreateEvent'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/block_json_test.js', ['Blockly.test.blockJson'], ['Blockly.Input'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/block_test.js', ['Blockly.test.blocks'], ['Blockly.ConnectionType', 'Blockly.Events.utils', 'Blockly.blocks', 'Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/comment_deserialization_test.js', ['Blockly.test.commentDeserialization'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/comment_test.js', ['Blockly.test.comments'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/connection_checker_test.js', ['Blockly.test.connectionChecker'], ['Blockly.ConnectionType', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/connection_db_test.js', ['Blockly.test.connectionDb'], ['Blockly.ConnectionType', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/connection_test.js', ['Blockly.test.connection'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/contextmenu_items_test.js', ['Blockly.test.contextMenuItem'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/cursor_test.js', ['Blockly.test.cursor'], ['Blockly.ASTNode', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/dropdowndiv_test.js', ['Blockly.test.dropdown'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/event_test.js', ['Blockly.test.event'], ['Blockly.ASTNode', 'Blockly.Events.utils', 'Blockly.WorkspaceComment', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/extensions_test.js', ['Blockly.test.extensions'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_angle_test.js', ['Blockly.test.fieldAngle'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_checkbox_test.js', ['Blockly.test.fieldCheckbox'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_colour_test.js', ['Blockly.test.fieldColour'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_dropdown_test.js', ['Blockly.test.fieldDropdown'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_image_test.js', ['Blockly.test.fieldImage'], ['Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_label_serializable_test.js', ['Blockly.test.fieldLabelSerialization'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_label_test.js', ['Blockly.test.fieldLabel'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_multilineinput_test.js', ['Blockly.test.fieldMultiline'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.codeGeneration', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_number_test.js', ['Blockly.test.fieldNumber'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.common', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_registry_test.js', ['Blockly.test.fieldRegistry'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_test.js', ['Blockly.test.fieldTest'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_textinput_test.js', ['Blockly.test.fieldTextInput'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/field_variable_test.js', ['Blockly.test.fieldVariable'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.fields', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/flyout_test.js', ['Blockly.test.flyout'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.toolboxDefinitions'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/generator_test.js', ['Blockly.test.generator'], ['Blockly.Dart', 'Blockly.JavaScript', 'Blockly.Lua', 'Blockly.PHP', 'Blockly.Python', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/gesture_test.js', ['Blockly.test.gesture'], ['Blockly.Events.utils', 'Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/input_test.js', ['Blockly.test.input'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/insertion_marker_test.js', ['Blockly.test.insertionMarker'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/jso_deserialization_test.js', ['Blockly.test.jsoDeserialization'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/jso_serialization_test.js', ['Blockly.test.jsoSerialization'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es8', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/json_test.js', ['Blockly.test.json'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/keydown_test.js', ['Blockly.test.keydown'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/logic_ternary_test.js', ['Blockly.test.logicTernary'], ['Blockly.Events.utils', 'Blockly.test.helpers.serialization', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/metrics_test.js', ['Blockly.test.metrics'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/mutator_test.js', ['Blockly.test.mutator'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/names_test.js', ['Blockly.test.names'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/procedures_test.js', ['Blockly.test.procedures'], ['Blockly', 'Blockly.Msg', 'Blockly.test.helpers.procedures', 'Blockly.test.helpers.serialization', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/registry_test.js', ['Blockly.test.registry'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/run_mocha_tests_in_browser.js', [], [], {'lang': 'es8'}); -goog.addDependency('../../tests/mocha/serializer_test.js', ['Blockly.test.serialization'], ['Blockly.test.helpers.common', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/shortcut_registry_test.js', ['Blockly.test.shortcutRegistry'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/block_definitions.js', ['Blockly.test.helpers.blockDefinitions'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/code_generation.js', ['Blockly.test.helpers.codeGeneration'], ['Blockly.test.helpers.common'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/common.js', ['Blockly.test.helpers.common'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/events.js', ['Blockly.test.helpers.events'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/fields.js', ['Blockly.test.helpers.fields'], ['Blockly.test.helpers.common'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/procedures.js', ['Blockly.test.helpers.procedures'], ['Blockly.ConnectionType'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/serialization.js', ['Blockly.test.helpers.serialization'], ['Blockly.test.helpers.common'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/setup_teardown.js', ['Blockly.test.helpers.setupTeardown'], ['Blockly.Events.utils', 'Blockly.blocks'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/toolbox_definitions.js', ['Blockly.test.helpers.toolboxDefinitions'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/user_input.js', ['Blockly.test.helpers.userInput'], ['Blockly.utils.KeyCodes'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/variables.js', ['Blockly.test.helpers.variables'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/warnings.js', ['Blockly.test.helpers.warnings'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/test_helpers/workspace.js', ['Blockly.test.helpers.workspace'], ['Blockly.Events.utils', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/theme_test.js', ['Blockly.test.theme'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/toolbox_test.js', ['Blockly.test.toolbox'], ['Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.toolboxDefinitions'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/tooltip_test.js', ['Blockly.test.tooltip'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/trashcan_test.js', ['Blockly.test.trashcan'], ['Blockly.Events.utils', 'Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/utils_test.js', ['Blockly.test.utils'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/variable_map_test.js', ['Blockly.test.variableMap'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/variable_model_test.js', ['Blockly.test.variableModel'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/variables_test.js', ['Blockly.test.variables'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/widget_div_test.js', ['Blockly.test.widgetDiv'], ['Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/workspace_comment_test.js', ['Blockly.test.workspaceComment'], ['Blockly.WorkspaceComment', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/workspace_svg_test.js', ['Blockly.test.workspaceSvg'], ['Blockly.Events.utils', 'Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables', 'Blockly.test.helpers.workspace'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/workspace_test.js', ['Blockly.test.workspace'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables', 'Blockly.test.helpers.workspace'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/xml_test.js', ['Blockly.test.xml'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.variables'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../tests/mocha/zoom_controls_test.js', ['Blockly.test.zoomControls'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); diff --git a/tests/generators/golden/generated.js b/tests/generators/golden/generated.js index 48a4e20ac9f..2778376c203 100644 --- a/tests/generators/golden/generated.js +++ b/tests/generators/golden/generated.js @@ -476,7 +476,7 @@ function test_change() { } function mathMean(myList) { - return myList.reduce(function(x, y) {return x + y;}) / myList.length; + return myList.reduce(function(x, y) {return x + y;}, 0) / myList.length; } function mathMedian(myList) { @@ -538,7 +538,7 @@ function mathRandomList(list) { // Tests the "list operation" blocks. function test_operations_on_list() { - assertEquals([3, 4, 5].reduce(function(x, y) {return x + y;}), 12, 'sum'); + assertEquals([3, 4, 5].reduce(function(x, y) {return x + y;}, 0), 12, 'sum'); assertEquals(Math.min.apply(null, [3, 4, 5]), 3, 'min'); assertEquals(Math.max.apply(null, [3, 4, 5]), 5, 'max'); assertEquals(mathMean([3, 4, 5]), 4, 'average'); diff --git a/tests/generators/golden/generated.py b/tests/generators/golden/generated.py index 28a673b7492..e4375dbbcec 100644 --- a/tests/generators/golden/generated.py +++ b/tests/generators/golden/generated.py @@ -223,22 +223,22 @@ def test_count_by(): loglist.append(x) assertEquals(loglist, [1, 2.5, 4, 5.5, 7], 'count with floats') loglist = [] - x_start = float(1 + 0) - x_end = float(8 + 0) - x_inc = float(1 - 2) + x_start = 1 + 0 + x_end = 8 + 0 + x_inc = 1 - 2 for x in (x_start <= x_end) and upRange(x_start, x_end, x_inc) or downRange(x_start, x_end, x_inc): loglist.append(x) assertEquals(loglist, [1, 2, 3, 4, 5, 6, 7, 8], 'count up non-trivial ints') loglist = [] - x_start2 = float(8 + 0) - x_end2 = float(1 + 0) + x_start2 = 8 + 0 + x_end2 = 1 + 0 for x in (x_start2 <= x_end2) and upRange(x_start2, x_end2, 2) or downRange(x_start2, x_end2, 2): loglist.append(x) assertEquals(loglist, [8, 6, 4, 2], 'count down non-trivial ints') loglist = [] - x_start3 = float(5 + 0.5) - x_end3 = float(1 + 0) - x_inc2 = float(1 + 0) + x_start3 = 5 + 0.5 + x_end3 = 1 + 0 + x_inc2 = 1 + 0 for x in (x_start3 <= x_end3) and upRange(x_start3, x_end3, x_inc2) or downRange(x_start3, x_end3, x_inc2): loglist.append(x) assertEquals(loglist, [5.5, 4.5, 3.5, 2.5, 1.5], 'count with floats') @@ -255,14 +255,14 @@ def test_count_loops(): log = str(log) + str(x) assertEquals(log, '87654321', 'count down') loglist = [] - x_start4 = float(1 + 0) - x_end4 = float(4 + 0) + x_start4 = 1 + 0 + x_end4 = 4 + 0 for x in (x_start4 <= x_end4) and upRange(x_start4, x_end4, 1) or downRange(x_start4, x_end4, 1): loglist.append(x) assertEquals(loglist, [1, 2, 3, 4], 'count up non-trivial') loglist = [] - x_start5 = float(3 + 1) - x_end5 = float(1 + 0) + x_start5 = 3 + 1 + x_end5 = 1 + 0 for x in (x_start5 <= x_end5) and upRange(x_start5, x_end5, 1) or downRange(x_start5, x_end5, 1): loglist.append(x) assertEquals(loglist, [4, 3, 2, 1], 'count down non-trivial') diff --git a/tests/generators/index.html b/tests/generators/index.html index 9e37f05b6c6..18455ca703e 100644 --- a/tests/generators/index.html +++ b/tests/generators/index.html @@ -3,41 +3,36 @@ Blockly Generator Tests - - - - - - - - - + + - +
    diff --git a/tests/generators/run_generators_in_browser.js b/tests/generators/run_generators_in_browser.js index 97dcf97276b..280a59fe57b 100644 --- a/tests/generators/run_generators_in_browser.js +++ b/tests/generators/run_generators_in_browser.js @@ -24,7 +24,7 @@ async function runLangGeneratorInBrowser(browser, filename, codegenFn) { await browser.execute(codegenFn); var elem = await browser.$("#importExport"); var result = await elem.getValue(); - fs.writeFile(filename, result, function(err) { + fs.writeFileSync(filename, result, function(err) { if (err) { return console.log(err); } diff --git a/tests/generators/unittest.js b/tests/generators/unittest.js index 18d3ce89539..9649dfaca97 100644 --- a/tests/generators/unittest.js +++ b/tests/generators/unittest.js @@ -20,7 +20,7 @@ Blockly.Blocks['unittest_main'] = { this.setTooltip('Executes the enclosed unit tests,\n' + 'then prints a summary.'); }, - getDeveloperVars: function() { + getDeveloperVariables: function() { return ['unittestResults']; } }; @@ -40,7 +40,7 @@ Blockly.Blocks['unittest_assertequals'] = { .appendField('expected'); this.setTooltip('Tests that "actual == expected".'); }, - getDeveloperVars: function() { + getDeveloperVariables: function() { return ['unittestResults']; } }; @@ -60,7 +60,7 @@ Blockly.Blocks['unittest_assertvalue'] = { [['true', 'TRUE'], ['false', 'FALSE'], ['null', 'NULL']]), 'EXPECTED'); this.setTooltip('Tests that the value is true, false, or null.'); }, - getDeveloperVars: function() { + getDeveloperVariables: function() { return ['unittestResults']; } }; @@ -76,7 +76,7 @@ Blockly.Blocks['unittest_fail'] = { .appendField('fail'); this.setTooltip('Records an error.'); }, - getDeveloperVars: function() { + getDeveloperVariables: function() { return ['unittestResults']; } }; diff --git a/tests/generators/unittest_dart.js b/tests/generators/unittest_dart.js index 65a348aba79..61f6caaa1fc 100644 --- a/tests/generators/unittest_dart.js +++ b/tests/generators/unittest_dart.js @@ -9,13 +9,13 @@ */ 'use strict'; -Blockly.Dart['unittest_main'] = function(block) { +dartGenerator['unittest_main'] = function(block) { // Container for unit tests. - var resultsVar = Blockly.Dart.nameDB_.getName('unittestResults', + var resultsVar = dartGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Dart.provideFunction_( + var functionName = dartGenerator.provideFunction_( 'unittest_report', - [ 'String ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + '() {', + [ 'String ' + dartGenerator.FUNCTION_NAME_PLACEHOLDER_ + '() {', ' // Create test report.', ' List report = [];', ' StringBuffer summary = new StringBuffer();', @@ -50,7 +50,7 @@ Blockly.Dart['unittest_main'] = function(block) { block.getFieldValue('SUITE_NAME') + '\');\n'; // Run tests (unindented). - code += Blockly.Dart.statementToCode(block, 'DO') + code += dartGenerator.statementToCode(block, 'DO') .replace(/^ /, '').replace(/\n /g, '\n'); // Print the report to the console (that's where errors will go anyway). code += 'print(' + functionName + '());\n'; @@ -59,12 +59,12 @@ Blockly.Dart['unittest_main'] = function(block) { return code; }; -Blockly.Dart['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Dart.nameDB_.getName('unittestResults', +dartGenerator['unittest_main'].defineAssert_ = function() { + var resultsVar = dartGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Dart.provideFunction_( + var functionName = dartGenerator.provideFunction_( 'unittest_assertequals', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + [ 'void ' + dartGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(dynamic actual, dynamic expected, String message) {', ' // Asserts that a value equals another value.', ' if (' + resultsVar + ' == null) {', @@ -96,24 +96,24 @@ Blockly.Dart['unittest_main'].defineAssert_ = function() { return functionName; }; -Blockly.Dart['unittest_assertequals'] = function(block) { +dartGenerator['unittest_assertequals'] = function(block) { // Asserts that a value equals another value. - var message = Blockly.Dart.valueToCode(block, 'MESSAGE', - Blockly.Dart.ORDER_NONE) || ''; - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; - var expected = Blockly.Dart.valueToCode(block, 'EXPECTED', - Blockly.Dart.ORDER_NONE) || 'null'; - return Blockly.Dart['unittest_main'].defineAssert_() + + var message = dartGenerator.valueToCode(block, 'MESSAGE', + dartGenerator.ORDER_NONE) || ''; + var actual = dartGenerator.valueToCode(block, 'ACTUAL', + dartGenerator.ORDER_NONE) || 'null'; + var expected = dartGenerator.valueToCode(block, 'EXPECTED', + dartGenerator.ORDER_NONE) || 'null'; + return dartGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.Dart['unittest_assertvalue'] = function(block) { +dartGenerator['unittest_assertvalue'] = function(block) { // Asserts that a value is true, false, or null. - var message = Blockly.Dart.valueToCode(block, 'MESSAGE', - Blockly.Dart.ORDER_NONE) || ''; - var actual = Blockly.Dart.valueToCode(block, 'ACTUAL', - Blockly.Dart.ORDER_NONE) || 'null'; + var message = dartGenerator.valueToCode(block, 'MESSAGE', + dartGenerator.ORDER_NONE) || ''; + var actual = dartGenerator.valueToCode(block, 'ACTUAL', + dartGenerator.ORDER_NONE) || 'null'; var expected = block.getFieldValue('EXPECTED'); if (expected === 'TRUE') { expected = 'true'; @@ -122,18 +122,18 @@ Blockly.Dart['unittest_assertvalue'] = function(block) { } else if (expected === 'NULL') { expected = 'null'; } - return Blockly.Dart['unittest_main'].defineAssert_() + + return dartGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.Dart['unittest_fail'] = function(block) { +dartGenerator['unittest_fail'] = function(block) { // Always assert an error. - var resultsVar = Blockly.Dart.nameDB_.getName('unittestResults', + var resultsVar = dartGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var message = Blockly.Dart.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Dart.provideFunction_( + var message = dartGenerator.quote_(block.getFieldValue('MESSAGE')); + var functionName = dartGenerator.provideFunction_( 'unittest_fail', - [ 'void ' + Blockly.Dart.FUNCTION_NAME_PLACEHOLDER_ + + [ 'void ' + dartGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(String message) {', ' // Always assert an error.', ' if (' + resultsVar + ' == null) {', @@ -144,20 +144,20 @@ Blockly.Dart['unittest_fail'] = function(block) { return functionName + '(' + message + ');\n'; }; -Blockly.Dart['unittest_adjustindex'] = function(block) { - var index = Blockly.Dart.valueToCode(block, 'INDEX', - Blockly.Dart.ORDER_ADDITIVE) || '0'; +dartGenerator['unittest_adjustindex'] = function(block) { + var index = dartGenerator.valueToCode(block, 'INDEX', + dartGenerator.ORDER_ADDITIVE) || '0'; // Adjust index if using one-based indexing. if (block.workspace.options.oneBasedIndex) { if (Blockly.isNumber(index)) { // If the index is a naked number, adjust it right now. - return [Number(index) + 1, Blockly.Dart.ORDER_ATOMIC]; + return [Number(index) + 1, dartGenerator.ORDER_ATOMIC]; } else { // If the index is dynamic, adjust it in code. index = index + ' + 1'; } } else if (Blockly.isNumber(index)) { - return [index, Blockly.Dart.ORDER_ATOMIC]; + return [index, dartGenerator.ORDER_ATOMIC]; } - return [index, Blockly.Dart.ORDER_ADDITIVE]; + return [index, dartGenerator.ORDER_ADDITIVE]; }; diff --git a/tests/generators/unittest_javascript.js b/tests/generators/unittest_javascript.js index df48642df4a..6e083f7a5e9 100644 --- a/tests/generators/unittest_javascript.js +++ b/tests/generators/unittest_javascript.js @@ -9,13 +9,13 @@ */ 'use strict'; -Blockly.JavaScript['unittest_main'] = function(block) { +javascriptGenerator['unittest_main'] = function(block) { // Container for unit tests. - var resultsVar = Blockly.JavaScript.nameDB_.getName('unittestResults', + var resultsVar = javascriptGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( + var functionName = javascriptGenerator.provideFunction_( 'unittest_report', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + '() {', + [ 'function ' + javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_ + '() {', ' // Create test report.', ' var report = [];', ' var summary = [];', @@ -51,7 +51,7 @@ Blockly.JavaScript['unittest_main'] = function(block) { block.getFieldValue('SUITE_NAME') + '\')\n'; // Run tests (unindented). - code += Blockly.JavaScript.statementToCode(block, 'DO') + code += javascriptGenerator.statementToCode(block, 'DO') .replace(/^ /, '').replace(/\n /g, '\n'); // Send the report to the console (that's where errors will go anyway). code += 'console.log(' + functionName + '());\n'; @@ -60,12 +60,12 @@ Blockly.JavaScript['unittest_main'] = function(block) { return code; }; -Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.JavaScript.nameDB_.getName('unittestResults', +javascriptGenerator['unittest_main'].defineAssert_ = function(block) { + var resultsVar = javascriptGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.JavaScript.provideFunction_( + var functionName = javascriptGenerator.provideFunction_( 'assertEquals', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + [ 'function ' + javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(actual, expected, message) {', ' // Asserts that a value equals another value.', ' if (!' + resultsVar + ') {', @@ -100,24 +100,24 @@ Blockly.JavaScript['unittest_main'].defineAssert_ = function(block) { return functionName; }; -Blockly.JavaScript['unittest_assertequals'] = function(block) { +javascriptGenerator['unittest_assertequals'] = function(block) { // Asserts that a value equals another value. - var message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', - Blockly.JavaScript.ORDER_NONE) || ''; - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_NONE) || 'null'; - var expected = Blockly.JavaScript.valueToCode(block, 'EXPECTED', - Blockly.JavaScript.ORDER_NONE) || 'null'; - return Blockly.JavaScript['unittest_main'].defineAssert_() + + var message = javascriptGenerator.valueToCode(block, 'MESSAGE', + javascriptGenerator.ORDER_NONE) || ''; + var actual = javascriptGenerator.valueToCode(block, 'ACTUAL', + javascriptGenerator.ORDER_NONE) || 'null'; + var expected = javascriptGenerator.valueToCode(block, 'EXPECTED', + javascriptGenerator.ORDER_NONE) || 'null'; + return javascriptGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.JavaScript['unittest_assertvalue'] = function(block) { +javascriptGenerator['unittest_assertvalue'] = function(block) { // Asserts that a value is true, false, or null. - var message = Blockly.JavaScript.valueToCode(block, 'MESSAGE', - Blockly.JavaScript.ORDER_NONE) || ''; - var actual = Blockly.JavaScript.valueToCode(block, 'ACTUAL', - Blockly.JavaScript.ORDER_NONE) || 'null'; + var message = javascriptGenerator.valueToCode(block, 'MESSAGE', + javascriptGenerator.ORDER_NONE) || ''; + var actual = javascriptGenerator.valueToCode(block, 'ACTUAL', + javascriptGenerator.ORDER_NONE) || 'null'; var expected = block.getFieldValue('EXPECTED'); if (expected === 'TRUE') { expected = 'true'; @@ -126,18 +126,18 @@ Blockly.JavaScript['unittest_assertvalue'] = function(block) { } else if (expected === 'NULL') { expected = 'null'; } - return Blockly.JavaScript['unittest_main'].defineAssert_() + + return javascriptGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.JavaScript['unittest_fail'] = function(block) { +javascriptGenerator['unittest_fail'] = function(block) { // Always assert an error. - var resultsVar = Blockly.JavaScript.nameDB_.getName('unittestResults', + var resultsVar = javascriptGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var message = Blockly.JavaScript.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.JavaScript.provideFunction_( + var message = javascriptGenerator.quote_(block.getFieldValue('MESSAGE')); + var functionName = javascriptGenerator.provideFunction_( 'unittest_fail', - [ 'function ' + Blockly.JavaScript.FUNCTION_NAME_PLACEHOLDER_ + + [ 'function ' + javascriptGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(message) {', ' // Always assert an error.', ' if (!' + resultsVar + ') {', @@ -148,20 +148,20 @@ Blockly.JavaScript['unittest_fail'] = function(block) { return functionName + '(' + message + ');\n'; }; -Blockly.JavaScript['unittest_adjustindex'] = function(block) { - var index = Blockly.JavaScript.valueToCode(block, 'INDEX', - Blockly.JavaScript.ORDER_ADDITION) || '0'; +javascriptGenerator['unittest_adjustindex'] = function(block) { + var index = javascriptGenerator.valueToCode(block, 'INDEX', + javascriptGenerator.ORDER_ADDITION) || '0'; // Adjust index if using one-based indexing. if (block.workspace.options.oneBasedIndex) { if (Blockly.isNumber(index)) { // If the index is a naked number, adjust it right now. - return [Number(index) + 1, Blockly.JavaScript.ORDER_ATOMIC]; + return [Number(index) + 1, javascriptGenerator.ORDER_ATOMIC]; } else { // If the index is dynamic, adjust it in code. index = index + ' + 1'; } } else if (Blockly.isNumber(index)) { - return [index, Blockly.JavaScript.ORDER_ATOMIC]; + return [index, javascriptGenerator.ORDER_ATOMIC]; } - return [index, Blockly.JavaScript.ORDER_ADDITION]; + return [index, javascriptGenerator.ORDER_ADDITION]; }; diff --git a/tests/generators/unittest_lua.js b/tests/generators/unittest_lua.js index 06b21744d8c..40447616aa8 100644 --- a/tests/generators/unittest_lua.js +++ b/tests/generators/unittest_lua.js @@ -9,13 +9,13 @@ */ 'use strict'; -Blockly.Lua['unittest_main'] = function(block) { +luaGenerator['unittest_main'] = function(block) { // Container for unit tests. - var resultsVar = Blockly.Lua.nameDB_.getName('unittestResults', + var resultsVar = luaGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Lua.provideFunction_( + var functionName = luaGenerator.provideFunction_( 'unittest_report', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '()', + ['function ' + luaGenerator.FUNCTION_NAME_PLACEHOLDER_ + '()', ' -- Create test report.', ' local report = {}', ' local summary = {}', @@ -49,7 +49,7 @@ Blockly.Lua['unittest_main'] = function(block) { block.getFieldValue('SUITE_NAME') + '\')\n'; // Run tests (unindented). - code += Blockly.Lua.statementToCode(block, 'DO') + code += luaGenerator.statementToCode(block, 'DO') .replace(/^ /, '').replace(/\n /g, '\n'); // Print the report. code += 'print(' + functionName + '())\n'; @@ -58,12 +58,12 @@ Blockly.Lua['unittest_main'] = function(block) { return code; }; -Blockly.Lua['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.Lua.nameDB_.getName('unittestResults', +luaGenerator['unittest_main'].defineAssert_ = function(block) { + var resultsVar = luaGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Lua.provideFunction_( + var functionName = luaGenerator.provideFunction_( 'assertEquals', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + + ['function ' + luaGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(actual, expected, message)', ' -- Asserts that a value equals another value.', ' assert(' + resultsVar + ' ~= nil, ' + @@ -106,24 +106,24 @@ Blockly.Lua['unittest_main'].defineAssert_ = function(block) { return functionName; }; -Blockly.Lua['unittest_assertequals'] = function(block) { +luaGenerator['unittest_assertequals'] = function(block) { // Asserts that a value equals another value. - var message = Blockly.Lua.valueToCode(block, 'MESSAGE', - Blockly.Lua.ORDER_NONE) || ''; - var actual = Blockly.Lua.valueToCode(block, 'ACTUAL', - Blockly.Lua.ORDER_NONE) || 'nil'; - var expected = Blockly.Lua.valueToCode(block, 'EXPECTED', - Blockly.Lua.ORDER_NONE) || 'nil'; - return Blockly.Lua['unittest_main'].defineAssert_() + + var message = luaGenerator.valueToCode(block, 'MESSAGE', + luaGenerator.ORDER_NONE) || ''; + var actual = luaGenerator.valueToCode(block, 'ACTUAL', + luaGenerator.ORDER_NONE) || 'nil'; + var expected = luaGenerator.valueToCode(block, 'EXPECTED', + luaGenerator.ORDER_NONE) || 'nil'; + return luaGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ')\n'; }; -Blockly.Lua['unittest_assertvalue'] = function(block) { +luaGenerator['unittest_assertvalue'] = function(block) { // Asserts that a value is true, false, or null. - var message = Blockly.Lua.valueToCode(block, 'MESSAGE', - Blockly.Lua.ORDER_NONE) || ''; - var actual = Blockly.Lua.valueToCode(block, 'ACTUAL', - Blockly.Lua.ORDER_NONE) || 'nil'; + var message = luaGenerator.valueToCode(block, 'MESSAGE', + luaGenerator.ORDER_NONE) || ''; + var actual = luaGenerator.valueToCode(block, 'ACTUAL', + luaGenerator.ORDER_NONE) || 'nil'; var expected = block.getFieldValue('EXPECTED'); if (expected == 'TRUE') { expected = 'true'; @@ -132,18 +132,18 @@ Blockly.Lua['unittest_assertvalue'] = function(block) { } else if (expected == 'NULL') { expected = 'nil'; } - return Blockly.Lua.unittest_main.defineAssert_() + + return luaGenerator.unittest_main.defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ')\n'; }; -Blockly.Lua['unittest_fail'] = function(block) { +luaGenerator['unittest_fail'] = function(block) { // Always assert an error. - var resultsVar = Blockly.Lua.nameDB_.getName('unittestResults', + var resultsVar = luaGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var message = Blockly.Lua.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Lua.provideFunction_( + var message = luaGenerator.quote_(block.getFieldValue('MESSAGE')); + var functionName = luaGenerator.provideFunction_( 'unittest_fail', - ['function ' + Blockly.Lua.FUNCTION_NAME_PLACEHOLDER_ + '(message)', + ['function ' + luaGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(message)', ' -- Always assert an error.', ' assert(' + resultsVar + ' ~= nil, "Orphaned assert fail: " .. message)', @@ -153,13 +153,13 @@ Blockly.Lua['unittest_fail'] = function(block) { return functionName + '(' + message + ')\n'; }; -Blockly.Lua['unittest_adjustindex'] = function(block) { - var index = Blockly.Lua.valueToCode(block, 'INDEX', - Blockly.Lua.ORDER_ADDITIVE) || '0'; +luaGenerator['unittest_adjustindex'] = function(block) { + var index = luaGenerator.valueToCode(block, 'INDEX', + luaGenerator.ORDER_ADDITIVE) || '0'; if (Blockly.isNumber(index)) { // If the index is a naked number, adjust it right now. - return [Number(index) + 1, Blockly.Lua.ORDER_ATOMIC]; + return [Number(index) + 1, luaGenerator.ORDER_ATOMIC]; } // If the index is dynamic, adjust it in code. - return [index + ' + 1', Blockly.Lua.ORDER_ADDITIVE]; + return [index + ' + 1', luaGenerator.ORDER_ADDITIVE]; }; diff --git a/tests/generators/unittest_php.js b/tests/generators/unittest_php.js index eba709ce053..f8ffa699390 100644 --- a/tests/generators/unittest_php.js +++ b/tests/generators/unittest_php.js @@ -9,13 +9,13 @@ */ 'use strict'; -Blockly.PHP['unittest_main'] = function(block) { +phpGenerator['unittest_main'] = function(block) { // Container for unit tests. - var resultsVar = Blockly.PHP.nameDB_.getName('unittestResults', + var resultsVar = phpGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.PHP.provideFunction_( + var functionName = phpGenerator.provideFunction_( 'unittest_report', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + '() {', + [ 'function ' + phpGenerator.FUNCTION_NAME_PLACEHOLDER_ + '() {', ' global ' + resultsVar + ';', ' // Create test report.', ' $report = array();', @@ -51,7 +51,7 @@ Blockly.PHP['unittest_main'] = function(block) { block.getFieldValue('SUITE_NAME') + '\\n");\n'; // Run tests (unindented). - code += Blockly.PHP.statementToCode(block, 'DO') + code += phpGenerator.statementToCode(block, 'DO') .replace(/^ /, '').replace(/\n /g, '\n'); // Send the report to the console (that's where errors will go anyway). code += 'print(' + functionName + '());\n'; @@ -60,12 +60,12 @@ Blockly.PHP['unittest_main'] = function(block) { return code; }; -Blockly.PHP['unittest_main'].defineAssert_ = function(block) { - var resultsVar = Blockly.PHP.nameDB_.getName('unittestResults', +phpGenerator['unittest_main'].defineAssert_ = function(block) { + var resultsVar = phpGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.PHP.provideFunction_( + var functionName = phpGenerator.provideFunction_( 'assertEquals', - ['function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + ['function ' + phpGenerator.FUNCTION_NAME_PLACEHOLDER_ + '($actual, $expected, $message) {', ' global ' + resultsVar + ';', ' // Asserts that a value equals another value.', @@ -86,24 +86,24 @@ Blockly.PHP['unittest_main'].defineAssert_ = function(block) { return functionName; }; -Blockly.PHP['unittest_assertequals'] = function(block) { +phpGenerator['unittest_assertequals'] = function(block) { // Asserts that a value equals another value. - var message = Blockly.PHP.valueToCode(block, 'MESSAGE', - Blockly.PHP.ORDER_NONE) || ''; - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_NONE) || 'null'; - var expected = Blockly.PHP.valueToCode(block, 'EXPECTED', - Blockly.PHP.ORDER_NONE) || 'null'; - return Blockly.PHP['unittest_main'].defineAssert_() + + var message = phpGenerator.valueToCode(block, 'MESSAGE', + phpGenerator.ORDER_NONE) || ''; + var actual = phpGenerator.valueToCode(block, 'ACTUAL', + phpGenerator.ORDER_NONE) || 'null'; + var expected = phpGenerator.valueToCode(block, 'EXPECTED', + phpGenerator.ORDER_NONE) || 'null'; + return phpGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.PHP['unittest_assertvalue'] = function(block) { +phpGenerator['unittest_assertvalue'] = function(block) { // Asserts that a value is true, false, or null. - var message = Blockly.PHP.valueToCode(block, 'MESSAGE', - Blockly.PHP.ORDER_NONE) || ''; - var actual = Blockly.PHP.valueToCode(block, 'ACTUAL', - Blockly.PHP.ORDER_NONE) || 'null'; + var message = phpGenerator.valueToCode(block, 'MESSAGE', + phpGenerator.ORDER_NONE) || ''; + var actual = phpGenerator.valueToCode(block, 'ACTUAL', + phpGenerator.ORDER_NONE) || 'null'; var expected = block.getFieldValue('EXPECTED'); if (expected == 'TRUE') { expected = 'true'; @@ -112,18 +112,18 @@ Blockly.PHP['unittest_assertvalue'] = function(block) { } else if (expected == 'NULL') { expected = 'null'; } - return Blockly.PHP['unittest_main'].defineAssert_() + + return phpGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ');\n'; }; -Blockly.PHP['unittest_fail'] = function(block) { +phpGenerator['unittest_fail'] = function(block) { // Always assert an error. - var resultsVar = Blockly.PHP.nameDB_.getName('unittestResults', + var resultsVar = phpGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var message = Blockly.PHP.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.PHP.provideFunction_( + var message = phpGenerator.quote_(block.getFieldValue('MESSAGE')); + var functionName = phpGenerator.provideFunction_( 'unittest_fail', - [ 'function ' + Blockly.PHP.FUNCTION_NAME_PLACEHOLDER_ + + [ 'function ' + phpGenerator.FUNCTION_NAME_PLACEHOLDER_ + '($message) {', ' global ' + resultsVar + ';', ' // Always assert an error.', @@ -135,20 +135,20 @@ Blockly.PHP['unittest_fail'] = function(block) { return functionName + '(' + message + ');\n'; }; -Blockly.PHP['unittest_adjustindex'] = function(block) { - var index = Blockly.PHP.valueToCode(block, 'INDEX', - Blockly.PHP.ORDER_ADDITION) || '0'; +phpGenerator['unittest_adjustindex'] = function(block) { + var index = phpGenerator.valueToCode(block, 'INDEX', + phpGenerator.ORDER_ADDITION) || '0'; // Adjust index if using one-based indexing. if (block.workspace.options.oneBasedIndex) { if (Blockly.isNumber(index)) { // If the index is a naked number, adjust it right now. - return [Number(index) + 1, Blockly.PHP.ORDER_ATOMIC]; + return [Number(index) + 1, phpGenerator.ORDER_ATOMIC]; } else { // If the index is dynamic, adjust it in code. index = index + ' + 1'; } } else if (Blockly.isNumber(index)) { - return [index, Blockly.PHP.ORDER_ATOMIC]; + return [index, phpGenerator.ORDER_ATOMIC]; } - return [index, Blockly.PHP.ORDER_ADDITION]; + return [index, phpGenerator.ORDER_ADDITION]; }; diff --git a/tests/generators/unittest_python.js b/tests/generators/unittest_python.js index 073211d6287..63d787c88b2 100644 --- a/tests/generators/unittest_python.js +++ b/tests/generators/unittest_python.js @@ -9,13 +9,13 @@ */ 'use strict'; -Blockly.Python['unittest_main'] = function(block) { +pythonGenerator['unittest_main'] = function(block) { // Container for unit tests. - var resultsVar = Blockly.Python.nameDB_.getName('unittestResults', + var resultsVar = pythonGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Python.provideFunction_( + var functionName = pythonGenerator.provideFunction_( 'unittest_report', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '():', + ['def ' + pythonGenerator.FUNCTION_NAME_PLACEHOLDER_ + '():', ' # Create test report.', ' report = []', ' summary = []', @@ -47,7 +47,7 @@ Blockly.Python['unittest_main'] = function(block) { block.getFieldValue('SUITE_NAME') + '\')\n'; // Run tests (unindented). - code += Blockly.Python.statementToCode(block, 'DO') + code += pythonGenerator.statementToCode(block, 'DO') .replace(/^ /, '').replace(/\n /g, '\n'); // Print the report. code += 'print(' + functionName + '())\n'; @@ -56,12 +56,12 @@ Blockly.Python['unittest_main'] = function(block) { return code; }; -Blockly.Python['unittest_main'].defineAssert_ = function() { - var resultsVar = Blockly.Python.nameDB_.getName('unittestResults', +pythonGenerator['unittest_main'].defineAssert_ = function() { + var resultsVar = pythonGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var functionName = Blockly.Python.provideFunction_( + var functionName = pythonGenerator.provideFunction_( 'assertEquals', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + + ['def ' + pythonGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(actual, expected, message):', ' # Asserts that a value equals another value.', ' if ' + resultsVar + ' == None:', @@ -74,24 +74,24 @@ Blockly.Python['unittest_main'].defineAssert_ = function() { return functionName; }; -Blockly.Python['unittest_assertequals'] = function(block) { +pythonGenerator['unittest_assertequals'] = function(block) { // Asserts that a value equals another value. - var message = Blockly.Python.valueToCode(block, 'MESSAGE', - Blockly.Python.ORDER_NONE) || ''; - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; - var expected = Blockly.Python.valueToCode(block, 'EXPECTED', - Blockly.Python.ORDER_NONE) || 'None'; - return Blockly.Python['unittest_main'].defineAssert_() + + var message = pythonGenerator.valueToCode(block, 'MESSAGE', + pythonGenerator.ORDER_NONE) || ''; + var actual = pythonGenerator.valueToCode(block, 'ACTUAL', + pythonGenerator.ORDER_NONE) || 'None'; + var expected = pythonGenerator.valueToCode(block, 'EXPECTED', + pythonGenerator.ORDER_NONE) || 'None'; + return pythonGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ')\n'; }; -Blockly.Python['unittest_assertvalue'] = function(block) { +pythonGenerator['unittest_assertvalue'] = function(block) { // Asserts that a value is true, false, or null. - var message = Blockly.Python.valueToCode(block, 'MESSAGE', - Blockly.Python.ORDER_NONE) || ''; - var actual = Blockly.Python.valueToCode(block, 'ACTUAL', - Blockly.Python.ORDER_NONE) || 'None'; + var message = pythonGenerator.valueToCode(block, 'MESSAGE', + pythonGenerator.ORDER_NONE) || ''; + var actual = pythonGenerator.valueToCode(block, 'ACTUAL', + pythonGenerator.ORDER_NONE) || 'None'; var expected = block.getFieldValue('EXPECTED'); if (expected == 'TRUE') { expected = 'True'; @@ -100,18 +100,18 @@ Blockly.Python['unittest_assertvalue'] = function(block) { } else if (expected == 'NULL') { expected = 'None'; } - return Blockly.Python['unittest_main'].defineAssert_() + + return pythonGenerator['unittest_main'].defineAssert_() + '(' + actual + ', ' + expected + ', ' + message + ')\n'; }; -Blockly.Python['unittest_fail'] = function(block) { +pythonGenerator['unittest_fail'] = function(block) { // Always assert an error. - var resultsVar = Blockly.Python.nameDB_.getName('unittestResults', + var resultsVar = pythonGenerator.nameDB_.getName('unittestResults', Blockly.Names.DEVELOPER_VARIABLE_TYPE); - var message = Blockly.Python.quote_(block.getFieldValue('MESSAGE')); - var functionName = Blockly.Python.provideFunction_( + var message = pythonGenerator.quote_(block.getFieldValue('MESSAGE')); + var functionName = pythonGenerator.provideFunction_( 'fail', - ['def ' + Blockly.Python.FUNCTION_NAME_PLACEHOLDER_ + '(message):', + ['def ' + pythonGenerator.FUNCTION_NAME_PLACEHOLDER_ + '(message):', ' # Always assert an error.', ' if ' + resultsVar + ' == None:', ' raise Exception("Orphaned assert equals: " + message)', @@ -119,20 +119,20 @@ Blockly.Python['unittest_fail'] = function(block) { return functionName + '(' + message + ')\n'; }; -Blockly.Python['unittest_adjustindex'] = function(block) { - var index = Blockly.Python.valueToCode(block, 'INDEX', - Blockly.Python.ORDER_ADDITIVE) || '0'; +pythonGenerator['unittest_adjustindex'] = function(block) { + var index = pythonGenerator.valueToCode(block, 'INDEX', + pythonGenerator.ORDER_ADDITIVE) || '0'; // Adjust index if using one-based indexing. if (block.workspace.options.oneBasedIndex) { if (Blockly.isNumber(index)) { // If the index is a naked number, adjust it right now. - return [Number(index) + 1, Blockly.Python.ORDER_ATOMIC]; + return [Number(index) + 1, pythonGenerator.ORDER_ATOMIC]; } else { // If the index is dynamic, adjust it in code. index = index + ' + 1'; } } else if (Blockly.isNumber(index)) { - return [index, Blockly.Python.ORDER_ATOMIC]; + return [index, pythonGenerator.ORDER_ATOMIC]; } - return [index, Blockly.Python.ORDER_ADDITIVE]; + return [index, pythonGenerator.ORDER_ADDITIVE]; }; diff --git a/tests/mocha/.eslintrc.json b/tests/mocha/.eslintrc.json index 8ebf31ae61c..99dda9b3875 100644 --- a/tests/mocha/.eslintrc.json +++ b/tests/mocha/.eslintrc.json @@ -11,7 +11,11 @@ "no-unused-vars": ["off"], // Allow uncommented helper functions in tests. "require-jsdoc": ["off"], - "prefer-rest-params": ["off"] + "prefer-rest-params": ["off"], + "no-invalid-this": ["off"] }, - "extends": "../../.eslintrc.json" + "extends": "../../.eslintrc.json", + "parserOptions": { + "sourceType": "module" + } } diff --git a/tests/mocha/.mocharc.js b/tests/mocha/.mocharc.js index 3c156db3e95..0928b25d275 100644 --- a/tests/mocha/.mocharc.js +++ b/tests/mocha/.mocharc.js @@ -2,6 +2,5 @@ module.exports = { ui: 'tdd', - file: '../blockly_uncompressed.js', reporter: 'landing' }; diff --git a/tests/mocha/astnode_test.js b/tests/mocha/astnode_test.js index f974f3ea8a2..52b173465a9 100644 --- a/tests/mocha/astnode_test.js +++ b/tests/mocha/astnode_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.astNode'); +goog.declareModuleId('Blockly.test.astNode'); -const {ASTNode} = goog.require('Blockly.ASTNode'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {ASTNode} from '../../build/src/core/keyboard_nav/ast_node.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('ASTNode', function() { diff --git a/tests/mocha/block_change_event_test.js b/tests/mocha/block_change_event_test.js index 6cfbca57885..ecd62f4b423 100644 --- a/tests/mocha/block_change_event_test.js +++ b/tests/mocha/block_change_event_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.blockChangeEvent'); +goog.declareModuleId('Blockly.test.blockChangeEvent'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {defineMutatorBlocks} = goog.require('Blockly.test.helpers.blockDefinitions'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {defineMutatorBlocks} from './test_helpers/block_definitions.js'; suite('Block Change Event', function() { diff --git a/tests/mocha/block_create_event_test.js b/tests/mocha/block_create_event_test.js index 475991908ac..ddbb84d5323 100644 --- a/tests/mocha/block_create_event_test.js +++ b/tests/mocha/block_create_event_test.js @@ -4,11 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.blockCreateEvent'); +goog.declareModuleId('Blockly.test.blockCreateEvent'); -const {assertEventFired} = goog.require('Blockly.test.helpers.events'); -const eventUtils = goog.require('Blockly.Events.utils'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {assertEventFired} from './test_helpers/events.js'; +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Block Create Event', function() { diff --git a/tests/mocha/block_delete_event_test.js b/tests/mocha/block_delete_event_test.js new file mode 100644 index 00000000000..c4bef949d24 --- /dev/null +++ b/tests/mocha/block_delete_event_test.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.blockDeleteEvent'); + +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + +suite('Block Delete Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Receiving', function() { + test('blocks receive their own delete events', function() { + Blockly.Blocks['test'] = { + onchange: function(e) {}, + }; + // Need to stub the definition, because the property on the definition is + // what gets registered as an event listener. + const spy = sinon.spy(Blockly.Blocks['test'], 'onchange'); + const testBlock = this.workspace.newBlock('test'); + + testBlock.dispose(); + + const deleteClass = eventUtils.get(eventUtils.BLOCK_DELETE); + chai.assert.isTrue(spy.calledOnce); + chai.assert.isTrue(spy.getCall(0).args[0] instanceof deleteClass); + }); + }); +}); diff --git a/tests/mocha/block_json_test.js b/tests/mocha/block_json_test.js index b93045960f6..b2b15f2e068 100644 --- a/tests/mocha/block_json_test.js +++ b/tests/mocha/block_json_test.js @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.blockJson'); +goog.declareModuleId('Blockly.test.blockJson'); -const {Align} = goog.require('Blockly.Input'); +import {Align} from '../../build/src/core/input.js'; suite('Block JSON initialization', function() { @@ -289,7 +289,7 @@ suite('Block JSON initialization', function() { suite('fieldFromJson_', function() { setup(function() { - this.stub = sinon.stub(Blockly.fieldRegistry, 'fromJson') + this.stub = sinon.stub(Blockly.fieldRegistry.TEST_ONLY, 'fromJsonInternal') .callsFake(function(elem) { switch (elem['type']) { case 'field_label': diff --git a/tests/mocha/block_test.js b/tests/mocha/block_test.js index 13e51553403..abad7ace05f 100644 --- a/tests/mocha/block_test.js +++ b/tests/mocha/block_test.js @@ -4,14 +4,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.blocks'); +goog.declareModuleId('Blockly.test.blocks'); -const {Blocks} = goog.require('Blockly.blocks'); -const {ConnectionType} = goog.require('Blockly.ConnectionType'); -const {createDeprecationWarningStub} = goog.require('Blockly.test.helpers.warnings'); -const {createRenderedBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const eventUtils = goog.require('Blockly.Events.utils'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {ConnectionType} from '../../build/src/core/connection_type.js'; +import {createDeprecationWarningStub} from './test_helpers/warnings.js'; +import {createRenderedBlock} from './test_helpers/block_definitions.js'; +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Blocks', function() { @@ -1097,7 +1096,7 @@ suite('Blocks', function() { chai.assert.notEqual(event.type, eventUtils.BLOCK_CHANGE); } setup(function() { - this.eventsFireSpy = sinon.spy(eventUtils, 'fire'); + this.eventsFireSpy = sinon.spy(eventUtils.TEST_ONLY, 'fireInternal'); }); teardown(function() { this.eventsFireSpy.restore(); @@ -1990,7 +1989,7 @@ suite('Blocks', function() { // so we assert init was called to be safe. let initCalled = false; let recordUndoDuringInit; - Blocks['init_test_block'].init = function() { + Blockly.Blocks['init_test_block'].init = function() { initCalled = true; recordUndoDuringInit = eventUtils.getRecordUndo(); throw new Error(); diff --git a/tests/mocha/blocks/lists_test.js b/tests/mocha/blocks/lists_test.js new file mode 100644 index 00000000000..b1609aebe5a --- /dev/null +++ b/tests/mocha/blocks/lists_test.js @@ -0,0 +1,194 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.lists'); + +import {runSerializationTestSuite} from '../test_helpers/serialization.js'; +import {sharedTestSetup, sharedTestTeardown} from '../test_helpers/setup_teardown.js'; +import {ConnectionType} from '../../../build/src/core/connection_type.js'; +import {defineStatementBlock} from '../test_helpers/block_definitions.js'; + + +suite('Lists', function() { + setup(function() { + sharedTestSetup.call(this); + defineStatementBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('ListsGetIndex', function() { + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = [ + { + title: 'JSON not requiring mutations', + json: { + type: 'lists_getIndex', + id: '1', + fields: {MODE: 'GET', WHERE: 'FIRST'}, + }, + assertBlockStructure: (block) => { + chai.assert.equal(block.type, 'lists_getIndex'); + chai.assert.exists(block.outputConnection); + }, + }, + { + title: 'JSON requiring mutations', + json: { + type: 'lists_getIndex', + id: '1', + extraState: {isStatement: true}, + fields: {MODE: 'REMOVE', WHERE: 'FROM_START'}, + }, + assertBlockStructure: (block) => { + chai.assert.equal(block.type, 'lists_getIndex'); + chai.assert.isNotTrue(block.outputConnection); + chai.assert.isTrue( + block.getInput('AT').type === ConnectionType.INPUT_VALUE + ); + }, + }, + { + title: + 'JSON requiring mutations and extra state for previous connection', + json: { + type: 'statement_block', + id: '1', + next: { + block: { + type: 'lists_getIndex', + id: '2', + extraState: {isStatement: true}, + fields: {MODE: 'REMOVE', WHERE: 'FROM_START'}, + }, + }, + }, + assertBlockStructure: (block) => {}, + }, + { + title: + 'JSON requiring mutations with XML extra state', + json: { + type: 'statement_block', + id: '1', + next: { + block: { + type: 'lists_getIndex', + id: '2', + extraState: '', + fields: {MODE: 'REMOVE', WHERE: 'FROM_START'}, + }, + }, + }, + expectedJson: { + type: 'statement_block', + id: '1', + next: { + block: { + type: 'lists_getIndex', + id: '2', + extraState: {isStatement: true}, + fields: {MODE: 'REMOVE', WHERE: 'FROM_START'}, + }, + }, + }, + assertBlockStructure: (block) => {}, + }, + ]; + runSerializationTestSuite(testCases); + }); + + /** + * Test cases for serialization where JSON hooks should have null + * implementation to avoid serializing xml mutations in json. + * @param {!Object} serializedJson basic serialized json + * @param {!string} xmlMutation xml mutation that should be ignored/not reserialized in round trip + * @return {Array} test cases + */ + function makeTestCasesForBlockNotNeedingExtraState_(serializedJson, xmlMutation) { + return [ + { + title: 'JSON not requiring mutations', + json: serializedJson, + assertBlockStructure: (block) => { + chai.assert.equal(block.type, serializedJson.type); + }, + }, + { + title: + 'JSON with XML extra state', + json: { + ...serializedJson, + "extraState": xmlMutation, + }, + expectedJson: serializedJson, + assertBlockStructure: (block) => {}, + }, + ]; + } + + suite('ListsSetIndex', function() { + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = makeTestCasesForBlockNotNeedingExtraState_( + { + "type": "lists_setIndex", + "id": "1", + "fields": { + "MODE": "SET", + "WHERE": "FROM_START", + }, + }, + "" + ); + runSerializationTestSuite(testCases); + }); + + suite('ListsGetSubList', function() { + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = makeTestCasesForBlockNotNeedingExtraState_( + { + "type": "lists_getSublist", + "id": "1", + "fields": { + "WHERE1": "FROM_START", + "WHERE2": "FROM_START", + }, + }, + "" + ); + runSerializationTestSuite(testCases); + }); + + suite('ListsSplit', function() { + /** + * Test cases for serialization tests. + * @type {Array} + */ + const testCases = makeTestCasesForBlockNotNeedingExtraState_( + { + "type": "lists_split", + "id": "1", + "fields": { + "MODE": "SPLIT", + }, + }, + "" + ); + runSerializationTestSuite(testCases); + }); +}); diff --git a/tests/mocha/logic_ternary_test.js b/tests/mocha/blocks/logic_ternary_test.js similarity index 97% rename from tests/mocha/logic_ternary_test.js rename to tests/mocha/blocks/logic_ternary_test.js index 5f4c82580e8..db2de13bbc8 100644 --- a/tests/mocha/logic_ternary_test.js +++ b/tests/mocha/blocks/logic_ternary_test.js @@ -4,11 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.logicTernary'); +goog.declareModuleId('Blockly.test.logicTernary'); -const eventUtils = goog.require('Blockly.Events.utils'); -const {runSerializationTestSuite} = goog.require('Blockly.test.helpers.serialization'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as eventUtils from '../../../build/src/core/events/utils.js'; +import {runSerializationTestSuite} from '../test_helpers/serialization.js'; +import {sharedTestSetup, sharedTestTeardown} from '../test_helpers/setup_teardown.js'; suite('Logic ternary', function() { diff --git a/tests/mocha/procedures_test.js b/tests/mocha/blocks/procedures_test.js similarity index 92% rename from tests/mocha/procedures_test.js rename to tests/mocha/blocks/procedures_test.js index 6d7888a9f2e..898bdf27a92 100644 --- a/tests/mocha/procedures_test.js +++ b/tests/mocha/blocks/procedures_test.js @@ -4,14 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.procedures'); - -goog.require('Blockly'); -goog.require('Blockly.Msg'); -const {assertCallBlockStructure, assertDefBlockStructure, createProcDefBlock, createProcCallBlock} = goog.require('Blockly.test.helpers.procedures'); -const {runSerializationTestSuite} = goog.require('Blockly.test.helpers.serialization'); -const {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +goog.declareModuleId('Blockly.test.procedures'); +import * as Blockly from '../../../build/src/core/blockly.js'; +import {assertCallBlockStructure, assertDefBlockStructure, createProcDefBlock, createProcCallBlock} from '../test_helpers/procedures.js'; +import {runSerializationTestSuite} from '../test_helpers/serialization.js'; +import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from '../test_helpers/setup_teardown.js'; suite('Procedures', function() { setup(function() { @@ -484,11 +482,11 @@ suite('Procedures', function() { }); test('Simple, Input', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + '2'; + defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + '2'; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name2'); @@ -497,9 +495,9 @@ suite('Procedures', function() { }); test('lower -> CAPS', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = 'PROC NAME'; defInput.onHtmlInputChange_(null); @@ -512,9 +510,9 @@ suite('Procedures', function() { this.defBlock.setFieldValue('PROC NAME', 'NAME'); this.callBlock.setFieldValue('PROC NAME', 'NAME'); const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'PROC NAME'; - defInput.htmlInput_.untypedDefaultValue_ = 'PROC NAME'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'PROC NAME'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'PROC NAME'); defInput.htmlInput_.value = 'proc name'; defInput.onHtmlInputChange_(null); @@ -525,11 +523,11 @@ suite('Procedures', function() { }); test('Whitespace', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + ' '; + defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + ' '; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name'); @@ -538,13 +536,13 @@ suite('Procedures', function() { }); test('Whitespace then Text', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + ' '; + defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + ' '; defInput.onHtmlInputChange_(null); - defInput.htmlInput_.value = defInput.htmlInput_.oldValue_ + '2'; + defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + '2'; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name 2'); @@ -553,9 +551,9 @@ suite('Procedures', function() { }); test('Set Empty', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = ''; defInput.onHtmlInputChange_(null); @@ -568,9 +566,9 @@ suite('Procedures', function() { }); test('Set Empty, and Create New', function() { const defInput = this.defBlock.getField('NAME'); - defInput.htmlInput_ = Object.create(null); - defInput.htmlInput_.oldValue_ = 'proc name'; - defInput.htmlInput_.untypedDefaultValue_ = 'proc name'; + defInput.htmlInput_ = document.createElement('input'); + defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); + defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = ''; defInput.onHtmlInputChange_(null); @@ -1211,3 +1209,43 @@ suite('Procedures', function() { }); }); }); + +suite('Procedures, dont auto fire events', function() { + setup(function() { + sharedTestSetup.call(this, {fireEventsNow: false}); + this.workspace = new Blockly.Workspace(); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + + const testSuites = [ + {title: 'procedures_defreturn', hasReturn: true, + defType: 'procedures_defreturn', callType: 'procedures_callreturn'}, + {title: 'procedures_defnoreturn', hasReturn: false, + defType: 'procedures_defnoreturn', callType: 'procedures_callnoreturn'}, + ]; + + testSuites.forEach((testSuite) => { + suite(testSuite.title, function() { + suite('Disposal', function() { + test('callers are disposed when definitions are disposed', function() { + this.defBlock = new Blockly.Block(this.workspace, testSuite.defType); + this.defBlock.setFieldValue('proc name', 'NAME'); + this.callerBlock = new Blockly.Block( + this.workspace, testSuite.callType); + this.callerBlock.setFieldValue('proc name', 'NAME'); + + // Run the clock now so that the create events get fired. If we fire + // it after disposing, a new procedure def will get created when + // the caller create event is heard. + this.clock.runAll(); + this.defBlock.dispose(); + this.clock.runAll(); + + chai.assert.isTrue(this.callerBlock.disposed); + }); + }); + }); + }); +}); diff --git a/tests/mocha/variables_test.js b/tests/mocha/blocks/variables_test.js similarity index 97% rename from tests/mocha/variables_test.js rename to tests/mocha/blocks/variables_test.js index e128576d063..73747122086 100644 --- a/tests/mocha/variables_test.js +++ b/tests/mocha/blocks/variables_test.js @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.variables'); +goog.declareModuleId('Blockly.test.variables'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {sharedTestSetup, sharedTestTeardown} from '../test_helpers/setup_teardown.js'; suite('Variables', function() { diff --git a/tests/mocha/comment_deserialization_test.js b/tests/mocha/comment_deserialization_test.js index f3eb48dc5e1..a37e98986f4 100644 --- a/tests/mocha/comment_deserialization_test.js +++ b/tests/mocha/comment_deserialization_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.commentDeserialization'); +goog.declareModuleId('Blockly.test.commentDeserialization'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {simulateClick} = goog.require('Blockly.test.helpers.userInput'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {simulateClick} from './test_helpers/user_input.js'; suite('Comment Deserialization', function() { diff --git a/tests/mocha/comment_test.js b/tests/mocha/comment_test.js index afee012f659..e358d4fb158 100644 --- a/tests/mocha/comment_test.js +++ b/tests/mocha/comment_test.js @@ -4,11 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.comments'); +goog.declareModuleId('Blockly.test.comments'); -const {assertEventFired} = goog.require('Blockly.test.helpers.events'); -const eventUtils = goog.require('Blockly.Events.utils'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {assertEventFired} from './test_helpers/events.js'; +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Comments', function() { diff --git a/tests/mocha/connection_checker_test.js b/tests/mocha/connection_checker_test.js index 523fecfccfd..d86d48bfb78 100644 --- a/tests/mocha/connection_checker_test.js +++ b/tests/mocha/connection_checker_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.connectionChecker'); +goog.declareModuleId('Blockly.test.connectionChecker'); -const {ConnectionType} = goog.require('Blockly.ConnectionType'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {ConnectionType} from '../../build/src/core/connection_type.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Connection checker', function() { diff --git a/tests/mocha/connection_db_test.js b/tests/mocha/connection_db_test.js index cdc343bd559..6d7e2b36348 100644 --- a/tests/mocha/connection_db_test.js +++ b/tests/mocha/connection_db_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.connectionDb'); +goog.declareModuleId('Blockly.test.connectionDb'); -const {ConnectionType} = goog.require('Blockly.ConnectionType'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {ConnectionType} from '../../build/src/core/connection_type.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Connection Database', function() { @@ -203,13 +203,13 @@ suite('Connection Database', function() { suite('Search For Closest', function() { setup(function() { // Ignore type checks. - sinon.stub(this.database.connectionChecker_, 'doTypeChecks') + sinon.stub(this.database.connectionChecker, 'doTypeChecks') .returns(true); // Ignore safety checks. - sinon.stub(this.database.connectionChecker_, 'doSafetyChecks') + sinon.stub(this.database.connectionChecker, 'doSafetyChecks') .returns(Blockly.Connection.CAN_CONNECT); // Skip everything but the distance checks. - sinon.stub(this.database.connectionChecker_, 'doDragChecks') + sinon.stub(this.database.connectionChecker, 'doDragChecks') .callsFake(function(a, b, distance) { return a.distanceFrom(b) <= distance; }); diff --git a/tests/mocha/connection_test.js b/tests/mocha/connection_test.js index 37bca1240fe..878fcd00639 100644 --- a/tests/mocha/connection_test.js +++ b/tests/mocha/connection_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.connection'); +goog.declareModuleId('Blockly.test.connection'); -const {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {defineRowBlock, defineStatementBlock, defineStackBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); +import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {defineRowBlock, defineStatementBlock, defineStackBlock} from './test_helpers/block_definitions.js'; suite('Connection', function() { diff --git a/tests/mocha/contextmenu_items_test.js b/tests/mocha/contextmenu_items_test.js index c9b9b8127a6..e4dbf47be57 100644 --- a/tests/mocha/contextmenu_items_test.js +++ b/tests/mocha/contextmenu_items_test.js @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.contextMenuItem'); +goog.declareModuleId('Blockly.test.contextMenuItem'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Context Menu Items', function() { @@ -260,7 +260,7 @@ suite('Context Menu Items', function() { test('Deletes all blocks after confirming', function() { // Mocks the confirmation dialog and calls the callback with 'true' simulating ok. const confirmStub = sinon.stub( - Blockly.dialog, 'confirm').callsArgWith(1, true); + Blockly.dialog.TEST_ONLY, 'confirmInternal').callsArgWith(1, true); this.workspace.newBlock('text'); this.workspace.newBlock('text'); @@ -273,7 +273,7 @@ suite('Context Menu Items', function() { test('Does not delete blocks if not confirmed', function() { // Mocks the confirmation dialog and calls the callback with 'false' simulating cancel. const confirmStub = sinon.stub( - Blockly.dialog, 'confirm').callsArgWith(1, false); + Blockly.dialog.TEST_ONLY, 'confirmInternal').callsArgWith(1, false); this.workspace.newBlock('text'); this.workspace.newBlock('text'); @@ -284,7 +284,7 @@ suite('Context Menu Items', function() { }); test('No dialog for single block', function() { - const confirmStub = sinon.stub(Blockly.dialog, 'confirm'); + const confirmStub = sinon.stub(Blockly.dialog.TEST_ONLY, 'confirmInternal'); this.workspace.newBlock('text'); this.deleteOption.callback(this.scope); this.clock.runAll(); @@ -334,7 +334,7 @@ suite('Context Menu Items', function() { }); test('Calls duplicate', function() { - const spy = sinon.spy(Blockly.clipboard, 'duplicate'); + const spy = sinon.spy(Blockly.clipboard.TEST_ONLY, 'duplicateInternal'); this.duplicateOption.callback(this.scope); @@ -356,16 +356,6 @@ suite('Context Menu Items', function() { chai.assert.equal(this.commentOption.preconditionFn(this.scope), 'enabled'); }); - test('Hidden for IE', function() { - const oldState = Blockly.utils.userAgent.IE; - try { - Blockly.utils.userAgent.IE = true; - chai.assert.equal(this.commentOption.preconditionFn(this.scope), 'hidden'); - } finally { - Blockly.utils.userAgent.IE = oldState; - } - }); - test('Hidden for collapsed block', function() { // Must render block to collapse it properly. this.block.initSvg(); diff --git a/tests/mocha/cursor_test.js b/tests/mocha/cursor_test.js index 77b22470aec..91514098b0b 100644 --- a/tests/mocha/cursor_test.js +++ b/tests/mocha/cursor_test.js @@ -4,10 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.cursor'); +goog.declareModuleId('Blockly.test.cursor'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {ASTNode} = goog.require('Blockly.ASTNode'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {ASTNode} from '../../build/src/core/keyboard_nav/ast_node.js'; suite('Cursor', function() { diff --git a/tests/mocha/dropdowndiv_test.js b/tests/mocha/dropdowndiv_test.js index 6cd8dca539e..1a6cf07d861 100644 --- a/tests/mocha/dropdowndiv_test.js +++ b/tests/mocha/dropdowndiv_test.js @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.dropdown'); +goog.declareModuleId('Blockly.test.dropdown'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('DropDownDiv', function() { @@ -22,7 +22,7 @@ suite('DropDownDiv', function() { width: 100, height: 100, }); - this.sizeStub = sinon.stub(Blockly.utils.style, 'getSize') + this.sizeStub = sinon.stub(Blockly.utils.style.TEST_ONLY, 'getSizeInternal') .returns({ width: 60, height: 60, diff --git a/tests/mocha/event_test.js b/tests/mocha/event_test.js index 9ee53a68941..9954225beec 100644 --- a/tests/mocha/event_test.js +++ b/tests/mocha/event_test.js @@ -4,20 +4,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.event'); +goog.declareModuleId('Blockly.test.event'); -const {ASTNode} = goog.require('Blockly.ASTNode'); -const {assertEventEquals, assertNthCallEventArgEquals, createFireChangeListenerSpy} = goog.require('Blockly.test.helpers.events'); -const {assertVariableValues} = goog.require('Blockly.test.helpers.variables'); -const {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const eventUtils = goog.require('Blockly.Events.utils'); -goog.require('Blockly.WorkspaceComment'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {ASTNode} from '../../build/src/core/keyboard_nav/ast_node.js'; +import {assertEventEquals, assertNthCallEventArgEquals, createFireChangeListenerSpy} from './test_helpers/events.js'; +import {assertVariableValues} from './test_helpers/variables.js'; +import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {WorkspaceComment} from '../../build/src/core/workspace_comment.js'; suite('Events', function() { setup(function() { sharedTestSetup.call(this, {fireEventsNow: false}); - this.eventsFireSpy = sinon.spy(eventUtils, 'fire'); + this.eventsFireSpy = sinon.spy(eventUtils.TEST_ONLY, 'fireInternal'); this.workspace = new Blockly.Workspace(); Blockly.defineBlocksWithJsonArray([{ 'type': 'field_variable_test_block', @@ -60,7 +61,7 @@ suite('Events', function() { suite('Constructors', function() { test('Abstract', function() { const event = new Blockly.Events.Abstract(); - assertEventEquals(event, undefined, undefined, undefined, { + assertEventEquals(event, '', undefined, undefined, { 'recordUndo': true, 'group': '', }); @@ -68,7 +69,7 @@ suite('Events', function() { test('UI event without block', function() { const event = new Blockly.Events.UiBase(this.workspace.id); - assertEventEquals(event, undefined, this.workspace.id, undefined, { + assertEventEquals(event, '', this.workspace.id, undefined, { 'recordUndo': false, 'group': '', }, true); @@ -109,10 +110,9 @@ suite('Events', function() { test('Block base', function() { const event = new Blockly.Events.BlockBase(this.block); sinon.assert.calledOnce(this.genUidStub); - assertEventEquals(event, undefined, + assertEventEquals(event, '', this.workspace.id, this.TEST_BLOCK_ID, { - 'varId': undefined, 'recordUndo': true, 'group': '', }); @@ -222,7 +222,7 @@ suite('Events', function() { test('Block base', function() { const event = new Blockly.Events.BlockBase(this.block); sinon.assert.calledOnce(this.genUidStub); - assertEventEquals(event, undefined, + assertEventEquals(event, '', this.workspace.id, this.TEST_BLOCK_ID, { 'varId': undefined, @@ -338,51 +338,51 @@ suite('Events', function() { const variableEventTestCases = [ {title: 'Var create', class: Blockly.Events.VarCreate, getArgs: (thisObj) => [thisObj.variable], - getExpectedJson: () => ({type: 'var_create', varId: 'id1', + getExpectedJson: () => ({type: 'var_create', group: '', varId: 'id1', varType: 'type1', varName: 'name1'})}, {title: 'Var delete', class: Blockly.Events.VarDelete, getArgs: (thisObj) => [thisObj.variable], - getExpectedJson: () => ({type: 'var_delete', varId: 'id1', + getExpectedJson: () => ({type: 'var_delete', group: '', varId: 'id1', varType: 'type1', varName: 'name1'})}, {title: 'Var rename', class: Blockly.Events.VarRename, getArgs: (thisObj) => [thisObj.variable, 'name2'], - getExpectedJson: () => ({type: 'var_rename', varId: 'id1', + getExpectedJson: () => ({type: 'var_rename', group: '', varId: 'id1', oldName: 'name1', newName: 'name2'})}, ]; const uiEventTestCases = [ {title: 'Bubble open', class: Blockly.Events.BubbleOpen, getArgs: (thisObj) => [thisObj.block, true, 'mutator'], - getExpectedJson: (thisObj) => ({type: 'bubble_open', isOpen: true, + getExpectedJson: (thisObj) => ({type: 'bubble_open', group: '', isOpen: true, bubbleType: 'mutator', blockId: thisObj.block.id})}, {title: 'Block click', class: Blockly.Events.Click, getArgs: (thisObj) => [thisObj.block, null, 'block'], - getExpectedJson: (thisObj) => ({type: 'click', targetType: 'block', + getExpectedJson: (thisObj) => ({type: 'click', group: '', targetType: 'block', blockId: thisObj.block.id})}, {title: 'Workspace click', class: Blockly.Events.Click, getArgs: (thisObj) => [null, thisObj.workspace.id, 'workspace'], - getExpectedJson: (thisObj) => ({type: 'click', + getExpectedJson: (thisObj) => ({type: 'click', group: '', targetType: 'workspace'})}, {title: 'Drag start', class: Blockly.Events.BlockDrag, getArgs: (thisObj) => [thisObj.block, true, [thisObj.block]], - getExpectedJson: (thisObj) => ({type: 'drag', + getExpectedJson: (thisObj) => ({type: 'drag', group: '', isStart: true, blockId: thisObj.block.id, blocks: [thisObj.block]})}, {title: 'Drag end', class: Blockly.Events.BlockDrag, getArgs: (thisObj) => [thisObj.block, false, [thisObj.block]], - getExpectedJson: (thisObj) => ({type: 'drag', + getExpectedJson: (thisObj) => ({type: 'drag', group: '', isStart: false, blockId: thisObj.block.id, blocks: [thisObj.block]})}, {title: 'null to Block Marker move', class: Blockly.Events.MarkerMove, getArgs: (thisObj) => [thisObj.block, true, null, new ASTNode(ASTNode.types.BLOCK, thisObj.block)], - getExpectedJson: (thisObj) => ({type: 'marker_move', - isCursor: true, blockId: thisObj.block.id, oldNode: null, + getExpectedJson: (thisObj) => ({type: 'marker_move', group: '', + isCursor: true, blockId: thisObj.block.id, oldNode: undefined, newNode: new ASTNode(ASTNode.types.BLOCK, thisObj.block)})}, {title: 'null to Workspace Marker move', class: Blockly.Events.MarkerMove, getArgs: (thisObj) => [null, true, null, ASTNode.createWorkspaceNode(thisObj.workspace, new Blockly.utils.Coordinate(0, 0))], - getExpectedJson: (thisObj) => ({type: 'marker_move', - isCursor: true, blockId: null, oldNode: null, + getExpectedJson: (thisObj) => ({type: 'marker_move', group: '', + isCursor: true, blockId: undefined, oldNode: undefined, newNode: ASTNode.createWorkspaceNode(thisObj.workspace, new Blockly.utils.Coordinate(0, 0))})}, {title: 'Workspace to Block Marker move', @@ -391,7 +391,7 @@ suite('Events', function() { ASTNode.createWorkspaceNode(thisObj.workspace, new Blockly.utils.Coordinate(0, 0)), new ASTNode(ASTNode.types.BLOCK, thisObj.block)], - getExpectedJson: (thisObj) => ({type: 'marker_move', + getExpectedJson: (thisObj) => ({type: 'marker_move', group: '', isCursor: true, blockId: thisObj.block.id, oldNode: ASTNode.createWorkspaceNode(thisObj.workspace, new Blockly.utils.Coordinate(0, 0)), @@ -405,40 +405,39 @@ suite('Events', function() { new Blockly.utils.Coordinate(0, 0))]}, {title: 'Selected', class: Blockly.Events.Selected, getArgs: (thisObj) => [null, thisObj.block.id, thisObj.workspace.id], - getExpectedJson: (thisObj) => ({type: 'selected', oldElementId: null, + getExpectedJson: (thisObj) => ({type: 'selected', group: '', newElementId: thisObj.block.id})}, {title: 'Selected (deselect)', class: Blockly.Events.Selected, getArgs: (thisObj) => [thisObj.block.id, null, thisObj.workspace.id], - getExpectedJson: (thisObj) => ({type: 'selected', - oldElementId: thisObj.block.id, newElementId: null})}, + getExpectedJson: (thisObj) => ({type: 'selected', group: '', + oldElementId: thisObj.block.id})}, {title: 'Theme Change', class: Blockly.Events.ThemeChange, getArgs: (thisObj) => ['classic', thisObj.workspace.id], - getExpectedJson: () => ({type: 'theme_change', themeName: 'classic'})}, + getExpectedJson: () => ({type: 'theme_change', group: '', themeName: 'classic'})}, {title: 'Toolbox item select', class: Blockly.Events.ToolboxItemSelect, getArgs: (thisObj) => ['Math', 'Loops', thisObj.workspace.id], - getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: 'Math', + getExpectedJson: () => ({type: 'toolbox_item_select', group: '', oldItem: 'Math', newItem: 'Loops'})}, {title: 'Toolbox item select (no previous)', class: Blockly.Events.ToolboxItemSelect, getArgs: (thisObj) => [null, 'Loops', thisObj.workspace.id], - getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: null, + getExpectedJson: () => ({type: 'toolbox_item_select', group: '', newItem: 'Loops'})}, {title: 'Toolbox item select (deselect)', class: Blockly.Events.ToolboxItemSelect, getArgs: (thisObj) => ['Math', null, thisObj.workspace.id], - getExpectedJson: () => ({type: 'toolbox_item_select', oldItem: 'Math', - newItem: null})}, + getExpectedJson: () => ({type: 'toolbox_item_select', group: '', oldItem: 'Math'})}, {title: 'Trashcan open', class: Blockly.Events.TrashcanOpen, getArgs: (thisObj) => [true, thisObj.workspace.id], - getExpectedJson: () => ({type: 'trashcan_open', isOpen: true})}, + getExpectedJson: () => ({type: 'trashcan_open', group: '', isOpen: true})}, {title: 'Viewport change', class: Blockly.Events.ViewportChange, getArgs: (thisObj) => [2.666, 1.333, 1.2, thisObj.workspace.id, 1], - getExpectedJson: () => ({type: 'viewport_change', viewTop: 2.666, + getExpectedJson: () => ({type: 'viewport_change', group: '', viewTop: 2.666, viewLeft: 1.333, scale: 1.2, oldScale: 1})}, {title: 'Viewport change (0,0)', class: Blockly.Events.ViewportChange, getArgs: (thisObj) => [0, 0, 1.2, thisObj.workspace.id, 1], - getExpectedJson: () => ({type: 'viewport_change', viewTop: 0, + getExpectedJson: () => ({type: 'viewport_change', group: '', viewTop: 0, viewLeft: 0, scale: 1.2, oldScale: 1})}, ]; const blockEventTestCases = [ @@ -448,6 +447,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.block, 'collapsed', null, false, true], getExpectedJson: (thisObj) => ({ type: 'change', + group: '', blockId: thisObj.block.id, element: 'collapsed', oldValue: false, @@ -460,6 +460,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.block], getExpectedJson: (thisObj) => ({ type: 'create', + group: '', blockId: thisObj.block.id, xml: '' + @@ -479,6 +480,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.shadowBlock], getExpectedJson: (thisObj) => ({ type: 'create', + group: '', blockId: thisObj.shadowBlock.id, xml: '' + @@ -499,6 +501,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.block], getExpectedJson: (thisObj) => ({ type: 'delete', + group: '', blockId: thisObj.block.id, oldXml: '' + @@ -519,6 +522,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.shadowBlock], getExpectedJson: (thisObj) => ({ type: 'delete', + group: '', blockId: thisObj.shadowBlock.id, oldXml: '' + @@ -541,6 +545,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.block], getExpectedJson: (thisObj) => ({ type: 'move', + group: '', blockId: thisObj.block.id, }), }, @@ -550,6 +555,7 @@ suite('Events', function() { getArgs: (thisObj) => [thisObj.shadowBlock], getExpectedJson: (thisObj) => ({ type: 'move', + group: '', blockId: thisObj.shadowBlock.id, recordUndo: false, }), @@ -558,29 +564,25 @@ suite('Events', function() { const workspaceEventTestCases = [ {title: 'Finished Loading', class: Blockly.Events.FinishedLoading, getArgs: (thisObj) => [thisObj.workspace], - getExpectedJson: (thisObj) => ({type: 'finished_loading', + getExpectedJson: (thisObj) => ({type: 'finished_loading', group: '', workspaceId: thisObj.workspace.id})}, ]; const workspaceCommentEventTestCases = [ {title: 'Comment change', class: Blockly.Events.CommentChange, getArgs: (thisObj) => [thisObj.comment, 'bar', 'foo'], - getExpectedJson: (thisObj) => ({type: 'comment_change', + getExpectedJson: (thisObj) => ({type: 'comment_change', group: '', commentId: thisObj.comment.id, oldContents: 'bar', newContents: 'foo'})}, {title: 'Comment create', class: Blockly.Events.CommentCreate, getArgs: (thisObj) => [thisObj.comment], - getExpectedJson: (thisObj) => ({type: 'comment_create', + getExpectedJson: (thisObj) => ({type: 'comment_create', group: '', commentId: thisObj.comment.id, xml: Blockly.Xml.domToText(thisObj.comment.toXmlWithXY())})}, {title: 'Comment delete', class: Blockly.Events.CommentDelete, getArgs: (thisObj) => [thisObj.comment], - getExpectedJson: (thisObj) => ({type: 'comment_delete', + getExpectedJson: (thisObj) => ({type: 'comment_delete', group: '', commentId: thisObj.comment.id})}, // TODO(#4577) Test serialization of move event coordinate properties. - {title: 'Comment move', class: Blockly.Events.CommentMove, - getArgs: (thisObj) => [thisObj.comment], - getExpectedJson: (thisObj) => ({type: 'comment_move', - commentId: thisObj.comment.id, oldCoordinate: '0,0'})}, ]; const testSuites = [ {title: 'Variable events', testCases: variableEventTestCases, @@ -669,7 +671,7 @@ suite('Events', function() { suite('Constructors', function() { test('Var base', function() { const event = new Blockly.Events.VarBase(this.variable); - assertEventEquals(event, undefined, this.workspace.id, undefined, { + assertEventEquals(event, '', this.workspace.id, undefined, { 'varId': 'id1', 'recordUndo': true, 'group': '', @@ -996,10 +998,6 @@ suite('Events', function() { this.eventsFireSpy, 0, Blockly.Events.BlockDelete, {oldXml: expectedOldXml, group: ''}, workspaceSvg.id, expectedId); - assertNthCallEventArgEquals( - changeListenerSpy, 0, Blockly.Events.BlockDelete, - {oldXml: expectedOldXml, group: ''}, - workspaceSvg.id, expectedId); // Expect the workspace to not have a variable with ID 'test_block_id'. chai.assert.isNull(this.workspace.getVariableById(TEST_BLOCK_ID)); diff --git a/tests/mocha/extensions_test.js b/tests/mocha/extensions_test.js index 6c2873ff1f5..d848b21e6ed 100644 --- a/tests/mocha/extensions_test.js +++ b/tests/mocha/extensions_test.js @@ -4,9 +4,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.extensions'); +goog.declareModuleId('Blockly.test.extensions'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Extensions', function() { diff --git a/tests/mocha/field_angle_test.js b/tests/mocha/field_angle_test.js index 1639eb206fd..172b0eeba03 100644 --- a/tests/mocha/field_angle_test.js +++ b/tests/mocha/field_angle_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldAngle'); +goog.declareModuleId('Blockly.test.fieldAngle'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Angle Fields', function() { @@ -111,9 +112,9 @@ suite('Angle Fields', function() { suite('Validators', function() { setup(function() { this.field = new Blockly.FieldAngle(1); - this.field.htmlInput_ = Object.create(null); - this.field.htmlInput_.oldValue_ = '1'; - this.field.htmlInput_.untypedDefaultValue_ = 1; + this.field.htmlInput_ = document.createElement('input'); + this.field.htmlInput_.setAttribute('data-old-value', '1'); + this.field.htmlInput_.setAttribute('data-untyped-default-value', '1'); this.stub = sinon.stub(this.field, 'resizeEditor_'); }); teardown(function() { diff --git a/tests/mocha/field_checkbox_test.js b/tests/mocha/field_checkbox_test.js index 5de5659849a..60a95430cc6 100644 --- a/tests/mocha/field_checkbox_test.js +++ b/tests/mocha/field_checkbox_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldCheckbox'); +goog.declareModuleId('Blockly.test.fieldCheckbox'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {defineRowBlock} from './test_helpers/block_definitions.js'; suite('Checkbox Fields', function() { diff --git a/tests/mocha/field_colour_test.js b/tests/mocha/field_colour_test.js index eb0389702a5..bf7c00f1a7e 100644 --- a/tests/mocha/field_colour_test.js +++ b/tests/mocha/field_colour_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldColour'); +goog.declareModuleId('Blockly.test.fieldColour'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Colour Fields', function() { diff --git a/tests/mocha/field_dropdown_test.js b/tests/mocha/field_dropdown_test.js index 1b67525f442..b16303eaf25 100644 --- a/tests/mocha/field_dropdown_test.js +++ b/tests/mocha/field_dropdown_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldDropdown'); +goog.declareModuleId('Blockly.test.fieldDropdown'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Dropdown Fields', function() { diff --git a/tests/mocha/field_image_test.js b/tests/mocha/field_image_test.js index 62826398a70..2e7cfb5da48 100644 --- a/tests/mocha/field_image_test.js +++ b/tests/mocha/field_image_test.js @@ -4,10 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldImage'); +goog.declareModuleId('Blockly.test.fieldImage'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Image Fields', function() { @@ -22,7 +23,6 @@ suite('Image Fields', function() { * @type {!Array} */ const invalidValueTestCases = [ - {title: 'Undefined Src', value: undefined, args: [undefined, 1, 1]}, {title: 'Undefined Size', value: 'src', args: ['src', undefined, undefined]}, {title: 'Zero Size', value: 'src', args: ['src', 0, 0]}, {title: 'Non-Parsable String for Size', value: 'src', args: ['src', 'bad', 'bad']}, diff --git a/tests/mocha/field_label_serializable_test.js b/tests/mocha/field_label_serializable_test.js index b5ba42824a2..928f0aa6622 100644 --- a/tests/mocha/field_label_serializable_test.js +++ b/tests/mocha/field_label_serializable_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldLabelSerialization'); +goog.declareModuleId('Blockly.test.fieldLabelSerialization'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; suite('Label Serializable Fields', function() { diff --git a/tests/mocha/field_label_test.js b/tests/mocha/field_label_test.js index 62f088b9617..88a18cd1fe6 100644 --- a/tests/mocha/field_label_test.js +++ b/tests/mocha/field_label_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldLabel'); +goog.declareModuleId('Blockly.test.fieldLabel'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {createTestBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {createTestBlock} from './test_helpers/block_definitions.js'; suite('Label Fields', function() { diff --git a/tests/mocha/field_multilineinput_test.js b/tests/mocha/field_multilineinput_test.js index 6096384fe08..594dc863d1f 100644 --- a/tests/mocha/field_multilineinput_test.js +++ b/tests/mocha/field_multilineinput_test.js @@ -4,12 +4,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldMultiline'); +goog.declareModuleId('Blockly.test.fieldMultiline'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {runCodeGenerationTestSuites} = goog.require('Blockly.test.helpers.codeGeneration'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {runCodeGenerationTestSuites} from './test_helpers/code_generation.js'; +const {dartGenerator} = goog.require('Blockly.Dart'); +const {javascriptGenerator} = goog.require('Blockly.JavaScript'); +const {luaGenerator} = goog.require('Blockly.Lua'); +const {phpGenerator} = goog.require('Blockly.PHP'); +const {pythonGenerator} = goog.require('Blockly.Python'); suite('Multiline Input Fields', function() { @@ -123,35 +129,35 @@ suite('Multiline Input Fields', function() { * @type {Array} */ const testSuites = [ - {title: 'Dart', generator: Blockly.Dart, + {title: 'Dart', generator: dartGenerator, testCases: [ {title: 'Empty string', expectedCode: '\'\'', createBlock: createBlockFn('')}, {title: 'String with newline', expectedCode: '\'bark bark\' + \'\\n\' + \n\' bark bark bark\' + \'\\n\' + \n\' bark bar bark bark\' + \'\\n\' + \n\'\'', createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, ]}, - {title: 'JavaScript', generator: Blockly.JavaScript, + {title: 'JavaScript', generator: javascriptGenerator, testCases: [ {title: 'Empty string', expectedCode: '\'\'', createBlock: createBlockFn('')}, {title: 'String with newline', expectedCode: '\'bark bark\' + \'\\n\' +\n\' bark bark bark\' + \'\\n\' +\n\' bark bar bark bark\' + \'\\n\' +\n\'\'', createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, ]}, - {title: 'Lua', generator: Blockly.Lua, + {title: 'Lua', generator: luaGenerator, testCases: [ {title: 'Empty string', expectedCode: '\'\'', createBlock: createBlockFn('')}, {title: 'String with newline', expectedCode: '\'bark bark\' .. \'\\n\' ..\n\' bark bark bark\' .. \'\\n\' ..\n\' bark bar bark bark\' .. \'\\n\' ..\n\'\'', createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, ]}, - {title: 'PHP', generator: Blockly.PHP, + {title: 'PHP', generator: phpGenerator, testCases: [ {title: 'Empty string', expectedCode: '\'\'', createBlock: createBlockFn('')}, {title: 'String with newline', expectedCode: '\'bark bark\' . "\\n" .\n\' bark bark bark\' . "\\n" .\n\' bark bar bark bark\' . "\\n" .\n\'\'', createBlock: createBlockFn('bark bark\n bark bark bark\n bark bar bark bark\n')}, ]}, - {title: 'Python', generator: Blockly.Python, + {title: 'Python', generator: pythonGenerator, testCases: [ {title: 'Empty string', expectedCode: '\'\'', createBlock: createBlockFn('')}, diff --git a/tests/mocha/field_number_test.js b/tests/mocha/field_number_test.js index fd23cc6613e..10176cf223f 100644 --- a/tests/mocha/field_number_test.js +++ b/tests/mocha/field_number_test.js @@ -4,12 +4,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldNumber'); +goog.declareModuleId('Blockly.test.fieldNumber'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {runTestCases} = goog.require('Blockly.test.helpers.common'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {runTestCases} from './test_helpers/common.js'; suite('Number Fields', function() { @@ -187,9 +188,9 @@ suite('Number Fields', function() { suite('Validators', function() { setup(function() { this.field = new Blockly.FieldNumber(1); - this.field.htmlInput_ = Object.create(null); - this.field.htmlInput_.oldValue_ = '1'; - this.field.htmlInput_.untypedDefaultValue_ = 1; + this.field.htmlInput_ = document.createElement('input'); + this.field.htmlInput_.setAttribute('data-old-value', '1'); + this.field.htmlInput_.setAttribute('data-untyped-default-value', '1'); this.stub = sinon.stub(this.field, 'resizeEditor_'); }); teardown(function() { diff --git a/tests/mocha/field_registry_test.js b/tests/mocha/field_registry_test.js index 39408136561..7c2378d3900 100644 --- a/tests/mocha/field_registry_test.js +++ b/tests/mocha/field_registry_test.js @@ -4,10 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldRegistry'); +goog.declareModuleId('Blockly.test.fieldRegistry'); -const {createDeprecationWarningStub} = goog.require('Blockly.test.helpers.warnings'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {createDeprecationWarningStub} from './test_helpers/warnings.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Field Registry', function() { diff --git a/tests/mocha/field_test.js b/tests/mocha/field_test.js index 4d1887aa07f..ca5cad5f578 100644 --- a/tests/mocha/field_test.js +++ b/tests/mocha/field_test.js @@ -4,10 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldTest'); +goog.declareModuleId('Blockly.test.fieldTest'); -const {addBlockTypeToCleanup, addMessageToCleanup, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {createDeprecationWarningStub} = goog.require('Blockly.test.helpers.warnings'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {addBlockTypeToCleanup, addMessageToCleanup, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {createDeprecationWarningStub} from './test_helpers/warnings.js'; suite('Abstract Fields', function() { diff --git a/tests/mocha/field_textinput_test.js b/tests/mocha/field_textinput_test.js index efd01d70223..f37e6d8859d 100644 --- a/tests/mocha/field_textinput_test.js +++ b/tests/mocha/field_textinput_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldTextInput'); +goog.declareModuleId('Blockly.test.fieldTextInput'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; suite('Text Input Fields', function() { @@ -105,9 +106,9 @@ suite('Text Input Fields', function() { suite('Validators', function() { setup(function() { this.field = new Blockly.FieldTextInput('value'); - this.field.htmlInput_ = Object.create(null); - this.field.htmlInput_.oldValue_ = 'value'; - this.field.htmlInput_.untypedDefaultValue_ = 'value'; + this.field.htmlInput_ = document.createElement('input'); + this.field.htmlInput_.setAttribute('data-old-value', 'value'); + this.field.htmlInput_.setAttribute('data-untyped-default-value', 'value'); this.stub = sinon.stub(this.field, 'resizeEditor_'); }); teardown(function() { diff --git a/tests/mocha/field_variable_test.js b/tests/mocha/field_variable_test.js index 2eafb6f42bb..5872f12bc71 100644 --- a/tests/mocha/field_variable_test.js +++ b/tests/mocha/field_variable_test.js @@ -4,11 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.fieldVariable'); +goog.declareModuleId('Blockly.test.fieldVariable'); -const {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} = goog.require('Blockly.test.helpers.fields'); -const {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {createTestBlock, defineRowBlock} = goog.require('Blockly.test.helpers.blockDefinitions'); +import * as Blockly from '../../build/src/core/blockly.js'; +import {assertFieldValue, runConstructorSuiteTests, runFromJsonSuiteTests, runSetValueTests} from './test_helpers/fields.js'; +import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {createTestBlock, defineRowBlock} from './test_helpers/block_definitions.js'; suite('Variable Fields', function() { @@ -18,7 +19,7 @@ suite('Variable Fields', function() { sharedTestSetup.call(this); this.workspace = new Blockly.Workspace(); // Stub for default variable name. - sinon.stub(Blockly.Variables, 'generateUniqueName').returns( + sinon.stub(Blockly.Variables.TEST_ONLY, 'generateUniqueNameInternal').returns( FAKE_VARIABLE_NAME); }); teardown(function() { diff --git a/tests/mocha/flyout_test.js b/tests/mocha/flyout_test.js index 8fbc38659e0..40c584281be 100644 --- a/tests/mocha/flyout_test.js +++ b/tests/mocha/flyout_test.js @@ -4,10 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.flyout'); +goog.declareModuleId('Blockly.test.flyout'); -const {defineStackBlock, sharedTestSetup, sharedTestTeardown, workspaceTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); -const {getBasicToolbox, getChildItem, getCollapsibleItem, getDeeplyNestedJSON, getInjectedToolbox, getNonCollapsibleItem, getProperSimpleJson, getSeparator, getSimpleJson, getXmlArray} = goog.require('Blockly.test.helpers.toolboxDefinitions'); +import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {defineStackBlock} from './test_helpers/block_definitions.js'; +import {getBasicToolbox, getChildItem, getCollapsibleItem, getDeeplyNestedJSON, getInjectedToolbox, getNonCollapsibleItem, getProperSimpleJson, getSeparator, getSimpleJson, getXmlArray} from './test_helpers/toolbox_definitions.js'; suite('Flyout', function() { diff --git a/tests/mocha/generator_test.js b/tests/mocha/generator_test.js index 4167d44f664..321d5f1cb8f 100644 --- a/tests/mocha/generator_test.js +++ b/tests/mocha/generator_test.js @@ -4,14 +4,15 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.generator'); +goog.declareModuleId('Blockly.test.generator'); -goog.require('Blockly.Dart'); -goog.require('Blockly.JavaScript'); -goog.require('Blockly.Lua'); -goog.require('Blockly.PHP'); -goog.require('Blockly.Python'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import * as Blockly from '../../build/src/core/blockly.js'; +const {dartGenerator} = goog.require('Blockly.Dart'); +const {javascriptGenerator} = goog.require('Blockly.JavaScript'); +const {luaGenerator} = goog.require('Blockly.Lua'); +const {phpGenerator} = goog.require('Blockly.PHP'); +const {pythonGenerator} = goog.require('Blockly.Python'); +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Generator', function() { @@ -83,11 +84,11 @@ suite('Generator', function() { }); const testCase = [ - [Blockly.Dart, 'Dart'], - [Blockly.JavaScript, 'JavaScript'], - [Blockly.Lua, 'Lua'], - [Blockly.PHP, 'PHP'], - [Blockly.Python, 'Python']]; + [dartGenerator, 'Dart'], + [javascriptGenerator, 'JavaScript'], + [luaGenerator, 'Lua'], + [phpGenerator, 'PHP'], + [pythonGenerator, 'Python']]; suite('Trivial', function() { testCase.forEach(function(testCase) { diff --git a/tests/mocha/gesture_test.js b/tests/mocha/gesture_test.js index 6e21287ded2..1ee0c75ca3e 100644 --- a/tests/mocha/gesture_test.js +++ b/tests/mocha/gesture_test.js @@ -4,13 +4,13 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.module('Blockly.test.gesture'); +goog.declareModuleId('Blockly.test.gesture'); -const {assertEventFired, assertEventNotFired} = goog.require('Blockly.test.helpers.events'); -const {defineBasicBlockWithField} = goog.require('Blockly.test.helpers.blockDefinitions'); -const {dispatchPointerEvent} = goog.require('Blockly.test.helpers.userInput'); -const eventUtils = goog.require('Blockly.Events.utils'); -const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +import {assertEventFired, assertEventNotFired} from './test_helpers/events.js'; +import {defineBasicBlockWithField} from './test_helpers/block_definitions.js'; +import {dispatchPointerEvent} from './test_helpers/user_input.js'; +import * as eventUtils from '../../build/src/core/events/utils.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Gesture', function() { @@ -38,7 +38,7 @@ suite('Gesture', function() { assertEventFired(eventsFireStub, Blockly.Events.Selected, - {oldElementId: null, newElementId: block.id, type: eventUtils.SELECTED}, fieldWorkspace.id); + {newElementId: block.id, type: eventUtils.SELECTED}, fieldWorkspace.id); assertEventNotFired(eventsFireStub, Blockly.Events.Click, {type: eventUtils.CLICK}); } @@ -61,7 +61,7 @@ suite('Gesture', function() { const e = {id: 'dummy_test_event'}; const gesture = new Blockly.Gesture(e, this.workspace); chai.assert.equal(gesture.mostRecentEvent_, e); - chai.assert.equal(gesture.creatorWorkspace_, this.workspace); + chai.assert.equal(gesture.creatorWorkspace, this.workspace); }); test('Field click - Click in workspace', function() { diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 27edd9d6aa8..0c58062447e 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -5,9 +5,6 @@ Mocha Tests for Blockly - - - - +

    Blockly Multi Playground

    diff --git a/tests/node/run_node_test.js b/tests/node/run_node_test.js index 69d095d51b9..bea22c32b4d 100644 --- a/tests/node/run_node_test.js +++ b/tests/node/run_node_test.js @@ -10,6 +10,7 @@ const assert = require('chai').assert; const Blockly = require('../../dist/'); +const {javascriptGenerator} = require('../../dist/javascript'); const xmlText = '\n' + ' \n' + @@ -48,7 +49,7 @@ suite('Test Node.js', function() { Blockly.Xml.domToWorkspace(xml, workspace); // Convert code - const code = Blockly.JavaScript.workspaceToCode(workspace); + const code = javascriptGenerator.workspaceToCode(workspace); // Check output assert.equal('window.alert(\'Hello from Blockly!\');', code.trim(), 'equal'); diff --git a/tests/playground.html b/tests/playground.html index 7a555392fb8..89f836055dd 100644 --- a/tests/playground.html +++ b/tests/playground.html @@ -4,15 +4,23 @@ Blockly Playground - - - - + + + diff --git a/tests/playgrounds/advanced_playground.html b/tests/playgrounds/advanced_playground.html index 1510555b71e..2d66c42169f 100644 --- a/tests/playgrounds/advanced_playground.html +++ b/tests/playgrounds/advanced_playground.html @@ -3,15 +3,23 @@ Advanced Blockly Playground - - - - - + + + `); - document.write(``); - document.write(``); - document.write( - ``); - document.write(``); -} else { - document.write( - ``); - document.write(``); - document.write(``); - document.write(``); - document.write(``); - document.write(``); - document.write(``); - document.write(``); -} -})(); diff --git a/tests/playgrounds/prepare.js b/tests/playgrounds/prepare.js deleted file mode 100644 index d428b952410..00000000000 --- a/tests/playgrounds/prepare.js +++ /dev/null @@ -1,99 +0,0 @@ -/** - * @license - * Copyright 2021 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * @fileoverview Load this file in a '); - // Load dependency graph info from test/deps.js. To update - // deps.js, run `npm run build:deps`. - document.write(''); - - // Msg loading kludge. This should go away once #5409 and/or - // #1895 are fixed. - - // Load messages into a temporary Blockly.Msg object, deleting it - // afterwards (after saving the messages!) - window.Blockly = {Msg: Object.create(null)}; - document.write(''); - document.write(` - `); - - document.write(` - `); - } else { - // The below code is necessary for a few reasons: - // - We need an absolute path instead of relative path because the - // advanced_playground the and regular playground are in different folders. - // - We need to get the root directory for blockly because it is - // different for github.io, appspot and local. - const files = [ - 'blockly_compressed.js', - 'msg/messages.js', - 'blocks_compressed.js', - 'dart_compressed.js', - 'javascript_compressed.js', - 'lua_compressed.js', - 'php_compressed.js', - 'python_compressed.js', - ]; - - // We need to load Blockly in compiled mode. - const hostName = window.location.host.replaceAll('.', '\\.'); - const matches = new RegExp(hostName + '\\/(.*)tests').exec(window.location.href); - const root = matches && matches[1] ? matches[1] : ''; - - // Load blockly_compressed.js et al. using '); - } - } -})(); diff --git a/tests/playgrounds/screenshot.js b/tests/playgrounds/screenshot.js index 59d0594e280..6b2b22e3e4a 100644 --- a/tests/playgrounds/screenshot.js +++ b/tests/playgrounds/screenshot.js @@ -91,6 +91,7 @@ function workspaceToSvg_(workspace, callback, customCss) { svgToPng_(data, width, height, callback); } +/* eslint-disable no-unused-vars */ /** * Download a screenshot of the blocks on a Blockly workspace. * @param {!Blockly.WorkspaceSvg} workspace The Blockly workspace. @@ -106,3 +107,4 @@ function downloadScreenshot(workspace) { a.parentNode.removeChild(a); }); } +/* eslint-enable */ diff --git a/tests/rendering/svg_paths.html b/tests/rendering/svg_paths.html deleted file mode 100644 index fe415c2f69b..00000000000 --- a/tests/rendering/svg_paths.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - SVG Path Playground - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/rendering/zelos/README.md b/tests/rendering/zelos/README.md deleted file mode 100644 index d8cf459dfe1..00000000000 --- a/tests/rendering/zelos/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Zelos Rendering / PXT-Blockly Comparison Playground - -## Dependencies -``` -npm install -g http-server -``` - -## Running the Playground: - -In Blockly's root directory, run: -``` -http-server ./ -``` - -and browse to: -``` -http://127.0.0.1:8080/tests/rendering/zelos -``` - diff --git a/tests/rendering/zelos/index.html b/tests/rendering/zelos/index.html deleted file mode 100644 index 4516b79be8e..00000000000 --- a/tests/rendering/zelos/index.html +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - -
    -
    -
    -

    Zelos Rendering

    -
    -
    -

    PXT-Blockly Rendering

    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -

    Zelos Rendering

    - -
    -
    -

    PXT-Blockly Rendering

    - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/pxtblockly.html b/tests/rendering/zelos/pxtblockly.html deleted file mode 100644 index d3aa9dffef8..00000000000 --- a/tests/rendering/zelos/pxtblockly.html +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/pxtblockly/index.html b/tests/rendering/zelos/pxtblockly/index.html deleted file mode 100644 index 6a53da07292..00000000000 --- a/tests/rendering/zelos/pxtblockly/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - - Scratch-Blocks - -
    -
    -
    -

    Zelos Rendering

    -
    -
    -

    PXT-Blockly Rendering

    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -

    Zelos Rendering

    - -
    -
    -

    PXT-Blockly Rendering

    - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/pxtblockly/pxtblockly.html b/tests/rendering/zelos/pxtblockly/pxtblockly.html deleted file mode 100644 index 8ee2e956087..00000000000 --- a/tests/rendering/zelos/pxtblockly/pxtblockly.html +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/pxtblockly/zelos.html b/tests/rendering/zelos/pxtblockly/zelos.html deleted file mode 100644 index 4568ba25ec5..00000000000 --- a/tests/rendering/zelos/pxtblockly/zelos.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/scratchblocks/index.html b/tests/rendering/zelos/scratchblocks/index.html deleted file mode 100644 index 9814d5eaf20..00000000000 --- a/tests/rendering/zelos/scratchblocks/index.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - - - - - PXT-Blockly - -
    -
    -
    -

    Zelos Rendering

    -
    -
    -

    Scratch-Blocks Rendering

    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -

    Zelos Rendering

    - -
    -
    -

    Scratch-Blocks Rendering

    - -
    -
    -
    -
    - - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/scratchblocks/scratchblocks.html b/tests/rendering/zelos/scratchblocks/scratchblocks.html deleted file mode 100644 index 801123097b1..00000000000 --- a/tests/rendering/zelos/scratchblocks/scratchblocks.html +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/scratchblocks/zelos.html b/tests/rendering/zelos/scratchblocks/zelos.html deleted file mode 100644 index 877c4f4cb8a..00000000000 --- a/tests/rendering/zelos/scratchblocks/zelos.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/rendering/zelos/zelos.html b/tests/rendering/zelos/zelos.html deleted file mode 100644 index 13b6f06c5e2..00000000000 --- a/tests/rendering/zelos/zelos.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - -
    - - - - \ No newline at end of file diff --git a/tests/run_all_tests.sh b/tests/run_all_tests.sh index 1d169be4f89..36ae667b778 100755 --- a/tests/run_all_tests.sh +++ b/tests/run_all_tests.sh @@ -58,10 +58,6 @@ fi # closure compiler warnings / errors. run_test_command "build-debug" "npm run build-debug" -# Generate TypeScript typings and ensure there are no errors. -# TODO(5621): Re-enable this test once typings generation is fixed. -# run_test_command "typings" "npm run typings" - # Run renaming validation test. run_test_command "renamings" "tests/migration/validate-renamings.js" diff --git a/tests/scripts/check_metadata.sh b/tests/scripts/check_metadata.sh index 7bf9e38e2b2..3e881f5660c 100755 --- a/tests/scripts/check_metadata.sh +++ b/tests/scripts/check_metadata.sh @@ -29,7 +29,10 @@ readonly BUILD_DIR='build' # Q3 2021 6.20210701.0 808807 (late-quarter goog.module conversion) # Q4 2021 7.20211209.0-beta.0 920002 # Q4 2021 7.20211209.0 929665 -readonly BLOCKLY_SIZE_EXPECTED=929665 +# Q2 2022 8.0.0 928056 +# Q3 2022 8.0.0 1040413 (mid-quarter typescript conversion) +# Q4 2022 8.0.0 870104 +readonly BLOCKLY_SIZE_EXPECTED=870104 # Size of blocks_compressed.js # Q2 2019 2.20190722.0 75618 @@ -44,7 +47,10 @@ readonly BLOCKLY_SIZE_EXPECTED=929665 # Q3 2021 6.20210701.0 76669 # Q4 2021 7.20211209.0-beta.0 82054 # Q4 2021 7.20211209.0 86966 -readonly BLOCKS_SIZE_EXPECTED=86966 +# Q2 2022 8.0.0 90769 +# Q3 2022 8.0.0 102176 (mid-quarter typescript conversion) +# Q4 2022 8.0.0 102213 +readonly BLOCKS_SIZE_EXPECTED=102213 # Size of blockly_compressed.js.gz # Q2 2019 2.20190722.0 180925 @@ -60,7 +66,10 @@ readonly BLOCKS_SIZE_EXPECTED=86966 # Q3 2021 6.20210701.0 152025 (late-quarter goog.module conversion) # Q4 2021 7.20211209.0-beta.0 169863 # Q4 2021 7.20211209.0 171759 -readonly BLOCKLY_GZ_SIZE_EXPECTED=171759 +# Q2 2022 8.0.0 173997 +# Q3 2022 8.0.0 185766 (mid-quarter typescript conversion) +# Q4 2022 8.0.0 175140 +readonly BLOCKLY_GZ_SIZE_EXPECTED=175140 # Size of blocks_compressed.js.gz # Q2 2019 2.20190722.0 14552 @@ -75,7 +84,10 @@ readonly BLOCKLY_GZ_SIZE_EXPECTED=171759 # Q3 2021 6.20210701.0 15284 # Q4 2021 7.20211209.0-beta.0 16616 # Q4 2021 7.20211209.0 15760 -readonly BLOCKS_GZ_SIZE_EXPECTED=15760 +# Q2 2022 8.0.0 16192 +# Q3 2022 8.0.0 17016 (mid-quarter typescript conversion) +# Q4 2022 8.0.0 17188 +readonly BLOCKS_GZ_SIZE_EXPECTED=17188 # ANSI colors readonly BOLD_GREEN='\033[1;32m' diff --git a/tests/scripts/update_metadata.sh b/tests/scripts/update_metadata.sh index c6afc8ad00d..19a201ca96a 100755 --- a/tests/scripts/update_metadata.sh +++ b/tests/scripts/update_metadata.sh @@ -3,13 +3,19 @@ # Determines the size of generated files and updates check_metadata.sh to # reflect the new values. -gzip -k build/blockly_compressed.js -gzip -k build/blocks_compressed.js - -blockly_size=$(wc -c < "build/blockly_compressed.js") -blocks_size=$(wc -c < "build/blocks_compressed.js") -blockly_gz_size=$(wc -c < "build/blockly_compressed.js.gz") -blocks_gz_size=$(wc -c < "build/blocks_compressed.js.gz") +# Location of the pre-built compressed files. +# +# (TODO(#5007): Should fetch this from scripts/gulpfiles/config.js +# instead of hardcoding it here. +readonly BUILD_DIR='build' + +gzip -k "${BUILD_DIR}/blockly_compressed.js" +gzip -k "${BUILD_DIR}/blocks_compressed.js" + +blockly_size=$(wc -c < "${BUILD_DIR}/blockly_compressed.js") +blocks_size=$(wc -c < "${BUILD_DIR}/blocks_compressed.js") +blockly_gz_size=$(wc -c < "${BUILD_DIR}/blockly_compressed.js.gz") +blocks_gz_size=$(wc -c < "${BUILD_DIR}/blocks_compressed.js.gz") quarters=(1 1 1 2 2 2 3 3 3 4 4 4) month=$(date +%-m) quarter=$(echo Q${quarters[$month - 1]} $(date +%Y)) @@ -35,4 +41,4 @@ replacement+="readonly BLOCKS_GZ_SIZE_EXPECTED=${blocks_gz_size}" sed -ri.bak "s/readonly BLOCKS_GZ_SIZE_EXPECTED=[0-9]+/${replacement}/g" \ tests/scripts/check_metadata.sh -rm tests/scripts/check_metadata.sh.bak \ No newline at end of file +rm tests/scripts/check_metadata.sh.bak diff --git a/tsconfig.json b/tsconfig.json index 88c95700b9e..a414b74e8d8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,30 @@ { "include": [ - "core/**/*", - "closure/goog/base_minimal.js", + "core/**/*", // N.B.: also pulls in closure/goog/goog.js if needed. + "closure/**/*", // Just for ouptut directory structure. + ], + "exclude": [ + "core/blockly.js" ], "compilerOptions": { // Tells TypeScript to read JS files, as // normally they are ignored as source files "allowJs": true, - // Enable the next few options for type declarations. - // Generate d.ts files - //"declaration": true, - // Types should go into this directory. - // Removing this would place the .d.ts files - // next to the .js files - //"declarationDir": "build/ts/declarations", + // Generate d.ts files and sourcemaps. + "declaration": true, + // Generate declaration maps used for api-extractor + "declarationMap": true, + "sourceMap": true, - "outDir": "build/ts", "module": "ES2015", "moduleResolution": "node", "target": "ES2020", "strict": true, + + // This does not understand enums only used to define other enums, so we + // cannot leave it enabled. + // See: https://github.com/microsoft/TypeScript/issues/49974 + // "importsNotUsedAsValues": "error" } } diff --git a/tsdoc.json b/tsdoc.json new file mode 100644 index 00000000000..92bab41924a --- /dev/null +++ b/tsdoc.json @@ -0,0 +1,40 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + // Include the definitions that are required for API Extractor + "extends": ["@microsoft/api-extractor/extends/tsdoc-base.json"], + "tagDefinitions": [ + { + "tagName": "@alias", + "syntaxKind": "block" + }, + { + "tagName": "@define", + "syntaxKind": "block" + }, + { + "tagName": "@license", + "syntaxKind": "block" + }, + { + "tagName": "@nocollapse", + "syntaxKind": "modifier" + }, + { + "tagName": "@suppress", + "syntaxKind": "block" + }, + { + "tagName": "@unrestricted", + "syntaxKind": "modifier" + } + ], + + "supportForTags": { + "@alias": true, + "@define": true, + "@license": true, + "@nocollapse": true, + "@suppress": true, + "@unrestricted": true + } +} \ No newline at end of file diff --git a/typings/blockly.d.ts b/typings/blockly.d.ts deleted file mode 100644 index 48988290fdd..00000000000 --- a/typings/blockly.d.ts +++ /dev/null @@ -1,26127 +0,0 @@ -declare module "core/utils/colour" { - /** - * Get the richness of block colours, regardless of the hue. - * @alias Blockly.utils.colour.getHsvSaturation - * @return {number} The current richness. - * @package - */ - export function getHsvSaturation(): number; - /** - * Set the richness of block colours, regardless of the hue. - * @param {number} newSaturation The new richness, in the range of 0 - * (inclusive) to 1 (exclusive) - * @alias Blockly.utils.colour.setHsvSaturation - * @package - */ - export function setHsvSaturation(newSaturation: number): void; - /** - * Get the intensity of block colours, regardless of the hue. - * @alias Blockly.utils.colour.getHsvValue - * @return {number} The current intensity. - * @package - */ - export function getHsvValue(): number; - /** - * Set the intensity of block colours, regardless of the hue. - * @param {number} newValue The new intensity, in the range of 0 - * (inclusive) to 1 (exclusive) - * @alias Blockly.utils.colour.setHsvValue - * @package - */ - export function setHsvValue(newValue: number): void; - /** - * Parses a colour from a string. - * .parse('red') -> '#ff0000' - * .parse('#f00') -> '#ff0000' - * .parse('#ff0000') -> '#ff0000' - * .parse('0xff0000') -> '#ff0000' - * .parse('rgb(255, 0, 0)') -> '#ff0000' - * @param {string|number} str Colour in some CSS format. - * @return {?string} A string containing a hex representation of the colour, - * or null if can't be parsed. - * @alias Blockly.utils.colour.parse - */ - export function parse(str: string | number): string | null; - /** - * Converts a colour from RGB to hex representation. - * @param {number} r Amount of red, int between 0 and 255. - * @param {number} g Amount of green, int between 0 and 255. - * @param {number} b Amount of blue, int between 0 and 255. - * @return {string} Hex representation of the colour. - * @alias Blockly.utils.colour.rgbToHex - */ - export function rgbToHex(r: number, g: number, b: number): string; - /** - * Converts a colour to RGB. - * @param {string} colour String representing colour in any - * colour format ('#ff0000', 'red', '0xff000', etc). - * @return {!Array} RGB representation of the colour. - * @alias Blockly.utils.colour.hexToRgb - */ - export function hexToRgb(colour: string): Array; - /** - * Converts an HSV triplet to hex representation. - * @param {number} h Hue value in [0, 360]. - * @param {number} s Saturation value in [0, 1]. - * @param {number} v Brightness in [0, 255]. - * @return {string} Hex representation of the colour. - * @alias Blockly.utils.colour.hsvToHex - */ - export function hsvToHex(h: number, s: number, v: number): string; - /** - * Blend two colours together, using the specified factor to indicate the - * weight given to the first colour. - * @param {string} colour1 First colour. - * @param {string} colour2 Second colour. - * @param {number} factor The weight to be given to colour1 over colour2. - * Values should be in the range [0, 1]. - * @return {?string} Combined colour represented in hex. - * @alias Blockly.utils.colour.blend - */ - export function blend(colour1: string, colour2: string, factor: number): string | null; - /** - * A map that contains the 16 basic colour keywords as defined by W3C: - * https://www.w3.org/TR/2018/REC-css-color-3-20180619/#html4 - * The keys of this map are the lowercase "readable" names of the colours, - * while the values are the "hex" values. - * - * @type {!Object} - * @alias Blockly.utils.colour.names - */ - export const names: { - [x: string]: string; - }; - /** - * Convert a hue (HSV model) into an RGB hex triplet. - * @param {number} hue Hue on a colour wheel (0-360). - * @return {string} RGB code, e.g. '#5ba65b'. - * @alias Blockly.utils.colour.hueToHex - */ - export function hueToHex(hue: number): string; -} -declare module "core/utils/string" { - /** - * Fast prefix-checker. - * Copied from Closure's goog.string.startsWith. - * @param {string} str The string to check. - * @param {string} prefix A string to look for at the start of `str`. - * @return {boolean} True if `str` begins with `prefix`. - * @alias Blockly.utils.string.startsWith - */ - export function startsWith(str: string, prefix: string): boolean; - /** - * Given an array of strings, return the length of the shortest one. - * @param {!Array} array Array of strings. - * @return {number} Length of shortest string. - * @alias Blockly.utils.string.shortestStringLength - */ - export function shortestStringLength(array: Array): number; - /** - * Given an array of strings, return the length of the common prefix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common prefix. - * @alias Blockly.utils.string.commonWordPrefix - */ - export function commonWordPrefix(array: Array, opt_shortest?: number | undefined): number; - /** - * Given an array of strings, return the length of the common suffix. - * Words may not be split. Any space after a word is included in the length. - * @param {!Array} array Array of strings. - * @param {number=} opt_shortest Length of shortest string. - * @return {number} Length of common suffix. - * @alias Blockly.utils.string.commonWordSuffix - */ - export function commonWordSuffix(array: Array, opt_shortest?: number | undefined): number; - /** - * Wrap text to the specified width. - * @param {string} text Text to wrap. - * @param {number} limit Width to wrap each line. - * @return {string} Wrapped text. - * @alias Blockly.utils.string.wrap - */ - export function wrap(text: string, limit: number): string; - /** - * Is the given string a number (includes negative and decimals). - * @param {string} str Input string. - * @return {boolean} True if number, false otherwise. - * @alias Blockly.utils.string.isNumber - */ - export function isNumber(str: string): boolean; -} -declare module "core/msg" { - /** - * A dictionary of localised messages. - * @type {!Object} - */ - export const Msg: any; -} -declare module "core/utils/parsing" { - /** - * Parse a string with any number of interpolation tokens (%1, %2, ...). - * It will also replace string table references (e.g., %{bky_my_msg} and - * %{BKY_MY_MSG} will both be replaced with the value in - * Msg['MY_MSG']). Percentage sign characters '%' may be self-escaped - * (e.g., '%%'). - * @param {string} message Text which might contain string table references and - * interpolation tokens. - * @return {!Array} Array of strings and numbers. - * @alias Blockly.utils.parsing.tokenizeInterpolation - */ - export function tokenizeInterpolation(message: string): Array; - /** - * Replaces string table references in a message, if the message is a string. - * For example, "%{bky_my_msg}" and "%{BKY_MY_MSG}" will both be replaced with - * the value in Msg['MY_MSG']. - * @param {string|?} message Message, which may be a string that contains - * string table references. - * @return {string} String with message references replaced. - * @alias Blockly.utils.parsing.replaceMessageReferences - */ - export function replaceMessageReferences(message: string | unknown): string; - /** - * Validates that any %{MSG_KEY} references in the message refer to keys of - * the Msg string table. - * @param {string} message Text which might contain string table references. - * @return {boolean} True if all message references have matching values. - * Otherwise, false. - * @alias Blockly.utils.parsing.checkMessageReferences - */ - export function checkMessageReferences(message: string): boolean; - /** - * Parse a block colour from a number or string, as provided in a block - * definition. - * @param {number|string} colour HSV hue value (0 to 360), #RRGGBB string, - * or a message reference string pointing to one of those two values. - * @return {{hue: ?number, hex: string}} An object containing the colour as - * a #RRGGBB string, and the hue if the input was an HSV hue value. - * @throws {Error} If the colour cannot be parsed. - * @alias Blockly.utils.parsing.parseBlockColour - */ - export function parseBlockColour(colour: number | string): { - hue: number | null; - hex: string; - }; -} -declare module "core/utils/aria" { - /** - * * - */ - export type Role = string; - export namespace Role { - const GRID: string; - const GRIDCELL: string; - const GROUP: string; - const LISTBOX: string; - const MENU: string; - const MENUITEM: string; - const MENUITEMCHECKBOX: string; - const OPTION: string; - const PRESENTATION: string; - const ROW: string; - const TREE: string; - const TREEITEM: string; - } - /** - * * - */ - export type State = string; - export namespace State { - const ACTIVEDESCENDANT: string; - const COLCOUNT: string; - const DISABLED: string; - const EXPANDED: string; - const INVALID: string; - const LABEL: string; - const LABELLEDBY: string; - const LEVEL: string; - const ORIENTATION: string; - const POSINSET: string; - const ROWCOUNT: string; - const SELECTED: string; - const SETSIZE: string; - const VALUEMAX: string; - const VALUEMIN: string; - } - /** - * Sets the role of an element. - * - * Similar to Closure's goog.a11y.aria - * - * @param {!Element} element DOM node to set role of. - * @param {!Role} roleName Role name. - * @alias Blockly.utils.aria.setRole - */ - export function setRole(element: Element, roleName: Role): void; - /** - * Sets the state or property of an element. - * Copied from Closure's goog.a11y.aria - * @param {!Element} element DOM node where we set state. - * @param {!State} stateName State attribute being set. - * Automatically adds prefix 'aria-' to the state name if the attribute is - * not an extra attribute. - * @param {string|boolean|number|!Array} value Value - * for the state attribute. - * @alias Blockly.utils.aria.setState - */ - export function setState(element: Element, stateName: State, value: string | boolean | number | Array): void; -} -declare module "core/utils/global" { - /** - * Reference to the global object. - * - * More info on this implementation here: - * https://docs.google.com/document/d/1NAeW4Wk7I7FV0Y2tcUFvQdGMc89k2vdgSXInw8_nvCI - */ - export var globalThis: any; -} -declare module "core/utils/useragent" { - /** - * The raw useragent string. - * @type {string} - */ - let rawUserAgent: string; - /** @type {boolean} */ - let isIe: boolean; - /** @type {boolean} */ - let isEdge: boolean; - /** @type {boolean} */ - let isJavaFx: boolean; - /** @type {boolean} */ - let isChrome: boolean; - /** @type {boolean} */ - let isWebKit: boolean; - /** @type {boolean} */ - let isGecko: boolean; - /** @type {boolean} */ - let isAndroid: boolean; - /** @type {boolean} */ - let isIPad: boolean; - /** @type {boolean} */ - let isIPod: boolean; - /** @type {boolean} */ - let isIPhone: boolean; - /** @type {boolean} */ - let isMac: boolean; - /** @type {boolean} */ - let isTablet: boolean; - /** @type {boolean} */ - let isMobile: boolean; - export { rawUserAgent as raw, isIe as IE, isEdge as EDGE, isJavaFx as JavaFx, isChrome as CHROME, isWebKit as WEBKIT, isGecko as GECKO, isAndroid as ANDROID, isIPad as IPAD, isIPod as IPOD, isIPhone as IPHONE, isMac as MAC, isTablet as TABLET, isMobile as MOBILE }; -} -declare module "core/utils/svg" { - /** - * A name with the type of the SVG element stored in the generic. - * @template T - * @alias Blockly.utils.Svg - */ - export class Svg { - /** - * @param {string} tagName The SVG element tag name. - * @package - */ - constructor(tagName: string); - /** - * @type {string} - * @private - */ - private tagName_; - /** - * Returns the SVG element tag name. - * @return {string} The name. - */ - toString(): string; - } - export namespace Svg { - const ANIMATE: Svg; - const CIRCLE: Svg; - const CLIPPATH: Svg; - const DEFS: Svg; - const FECOMPOSITE: Svg; - const FECOMPONENTTRANSFER: Svg; - const FEFLOOD: Svg; - const FEFUNCA: Svg; - const FEGAUSSIANBLUR: Svg; - const FEPOINTLIGHT: Svg; - const FESPECULARLIGHTING: Svg; - const FILTER: Svg; - const FOREIGNOBJECT: Svg; - const G: Svg; - const IMAGE: Svg; - const LINE: Svg; - const PATH: Svg; - const PATTERN: Svg; - const POLYGON: Svg; - const RECT: Svg; - const SVG: Svg; - const TEXT: Svg; - const TSPAN: Svg; - } -} -declare module "core/utils/dom" { - /** - * Required name space for SVG elements. - * @const - * @alias Blockly.utils.dom.SVG_NS - */ - export const SVG_NS: "http://www.w3.org/2000/svg"; - /** - * Required name space for HTML elements. - * @const - * @alias Blockly.utils.dom.HTML_NS - */ - export const HTML_NS: "http://www.w3.org/1999/xhtml"; - /** - * Required name space for XLINK elements. - * @const - * @alias Blockly.utils.dom.XLINK_NS - */ - export const XLINK_NS: "http://www.w3.org/1999/xlink"; - /** - * * - */ - export type NodeType = number; - export namespace NodeType { - const ELEMENT_NODE: number; - const TEXT_NODE: number; - const COMMENT_NODE: number; - const DOCUMENT_POSITION_CONTAINED_BY: number; - } - /** - * Helper method for creating SVG elements. - * @param {string|Svg} name Element's tag name. - * @param {!Object} attrs Dictionary of attribute names and values. - * @param {Element=} opt_parent Optional parent on which to append the element. - * @return {T} Newly created SVG element. The return type is {!SVGElement} if - * name is a string or a more specific type if it a member of Svg. - * @template T - * @alias Blockly.utils.dom.createSvgElement - */ - export function createSvgElement(name: string | Svg, attrs: Object, opt_parent?: Element | undefined): T; - /** - * Add a CSS class to a element. - * Similar to Closure's goog.dom.classes.add, except it handles SVG elements. - * @param {!Element} element DOM element to add class to. - * @param {string} className Name of class to add. - * @return {boolean} True if class was added, false if already present. - * @alias Blockly.utils.dom.addClass - */ - export function addClass(element: Element, className: string): boolean; - /** - * Removes multiple calsses from an element. - * @param {!Element} element DOM element to remove classes from. - * @param {string} classNames A string of one or multiple class names for an - * element. - * @alias Blockly.utils.dom.removeClasses - */ - export function removeClasses(element: Element, classNames: string): void; - /** - * Remove a CSS class from a element. - * Similar to Closure's goog.dom.classes.remove, except it handles SVG elements. - * @param {!Element} element DOM element to remove class from. - * @param {string} className Name of class to remove. - * @return {boolean} True if class was removed, false if never present. - * @alias Blockly.utils.dom.removeClass - */ - export function removeClass(element: Element, className: string): boolean; - /** - * Checks if an element has the specified CSS class. - * Similar to Closure's goog.dom.classes.has, except it handles SVG elements. - * @param {!Element} element DOM element to check. - * @param {string} className Name of class to check. - * @return {boolean} True if class exists, false otherwise. - * @alias Blockly.utils.dom.hasClass - */ - export function hasClass(element: Element, className: string): boolean; - /** - * Removes a node from its parent. No-op if not attached to a parent. - * @param {?Node} node The node to remove. - * @return {?Node} The node removed if removed; else, null. - * @alias Blockly.utils.dom.removeNode - */ - export function removeNode(node: Node | null): Node | null; - /** - * Insert a node after a reference node. - * Contrast with node.insertBefore function. - * @param {!Element} newNode New element to insert. - * @param {!Element} refNode Existing element to precede new node. - * @alias Blockly.utils.dom.insertAfter - */ - export function insertAfter(newNode: Element, refNode: Element): void; - /** - * Whether a node contains another node. - * @param {!Node} parent The node that should contain the other node. - * @param {!Node} descendant The node to test presence of. - * @return {boolean} Whether the parent node contains the descendant node. - * @alias Blockly.utils.dom.containsNode - */ - export function containsNode(parent: Node, descendant: Node): boolean; - /** - * Sets the CSS transform property on an element. This function sets the - * non-vendor-prefixed and vendor-prefixed versions for backwards compatibility - * with older browsers. See https://caniuse.com/#feat=transforms2d - * @param {!Element} element Element to which the CSS transform will be applied. - * @param {string} transform The value of the CSS `transform` property. - * @alias Blockly.utils.dom.setCssTransform - */ - export function setCssTransform(element: Element, transform: string): void; - /** - * Start caching text widths. Every call to this function MUST also call - * stopTextWidthCache. Caches must not survive between execution threads. - * @alias Blockly.utils.dom.startTextWidthCache - */ - export function startTextWidthCache(): void; - /** - * Stop caching field widths. Unless caching was already on when the - * corresponding call to startTextWidthCache was made. - * @alias Blockly.utils.dom.stopTextWidthCache - */ - export function stopTextWidthCache(): void; - /** - * Gets the width of a text element, caching it in the process. - * @param {!Element} textElement An SVG 'text' element. - * @return {number} Width of element. - * @alias Blockly.utils.dom.getTextWidth - */ - export function getTextWidth(textElement: Element): number; - /** - * Gets the width of a text element using a faster method than `getTextWidth`. - * This method requires that we know the text element's font family and size in - * advance. Similar to `getTextWidth`, we cache the width we compute. - * @param {!Element} textElement An SVG 'text' element. - * @param {number} fontSize The font size to use. - * @param {string} fontWeight The font weight to use. - * @param {string} fontFamily The font family to use. - * @return {number} Width of element. - * @alias Blockly.utils.dom.getFastTextWidth - */ - export function getFastTextWidth(textElement: Element, fontSize: number, fontWeight: string, fontFamily: string): number; - /** - * Gets the width of a text element using a faster method than `getTextWidth`. - * This method requires that we know the text element's font family and size in - * advance. Similar to `getTextWidth`, we cache the width we compute. - * This method is similar to ``getFastTextWidth`` but expects the font size - * parameter to be a string. - * @param {!Element} textElement An SVG 'text' element. - * @param {string} fontSize The font size to use. - * @param {string} fontWeight The font weight to use. - * @param {string} fontFamily The font family to use. - * @return {number} Width of element. - * @alias Blockly.utils.dom.getFastTextWidthWithSizeString - */ - export function getFastTextWidthWithSizeString(textElement: Element, fontSize: string, fontWeight: string, fontFamily: string): number; - /** - * Measure a font's metrics. The height and baseline values. - * @param {string} text Text to measure the font dimensions of. - * @param {string} fontSize The font size to use. - * @param {string} fontWeight The font weight to use. - * @param {string} fontFamily The font family to use. - * @return {{height: number, baseline: number}} Font measurements. - * @alias Blockly.utils.dom.measureFontMetrics - */ - export function measureFontMetrics(text: string, fontSize: string, fontWeight: string, fontFamily: string): { - height: number; - baseline: number; - }; - import { Svg } from "core/utils/svg"; -} -declare module "core/blocks" { - /** - * A block definition. For now this very lose, but it can potentially - * be refined e.g. by replacing this typedef with a class definition. - */ - export type BlockDefinition = any; - /** - * A block definition. For now this very lose, but it can potentially - * be refined e.g. by replacing this typedef with a class definition. - * @typedef {!Object} - */ - // export let BlockDefinition: any; - /** - * A mapping of block type names to block prototype objects. - * @type {!Object} - * @alias Blockly.blocks.Blocks - */ - export const Blocks: { - [x: string]: BlockDefinition; - }; -} -declare module "core/utils/idgenerator" { - namespace internal { - /** - * Generate a random unique ID. This should be globally unique. - * 87 characters ^ 20 length > 128 bits (better than a UUID). - * @return {string} A globally unique ID string. - */ - function genUid(): string; - } - /** - * Generate the next unique element IDs. - * IDs are compatible with the HTML4 id attribute restrictions: - * Use only ASCII letters, digits, '_', '-' and '.' - * - * For UUIDs use genUid (below) instead; this ID generator should - * primarily be used for IDs that end up in the DOM. - * - * @return {string} The next unique identifier. - * @alias Blockly.utils.idGenerator.getNextUniqueId - */ - export function getNextUniqueId(): string; - /** - * Generate a random unique ID. - * @see internal.genUid - * @return {string} A globally unique ID string. - * @alias Blockly.utils.idGenerator.genUid - */ - export function genUid(): string; - export { internal as TEST_ONLY }; -} -declare module "core/utils/array" { - /** - * Removes the first occurrence of a particular value from an array. - * @param {!Array} arr Array from which to remove value. - * @param {*} value Value to remove. - * @return {boolean} True if an element was removed. - * @alias Blockly.array.removeElem - * @package - */ - export function removeElem(arr: any[], value: any): boolean; -} -declare module "core/utils/math" { - /** - * Converts degrees to radians. - * Copied from Closure's goog.math.toRadians. - * @param {number} angleDegrees Angle in degrees. - * @return {number} Angle in radians. - * @alias Blockly.utils.math.toRadians - */ - export function toRadians(angleDegrees: number): number; - /** - * Converts radians to degrees. - * Copied from Closure's goog.math.toDegrees. - * @param {number} angleRadians Angle in radians. - * @return {number} Angle in degrees. - * @alias Blockly.utils.math.toDegrees - */ - export function toDegrees(angleRadians: number): number; - /** - * Clamp the provided number between the lower bound and the upper bound. - * @param {number} lowerBound The desired lower bound. - * @param {number} number The number to clamp. - * @param {number} upperBound The desired upper bound. - * @return {number} The clamped number. - * @alias Blockly.utils.math.clamp - */ - export function clamp(lowerBound: number, number: number, upperBound: number): number; -} -declare module "core/serialization/priorities" { - /** - * The priority for deserializing variables. - * @type {number} - * @const - * @alias Blockly.serialization.priorities.VARIABLES - */ - export const VARIABLES: number; - /** - * The priority for deserializing blocks. - * @type {number} - * @const - * @alias Blockly.serialization.priorities.BLOCKS - */ - export const BLOCKS: number; -} -declare module "core/interfaces/i_serializer" { - /** - * Serializes and deserializes a plugin or system. - * @interface - * @alias Blockly.serialization.ISerializer.ISerializer - */ - export class ISerializer { - /** - * A priority value used to determine the order of deserializing state. - * More positive priorities are deserialized before less positive - * priorities. Eg if you have priorities (0, -10, 10, 100) the order of - * deserialiation will be (100, 10, 0, -10). - * If two serializers have the same priority, they are deserialized in an - * arbitrary order relative to each other. - * @type {number} - */ - priority: number; - /** - * Saves the state of the plugin or system. - * @param {!Workspace} workspace The workspace the system to serialize is - * associated with. - * @return {?} A JS object containing the system's state, or null if - * there is no state to record. - */ - save(workspace: Workspace): unknown; - /** - * Loads the state of the plugin or system. - * @param {?} state The state of the system to deserialize. This will always - * be non-null. - * @param {!Workspace} workspace The workspace the system to deserialize is - * associated with. - */ - load(state: unknown, workspace: Workspace): void; - /** - * Clears the state of the plugin or system. - * @param {!Workspace} workspace The workspace the system to clear the state - * of is associated with. - */ - clear(workspace: Workspace): void; - } - import { Workspace } from "core/workspace"; -} -declare module "core/serialization/registry" { - /** - * Registers the given serializer so that it can be used for serialization and - * deserialization. - * @param {string} name The name of the serializer to register. - * @param {ISerializer} serializer The serializer to register. - * @alias Blockly.serialization.registry.register - */ - export function register(name: string, serializer: ISerializer): void; - /** - * Unregisters the serializer associated with the given name. - * @param {string} name The name of the serializer to unregister. - * @alias Blockly.serialization.registry.unregister - */ - export function unregister(name: string): void; - import { ISerializer } from "core/interfaces/i_serializer"; -} -declare module "core/serialization/exceptions" { - /** - * @alias Blockly.serialization.exceptions.DeserializationError - */ - export class DeserializationError extends Error { - } - /** - * Represents an error where the serialized state is expected to provide a - * block type, but it is not provided. - * @alias Blockly.serialization.exceptions.MissingBlockType - */ - export class MissingBlockType extends DeserializationError { - /** - * @param {!State} state The state object which is missing the block type. - * @package - */ - constructor(state: any); - /** - * The state object containing the bad name. - * @type {!State} - */ - state: any; - } - /** - * Represents an error where deserialization encountered a block that did - * not have a connection that was defined in the serialized state. - * @alias Blockly.serialization.exceptions.MissingConnection - */ - export class MissingConnection extends DeserializationError { - /** - * @param {string} connection The name of the connection that is missing. E.g. - * 'IF0', or 'next'. - * @param {!Block} block The block missing the connection. - * @param {!State} state The state object containing the bad connection. - * @package - */ - constructor(connection: string, block: Block, state: any); - /** - * The block missing the connection. - * @type {!Block} - */ - block: Block; - /** - * The state object containing the bad name. - * @type {!State} - */ - state: any; - } - /** - * Represents an error where deserialization tried to connect two connections - * that were not compatible. - * @alias Blockly.serialization.exceptions.BadConnectionCheck - */ - export class BadConnectionCheck extends DeserializationError { - /** - * @param {string} reason The reason the connections were not compatible. - * @param {string} childConnection The name of the incompatible child - * connection. E.g. 'output' or 'previous'. - * @param {!Block} childBlock The child block that could not connect - * to its parent. - * @param {!State} childState The state object representing the child block. - * @package - */ - constructor(reason: string, childConnection: string, childBlock: Block, childState: any); - /** - * The block that could not connect to its parent. - * @type {!Block} - */ - childBlock: Block; - /** - * The state object representing the block that could not connect to its - * parent. - * @type {!State} - */ - childState: any; - } - /** - * Represents an error where deserialization encountered a real block as it - * was deserializing children of a shadow. - * This is an error because it is an invariant of Blockly that shadow blocks - * do not have real children. - * @alias Blockly.serialization.exceptions.RealChildOfShadow - */ - export class RealChildOfShadow extends DeserializationError { - /** - * @param {!State} state The state object representing the real block. - * @package - */ - constructor(state: any); - /** - * The state object representing the real block. - * @type {!State} - */ - state: any; - } - import { Block } from "core/block"; -} -declare module "core/utils/rect" { - /** - * Class for representing rectangular regions. - * @alias Blockly.utils.Rect - */ - export const Rect: { - new (top: number, bottom: number, left: number, right: number): { - /** @type {number} */ - top: number; - /** @type {number} */ - bottom: number; - /** @type {number} */ - left: number; - /** @type {number} */ - right: number; - /** - * Tests whether this rectangle contains a x/y coordinate. - * - * @param {number} x The x coordinate to test for containment. - * @param {number} y The y coordinate to test for containment. - * @return {boolean} Whether this rectangle contains given coordinate. - */ - contains(x: number, y: number): boolean; - /** - * Tests whether this rectangle intersects the provided rectangle. - * Assumes that the coordinate system increases going down and left. - * @param {!Rect} other The other rectangle to check for - * intersection with. - * @return {boolean} Whether this rectangle intersects the provided rectangle. - */ - intersects(other: any): boolean; - }; - }; -} -declare module "core/utils/size" { - /** - * Class for representing sizes consisting of a width and height. - * @alias Blockly.utils.Size - */ - export const Size: { - new (width: number, height: number): { - /** - * Width - * @type {number} - */ - width: number; - /** - * Height - * @type {number} - */ - height: number; - }; - /** - * Compares sizes for equality. - * @param {?Size} a A Size. - * @param {?Size} b A Size. - * @return {boolean} True iff the sizes have equal widths and equal - * heights, or if both are null. - */ - equals(a: { - /** - * Width - * @type {number} - */ - width: number; - /** - * Height - * @type {number} - */ - height: number; - } | null, b: { - /** - * Width - * @type {number} - */ - width: number; - /** - * Height - * @type {number} - */ - height: number; - } | null): boolean; - }; -} -declare module "core/dialog" { - /** - * Wrapper to window.alert() that app developers may override via setAlert to - * provide alternatives to the modal browser window. - * @param {string} message The message to display to the user. - * @param {function()=} opt_callback The callback when the alert is dismissed. - * @alias Blockly.dialog.alert - */ - export function alert(message: string, opt_callback?: (() => any) | undefined): void; - /** - * Sets the function to be run when Blockly.dialog.alert() is called. - * @param {!function(string, function()=)} alertFunction The function to be run. - * @see Blockly.dialog.alert - * @alias Blockly.dialog.setAlert - */ - export function setAlert(alertFunction: (arg0: string, arg1: (() => any) | undefined) => any): void; - /** - * Wrapper to window.confirm() that app developers may override via setConfirm - * to provide alternatives to the modal browser window. - * @param {string} message The message to display to the user. - * @param {!function(boolean)} callback The callback for handling user response. - * @alias Blockly.dialog.confirm - */ - export function confirm(message: string, callback: (arg0: boolean) => any): void; - /** - * Sets the function to be run when Blockly.dialog.confirm() is called. - * @param {!function(string, !function(boolean))} confirmFunction The function - * to be run. - * @see Blockly.dialog.confirm - * @alias Blockly.dialog.setConfirm - */ - export function setConfirm(confirmFunction: (arg0: string, arg1: (arg0: boolean) => any) => any): void; - /** - * Wrapper to window.prompt() that app developers may override via setPrompt to - * provide alternatives to the modal browser window. Built-in browser prompts - * are often used for better text input experience on mobile device. We strongly - * recommend testing mobile when overriding this. - * @param {string} message The message to display to the user. - * @param {string} defaultValue The value to initialize the prompt with. - * @param {!function(?string)} callback The callback for handling user response. - * @alias Blockly.dialog.prompt - */ - export function prompt(message: string, defaultValue: string, callback: (arg0: string | null) => any): void; - /** - * Sets the function to be run when Blockly.dialog.prompt() is called. - * @param {!function(string, string, !function(?string))} promptFunction The - * function to be run. - * @see Blockly.dialog.prompt - * @alias Blockly.dialog.setPrompt - */ - export function setPrompt(promptFunction: (arg0: string, arg1: string, arg2: (arg0: string | null) => any) => any): void; -} -declare module "core/utils/xml" { - /** - * Namespace for Blockly's XML. - * @alias Blockly.utils.xml.NAME_SPACE - */ - export const NAME_SPACE: "https://developers.google.com/blockly/xml"; - /** - * Get the document object to use for XML serialization. - * @return {!Document} The document object. - * @alias Blockly.utils.xml.getDocument - */ - export function getDocument(): Document; - /** - * Get the document object to use for XML serialization. - * @param {!Document} document The document object to use. - * @alias Blockly.utils.xml.setDocument - */ - export function setDocument(document: Document): void; - /** - * Create DOM element for XML. - * @param {string} tagName Name of DOM element. - * @return {!Element} New DOM element. - * @alias Blockly.utils.xml.createElement - */ - export function createElement(tagName: string): Element; - /** - * Create text element for XML. - * @param {string} text Text content. - * @return {!Text} New DOM text node. - * @alias Blockly.utils.xml.createTextNode - */ - export function createTextNode(text: string): Text; - /** - * Converts an XML string into a DOM tree. - * @param {string} text XML string. - * @return {Document} The DOM document. - * @throws if XML doesn't parse. - * @alias Blockly.utils.xml.textToDomDocument - */ - export function textToDomDocument(text: string): Document; - /** - * Converts a DOM structure into plain text. - * Currently the text format is fairly ugly: all one line with no whitespace. - * @param {!Node} dom A tree of XML nodes. - * @return {string} Text representation. - * @alias Blockly.utils.xml.domToText - */ - export function domToText(dom: Node): string; -} -declare module "core/events/events_var_base" { - /** - * Abstract class for a variable event. - * @extends {AbstractEvent} - * @alias Blockly.Events.VarBase - */ - export class VarBase extends AbstractEvent { - /** - * @param {!VariableModel=} opt_variable The variable this event - * corresponds to. Undefined for a blank event. - */ - constructor(opt_variable?: VariableModel | undefined); - /** - * The variable id for the variable this event pertains to. - * @type {string} - */ - varId: string; - } - import { Abstract as AbstractEvent } from "core/events/events_abstract"; - import { VariableModel } from "core/variable_model"; -} -declare module "core/events/events_var_create" { - /** - * Class for a variable creation event. - * @extends {VarBase} - * @alias Blockly.Events.VarCreate - */ - export class VarCreate extends VarBase { - varType: string | undefined; - varName: string | undefined; - } - import { VarBase } from "core/events/events_var_base"; -} -declare module "core/variable_model" { - /** - * Class for a variable model. - * Holds information for the variable including name, ID, and type. - * @see {Blockly.FieldVariable} - * @alias Blockly.VariableModel - */ - export class VariableModel { - /** - * A custom compare function for the VariableModel objects. - * @param {VariableModel} var1 First variable to compare. - * @param {VariableModel} var2 Second variable to compare. - * @return {number} -1 if name of var1 is less than name of var2, 0 if equal, - * and 1 if greater. - * @package - */ - static compareByName(var1: VariableModel, var2: VariableModel): number; - /** - * @param {!Workspace} workspace The variable's workspace. - * @param {string} name The name of the variable. This is the user-visible - * name (e.g. 'my var' or '私の変数'), not the generated name. - * @param {string=} opt_type The type of the variable like 'int' or 'string'. - * Does not need to be unique. Field_variable can filter variables based - * on their type. This will default to '' which is a specific type. - * @param {string=} opt_id The unique ID of the variable. This will default to - * a UUID. - */ - constructor(workspace: Workspace, name: string, opt_type?: string | undefined, opt_id?: string | undefined); - /** - * The workspace the variable is in. - * @type {!Workspace} - */ - workspace: Workspace; - /** - * The name of the variable, typically defined by the user. It may be - * changed by the user. - * @type {string} - */ - name: string; - /** - * The type of the variable, such as 'int' or 'sound_effect'. This may be - * used to build a list of variables of a specific type. By default this is - * the empty string '', which is a specific type. - * @see {Blockly.FieldVariable} - * @type {string} - */ - type: string; - /** - * A unique ID for the variable. This should be defined at creation and - * not change, even if the name changes. In most cases this should be a - * UUID. - * @type {string} - * @private - */ - private id_; - /** - * @return {string} The ID for the variable. - */ - getId(): string; - } - import { Workspace } from "core/workspace"; -} -declare module "core/variables" { - /** - * String for use in the "custom" attribute of a category in toolbox XML. - * This string indicates that the category should be dynamically populated with - * variable blocks. - * See also Blockly.Procedures.CATEGORY_NAME and - * Blockly.VariablesDynamic.CATEGORY_NAME. - * @const {string} - * @alias Blockly.Variables.CATEGORY_NAME - */ - export const CATEGORY_NAME: "VARIABLE"; - /** - * Find all user-created variables that are in use in the workspace. - * For use by generators. - * To get a list of all variables on a workspace, including unused variables, - * call Workspace.getAllVariables. - * @param {!Workspace} ws The workspace to search for variables. - * @return {!Array} Array of variable models. - * @alias Blockly.Variables.allUsedVarModels - */ - export function allUsedVarModels(ws: Workspace): Array; - /** - * Find all developer variables used by blocks in the workspace. - * Developer variables are never shown to the user, but are declared as global - * variables in the generated code. - * To declare developer variables, define the getDeveloperVariables function on - * your block and return a list of variable names. - * For use by generators. - * @param {!Workspace} workspace The workspace to search. - * @return {!Array} A list of non-duplicated variable names. - * @alias Blockly.Variables.allDeveloperVariables - */ - export function allDeveloperVariables(workspace: Workspace): Array; - /** - * Construct the elements (blocks and button) required by the flyout for the - * variable category. - * @param {!WorkspaceSvg} workspace The workspace containing variables. - * @return {!Array} Array of XML elements. - * @alias Blockly.Variables.flyoutCategory - */ - export function flyoutCategory(workspace: WorkspaceSvg): Array; - /** - * Construct the blocks required by the flyout for the variable category. - * @param {!Workspace} workspace The workspace containing variables. - * @return {!Array} Array of XML block elements. - * @alias Blockly.Variables.flyoutCategoryBlocks - */ - export function flyoutCategoryBlocks(workspace: Workspace): Array; - /** - * @alias Blockly.Variables.VAR_LETTER_OPTIONS - */ - export const VAR_LETTER_OPTIONS: "ijkmnopqrstuvwxyzabcdefgh"; - /** - * Return a new variable name that is not yet being used. This will try to - * generate single letter variable names in the range 'i' to 'z' to start with. - * If no unique name is located it will try 'i' to 'z', 'a' to 'h', - * then 'i2' to 'z2' etc. Skip 'l'. - * @param {!Workspace} workspace The workspace to be unique in. - * @return {string} New variable name. - * @alias Blockly.Variables.generateUniqueName - */ - export function generateUniqueName(workspace: Workspace): string; - /** - * Returns a unique name that is not present in the usedNames array. This - * will try to generate single letter names in the range a -> z (skip l). It - * will start with the character passed to startChar. - * @param {string} startChar The character to start the search at. - * @param {!Array} usedNames A list of all of the used names. - * @return {string} A unique name that is not present in the usedNames array. - * @alias Blockly.Variables.generateUniqueNameFromOptions - */ - export function generateUniqueNameFromOptions(startChar: string, usedNames: Array): string; - /** - * Handles "Create Variable" button in the default variables toolbox category. - * It will prompt the user for a variable name, including re-prompts if a name - * is already in use among the workspace's variables. - * - * Custom button handlers can delegate to this function, allowing variables - * types and after-creation processing. More complex customization (e.g., - * prompting for variable type) is beyond the scope of this function. - * - * @param {!Workspace} workspace The workspace on which to create the - * variable. - * @param {function(?string=)=} opt_callback A callback. It will be passed an - * acceptable new variable name, or null if change is to be aborted (cancel - * button), or undefined if an existing variable was chosen. - * @param {string=} opt_type The type of the variable like 'int', 'string', or - * ''. This will default to '', which is a specific type. - * @alias Blockly.Variables.createVariableButtonHandler - */ - export function createVariableButtonHandler(workspace: Workspace, opt_callback?: ((arg0: (string | null) | undefined) => any) | undefined, opt_type?: string | undefined): void; - /** - * Opens a prompt that allows the user to enter a new name for a variable. - * Triggers a rename if the new name is valid. Or re-prompts if there is a - * collision. - * @param {!Workspace} workspace The workspace on which to rename the - * variable. - * @param {!VariableModel} variable Variable to rename. - * @param {function(?string=)=} opt_callback A callback. It will - * be passed an acceptable new variable name, or null if change is to be - * aborted (cancel button), or undefined if an existing variable was chosen. - * @alias Blockly.Variables.renameVariable - */ - export function renameVariable(workspace: Workspace, variable: VariableModel, opt_callback?: ((arg0: (string | null) | undefined) => any) | undefined): void; - /** - * Prompt the user for a new variable name. - * @param {string} promptText The string of the prompt. - * @param {string} defaultText The default value to show in the prompt's field. - * @param {function(?string)} callback A callback. It will return the new - * variable name, or null if the user picked something illegal. - * @alias Blockly.Variables.promptName - */ - export function promptName(promptText: string, defaultText: string, callback: (arg0: string | null) => any): void; - /** - * Check whether there exists a variable with the given name of any type. - * @param {string} name The name to search for. - * @param {!Workspace} workspace The workspace to search for the - * variable. - * @return {?VariableModel} The variable with the given name, - * or null if none was found. - * @alias Blockly.Variables.nameUsedWithAnyType - */ - export function nameUsedWithAnyType(name: string, workspace: Workspace): VariableModel | null; - /** - * Generate DOM objects representing a variable field. - * @param {!VariableModel} variableModel The variable model to - * represent. - * @return {?Element} The generated DOM. - * @alias Blockly.Variables.generateVariableFieldDom - */ - export function generateVariableFieldDom(variableModel: VariableModel): Element | null; - /** - * Helper function to look up or create a variable on the given workspace. - * If no variable exists, creates and returns it. - * @param {!Workspace} workspace The workspace to search for the - * variable. It may be a flyout workspace or main workspace. - * @param {?string} id The ID to use to look up or create the variable, or null. - * @param {string=} opt_name The string to use to look up or create the - * variable. - * @param {string=} opt_type The type to use to look up or create the variable. - * @return {!VariableModel} The variable corresponding to the given ID - * or name + type combination. - * @alias Blockly.Variables.getOrCreateVariablePackage - */ - export function getOrCreateVariablePackage(workspace: Workspace, id: string | null, opt_name?: string | undefined, opt_type?: string | undefined): VariableModel; - /** - * Look up a variable on the given workspace. - * Always looks in the main workspace before looking in the flyout workspace. - * Always prefers lookup by ID to lookup by name + type. - * @param {!Workspace} workspace The workspace to search for the - * variable. It may be a flyout workspace or main workspace. - * @param {?string} id The ID to use to look up the variable, or null. - * @param {string=} opt_name The string to use to look up the variable. - * Only used if lookup by ID fails. - * @param {string=} opt_type The type to use to look up the variable. - * Only used if lookup by ID fails. - * @return {?VariableModel} The variable corresponding to the given ID - * or name + type combination, or null if not found. - * @alias Blockly.Variables.getVariable - */ - export function getVariable(workspace: Workspace, id: string | null, opt_name?: string | undefined, opt_type?: string | undefined): VariableModel | null; - /** - * Helper function to get the list of variables that have been added to the - * workspace after adding a new block, using the given list of variables that - * were in the workspace before the new block was added. - * @param {!Workspace} workspace The workspace to inspect. - * @param {!Array} originalVariables The array of - * variables that existed in the workspace before adding the new block. - * @return {!Array} The new array of variables that - * were freshly added to the workspace after creating the new block, - * or [] if no new variables were added to the workspace. - * @alias Blockly.Variables.getAddedVariables - * @package - */ - export function getAddedVariables(workspace: Workspace, originalVariables: Array): Array; - import { Workspace } from "core/workspace"; - import { VariableModel } from "core/variable_model"; - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/events/events_ui_base" { - /** - * Base class for a UI event. - * UI events are events that don't need to be sent over the wire for multi-user - * editing to work (e.g. scrolling the workspace, zooming, opening toolbox - * categories). - * UI events do not undo or redo. - * @extends {AbstractEvent} - * @alias Blockly.Events.UiBase - */ - export class UiBase extends AbstractEvent { - /** - * @param {string=} opt_workspaceId The workspace identifier for this event. - * Undefined for a blank event. - */ - constructor(opt_workspaceId?: string | undefined); - } - import { Abstract as AbstractEvent } from "core/events/events_abstract"; -} -declare module "core/events/events_bubble_open" { - /** - * Class for a bubble open event. - * @extends {UiBase} - * @alias Blockly.Events.BubbleOpen - */ - export class BubbleOpen extends UiBase { - /** - * @param {BlockSvg} opt_block The associated block. Undefined for a - * blank event. - * @param {boolean=} opt_isOpen Whether the bubble is opening (false if - * closing). Undefined for a blank event. - * @param {string=} opt_bubbleType The type of bubble. One of 'mutator', - * 'comment' - * or 'warning'. Undefined for a blank event. - */ - constructor(opt_block: BlockSvg, opt_isOpen?: boolean | undefined, opt_bubbleType?: string | undefined); - blockId: string | null; - /** - * Whether the bubble is opening (false if closing). - * @type {boolean|undefined} - */ - isOpen: boolean | undefined; - /** - * The type of bubble. One of 'mutator', 'comment', or 'warning'. - * @type {string|undefined} - */ - bubbleType: string | undefined; - } - import { UiBase } from "core/events/events_ui_base"; - import { BlockSvg } from "core/block_svg"; -} -declare module "core/block_animations" { - /** - * Play some UI effects (sound, animation) when disposing of a block. - * @param {!BlockSvg} block The block being disposed of. - * @alias Blockly.blockAnimations.disposeUiEffect - * @package - */ - export function disposeUiEffect(block: BlockSvg): void; - /** - * Play some UI effects (sound, ripple) after a connection has been established. - * @param {!BlockSvg} block The block being connected. - * @alias Blockly.blockAnimations.connectionUiEffect - * @package - */ - export function connectionUiEffect(block: BlockSvg): void; - /** - * Play some UI effects (sound, animation) when disconnecting a block. - * @param {!BlockSvg} block The block being disconnected. - * @alias Blockly.blockAnimations.disconnectUiEffect - * @package - */ - export function disconnectUiEffect(block: BlockSvg): void; - /** - * Stop the disconnect UI animation immediately. - * @alias Blockly.blockAnimations.disconnectUiStop - * @package - */ - export function disconnectUiStop(): void; - import { BlockSvg } from "core/block_svg"; -} -declare module "core/connection_type" { - /** - * * - */ - export type ConnectionType = number; - export namespace ConnectionType { - const INPUT_VALUE: number; - const OUTPUT_VALUE: number; - const NEXT_STATEMENT: number; - const PREVIOUS_STATEMENT: number; - } -} -declare module "core/internal_constants" { - /** - * Number of characters to truncate a collapsed block to. - * @alias Blockly.internalConstants.COLLAPSE_CHARS - */ - export const COLLAPSE_CHARS: 30; - /** - * When dragging a block out of a stack, split the stack in two (true), or drag - * out the block healing the stack (false). - * @alias Blockly.internalConstants.DRAG_STACK - */ - export const DRAG_STACK: true; - /** - * Lookup table for determining the opposite type of a connection. - * @const - * @alias Blockly.internalConstants.OPPOSITE_TYPE - */ - export const OPPOSITE_TYPE: any[]; - /** - * String for use in the dropdown created in field_variable. - * This string indicates that this option in the dropdown is 'Rename - * variable...' and if selected, should trigger the prompt to rename a variable. - * @const {string} - * @alias Blockly.internalConstants.RENAME_VARIABLE_ID - */ - export const RENAME_VARIABLE_ID: "RENAME_VARIABLE_ID"; - /** - * String for use in the dropdown created in field_variable. - * This string indicates that this option in the dropdown is 'Delete the "%1" - * variable' and if selected, should trigger the prompt to delete a variable. - * @const {string} - * @alias Blockly.internalConstants.DELETE_VARIABLE_ID - */ - export const DELETE_VARIABLE_ID: "DELETE_VARIABLE_ID"; -} -declare module "core/utils/deprecation" { - /** - * Warn developers that a function or property is deprecated. - * @param {string} name The name of the function or property. - * @param {string} deprecationDate The date of deprecation. - * Prefer 'month yyyy' or 'quarter yyyy' format. - * @param {string} deletionDate The date of deletion, in the same format as the - * deprecation date. - * @param {string=} opt_use The name of a function or property to use instead, - * if any. - * @alias Blockly.utils.deprecation.warn - * @package - */ - export function warn(name: string, deprecationDate: string, deletionDate: string, opt_use?: string | undefined): void; -} -declare module "core/utils/coordinate" { - /** - * Class for representing coordinates and positions. - * @alias Blockly.utils.Coordinate - */ - export const Coordinate: { - new (x: number, y: number): { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }; - /** - * Compares coordinates for equality. - * @param {?Coordinate} a A Coordinate. - * @param {?Coordinate} b A Coordinate. - * @return {boolean} True iff the coordinates are equal, or if both are null. - */ - equals(a: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | null, b: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | null): boolean; - /** - * Returns the distance between two coordinates. - * @param {!Coordinate} a A Coordinate. - * @param {!Coordinate} b A Coordinate. - * @return {number} The distance between `a` and `b`. - */ - distance(a: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }, b: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }): number; - /** - * Returns the magnitude of a coordinate. - * @param {!Coordinate} a A Coordinate. - * @return {number} The distance between the origin and `a`. - */ - magnitude(a: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }): number; - /** - * Returns the difference between two coordinates as a new - * Coordinate. - * @param {!Coordinate|!SVGPoint} a An x/y coordinate. - * @param {!Coordinate|!SVGPoint} b An x/y coordinate. - * @return {!Coordinate} A Coordinate representing the difference - * between `a` and `b`. - */ - difference(a: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | SVGPoint, b: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | SVGPoint): { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }; - /** - * Returns the sum of two coordinates as a new Coordinate. - * @param {!Coordinate|!SVGPoint} a An x/y coordinate. - * @param {!Coordinate|!SVGPoint} b An x/y coordinate. - * @return {!Coordinate} A Coordinate representing the sum of - * the two coordinates. - */ - sum(a: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | SVGPoint, b: { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - } | SVGPoint): { - /** - * X-value - * @type {number} - */ - x: number; - /** - * Y-value - * @type {number} - */ - y: number; - /** - * Creates a new copy of this coordinate. - * @return {!Coordinate} A copy of this coordinate. - */ - clone(): any; - /** - * Scales this coordinate by the given scale factor. - * @param {number} s The scale factor to use for both x and y dimensions. - * @return {!Coordinate} This coordinate after scaling. - */ - scale(s: number): any; - /** - * Translates this coordinate by the given offsets. - * respectively. - * @param {number} tx The value to translate x by. - * @param {number} ty The value to translate y by. - * @return {!Coordinate} This coordinate after translating. - */ - translate(tx: number, ty: number): any; - }; - }; -} -declare module "core/utils/style" { - /** - * Gets the height and width of an element. - * Similar to Closure's goog.style.getSize - * @param {!Element} element Element to get size of. - * @return {!Size} Object with width/height properties. - * @alias Blockly.utils.style.getSize - */ - export function getSize(element: Element): { - width: number; - height: number; - }; - /** - * Retrieves a computed style value of a node. It returns empty string if the - * value cannot be computed (which will be the case in Internet Explorer) or - * "none" if the property requested is an SVG one and it has not been - * explicitly set (firefox and webkit). - * - * Copied from Closure's goog.style.getComputedStyle - * - * @param {!Element} element Element to get style of. - * @param {string} property Property to get (camel-case). - * @return {string} Style value. - * @alias Blockly.utils.style.getComputedStyle - */ - export function getComputedStyle(element: Element, property: string): string; - /** - * Gets the cascaded style value of a node, or null if the value cannot be - * computed (only Internet Explorer can do this). - * - * Copied from Closure's goog.style.getCascadedStyle - * - * @param {!Element} element Element to get style of. - * @param {string} style Property to get (camel-case). - * @return {string} Style value. - * @alias Blockly.utils.style.getCascadedStyle - */ - export function getCascadedStyle(element: Element, style: string): string; - /** - * Returns a Coordinate object relative to the top-left of the HTML document. - * Similar to Closure's goog.style.getPageOffset - * @param {!Element} el Element to get the page offset for. - * @return {!Coordinate} The page offset. - * @alias Blockly.utils.style.getPageOffset - */ - export function getPageOffset(el: Element): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Calculates the viewport coordinates relative to the document. - * Similar to Closure's goog.style.getViewportPageOffset - * @return {!Coordinate} The page offset of the viewport. - * @alias Blockly.utils.style.getViewportPageOffset - */ - export function getViewportPageOffset(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Shows or hides an element from the page. Hiding the element is done by - * setting the display property to "none", removing the element from the - * rendering hierarchy so it takes up no space. To show the element, the default - * inherited display property is restored (defined either in stylesheets or by - * the browser's default style rules). - * Copied from Closure's goog.style.getViewportPageOffset - * - * @param {!Element} el Element to show or hide. - * @param {*} isShown True to render the element in its default style, - * false to disable rendering the element. - * @alias Blockly.utils.style.setElementShown - */ - export function setElementShown(el: Element, isShown: any): void; - /** - * Returns true if the element is using right to left (RTL) direction. - * Copied from Closure's goog.style.isRightToLeft - * - * @param {!Element} el The element to test. - * @return {boolean} True for right to left, false for left to right. - * @alias Blockly.utils.style.isRightToLeft - */ - export function isRightToLeft(el: Element): boolean; - /** - * Gets the computed border widths (on all sides) in pixels - * Copied from Closure's goog.style.getBorderBox - * @param {!Element} element The element to get the border widths for. - * @return {!Object} The computed border widths. - * @alias Blockly.utils.style.getBorderBox - */ - export function getBorderBox(element: Element): Object; - /** - * Changes the scroll position of `container` with the minimum amount so - * that the content and the borders of the given `element` become visible. - * If the element is bigger than the container, its top left corner will be - * aligned as close to the container's top left corner as possible. - * Copied from Closure's goog.style.scrollIntoContainerView - * - * @param {!Element} element The element to make visible. - * @param {!Element} container The container to scroll. If not set, then the - * document scroll element will be used. - * @param {boolean=} opt_center Whether to center the element in the container. - * Defaults to false. - * @alias Blockly.utils.style.scrollIntoContainerView - */ - export function scrollIntoContainerView(element: Element, container: Element, opt_center?: boolean | undefined): void; - /** - * Calculate the scroll position of `container` with the minimum amount so - * that the content and the borders of the given `element` become visible. - * If the element is bigger than the container, its top left corner will be - * aligned as close to the container's top left corner as possible. - * Copied from Closure's goog.style.getContainerOffsetToScrollInto - * - * @param {!Element} element The element to make visible. - * @param {!Element} container The container to scroll. If not set, then the - * document scroll element will be used. - * @param {boolean=} opt_center Whether to center the element in the container. - * Defaults to false. - * @return {!Coordinate} The new scroll position of the container, - * in form of goog.math.Coordinate(scrollLeft, scrollTop). - * @alias Blockly.utils.style.getContainerOffsetToScrollInto - */ - export function getContainerOffsetToScrollInto(element: Element, container: Element, opt_center?: boolean | undefined): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; -} -declare module "core/utils/svg_math" { - export namespace TEST_ONLY { - export { XY_REGEX }; - export { XY_STYLE_REGEX }; - } - /** - * Return the coordinates of the top-left corner of this element relative to - * its parent. Only for SVG elements and children (e.g. rect, g, path). - * @param {!Element} element SVG element to find the coordinates of. - * @return {!Coordinate} Object with .x and .y properties. - * @alias Blockly.utils.svgMath.getRelativeXY - */ - export function getRelativeXY(element: Element): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Return the coordinates of the top-left corner of this element relative to - * the div Blockly was injected into. - * @param {!Element} element SVG element to find the coordinates of. If this is - * not a child of the div Blockly was injected into, the behaviour is - * undefined. - * @return {!Coordinate} Object with .x and .y properties. - * @alias Blockly.utils.svgMath.getInjectionDivXY - */ - export function getInjectionDivXY(element: Element): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Check if 3D transforms are supported by adding an element - * and attempting to set the property. - * @return {boolean} True if 3D transforms are supported. - * @alias Blockly.utils.svgMath.is3dSupported - */ - export function is3dSupported(): boolean; - /** - * Get the position of the current viewport in window coordinates. This takes - * scroll into account. - * @return {!Rect} An object containing window width, height, and - * scroll position in window coordinates. - * @alias Blockly.utils.svgMath.getViewportBBox - * @package - */ - export function getViewportBBox(): { - top: number; - bottom: number; - left: number; - right: number; - contains(x: number, y: number): boolean; - intersects(other: any): boolean; - }; - /** - * Gets the document scroll distance as a coordinate object. - * Copied from Closure's goog.dom.getDocumentScroll. - * @return {!Coordinate} Object with values 'x' and 'y'. - * @alias Blockly.utils.svgMath.getDocumentScroll - */ - export function getDocumentScroll(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Converts screen coordinates to workspace coordinates. - * @param {!WorkspaceSvg} ws The workspace to find the coordinates on. - * @param {!Coordinate} screenCoordinates The screen coordinates to - * be converted to workspace coordinates - * @return {!Coordinate} The workspace coordinates. - * @alias Blockly.utils.svgMath.screenToWsCoordinates - */ - export function screenToWsCoordinates(ws: WorkspaceSvg, screenCoordinates: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Returns the dimensions of the specified SVG image. - * @param {!SVGElement} svg SVG image. - * @return {!Size} Contains width and height properties. - * @deprecated Use workspace.getCachedParentSvgSize. (2021 March 5) - * @alias Blockly.utils.svgMath.svgSize - */ - export function svgSize(svg: SVGElement): { - width: number; - height: number; - }; - /** - * Static regex to pull the x,y values out of an SVG translate() directive. - * Note that Firefox and IE (9,10) return 'translate(12)' instead of - * 'translate(12, 0)'. - * Note that IE (9,10) returns 'translate(16 8)' instead of 'translate(16, 8)'. - * Note that IE has been reported to return scientific notation (0.123456e-42). - * @type {!RegExp} - */ - const XY_REGEX: RegExp; - /** - * Static regex to pull the x,y values out of a translate() or translate3d() - * style property. - * Accounts for same exceptions as XY_REGEX. - * @type {!RegExp} - */ - const XY_STYLE_REGEX: RegExp; - import { WorkspaceSvg } from "core/workspace_svg"; - export {}; -} -declare module "core/block_drag_surface" { - /** - * Class for a drag surface for the currently dragged block. This is a separate - * SVG that contains only the currently moving block, or nothing. - * @alias Blockly.BlockDragSurfaceSvg - */ - export const BlockDragSurfaceSvg: { - new (container: Element): { - /** - * The SVG drag surface. Set once by BlockDragSurfaceSvg.createDom. - * @type {?SVGElement} - * @private - */ - SVG_: SVGElement | null; - /** - * This is where blocks live while they are being dragged if the drag - * surface is enabled. - * @type {?SVGElement} - * @private - */ - dragGroup_: SVGElement | null; - /** - * Containing HTML element; parent of the workspace and the drag surface. - * @type {!Element} - * @private - */ - container_: Element; - /** - * Cached value for the scale of the drag surface. - * Used to set/get the correct translation during and after a drag. - * @type {number} - * @private - */ - scale_: number; - /** - * Cached value for the translation of the drag surface. - * This translation is in pixel units, because the scale is applied to the - * drag group rather than the top-level SVG. - * @type {?Coordinate} - * @private - */ - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - /** - * Cached value for the translation of the child drag surface in pixel - * units. Since the child drag surface tracks the translation of the - * workspace this is ultimately the translation of the workspace. - * @type {!Coordinate} - * @private - */ - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Create the drag surface and inject it into the container. - */ - createDom(): void; - /** - * Set the SVG blocks on the drag surface's group and show the surface. - * Only one block group should be on the drag surface at a time. - * @param {!SVGElement} blocks Block or group of blocks to place on the drag - * surface. - */ - setBlocksAndShow(blocks: SVGElement): void; - /** - * Translate and scale the entire drag surface group to the given position, to - * keep in sync with the workspace. - * @param {number} x X translation in pixel coordinates. - * @param {number} y Y translation in pixel coordinates. - * @param {number} scale Scale of the group. - */ - translateAndScaleGroup(x: number, y: number, scale: number): void; - /** - * Translate the drag surface's SVG based on its internal state. - * @private - */ - translateSurfaceInternal_(): void; - /** - * Translates the entire surface by a relative offset. - * @param {number} deltaX Horizontal offset in pixel units. - * @param {number} deltaY Vertical offset in pixel units. - */ - translateBy(deltaX: number, deltaY: number): void; - /** - * Translate the entire drag surface during a drag. - * We translate the drag surface instead of the blocks inside the surface - * so that the browser avoids repainting the SVG. - * Because of this, the drag coordinates must be adjusted by scale. - * @param {number} x X translation for the entire surface. - * @param {number} y Y translation for the entire surface. - */ - translateSurface(x: number, y: number): void; - /** - * Reports the surface translation in scaled workspace coordinates. - * Use this when finishing a drag to return blocks to the correct position. - * @return {!Coordinate} Current translation of the surface. - */ - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Provide a reference to the drag group (primarily for - * BlockSvg.getRelativeToSurfaceXY). - * @return {?SVGElement} Drag surface group element. - */ - getGroup(): SVGElement | null; - /** - * Returns the SVG drag surface. - * @returns {?SVGElement} The SVG drag surface. - */ - getSvgRoot(): SVGElement | null; - /** - * Get the current blocks on the drag surface, if any (primarily - * for BlockSvg.getRelativeToSurfaceXY). - * @return {?Element} Drag surface block DOM element, or null if no blocks - * exist. - */ - getCurrentBlock(): Element | null; - /** - * Gets the translation of the child block surface - * This surface is in charge of keeping track of how much the workspace has - * moved. - * @return {!Coordinate} The amount the workspace has been moved. - */ - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Clear the group and hide the surface; move the blocks off onto the provided - * element. - * If the block is being deleted it doesn't need to go back to the original - * surface, since it would be removed immediately during dispose. - * @param {Element=} opt_newSurface Surface the dragging blocks should be - * moved to, or null if the blocks should be removed from this surface - * without being moved to a different surface. - */ - clearAndHide(opt_newSurface?: Element | undefined): void; - }; - }; -} -declare module "core/events/events_comment_change" { - /** - * Class for a comment change event. - * @extends {CommentBase} - * @alias Blockly.Events.CommentChange - */ - export class CommentChange extends CommentBase { - /** - * @param {!WorkspaceComment=} opt_comment The comment that is being - * changed. Undefined for a blank event. - * @param {string=} opt_oldContents Previous contents of the comment. - * @param {string=} opt_newContents New contents of the comment. - */ - constructor(opt_comment?: WorkspaceComment | undefined, opt_oldContents?: string | undefined, opt_newContents?: string | undefined); - oldContents_: string | undefined; - newContents_: string | undefined; - } - import { CommentBase } from "core/events/events_comment_base"; - import { WorkspaceComment } from "core/workspace_comment"; -} -declare module "core/events/events_comment_delete" { - /** - * Class for a comment deletion event. - * @extends {CommentBase} - * @alias Blockly.Events.CommentDelete - */ - export class CommentDelete extends CommentBase { - xml: Element | undefined; - } - import { CommentBase } from "core/events/events_comment_base"; -} -declare module "core/workspace_comment" { - /** - * Class for a workspace comment. - * @alias Blockly.WorkspaceComment - */ - export class WorkspaceComment { - /** - * Fire a create event for the given workspace comment, if comments are - * enabled. - * @param {!WorkspaceComment} comment The comment that was just created. - * @package - */ - static fireCreateEvent(comment: WorkspaceComment): void; - /** - * Decode an XML comment tag and create a comment on the workspace. - * @param {!Element} xmlComment XML comment element. - * @param {!Workspace} workspace The workspace. - * @return {!WorkspaceComment} The created workspace comment. - * @package - */ - static fromXml(xmlComment: Element, workspace: Workspace): WorkspaceComment; - /** - * Decode an XML comment tag and return the results in an object. - * @param {!Element} xml XML comment element. - * @return {{w: number, h: number, x: number, y: number, content: string}} An - * object containing the id, size, position, and comment string. - * @package - */ - static parseAttributes(xml: Element): { - w: number; - h: number; - x: number; - y: number; - content: string; - }; - /** - * @param {!Workspace} workspace The block's workspace. - * @param {string} content The content of this workspace comment. - * @param {number} height Height of the comment. - * @param {number} width Width of the comment. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. - */ - constructor(workspace: Workspace, content: string, height: number, width: number, opt_id?: string | undefined); - /** @type {string} */ - id: string; - /** - * The comment's position in workspace units. (0, 0) is at the workspace's - * origin; scale does not change this value. - * @type {!Coordinate} - * @protected - */ - protected xy_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * The comment's height in workspace units. Scale does not change this - * value. - * @type {number} - * @protected - */ - protected height_: number; - /** - * The comment's width in workspace units. Scale does not change this - * value. - * @type {number} - * @protected - */ - protected width_: number; - /** - * @type {!Workspace} - */ - workspace: Workspace; - /** - * @protected - * @type {boolean} - */ - protected RTL: boolean; - /** - * @type {boolean} - * @private - */ - private deletable_; - /** - * @type {boolean} - * @private - */ - private movable_; - /** - * @type {boolean} - * @private - */ - private editable_; - /** - * @protected - * @type {string} - */ - protected content_: string; - /** - * Whether this comment has been disposed. - * @protected - * @type {boolean} - */ - protected disposed_: boolean; - /** - * @package - * @type {boolean} - */ - isComment: boolean; - /** - * Dispose of this comment. - * @package - */ - dispose(): void; - /** - * Get comment height. - * @return {number} Comment height. - * @package - */ - getHeight(): number; - /** - * Set comment height. - * @param {number} height Comment height. - * @package - */ - setHeight(height: number): void; - /** - * Get comment width. - * @return {number} Comment width. - * @package - */ - getWidth(): number; - /** - * Set comment width. - * @param {number} width comment width. - * @package - */ - setWidth(width: number): void; - /** - * Get stored location. - * @return {!Coordinate} The comment's stored location. - * This is not valid if the comment is currently being dragged. - * @package - */ - getXY(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Move a comment by a relative offset. - * @param {number} dx Horizontal offset, in workspace units. - * @param {number} dy Vertical offset, in workspace units. - * @package - */ - moveBy(dx: number, dy: number): void; - /** - * Get whether this comment is deletable or not. - * @return {boolean} True if deletable. - * @package - */ - isDeletable(): boolean; - /** - * Set whether this comment is deletable or not. - * @param {boolean} deletable True if deletable. - * @package - */ - setDeletable(deletable: boolean): void; - /** - * Get whether this comment is movable or not. - * @return {boolean} True if movable. - * @package - */ - isMovable(): boolean; - /** - * Set whether this comment is movable or not. - * @param {boolean} movable True if movable. - * @package - */ - setMovable(movable: boolean): void; - /** - * Get whether this comment is editable or not. - * @return {boolean} True if editable. - */ - isEditable(): boolean; - /** - * Set whether this comment is editable or not. - * @param {boolean} editable True if editable. - */ - setEditable(editable: boolean): void; - /** - * Returns this comment's text. - * @return {string} Comment text. - * @package - */ - getContent(): string; - /** - * Set this comment's content. - * @param {string} content Comment content. - * @package - */ - setContent(content: string): void; - /** - * Encode a comment subtree as XML with XY coordinates. - * @param {boolean=} opt_noId True if the encoder should skip the comment ID. - * @return {!Element} Tree of XML elements. - * @package - */ - toXmlWithXY(opt_noId?: boolean | undefined): Element; - /** - * Encode a comment subtree as XML, but don't serialize the XY coordinates. - * This method avoids some expensive metrics-related calls that are made in - * toXmlWithXY(). - * @param {boolean=} opt_noId True if the encoder should skip the comment ID. - * @return {!Element} Tree of XML elements. - * @package - */ - toXml(opt_noId?: boolean | undefined): Element; - } - import { Workspace } from "core/workspace"; -} -declare module "core/events/events_comment_create" { - /** - * Class for a comment creation event. - * @extends {CommentBase} - * @alias Blockly.Events.CommentCreate - */ - export class CommentCreate extends CommentBase { - xml: Element | undefined; - } - import { CommentBase } from "core/events/events_comment_base"; -} -declare module "core/events/events_comment_base" { - /** - * Abstract class for a comment event. - * @extends {AbstractEvent} - * @alias Blockly.Events.CommentBase - */ - export class CommentBase extends AbstractEvent { - /** - * Helper function for Comment[Create|Delete] - * @param {!CommentCreate|!CommentDelete} event - * The event to run. - * @param {boolean} create if True then Create, if False then Delete - */ - static CommentCreateDeleteHelper(event: CommentCreate | CommentDelete, create: boolean): void; - /** - * @param {!WorkspaceComment=} opt_comment The comment this event - * corresponds to. Undefined for a blank event. - */ - constructor(opt_comment?: WorkspaceComment | undefined); - /** - * The ID of the comment this event pertains to. - * @type {string} - */ - commentId: string; - } - import { Abstract as AbstractEvent } from "core/events/events_abstract"; - import { CommentCreate } from "core/events/events_comment_create"; - import { CommentDelete } from "core/events/events_comment_delete"; - import { WorkspaceComment } from "core/workspace_comment"; -} -declare module "core/events/events_comment_move" { - /** - * Class for a comment move event. Created before the move. - * @extends {CommentBase} - * @alias Blockly.Events.CommentMove - */ - export class CommentMove extends CommentBase { - /** - * The comment that is being moved. Will be cleared after recording the new - * location. - * @type {WorkspaceComment} - */ - comment_: WorkspaceComment; - /** - * The location before the move, in workspace coordinates. - * @type {!Coordinate} - */ - oldCoordinate_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * The location after the move, in workspace coordinates. - * @type {Coordinate} - */ - newCoordinate_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Record the comment's new location. Called after the move. Can only be - * called once. - */ - recordNew(): void; - /** - * Override the location before the move. Use this if you don't create the - * event until the end of the move, but you know the original location. - * @param {!Coordinate} xy The location before the move, - * in workspace coordinates. - */ - setOldCoordinate(xy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - } - import { CommentBase } from "core/events/events_comment_base"; - import { WorkspaceComment } from "core/workspace_comment"; -} -declare module "core/interfaces/i_component" { - /** - * The interface for a workspace component that can be registered with the - * ComponentManager. - * @interface - * @alias Blockly.IComponent - */ - export function IComponent(): void; - export namespace IComponent { - const id: string; - } -} -declare module "core/interfaces/i_autohideable" { - /** - * Interface for a component that can be automatically hidden. - * @extends {IComponent} - * @interface - * @alias Blockly.IAutoHideable - */ - export class IAutoHideable {} -} -declare module "core/interfaces/i_deletable" { - /** - * The interface for an object that can be deleted. - * @interface - * @alias Blockly.IDeletable - */ - export class IDeletable {} -} -declare module "core/interfaces/i_draggable" { - /** - * The interface for an object that can be dragged. - * @extends {IDeletable} - * @interface - * @alias Blockly.IDraggable - */ - export class IDraggable {} -} -declare module "core/interfaces/i_drag_target" { - /** - * Interface for a component with custom behaviour when a block or bubble is - * dragged over or dropped on top of it. - * @extends {IComponent} - * @interface - * @alias Blockly.IDragTarget - */ - export class IDragTarget {} -} -declare module "core/interfaces/i_delete_area" { - /** - * Interface for a component that can delete a block or bubble that is dropped - * on top of it. - * @extends {IDragTarget} - * @interface - * @alias Blockly.IDeleteArea - */ - export class IDeleteArea {} -} -declare module "core/interfaces/i_registrable" { - /** - * The interface for a Blockly component that can be registered. - * @interface - * @alias Blockly.IRegistrable - */ - export class IRegistrable {} -} -declare module "core/interfaces/i_flyout" { - export class IFlyout { - /** - * Whether the flyout is laid out horizontally or not. - * @type {boolean} - */ - horizontalLayout: boolean; - /** - * Is RTL vs LTR. - * @type {boolean} - */ - RTL: boolean; - /** - * The target workspace - * @type {?WorkspaceSvg} - */ - targetWorkspace: WorkspaceSvg | null; - /** - * Margin around the edges of the blocks in the flyout. - * @type {number} - * @const - */ - MARGIN: number; - /** - * Does the flyout automatically close when a block is created? - * @type {boolean} - */ - autoClose: boolean; - /** - * Corner radius of the flyout background. - * @type {number} - * @const - */ - CORNER_RADIUS: number; - } - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/utils/metrics" { - /** - * @record - * @alias Blockly.utils.Metrics - */ - export class Metrics { - /** - * Height of the visible portion of the workspace. - * @type {number} - */ - viewHeight: number; - /** - * Width of the visible portion of the workspace. - * @type {number} - */ - viewWidth: number; - /** - * Height of the content. - * @type {number} - */ - contentHeight: number; - /** - * Width of the content. - * @type {number} - */ - contentWidth: number; - /** - * Height of the scroll area. - * @type {number} - */ - scrollHeight: number; - /** - * Width of the scroll area. - * @type {number} - */ - scrollWidth: number; - /** - * Top-edge of the visible portion of the workspace, relative to the workspace - * origin. - * @type {number} - */ - viewTop: number; - /** - * Left-edge of the visible portion of the workspace, relative to the workspace - * origin. - * @type {number} - */ - viewLeft: number; - /** - * Top-edge of the content, relative to the workspace origin. - * @type {number} - */ - contentTop: number; - /** - * Left-edge of the content relative to the workspace origin. - * @type {number} - */ - contentLeft: number; - /** - * Top-edge of the scroll area, relative to the workspace origin. - * @type {number} - */ - scrollTop: number; - /** - * Left-edge of the scroll area relative to the workspace origin. - * @type {number} - */ - scrollLeft: number; - /** - * Top-edge of the visible portion of the workspace, relative to the blocklyDiv. - * @type {number} - */ - absoluteTop: number; - /** - * Left-edge of the visible portion of the workspace, relative to the - * blocklyDiv. - * @type {number} - */ - absoluteLeft: number; - /** - * Height of the Blockly div (the view + the toolbox, simple of otherwise). - * @type {number} - */ - svgHeight: number; - /** - * Width of the Blockly div (the view + the toolbox, simple or otherwise). - * @type {number} - */ - svgWidth: number; - /** - * Width of the toolbox, if it exists. Otherwise zero. - * @type {number} - */ - toolboxWidth: number; - /** - * Height of the toolbox, if it exists. Otherwise zero. - * @type {number} - */ - toolboxHeight: number; - /** - * Top, bottom, left or right. Use TOOLBOX_AT constants to compare. - * @type {number} - */ - toolboxPosition: number; - /** - * Width of the flyout if it is always open. Otherwise zero. - * @type {number} - */ - flyoutWidth: number; - /** - * Height of the flyout if it is always open. Otherwise zero. - * @type {number} - */ - flyoutHeight: number; - } -} -declare module "core/interfaces/i_metrics_manager" { - /** - * Interface for a metrics manager. - * @interface - * @alias Blockly.IMetricsManager - */ - export class IMetricsManager {} -} -declare module "core/interfaces/i_toolbox_item" { - /** - * Interface for an item in the toolbox. - * @interface - * @alias Blockly.IToolboxItem - */ - export class IToolboxItem {} -} -declare module "core/interfaces/i_toolbox" { - /** - * Interface for a toolbox. - * @extends {IRegistrable} - * @interface - * @alias Blockly.IToolbox - */ - export class IToolbox {} -} -declare module "core/metrics_manager" { - /** - * The manager for all workspace metrics calculations. - * @implements {IMetricsManager} - * @alias Blockly.MetricsManager - */ - export class MetricsManager implements IMetricsManager { - /** - * @param {!WorkspaceSvg} workspace The workspace to calculate metrics - * for. - */ - constructor(workspace: WorkspaceSvg); - /** - * The workspace to calculate metrics for. - * @type {!WorkspaceSvg} - * @protected - */ - protected workspace_: WorkspaceSvg; - /** - * Gets the dimensions of the given workspace component, in pixel coordinates. - * @param {?IToolbox|?IFlyout} elem The element to get the - * dimensions of, or null. It should be a toolbox or flyout, and should - * implement getWidth() and getHeight(). - * @return {!Size} An object containing width and height - * attributes, which will both be zero if elem did not exist. - * @protected - */ - protected getDimensionsPx_(elem: ((() => void) | (IFlyout | null)) | null): { - width: number; - height: number; - }; - /** - * Gets the width and the height of the flyout on the workspace in pixel - * coordinates. Returns 0 for the width and height if the workspace has a - * category toolbox instead of a simple toolbox. - * @param {boolean=} opt_own Whether to only return the workspace's own - * flyout. - * @return {!MetricsManager.ToolboxMetrics} The width and height of the - * flyout. - * @public - */ - public getFlyoutMetrics(opt_own?: boolean | undefined): MetricsManager.ToolboxMetrics; - /** - * Gets the width, height and position of the toolbox on the workspace in - * pixel coordinates. Returns 0 for the width and height if the workspace has - * a simple toolbox instead of a category toolbox. To get the width and height - * of a - * simple toolbox @see {@link getFlyoutMetrics}. - * @return {!MetricsManager.ToolboxMetrics} The object with the width, - * height and position of the toolbox. - * @public - */ - public getToolboxMetrics(): MetricsManager.ToolboxMetrics; - /** - * Gets the width and height of the workspace's parent SVG element in pixel - * coordinates. This area includes the toolbox and the visible workspace area. - * @return {!Size} The width and height of the workspace's parent - * SVG element. - * @public - */ - public getSvgMetrics(): { - width: number; - height: number; - }; - /** - * Gets the absolute left and absolute top in pixel coordinates. - * This is where the visible workspace starts in relation to the SVG - * container. - * @return {!MetricsManager.AbsoluteMetrics} The absolute metrics for - * the workspace. - * @public - */ - public getAbsoluteMetrics(): MetricsManager.AbsoluteMetrics; - /** - * Gets the metrics for the visible workspace in either pixel or workspace - * coordinates. The visible workspace does not include the toolbox or flyout. - * @param {boolean=} opt_getWorkspaceCoordinates True to get the view metrics - * in workspace coordinates, false to get them in pixel coordinates. - * @return {!MetricsManager.ContainerRegion} The width, height, top and - * left of the viewport in either workspace coordinates or pixel - * coordinates. - * @public - */ - public getViewMetrics(opt_getWorkspaceCoordinates?: boolean | undefined): MetricsManager.ContainerRegion; - /** - * Gets content metrics in either pixel or workspace coordinates. - * The content area is a rectangle around all the top bounded elements on the - * workspace (workspace comments and blocks). - * @param {boolean=} opt_getWorkspaceCoordinates True to get the content - * metrics in workspace coordinates, false to get them in pixel - * coordinates. - * @return {!MetricsManager.ContainerRegion} The - * metrics for the content container. - * @public - */ - public getContentMetrics(opt_getWorkspaceCoordinates?: boolean | undefined): MetricsManager.ContainerRegion; - /** - * Returns whether the scroll area has fixed edges. - * @return {boolean} Whether the scroll area has fixed edges. - * @package - */ - hasFixedEdges(): boolean; - /** - * Computes the fixed edges of the scroll area. - * @param {!MetricsManager.ContainerRegion=} opt_viewMetrics The view - * metrics if they have been previously computed. Passing in null may - * cause the view metrics to be computed again, if it is needed. - * @return {!MetricsManager.FixedEdges} The fixed edges of the scroll - * area. - * @protected - */ - protected getComputedFixedEdges_(opt_viewMetrics?: MetricsManager.ContainerRegion | undefined): MetricsManager.FixedEdges; - /** - * Returns the content area with added padding. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view - * metrics. - * @param {!MetricsManager.ContainerRegion} contentMetrics The content - * metrics. - * @return {{top: number, bottom: number, left: number, right: number}} The - * padded content area. - * @protected - */ - protected getPaddedContent_(viewMetrics: MetricsManager.ContainerRegion, contentMetrics: MetricsManager.ContainerRegion): { - top: number; - bottom: number; - left: number; - right: number; - }; - /** - * Returns the metrics for the scroll area of the workspace. - * @param {boolean=} opt_getWorkspaceCoordinates True to get the scroll - * metrics in workspace coordinates, false to get them in pixel - * coordinates. - * @param {!MetricsManager.ContainerRegion=} opt_viewMetrics The view - * metrics if they have been previously computed. Passing in null may - * cause the view metrics to be computed again, if it is needed. - * @param {!MetricsManager.ContainerRegion=} opt_contentMetrics The - * content metrics if they have been previously computed. Passing in null - * may cause the content metrics to be computed again, if it is needed. - * @return {!MetricsManager.ContainerRegion} The metrics for the scroll - * container. - */ - getScrollMetrics(opt_getWorkspaceCoordinates?: boolean | undefined, opt_viewMetrics?: MetricsManager.ContainerRegion | undefined, opt_contentMetrics?: MetricsManager.ContainerRegion | undefined): MetricsManager.ContainerRegion; - /** - * Returns common metrics used by UI elements. - * @return {!MetricsManager.UiMetrics} The UI metrics. - */ - getUiMetrics(): MetricsManager.UiMetrics; - /** - * Returns an object with all the metrics required to size scrollbars for a - * top level workspace. The following properties are computed: - * Coordinate system: pixel coordinates, -left, -up, +right, +down - * .viewHeight: Height of the visible portion of the workspace. - * .viewWidth: Width of the visible portion of the workspace. - * .contentHeight: Height of the content. - * .contentWidth: Width of the content. - * .scrollHeight: Height of the scroll area. - * .scrollWidth: Width of the scroll area. - * .svgHeight: Height of the Blockly div (the view + the toolbox, - * simple or otherwise), - * .svgWidth: Width of the Blockly div (the view + the toolbox, - * simple or otherwise), - * .viewTop: Top-edge of the visible portion of the workspace, relative to - * the workspace origin. - * .viewLeft: Left-edge of the visible portion of the workspace, relative to - * the workspace origin. - * .contentTop: Top-edge of the content, relative to the workspace origin. - * .contentLeft: Left-edge of the content relative to the workspace origin. - * .scrollTop: Top-edge of the scroll area, relative to the workspace origin. - * .scrollLeft: Left-edge of the scroll area relative to the workspace origin. - * .absoluteTop: Top-edge of the visible portion of the workspace, relative - * to the blocklyDiv. - * .absoluteLeft: Left-edge of the visible portion of the workspace, relative - * to the blocklyDiv. - * .toolboxWidth: Width of the toolbox, if it exists. Otherwise zero. - * .toolboxHeight: Height of the toolbox, if it exists. Otherwise zero. - * .flyoutWidth: Width of the flyout if it is always open. Otherwise zero. - * .flyoutHeight: Height of the flyout if it is always open. Otherwise zero. - * .toolboxPosition: Top, bottom, left or right. Use TOOLBOX_AT constants to - * compare. - * @return {!Metrics} Contains size and position metrics of a top - * level workspace. - * @public - */ - public getMetrics(): Metrics; - } - export namespace MetricsManager { - /** - * Describes the width, height and location of the toolbox on the main - * workspace. - */ - type ToolboxMetrics = { - width: number; - height: number; - position: toolboxUtils.Position; - }; - /** - * Describes where the viewport starts in relation to the workspace SVG. - */ - type AbsoluteMetrics = { - left: number; - top: number; - }; - /** - * All the measurements needed to describe the size and location of a - * container. - */ - type ContainerRegion = { - height: number; - width: number; - top: number; - left: number; - }; - /** - * Describes fixed edges of the workspace. - */ - type FixedEdges = { - top: (number | undefined); - bottom: (number | undefined); - left: (number | undefined); - right: (number | undefined); - }; - /** - * Common metrics used for UI elements. - */ - type UiMetrics = { - viewMetrics: MetricsManager.ContainerRegion; - absoluteMetrics: MetricsManager.AbsoluteMetrics; - toolboxMetrics: MetricsManager.ToolboxMetrics; - }; - } - import { IMetricsManager } from "core/interfaces/i_metrics_manager"; - import { WorkspaceSvg } from "core/workspace_svg"; - import { IFlyout } from "core/interfaces/i_flyout"; - import { Metrics } from "core/utils/metrics"; - import * as toolboxUtils from "core/utils/toolbox"; -} -declare module "core/interfaces/i_positionable" { - /** - * Interface for a component that is positioned on top of the workspace. - * @extends {IComponent} - * @interface - * @alias Blockly.IPositionable - */ - export class IPositionable {} -} -declare module "core/component_manager" { - /** - * Manager for all items registered with the workspace. - * @alias Blockly.ComponentManager - */ - export class ComponentManager { - /** - * A map of the components registered with the workspace, mapped to id. - * @type {!Object} - * @private - */ - private componentData_; - /** - * A map of capabilities to component IDs. - * @type {!Object>} - * @private - */ - private capabilityToComponentIds_; - /** - * Adds a component. - * @param {!ComponentManager.ComponentDatum} componentInfo The data for - * the component to register. - * @param {boolean=} opt_allowOverrides True to prevent an error when - * overriding an already registered item. - */ - addComponent(componentInfo: ComponentManager.ComponentDatum, opt_allowOverrides?: boolean | undefined): void; - /** - * Removes a component. - * @param {string} id The ID of the component to remove. - */ - removeComponent(id: string): void; - /** - * Adds a capability to a existing registered component. - * @param {string} id The ID of the component to add the capability to. - * @param {string|!ComponentManager.Capability} capability The - * capability to add. - * @template T - */ - addCapability(id: string, capability: string | { - /** - * @type {string} - * @private - */ - name_: string; - /** - * Returns the name of the capability. - * @return {string} The name. - * @override - */ - toString(): string; - }): void; - /** - * Removes a capability from an existing registered component. - * @param {string} id The ID of the component to remove the capability from. - * @param {string|!ComponentManager.Capability} capability The - * capability to remove. - * @template T - */ - removeCapability(id: string, capability: string | { - /** - * @type {string} - * @private - */ - name_: string; - /** - * Returns the name of the capability. - * @return {string} The name. - * @override - */ - toString(): string; - }): void; - /** - * Returns whether the component with this id has the specified capability. - * @param {string} id The ID of the component to check. - * @param {string|!ComponentManager.Capability} capability The - * capability to check for. - * @return {boolean} Whether the component has the capability. - * @template T - */ - hasCapability(id: string, capability: string | { - /** - * @type {string} - * @private - */ - name_: string; - /** - * Returns the name of the capability. - * @return {string} The name. - * @override - */ - toString(): string; - }): boolean; - /** - * Gets the component with the given ID. - * @param {string} id The ID of the component to get. - * @return {!IComponent|undefined} The component with the given name - * or undefined if not found. - */ - getComponent(id: string): { - (): void; - id: string; - } | undefined; - /** - * Gets all the components with the specified capability. - * @param {string|!ComponentManager.Capability - * } capability The capability of the component. - * @param {boolean} sorted Whether to return list ordered by weights. - * @return {!Array} The components that match the specified capability. - * @template T - */ - getComponents(capability: string | { - /** - * @type {string} - * @private - */ - name_: string; - /** - * Returns the name of the capability. - * @return {string} The name. - * @override - */ - toString(): string; - }, sorted: boolean): T_4[]; - } - export namespace ComponentManager { - export { Capability }; - /** - * An object storing component information. - */ - export type ComponentDatum = { - component: { - (): void; - id: string; - }; - capabilities: (Array); - weight: number; - }; - } - class Capability { - /** - * @param {string} name The name of the component capability. - */ - constructor(name: string); - /** - * @type {string} - * @private - */ - private name_; - /** - * Returns the name of the capability. - * @return {string} The name. - * @override - */ - toString(): string; - } - export {}; -} -declare module "core/interfaces/i_contextmenu" { - /** - * @interface - * @alias Blockly.IContextMenu - */ - export class IContextMenu {} -} -declare module "core/interfaces/i_bubble" { - /** - * A bubble interface. - * @interface - * @extends {IDraggable} - * @extends {IContextMenu} - * @alias Blockly.IBubble - */ - export class IBubble {} -} -declare module "core/css" { - /** - * Add some CSS to the blob that will be injected later. Allows optional - * components such as fields and the toolbox to store separate CSS. - * @param {string|!Array} cssContent Multiline CSS string or an array of - * single lines of CSS. - * @alias Blockly.Css.register - */ - export function register(cssContent: string | Array): void; - /** - * Inject the CSS into the DOM. This is preferable over using a regular CSS - * file since: - * a) It loads synchronously and doesn't force a redraw later. - * b) It speeds up loading by not blocking on a separate HTTP transfer. - * c) The CSS content may be made dynamic depending on init options. - * @param {boolean} hasCss If false, don't inject CSS - * (providing CSS becomes the document's responsibility). - * @param {string} pathToMedia Path from page to the Blockly media directory. - * @alias Blockly.Css.inject - */ - export function inject(hasCss: boolean, pathToMedia: string): void; - /** - * The CSS content for Blockly. - * @alias Blockly.Css.content - */ - export let content: string; -} -declare module "core/interfaces/i_bounded_element" { - /** - * A bounded element interface. - * @interface - * @alias Blockly.IBoundedElement - */ - export class IBoundedElement {} -} -declare module "core/interfaces/i_movable" { - /** - * The interface for an object that is movable. - * @interface - * @alias Blockly.IMovable - */ - export class IMovable {} -} -declare module "core/interfaces/i_selectable" { - export class ISelectable { - /** - * @type {string} - */ - id: string; - } -} -declare module "core/interfaces/i_copyable" { - /** - * @extends {ISelectable} - * @interface - * @alias Blockly.ICopyable - */ - export class ICopyable {} - export namespace ICopyable { - /** - * Copy Metadata. - */ - type CopyData = { - saveInfo: (Object | Element); - source: WorkspaceSvg; - typeCounts: Object | null; - }; - } - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/events/events_selected" { - /** - * Class for a selected event. - * @extends {UiBase} - * @alias Blockly.Events.Selected - */ - export class Selected extends UiBase { - /** - * @param {?string=} opt_oldElementId The ID of the previously selected - * element. Null if no element last selected. Undefined for a blank event. - * @param {?string=} opt_newElementId The ID of the selected element. Null if - * no element currently selected (deselect). Undefined for a blank event. - * @param {string=} opt_workspaceId The workspace identifier for this event. - * Null if no element previously selected. Undefined for a blank event. - */ - constructor(opt_oldElementId?: (string | null) | undefined, opt_newElementId?: (string | null) | undefined, opt_workspaceId?: string | undefined); - /** - * The id of the last selected element. - * @type {?string|undefined} - */ - oldElementId: (string | undefined) | null; - /** - * The id of the selected element. - * @type {?string|undefined} - */ - newElementId: (string | undefined) | null; - } - import { UiBase } from "core/events/events_ui_base"; -} -declare module "core/workspace_comment_svg" { - /** - * Class for a workspace comment's SVG representation. - * @extends {WorkspaceComment} - * @implements {IBoundedElement} - * @implements {IBubble} - * @implements {ICopyable} - * @alias Blockly.WorkspaceCommentSvg - */ - export class WorkspaceCommentSvg extends WorkspaceComment implements IBoundedElement, IBubble, ICopyable { - /** - * Decode an XML comment tag and create a rendered comment on the workspace. - * @param {!Element} xmlComment XML comment element. - * @param {!WorkspaceSvg} workspace The workspace. - * @param {number=} opt_wsWidth The width of the workspace, which is used to - * position comments correctly in RTL. - * @return {!WorkspaceCommentSvg} The created workspace comment. - * @package - */ - static fromXmlRendered(xmlComment: Element, workspace: WorkspaceSvg, opt_wsWidth?: number | undefined): WorkspaceCommentSvg; - /** - * @param {!WorkspaceSvg} workspace The block's workspace. - * @param {string} content The content of this workspace comment. - * @param {number} height Height of the comment. - * @param {number} width Width of the comment. - * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise - * create a new ID. - */ - constructor(workspace: WorkspaceSvg, content: string, height: number, width: number, opt_id?: string | undefined); - /** - * Mouse up event data. - * @type {?browserEvents.Data} - * @private - */ - private onMouseUpWrapper_; - /** - * Mouse move event data. - * @type {?browserEvents.Data} - * @private - */ - private onMouseMoveWrapper_; - /** - * Whether event handlers have been initialized. - * @type {boolean} - * @private - */ - private eventsInit_; - /** - * @type {?Element} - * @private - */ - private textarea_; - /** - * @type {?SVGRectElement} - * @private - */ - private svgRectTarget_; - /** - * @type {?SVGRectElement} - * @private - */ - private svgHandleTarget_; - /** - * @type {?SVGForeignObjectElement} - * @private - */ - private foreignObject_; - /** - * @type {?SVGGElement} - * @private - */ - private resizeGroup_; - /** - * @type {?SVGGElement} - * @private - */ - private deleteGroup_; - /** - * @type {?SVGCircleElement} - * @private - */ - private deleteIconBorder_; - /** - * @type {boolean} - * @private - */ - private focused_; - /** - * @type {boolean} - * @private - */ - private autoLayout_; - /** - * @type {!SVGElement} - * @private - */ - private svgGroup_; - svgRect_: SVGRectElement; - /** - * Whether the comment is rendered onscreen and is a part of the DOM. - * @type {boolean} - * @private - */ - private rendered_; - /** - * Whether to move the comment to the drag surface when it is dragged. - * True if it should move, false if it should be translated directly. - * @type {boolean} - * @private - */ - private useDragSurface_; - /** - * Create and initialize the SVG representation of a workspace comment. - * May be called more than once. - * - * @param {boolean=} opt_noSelect Text inside text area will be selected if - * false - * - * @package - */ - initSvg(opt_noSelect?: boolean | undefined): void; - /** - * Handle a mouse-down on an SVG comment. - * @param {!Event} e Mouse down event or touch start event. - * @private - */ - private pathMouseDown_; - /** - * Show the context menu for this workspace comment. - * @param {!Event} e Mouse event. - * @package - */ - showContextMenu(e: Event): void; - /** - * Select this comment. Highlight it visually. - * @package - */ - select(): void; - /** - * Unselect this comment. Remove its highlighting. - * @package - */ - unselect(): void; - /** - * Select this comment. Highlight it visually. - * @package - */ - addSelect(): void; - /** - * Unselect this comment. Remove its highlighting. - * @package - */ - removeSelect(): void; - /** - * Focus this comment. Highlight it visually. - * @package - */ - addFocus(): void; - /** - * Unfocus this comment. Remove its highlighting. - * @package - */ - removeFocus(): void; - /** - * Return the coordinates of the top-left corner of this comment relative to - * the drawing surface's origin (0,0), in workspace units. - * If the comment is on the workspace, (0, 0) is the origin of the workspace - * coordinate system. - * This does not change with workspace scale. - * @return {!Coordinate} Object with .x and .y properties in - * workspace coordinates. - * @package - */ - getRelativeToSurfaceXY(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Transforms a comment by setting the translation on the transform attribute - * of the block's SVG. - * @param {number} x The x coordinate of the translation in workspace units. - * @param {number} y The y coordinate of the translation in workspace units. - * @package - */ - translate(x: number, y: number): void; - /** - * Move this comment to its workspace's drag surface, accounting for - * positioning. Generally should be called at the same time as - * setDragging(true). Does nothing if useDragSurface_ is false. - * @package - */ - moveToDragSurface(): void; - /** - * Move this comment during a drag, taking into account whether we are using a - * drag surface to translate blocks. - * @param {BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ - moveDuringDrag(dragSurface: { - SVG_: SVGElement | null; - dragGroup_: SVGElement | null; - container_: Element; - scale_: number; - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - createDom(): void; /** - * @type {?SVGRectElement} - * @private - */ - setBlocksAndShow(blocks: SVGElement): void; /** - * @type {boolean} - * @private - */ - translateAndScaleGroup(x: number, y: number, scale: number): void; - translateSurfaceInternal_(): void; - translateBy(deltaX: number, deltaY: number): void; - translateSurface(x: number, y: number): void; - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - getGroup(): SVGElement | null; - getSvgRoot(): SVGElement | null; - getCurrentBlock(): Element | null; - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - clearAndHide(opt_newSurface?: Element | undefined): void; - }, newLoc: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ - moveTo(x: number, y: number): void; - /** - * Clear the comment of transform="..." attributes. - * Used when the comment is switching from 3d to 2d transform or vice versa. - * @private - */ - private clearTransformAttributes_; - /** - * Returns the coordinates of a bounding box describing the dimensions of this - * comment. - * Coordinate system: workspace coordinates. - * @return {!Rect} Object with coordinates of the bounding box. - * @package - */ - getBoundingRectangle(): { - top: number; - bottom: number; - left: number; - right: number; - contains(x: number, y: number): boolean; - intersects(other: any): boolean; - }; - /** - * Add or remove the UI indicating if this comment is movable or not. - * @package - */ - updateMovable(): void; - /** - * Recursively adds or removes the dragging class to this node and its - * children. - * @param {boolean} adding True if adding, false if removing. - * @package - */ - setDragging(adding: boolean): void; - /** - * Return the root node of the SVG or null if none exists. - * @return {!SVGElement} The root SVG node (probably a group). - * @package - */ - getSvgRoot(): SVGElement; - /** - * Update the cursor over this comment by adding or removing a class. - * @param {boolean} enable True if the delete cursor should be shown, false - * otherwise. - * @package - */ - setDeleteStyle(enable: boolean): void; - /** - * Set whether auto-layout of this bubble is enabled. The first time a bubble - * is shown it positions itself to not cover any blocks. Once a user has - * dragged it to reposition, it renders where the user put it. - * @param {boolean} _enable True if auto-layout should be enabled, false - * otherwise. - * @package - */ - setAutoLayout(_enable: boolean): void; - /** - * Encode a comment for copying. - * @return {!ICopyable.CopyData} Copy metadata. - * @package - */ - toCopyData(): ICopyable.CopyData; - /** - * Returns a bounding box describing the dimensions of this comment. - * @return {!{height: number, width: number}} Object with height and width - * properties in workspace units. - * @package - */ - getHeightWidth(): { - height: number; - width: number; - }; - /** - * Renders the workspace comment. - * @package - */ - render(): void; - /** - * Create the text area for the comment. - * @return {!Element} The top-level node of the editor. - * @private - */ - private createEditor_; - /** - * Add the resize icon to the DOM - * @private - */ - private addResizeDom_; - /** - * Add the delete icon to the DOM - * @private - */ - private addDeleteDom_; - /** - * Handle a mouse-down on comment's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ - private resizeMouseDown_; - /** - * Handle a mouse-down on comment's delete icon. - * @param {!Event} e Mouse down event. - * @private - */ - private deleteMouseDown_; - /** - * Handle a mouse-out on comment's delete icon. - * @param {!Event} _e Mouse out event. - * @private - */ - private deleteMouseOut_; - /** - * Handle a mouse-up on comment's delete icon. - * @param {!Event} e Mouse up event. - * @private - */ - private deleteMouseUp_; - /** - * Stop binding to the global mouseup and mousemove events. - * @private - */ - private unbindDragEvents_; - /** - * Handle a mouse-up event while dragging a comment's border or resize handle. - * @param {!Event} _e Mouse up event. - * @private - */ - private resizeMouseUp_; - /** - * Resize this comment to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ - private resizeMouseMove_; - /** - * Callback function triggered when the comment has resized. - * Resize the text area accordingly. - * @private - */ - private resizeComment_; - /** - * Set size - * @param {number} width width of the container - * @param {number} height height of the container - * @private - */ - private setSize_; - /** - * Dispose of any rendered comment components. - * @private - */ - private disposeInternal_; - /** - * Set the focus on the text area. - * @package - */ - setFocus(): void; - /** - * Remove focus from the text area. - * @package - */ - blurFocus(): void; - } - export namespace WorkspaceCommentSvg { - const DEFAULT_SIZE: number; - const TOP_OFFSET: number; - } - import { IBoundedElement } from "core/interfaces/i_bounded_element"; - import { IBubble } from "core/interfaces/i_bubble"; - import { ICopyable } from "core/interfaces/i_copyable"; - import { WorkspaceComment } from "core/workspace_comment"; - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/scrollbar" { - /** - * A note on units: most of the numbers that are in CSS pixels are scaled if the - * scrollbar is in a mutator. - */ - /** - * Class for a pure SVG scrollbar. - * This technique offers a scrollbar that is guaranteed to work, but may not - * look or behave like the system's scrollbars. - * @alias Blockly.Scrollbar - */ - export class Scrollbar { - /** - * @param {!Metrics} first An object containing computed - * measurements of a workspace. - * @param {!Metrics} second Another object containing computed - * measurements of a workspace. - * @return {boolean} Whether the two sets of metrics are equivalent. - * @private - */ - private static metricsAreEquivalent_; - /** - * @param {!WorkspaceSvg} workspace Workspace to bind the scrollbar to. - * @param {boolean} horizontal True if horizontal, false if vertical. - * @param {boolean=} opt_pair True if scrollbar is part of a horiz/vert pair. - * @param {string=} opt_class A class to be applied to this scrollbar. - * @param {number=} opt_margin The margin to apply to this scrollbar. - */ - constructor(workspace: WorkspaceSvg, horizontal: boolean, opt_pair?: boolean | undefined, opt_class?: string | undefined, opt_margin?: number | undefined); - /** - * The workspace this scrollbar is bound to. - * @type {!WorkspaceSvg} - * @private - */ - private workspace_; - /** - * Whether this scrollbar is part of a pair. - * @type {boolean} - * @private - */ - private pair_; - /** - * Whether this is a horizontal scrollbar. - * @type {boolean} - * @private - */ - private horizontal_; - /** - * Margin around the scrollbar (between the scrollbar and the edge of the - * viewport in pixels). - * @type {number} - * @const - * @private - */ - private margin_; - /** - * Previously recorded metrics from the workspace. - * @type {?Metrics} - * @private - */ - private oldHostMetrics_; - /** - * The ratio of handle position offset to workspace content displacement. - * @type {?number} - * @package - */ - ratio: number | null; - /** - * The location of the origin of the workspace that the scrollbar is in, - * measured in CSS pixels relative to the injection div origin. This is - * usually (0, 0). When the scrollbar is in a flyout it may have a - * different origin. - * @type {Coordinate} - * @private - */ - private origin_; - /** - * The position of the mouse along this scrollbar's major axis at the start - * of the most recent drag. Units are CSS pixels, with (0, 0) at the top - * left of the browser window. For a horizontal scrollbar this is the x - * coordinate of the mouse down event; for a vertical scrollbar it's the y - * coordinate of the mouse down event. - * @type {number} - * @private - */ - private startDragMouse_; - /** - * The length of the scrollbars (including the handle and the background), - * in CSS pixels. This is equivalent to scrollbar background length and the - * area within which the scrollbar handle can move. - * @type {number} - * @private - */ - private scrollbarLength_; - /** - * The length of the scrollbar handle in CSS pixels. - * @type {number} - * @private - */ - private handleLength_; - /** - * The offset of the start of the handle from the scrollbar position, in CSS - * pixels. - * @type {number} - * @private - */ - private handlePosition_; - /** - * @type {number} - * @private - */ - private startDragHandle; - /** - * Whether the scrollbar handle is visible. - * @type {boolean} - * @private - */ - private isVisible_; - /** - * Whether the workspace containing this scrollbar is visible. - * @type {boolean} - * @private - */ - private containerVisible_; - /** - * @type {?SVGRectElement} - * @private - */ - private svgBackground_; - /** - * @type {?SVGRectElement} - * @private - */ - private svgHandle_; - /** - * @type {?SVGSVGElement} - * @private - */ - private outerSvg_; - /** - * @type {?SVGGElement} - * @private - */ - private svgGroup_; - /** - * The upper left corner of the scrollbar's SVG group in CSS pixels relative - * to the scrollbar's origin. This is usually relative to the injection div - * origin. - * @type {Coordinate} - * @package - */ - position: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - lengthAttribute_: string; - positionAttribute_: string; - onMouseDownBarWrapper_: any[][]; - onMouseDownHandleWrapper_: any[][]; - /** - * Dispose of this scrollbar. - * Unlink from all DOM elements to prevent memory leaks. - * @suppress {checkTypes} - */ - dispose(): void; - /** - * Constrain the handle's length within the minimum (0) and maximum - * (scrollbar background) values allowed for the scrollbar. - * @param {number} value Value that is potentially out of bounds, in CSS - * pixels. - * @return {number} Constrained value, in CSS pixels. - * @private - */ - private constrainHandleLength_; - /** - * Set the length of the scrollbar's handle and change the SVG attribute - * accordingly. - * @param {number} newLength The new scrollbar handle length in CSS pixels. - * @private - */ - private setHandleLength_; - /** - * Constrain the handle's position within the minimum (0) and maximum values - * allowed for the scrollbar. - * @param {number} value Value that is potentially out of bounds, in CSS - * pixels. - * @return {number} Constrained value, in CSS pixels. - * @private - */ - private constrainHandlePosition_; - /** - * Set the offset of the scrollbar's handle from the scrollbar's position, and - * change the SVG attribute accordingly. - * @param {number} newPosition The new scrollbar handle offset in CSS pixels. - */ - setHandlePosition(newPosition: number): void; - /** - * Set the size of the scrollbar's background and change the SVG attribute - * accordingly. - * @param {number} newSize The new scrollbar background length in CSS pixels. - * @private - */ - private setScrollbarLength_; - /** - * Set the position of the scrollbar's SVG group in CSS pixels relative to the - * scrollbar's origin. This sets the scrollbar's location within the - * workspace. - * @param {number} x The new x coordinate. - * @param {number} y The new y coordinate. - * @package - */ - setPosition(x: number, y: number): void; - /** - * Recalculate the scrollbar's location and its length. - * @param {Metrics=} opt_metrics A data structure of from the - * describing all the required dimensions. If not provided, it will be - * fetched from the host object. - */ - resize(opt_metrics?: Metrics | undefined): void; - /** - * Returns whether the a resizeView is necessary by comparing the passed - * hostMetrics with cached old host metrics. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - * @return {boolean} Whether a resizeView is necessary. - * @private - */ - private requiresViewResize_; - /** - * Recalculate a horizontal scrollbar's location and length. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - * @private - */ - private resizeHorizontal_; - /** - * Recalculate a horizontal scrollbar's location on the screen and path - * length. This should be called when the layout or size of the window has - * changed. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - */ - resizeViewHorizontal(hostMetrics: Metrics): void; - /** - * Recalculate a horizontal scrollbar's location within its path and length. - * This should be called when the contents of the workspace have changed. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - */ - resizeContentHorizontal(hostMetrics: Metrics): void; - /** - * Recalculate a vertical scrollbar's location and length. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - * @private - */ - private resizeVertical_; - /** - * Recalculate a vertical scrollbar's location on the screen and path length. - * This should be called when the layout or size of the window has changed. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - */ - resizeViewVertical(hostMetrics: Metrics): void; - /** - * Recalculate a vertical scrollbar's location within its path and length. - * This should be called when the contents of the workspace have changed. - * @param {!Metrics} hostMetrics A data structure describing all - * the required dimensions, possibly fetched from the host object. - */ - resizeContentVertical(hostMetrics: Metrics): void; - /** - * Create all the DOM elements required for a scrollbar. - * The resulting widget is not sized. - * @param {string=} opt_class A class to be applied to this scrollbar. - * @private - */ - private createDom_; - /** - * Is the scrollbar visible. Non-paired scrollbars disappear when they aren't - * needed. - * @return {boolean} True if visible. - */ - isVisible(): boolean; - /** - * Set whether the scrollbar's container is visible and update - * display accordingly if visibility has changed. - * @param {boolean} visible Whether the container is visible - */ - setContainerVisible(visible: boolean): void; - /** - * Set whether the scrollbar is visible. - * Only applies to non-paired scrollbars. - * @param {boolean} visible True if visible. - */ - setVisible(visible: boolean): void; - /** - * Update visibility of scrollbar based on whether it thinks it should - * be visible and whether its containing workspace is visible. - * We cannot rely on the containing workspace being hidden to hide us - * because it is not necessarily our parent in the DOM. - */ - updateDisplay_(): void; - /** - * Scroll by one pageful. - * Called when scrollbar background is clicked. - * @param {!Event} e Mouse down event. - * @private - */ - private onMouseDownBar_; - /** - * Start a dragging operation. - * Called when scrollbar handle is clicked. - * @param {!Event} e Mouse down event. - * @private - */ - private onMouseDownHandle_; - /** - * Drag the scrollbar's handle. - * @param {!Event} e Mouse up event. - * @private - */ - private onMouseMoveHandle_; - /** - * Release the scrollbar handle and reset state accordingly. - * @private - */ - private onMouseUpHandle_; - /** - * Hide chaff and stop binding to mouseup and mousemove events. Call this to - * wrap up loose ends associated with the scrollbar. - * @private - */ - private cleanUp_; - /** - * Helper to calculate the ratio of handle position to scrollbar view size. - * @return {number} Ratio. - * @package - */ - getRatio_(): number; - /** - * Updates workspace metrics based on new scroll ratio. Called when scrollbar - * is moved. - * @private - */ - private updateMetrics_; - /** - * Set the scrollbar handle's position. - * @param {number} value The content displacement, relative to the view in - * pixels. - * @param {boolean=} updateMetrics Whether to update metrics on this set call. - * Defaults to true. - */ - set(value: number, updateMetrics?: boolean | undefined): void; - /** - * Record the origin of the workspace that the scrollbar is in, in pixels - * relative to the injection div origin. This is for times when the scrollbar - * is used in an object whose origin isn't the same as the main workspace - * (e.g. in a flyout.) - * @param {number} x The x coordinate of the scrollbar's origin, in CSS - * pixels. - * @param {number} y The y coordinate of the scrollbar's origin, in CSS - * pixels. - */ - setOrigin(x: number, y: number): void; - } - export namespace Scrollbar { - const scrollbarThickness: number; - const DEFAULT_SCROLLBAR_MARGIN: number; - } - import { Metrics } from "core/utils/metrics"; - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/bubble" { - /** - * Class for UI bubble. - * @implements {IBubble} - * @alias Blockly.Bubble - */ - export const Bubble: { - new (workspace: WorkspaceSvg, content: Element, shape: Element, anchorXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }, bubbleWidth: number | null, bubbleHeight: number | null): { - workspace_: WorkspaceSvg; - content_: Element; - shape_: Element; - /** - * Flag to stop incremental rendering during construction. - * @type {boolean} - * @private - */ - rendered_: boolean; - /** - * The SVG group containing all parts of the bubble. - * @type {SVGGElement} - * @private - */ - bubbleGroup_: SVGGElement; - /** - * The SVG path for the arrow from the bubble to the icon on the block. - * @type {SVGPathElement} - * @private - */ - bubbleArrow_: SVGPathElement; - /** - * The SVG rect for the main body of the bubble. - * @type {SVGRectElement} - * @private - */ - bubbleBack_: SVGRectElement; - /** - * The SVG group for the resize hash marks on some bubbles. - * @type {SVGGElement} - * @private - */ - resizeGroup_: SVGGElement; - /** - * Absolute coordinate of anchor point, in workspace coordinates. - * @type {Coordinate} - * @private - */ - anchorXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Relative X coordinate of bubble with respect to the anchor's centre, - * in workspace units. - * In RTL mode the initial value is negated. - * @type {number} - * @private - */ - relativeLeft_: number; - /** - * Relative Y coordinate of bubble with respect to the anchor's centre, in - * workspace units. - * @type {number} - * @private - */ - relativeTop_: number; - /** - * Width of bubble, in workspace units. - * @type {number} - * @private - */ - width_: number; - /** - * Height of bubble, in workspace units. - * @type {number} - * @private - */ - height_: number; - /** - * Automatically position and reposition the bubble. - * @type {boolean} - * @private - */ - autoLayout_: boolean; - /** - * Method to call on resize of bubble. - * @type {?function()} - * @private - */ - resizeCallback_: (() => any) | null; - /** - * Method to call on move of bubble. - * @type {?function()} - * @private - */ - moveCallback_: (() => any) | null; - /** - * Mouse down on bubbleBack_ event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseDownBubbleWrapper_: any[][] | null; - /** - * Mouse down on resizeGroup_ event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseDownResizeWrapper_: any[][] | null; - /** - * Describes whether this bubble has been disposed of (nodes and event - * listeners removed from the page) or not. - * @type {boolean} - * @package - */ - disposed: boolean; - arrow_radians_: number; - /** - * Create the bubble's DOM. - * @param {!Element} content SVG content for the bubble. - * @param {boolean} hasResize Add diagonal resize gripper if true. - * @return {!SVGElement} The bubble's SVG group. - * @private - */ - createDom_(content: Element, hasResize: boolean): SVGElement; - /** - * Return the root node of the bubble's SVG group. - * @return {!SVGElement} The root SVG node of the bubble's group. - */ - getSvgRoot(): SVGElement; - /** - * Expose the block's ID on the bubble's top-level SVG group. - * @param {string} id ID of block. - */ - setSvgId(id: string): void; - /** - * Handle a mouse-down on bubble's border. - * @param {!Event} e Mouse down event. - * @private - */ - bubbleMouseDown_(e: Event): void; - /** - * Show the context menu for this bubble. - * @param {!Event} _e Mouse event. - * @package - */ - showContextMenu(_e: Event): void; - /** - * Get whether this bubble is deletable or not. - * @return {boolean} True if deletable. - * @package - */ - isDeletable(): boolean; - /** - * Update the style of this bubble when it is dragged over a delete area. - * @param {boolean} _enable True if the bubble is about to be deleted, false - * otherwise. - */ - setDeleteStyle(_enable: boolean): void; - /** - * Handle a mouse-down on bubble's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ - resizeMouseDown_(e: Event): void; - /** - * Resize this bubble to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ - resizeMouseMove_(e: Event): void; - /** - * Register a function as a callback event for when the bubble is resized. - * @param {!Function} callback The function to call on resize. - */ - registerResizeEvent(callback: Function): void; - /** - * Register a function as a callback event for when the bubble is moved. - * @param {!Function} callback The function to call on move. - */ - registerMoveEvent(callback: Function): void; - /** - * Move this bubble to the top of the stack. - * @return {boolean} Whether or not the bubble has been moved. - * @package - */ - promote(): boolean; - /** - * Notification that the anchor has moved. - * Update the arrow and bubble accordingly. - * @param {!Coordinate} xy Absolute location. - */ - setAnchorLocation(xy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Position the bubble so that it does not fall off-screen. - * @private - */ - layoutBubble_(): void; - /** - * Calculate the what percentage of the bubble overlaps with the visible - * workspace (what percentage of the bubble is visible). - * @param {!{x: number, y: number}} relativeMin The position of the top-left - * corner of the bubble relative to the anchor point. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The percentage of the bubble that is visible. - * @private - */ - getOverlap_(relativeMin: { - x: number; - y: number; - }, viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Calculate what the optimal horizontal position of the top-left corner of - * the bubble is (relative to the anchor point) so that the most area of the - * bubble is shown. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The optimal horizontal position of the top-left corner - * of the bubble. - * @private - */ - getOptimalRelativeLeft_(viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Calculate what the optimal vertical position of the top-left corner of - * the bubble is (relative to the anchor point) so that the most area of the - * bubble is shown. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The optimal vertical position of the top-left corner - * of the bubble. - * @private - */ - getOptimalRelativeTop_(viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Move the bubble to a location relative to the anchor's centre. - * @private - */ - positionBubble_(): void; - /** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ - moveTo(x: number, y: number): void; - /** - * Triggers a move callback if one exists at the end of a drag. - * @param {boolean} adding True if adding, false if removing. - * @package - */ - setDragging(adding: boolean): void; - /** - * Get the dimensions of this bubble. - * @return {!Size} The height and width of the bubble. - */ - getBubbleSize(): { - width: number; - height: number; - }; - /** - * Size this bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - */ - setBubbleSize(width: number, height: number): void; - /** - * Draw the arrow between the bubble and the origin. - * @private - */ - renderArrow_(): void; - /** - * Change the colour of a bubble. - * @param {string} hexColour Hex code of colour. - */ - setColour(hexColour: string): void; - /** - * Dispose of this bubble. - */ - dispose(): void; - /** - * Move this bubble during a drag, taking into account whether or not there is - * a drag surface. - * @param {BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ - moveDuringDrag(dragSurface: { - SVG_: SVGElement | null; - dragGroup_: SVGElement | null; - container_: Element; - scale_: number; - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - createDom(): void; - setBlocksAndShow(blocks: SVGElement): void; - translateAndScaleGroup(x: number, y: number, scale: number): void; - translateSurfaceInternal_(): void; - translateBy(deltaX: number, deltaY: number): void; - translateSurface(x: number, y: number): void; - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - getGroup(): SVGElement | null; - getSvgRoot(): SVGElement | null; - getCurrentBlock(): Element | null; - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - clearAndHide(opt_newSurface?: Element | undefined): void; - }, newLoc: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Return the coordinates of the top-left corner of this bubble's body - * relative to the drawing surface's origin (0,0), in workspace units. - * @return {!Coordinate} Object with .x and .y properties. - */ - getRelativeToSurfaceXY(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Set whether auto-layout of this bubble is enabled. The first time a bubble - * is shown it positions itself to not cover any blocks. Once a user has - * dragged it to reposition, it renders where the user put it. - * @param {boolean} enable True if auto-layout should be enabled, false - * otherwise. - * @package - */ - setAutoLayout(enable: boolean): void; - }; - /** - * Stop binding to the global mouseup and mousemove events. - * @private - */ - unbindDragEvents_(): void; - /** - * Handle a mouse-up event while dragging a bubble's border or resize handle. - * @param {!Event} _e Mouse up event. - * @private - */ - bubbleMouseUp_(_e: Event): void; - /** - * Create the text for a non editable bubble. - * @param {string} text The text to display. - * @return {!SVGTextElement} The top-level node of the text. - * @package - */ - textToDom(text: string): SVGTextElement; - /** - * Creates a bubble that can not be edited. - * @param {!SVGTextElement} paragraphElement The text element for the non - * editable bubble. - * @param {!BlockSvg} block The block that the bubble is attached to. - * @param {!Coordinate} iconXY The coordinate of the icon. - * @return {!Bubble} The non editable bubble. - * @package - */ - createNonEditableBubble(paragraphElement: SVGTextElement, block: BlockSvg, iconXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - workspace_: WorkspaceSvg; - content_: Element; - shape_: Element; - /** - * Flag to stop incremental rendering during construction. - * @type {boolean} - * @private - */ - rendered_: boolean; - /** - * The SVG group containing all parts of the bubble. - * @type {SVGGElement} - * @private - */ - bubbleGroup_: SVGGElement; - /** - * The SVG path for the arrow from the bubble to the icon on the block. - * @type {SVGPathElement} - * @private - */ - bubbleArrow_: SVGPathElement; - /** - * The SVG rect for the main body of the bubble. - * @type {SVGRectElement} - * @private - */ - bubbleBack_: SVGRectElement; - /** - * The SVG group for the resize hash marks on some bubbles. - * @type {SVGGElement} - * @private - */ - resizeGroup_: SVGGElement; - /** - * Absolute coordinate of anchor point, in workspace coordinates. - * @type {Coordinate} - * @private - */ - anchorXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Relative X coordinate of bubble with respect to the anchor's centre, - * in workspace units. - * In RTL mode the initial value is negated. - * @type {number} - * @private - */ - relativeLeft_: number; - /** - * Relative Y coordinate of bubble with respect to the anchor's centre, in - * workspace units. - * @type {number} - * @private - */ - relativeTop_: number; - /** - * Width of bubble, in workspace units. - * @type {number} - * @private - */ - width_: number; - /** - * Height of bubble, in workspace units. - * @type {number} - * @private - */ - height_: number; - /** - * Automatically position and reposition the bubble. - * @type {boolean} - * @private - */ - autoLayout_: boolean; - /** - * Method to call on resize of bubble. - * @type {?function()} - * @private - */ - resizeCallback_: (() => any) | null; - /** - * Method to call on move of bubble. - * @type {?function()} - * @private - */ - moveCallback_: (() => any) | null; - /** - * Mouse down on bubbleBack_ event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseDownBubbleWrapper_: any[][] | null; - /** - * Mouse down on resizeGroup_ event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseDownResizeWrapper_: any[][] | null; - /** - * Describes whether this bubble has been disposed of (nodes and event - * listeners removed from the page) or not. - * @type {boolean} - * @package - */ - disposed: boolean; - arrow_radians_: number; - /** - * Create the bubble's DOM. - * @param {!Element} content SVG content for the bubble. - * @param {boolean} hasResize Add diagonal resize gripper if true. - * @return {!SVGElement} The bubble's SVG group. - * @private - */ - createDom_(content: Element, hasResize: boolean): SVGElement; - /** - * Return the root node of the bubble's SVG group. - * @return {!SVGElement} The root SVG node of the bubble's group. - */ - getSvgRoot(): SVGElement; - /** - * Expose the block's ID on the bubble's top-level SVG group. - * @param {string} id ID of block. - */ - setSvgId(id: string): void; - /** - * Handle a mouse-down on bubble's border. - * @param {!Event} e Mouse down event. - * @private - */ - bubbleMouseDown_(e: Event): void; - /** - * Show the context menu for this bubble. - * @param {!Event} _e Mouse event. - * @package - */ - showContextMenu(_e: Event): void; - /** - * Get whether this bubble is deletable or not. - * @return {boolean} True if deletable. - * @package - */ - isDeletable(): boolean; - /** - * Update the style of this bubble when it is dragged over a delete area. - * @param {boolean} _enable True if the bubble is about to be deleted, false - * otherwise. - */ - setDeleteStyle(_enable: boolean): void; - /** - * Handle a mouse-down on bubble's resize corner. - * @param {!Event} e Mouse down event. - * @private - */ - resizeMouseDown_(e: Event): void; - /** - * Resize this bubble to follow the mouse. - * @param {!Event} e Mouse move event. - * @private - */ - resizeMouseMove_(e: Event): void; - /** - * Register a function as a callback event for when the bubble is resized. - * @param {!Function} callback The function to call on resize. - */ - registerResizeEvent(callback: Function): void; - /** - * Register a function as a callback event for when the bubble is moved. - * @param {!Function} callback The function to call on move. - */ - registerMoveEvent(callback: Function): void; - /** - * Move this bubble to the top of the stack. - * @return {boolean} Whether or not the bubble has been moved. - * @package - */ - promote(): boolean; - /** - * Notification that the anchor has moved. - * Update the arrow and bubble accordingly. - * @param {!Coordinate} xy Absolute location. - */ - setAnchorLocation(xy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Position the bubble so that it does not fall off-screen. - * @private - */ - layoutBubble_(): void; - /** - * Calculate the what percentage of the bubble overlaps with the visible - * workspace (what percentage of the bubble is visible). - * @param {!{x: number, y: number}} relativeMin The position of the top-left - * corner of the bubble relative to the anchor point. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The percentage of the bubble that is visible. - * @private - */ - getOverlap_(relativeMin: { - x: number; - y: number; - }, viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Calculate what the optimal horizontal position of the top-left corner of - * the bubble is (relative to the anchor point) so that the most area of the - * bubble is shown. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The optimal horizontal position of the top-left corner - * of the bubble. - * @private - */ - getOptimalRelativeLeft_(viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Calculate what the optimal vertical position of the top-left corner of - * the bubble is (relative to the anchor point) so that the most area of the - * bubble is shown. - * @param {!MetricsManager.ContainerRegion} viewMetrics The view metrics - * of the workspace the bubble will appear in. - * @return {number} The optimal vertical position of the top-left corner - * of the bubble. - * @private - */ - getOptimalRelativeTop_(viewMetrics: MetricsManager.ContainerRegion): number; - /** - * Move the bubble to a location relative to the anchor's centre. - * @private - */ - positionBubble_(): void; - /** - * Move the bubble group to the specified location in workspace coordinates. - * @param {number} x The x position to move to. - * @param {number} y The y position to move to. - * @package - */ - moveTo(x: number, y: number): void; - /** - * Triggers a move callback if one exists at the end of a drag. - * @param {boolean} adding True if adding, false if removing. - * @package - */ - setDragging(adding: boolean): void; - /** - * Get the dimensions of this bubble. - * @return {!Size} The height and width of the bubble. - */ - getBubbleSize(): { - width: number; - height: number; - }; - /** - * Size this bubble. - * @param {number} width Width of the bubble. - * @param {number} height Height of the bubble. - */ - setBubbleSize(width: number, height: number): void; - /** - * Draw the arrow between the bubble and the origin. - * @private - */ - renderArrow_(): void; - /** - * Change the colour of a bubble. - * @param {string} hexColour Hex code of colour. - */ - setColour(hexColour: string): void; - /** - * Dispose of this bubble. - */ - dispose(): void; - /** - * Move this bubble during a drag, taking into account whether or not there is - * a drag surface. - * @param {BlockDragSurfaceSvg} dragSurface The surface that carries - * rendered items during a drag, or null if no drag surface is in use. - * @param {!Coordinate} newLoc The location to translate to, in - * workspace coordinates. - * @package - */ - moveDuringDrag(dragSurface: { - SVG_: SVGElement | null; - dragGroup_: SVGElement | null; - container_: Element; - scale_: number; - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - createDom(): void; - setBlocksAndShow(blocks: SVGElement): void; - translateAndScaleGroup(x: number, y: number, scale: number): void; - translateSurfaceInternal_(): void; - translateBy(deltaX: number, deltaY: number): void; - translateSurface(x: number, y: number): void; - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - getGroup(): SVGElement | null; - getSvgRoot(): SVGElement | null; - getCurrentBlock(): Element | null; - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - clearAndHide(opt_newSurface?: Element | undefined): void; - }, newLoc: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Return the coordinates of the top-left corner of this bubble's body - * relative to the drawing surface's origin (0,0), in workspace units. - * @return {!Coordinate} Object with .x and .y properties. - */ - getRelativeToSurfaceXY(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Set whether auto-layout of this bubble is enabled. The first time a bubble - * is shown it positions itself to not cover any blocks. Once a user has - * dragged it to reposition, it renders where the user put it. - * @param {boolean} enable True if auto-layout should be enabled, false - * otherwise. - * @package - */ - setAutoLayout(enable: boolean): void; - }; - /** - * Width of the border around the bubble. - */ - BORDER_WIDTH: number; - /** - * Determines the thickness of the base of the arrow in relation to the size - * of the bubble. Higher numbers result in thinner arrows. - */ - ARROW_THICKNESS: number; - /** - * The number of degrees that the arrow bends counter-clockwise. - */ - ARROW_ANGLE: number; - /** - * The sharpness of the arrow's bend. Higher numbers result in smoother arrows. - */ - ARROW_BEND: number; - /** - * Distance between arrow point and anchor point. - */ - ANCHOR_RADIUS: number; - /** - * Mouse up event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseUpWrapper_: any[][] | null; - /** - * Mouse move event data. - * @type {?browserEvents.Data} - * @private - */ - onMouseMoveWrapper_: any[][] | null; - }; - import { WorkspaceSvg } from "core/workspace_svg"; - import { MetricsManager } from "core/metrics_manager"; - import { BlockSvg } from "core/block_svg"; -} -declare module "core/constants" { - /** - * The language-neutral ID given to the collapsed input. - * @const {string} - * @alias Blockly.constants.COLLAPSED_INPUT_NAME - */ - export const COLLAPSED_INPUT_NAME: "_TEMP_COLLAPSED_INPUT"; - /** - * The language-neutral ID given to the collapsed field. - * @const {string} - * @alias Blockly.constants.COLLAPSED_FIELD_NAME - */ - export const COLLAPSED_FIELD_NAME: "_TEMP_COLLAPSED_FIELD"; -} -declare module "core/bubble_dragger" { - /** - * Class for a bubble dragger. It moves things on the bubble canvas around the - * workspace when they are being dragged by a mouse or touch. These can be - * block comments, mutators, warnings, or workspace comments. - * @alias Blockly.BubbleDragger - */ - export const BubbleDragger: { - new (bubble: () => void, workspace: WorkspaceSvg): { - /** - * The item on the bubble canvas that is being dragged. - * @type {!IBubble} - * @private - */ - draggingBubble_: () => void; - /** - * The workspace on which the bubble is being dragged. - * @type {!WorkspaceSvg} - * @private - */ - workspace_: WorkspaceSvg; - /** - * Which drag target the mouse pointer is over, if any. - * @type {?IDragTarget} - * @private - */ - dragTarget_: (() => void) | null; - /** - * Whether the bubble would be deleted if dropped immediately. - * @type {boolean} - * @private - */ - wouldDeleteBubble_: boolean; - /** - * The location of the top left corner of the dragging bubble's body at the - * beginning of the drag, in workspace coordinates. - * @type {!Coordinate} - * @private - */ - startXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * The drag surface to move bubbles to during a drag, or null if none should - * be used. Block dragging and bubble dragging use the same surface. - * @type {BlockDragSurfaceSvg} - * @private - */ - dragSurface_: { - SVG_: SVGElement | null; - dragGroup_: SVGElement | null; - container_: Element; - scale_: number; - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - createDom(): void; - setBlocksAndShow(blocks: SVGElement): void; - translateAndScaleGroup(x: number, y: number, scale: number): void; - translateSurfaceInternal_(): void; - translateBy(deltaX: number, deltaY: number): void; - translateSurface(x: number, y: number): void; - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - getGroup(): SVGElement | null; - getSvgRoot(): SVGElement | null; - getCurrentBlock(): Element | null; - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - clearAndHide(opt_newSurface?: Element | undefined): void; - }; - /** - * Sever all links from this object. - * @package - * @suppress {checkTypes} - */ - dispose(): void; - /** - * Start dragging a bubble. This includes moving it to the drag surface. - * @package - */ - startBubbleDrag(): void; - /** - * Execute a step of bubble dragging, based on the given event. Update the - * display accordingly. - * @param {!Event} e The most recent move event. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - */ - dragBubble(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Whether ending the drag would delete the bubble. - * @param {?IDragTarget} dragTarget The drag target that the bubblee is - * currently over. - * @return {boolean} Whether dropping the bubble immediately would delete the - * block. - * @private - */ - shouldDelete_(dragTarget: (() => void) | null): boolean; - /** - * Update the cursor (and possibly the trash can lid) to reflect whether the - * dragging bubble would be deleted if released immediately. - * @private - */ - updateCursorDuringBubbleDrag_(): void; - /** - * Finish a bubble drag and put the bubble back on the workspace. - * @param {!Event} e The mouseup/touchend event. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @package - */ - endBubbleDrag(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Fire a move event at the end of a bubble drag. - * @private - */ - fireMoveEvent_(): void; - /** - * Convert a coordinate object from pixels to workspace units, including a - * correction for mutator workspaces. - * This function does not consider differing origins. It simply scales the - * input's x and y values. - * @param {!Coordinate} pixelCoord A coordinate with x and y - * values in CSS pixel units. - * @return {!Coordinate} The input coordinate divided by the - * workspace scale. - * @private - */ - pixelsToWorkspaceUnits_(pixelCoord: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Move the bubble onto the drag surface at the beginning of a drag. Move the - * drag surface to preserve the apparent location of the bubble. - * @private - */ - moveToDragSurface_(): void; - }; - }; - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/config" { - /** - * Object holding all the values on Blockly that we expect developers to be - * able to change. - * @type {Config} - */ - export const config: Config; - /** - * All the values that we expect developers to be able to change - * before injecting Blockly. - */ - type Config = { - dragRadius: number; - flyoutDragRadius: number; - snapRadius: number; - currentConnectionPreference: number; - bumpDelay: number; - connectingSnapRadius: number; - }; - /** - * All the values that we expect developers to be able to change - * before injecting Blockly. - * @typedef {{ - * dragRadius: number, - * flyoutDragRadius: number, - * snapRadius: number, - * currentConnectionPreference: number, - * bumpDelay: number, - * connectingSnapRadius: number - * }} - */ - let Config: any; - export {}; -} -declare module "core/interfaces/i_block_dragger" { - /** - * A block dragger interface. - * @interface - * @alias Blockly.IBlockDragger - */ - export function IBlockDragger(): void; -} -declare module "core/workspace_dragger" { - /** - * Class for a workspace dragger. It moves the workspace around when it is - * being dragged by a mouse or touch. - * Note that the workspace itself manages whether or not it has a drag surface - * and how to do translations based on that. This simply passes the right - * commands based on events. - * @alias Blockly.WorkspaceDragger - */ - export class WorkspaceDragger { - /** - * @param {!WorkspaceSvg} workspace The workspace to drag. - */ - constructor(workspace: WorkspaceSvg); - /** - * @type {!WorkspaceSvg} - * @private - */ - private workspace_; - /** - * Whether horizontal scroll is enabled. - * @type {boolean} - * @private - */ - private horizontalScrollEnabled_; - /** - * Whether vertical scroll is enabled. - * @type {boolean} - * @private - */ - private verticalScrollEnabled_; - /** - * The scroll position of the workspace at the beginning of the drag. - * Coordinate system: pixel coordinates. - * @type {!Coordinate} - * @protected - */ - protected startScrollXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Sever all links from this object. - * @package - * @suppress {checkTypes} - */ - dispose(): void; - /** - * Start dragging the workspace. - * @package - */ - startDrag(): void; - /** - * Finish dragging the workspace and put everything back where it belongs. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel coordinates. - * @package - */ - endDrag(currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Move the workspace based on the most recent mouse movements. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel coordinates. - * @package - */ - drag(currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - } - import { WorkspaceSvg } from "core/workspace_svg"; -} -declare module "core/events/events_viewport" { - /** - * Class for a viewport change event. - * @extends {UiBase} - * @alias Blockly.Events.ViewportChange - */ - export class ViewportChange extends UiBase { - /** - * @param {number=} opt_top Top-edge of the visible portion of the workspace, - * relative to the workspace origin. Undefined for a blank event. - * @param {number=} opt_left Left-edge of the visible portion of the - * workspace relative to the workspace origin. Undefined for a blank - * event. - * @param {number=} opt_scale The scale of the workspace. Undefined for a - * blank event. - * @param {string=} opt_workspaceId The workspace identifier for this event. - * Undefined for a blank event. - * @param {number=} opt_oldScale The old scale of the workspace. Undefined for - * a blank event. - */ - constructor(opt_top?: number | undefined, opt_left?: number | undefined, opt_scale?: number | undefined, opt_workspaceId?: string | undefined, opt_oldScale?: number | undefined); - /** - * Top-edge of the visible portion of the workspace, relative to the - * workspace origin. - * @type {number|undefined} - */ - viewTop: number | undefined; - /** - * Left-edge of the visible portion of the workspace, relative to the - * workspace origin. - * @type {number|undefined} - */ - viewLeft: number | undefined; - /** - * The scale of the workspace. - * @type {number|undefined} - */ - scale: number | undefined; - /** - * The old scale of the workspace. - * @type {number|undefined} - */ - oldScale: number | undefined; - } - import { UiBase } from "core/events/events_ui_base"; -} -declare module "core/bump_objects" { - /** - * Bumps the given object that has passed out of bounds. - * @param {!WorkspaceSvg} workspace The workspace containing the object. - * @param {!MetricsManager.ContainerRegion} scrollMetrics Scroll metrics - * in workspace coordinates. - * @param {!IBoundedElement} object The object to bump. - * @return {boolean} True if block was bumped. - * @alias Blockly.bumpObjects.bumpIntoBounds - */ - function bumpObjectIntoBounds(workspace: WorkspaceSvg, scrollMetrics: MetricsManager.ContainerRegion, object: () => void): boolean; - /** - * Creates a handler for bumping objects when they cross fixed bounds. - * @param {!WorkspaceSvg} workspace The workspace to handle. - * @return {function(Abstract)} The event handler. - * @alias Blockly.bumpObjects.bumpIntoBoundsHandler - */ - export function bumpIntoBoundsHandler(workspace: WorkspaceSvg): (arg0: Abstract) => any; - /** - * Bumps the top objects in the given workspace into bounds. - * @param {!WorkspaceSvg} workspace The workspace. - * @alias Blockly.bumpObjects.bumpTopObjectsIntoBounds - */ - export function bumpTopObjectsIntoBounds(workspace: WorkspaceSvg): void; - import { WorkspaceSvg } from "core/workspace_svg"; - import { MetricsManager } from "core/metrics_manager"; - import { Abstract } from "core/events/events_abstract"; - export { bumpObjectIntoBounds as bumpIntoBounds }; -} -declare module "core/events/events_block_base" { - /** - * Abstract class for a block event. - * @extends {AbstractEvent} - * @alias Blockly.Events.BlockBase - */ - export class BlockBase extends AbstractEvent { - /** - * @param {!Block=} opt_block The block this event corresponds to. - * Undefined for a blank event. - */ - constructor(opt_block?: Block | undefined); - /** - * The block ID for the block this event pertains to - * @type {string} - */ - blockId: string; - } - import { Abstract as AbstractEvent } from "core/events/events_abstract"; - import { Block } from "core/block"; -} -declare module "core/events/events_block_move" { - /** - * Class for a block move event. Created before the move. - * @extends {BlockBase} - * @alias Blockly.Events.BlockMove - */ - export class BlockMove extends BlockBase { - oldParentId: any; - oldInputName: any; - oldCoordinate: any; - newParentId: any; - newInputName: any; - newCoordinate: any; - /** - * Record the block's new location. Called after the move. - */ - recordNew(): void; - /** - * Returns the parentId and input if the block is connected, - * or the XY location if disconnected. - * @return {!Object} Collection of location info. - * @private - */ - private currentLocation_; - } - import { BlockBase } from "core/events/events_block_base"; -} -declare module "core/utils/svg_paths" { - /** - * Create a string representing the given x, y pair. It does not matter whether - * the coordinate is relative or absolute. The result has leading - * and trailing spaces, and separates the x and y coordinates with a comma but - * no space. - * @param {number} x The x coordinate. - * @param {number} y The y coordinate. - * @return {string} A string of the format ' x,y ' - * @alias Blockly.utils.svgPaths.point - */ - export function point(x: number, y: number): string; - /** - * Draw a cubic or quadratic curve. See - * developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Cubic_B%C3%A9zier_Curve - * These coordinates are unitless and hence in the user coordinate system. - * @param {string} command The command to use. - * Should be one of: c, C, s, S, q, Q. - * @param {!Array} points An array containing all of the points to pass - * to the curve command, in order. The points are represented as strings of - * the format ' x, y '. - * @return {string} A string defining one or more Bezier curves. See the MDN - * documentation for exact format. - * @alias Blockly.utils.svgPaths.curve - */ - export function curve(command: string, points: Array): string; - /** - * Move the cursor to the given position without drawing a line. - * The coordinates are absolute. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands - * @param {number} x The absolute x coordinate. - * @param {number} y The absolute y coordinate. - * @return {string} A string of the format ' M x,y ' - * @alias Blockly.utils.svgPaths.moveTo - */ - export function moveTo(x: number, y: number): string; - /** - * Move the cursor to the given position without drawing a line. - * Coordinates are relative. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands - * @param {number} dx The relative x coordinate. - * @param {number} dy The relative y coordinate. - * @return {string} A string of the format ' m dx,dy ' - * @alias Blockly.utils.svgPaths.moveBy - */ - export function moveBy(dx: number, dy: number): string; - /** - * Draw a line from the current point to the end point, which is the current - * point shifted by dx along the x-axis and dy along the y-axis. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands - * @param {number} dx The relative x coordinate. - * @param {number} dy The relative y coordinate. - * @return {string} A string of the format ' l dx,dy ' - * @alias Blockly.utils.svgPaths.lineTo - */ - export function lineTo(dx: number, dy: number): string; - /** - * Draw multiple lines connecting all of the given points in order. This is - * equivalent to a series of 'l' commands. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths#Line_commands - * @param {!Array} points An array containing all of the points to - * draw lines to, in order. The points are represented as strings of the - * format ' dx,dy '. - * @return {string} A string of the format ' l (dx,dy)+ ' - * @alias Blockly.utils.svgPaths.line - */ - export function line(points: Array): string; - /** - * Draw a horizontal or vertical line. - * The first argument specifies the direction and whether the given position is - * relative or absolute. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#LineTo_path_commands - * @param {string} command The command to prepend to the coordinate. This - * should be one of: V, v, H, h. - * @param {number} val The coordinate to pass to the command. It may be - * absolute or relative. - * @return {string} A string of the format ' command val ' - * @alias Blockly.utils.svgPaths.lineOnAxis - */ - export function lineOnAxis(command: string, val: number): string; - /** - * Draw an elliptical arc curve. - * These coordinates are unitless and hence in the user coordinate system. - * See developer.mozilla.org/en-US/docs/Web/SVG/Attribute/d#Elliptical_Arc_Curve - * @param {string} command The command string. Either 'a' or 'A'. - * @param {string} flags The flag string. See the MDN documentation for a - * description and examples. - * @param {number} radius The radius of the arc to draw. - * @param {string} point The point to move the cursor to after drawing the arc, - * specified either in absolute or relative coordinates depending on the - * command. - * @return {string} A string of the format 'command radius radius flags point' - * @alias Blockly.utils.svgPaths.arc - */ - export function arc(command: string, flags: string, radius: number, point: string): string; -} -declare module "core/interfaces/i_connection_checker" { - /** - * Class for connection type checking logic. - * @interface - * @alias Blockly.IConnectionChecker - */ - export class IConnectionChecker {} -} -declare module "core/connection_db" { - /** - * Database of connections. - * Connections are stored in order of their vertical component. This way - * connections in an area may be looked up quickly using a binary search. - * @alias Blockly.ConnectionDB - */ - export class ConnectionDB { - /** - * Initialize a set of connection DBs for a workspace. - * @param {!IConnectionChecker} checker The workspace's - * connection checker, used to decide if connections are valid during a - * drag. - * @return {!Array} Array of databases. - */ - static init(checker: () => void): Array; - /** - * @param {!IConnectionChecker} checker The workspace's - * connection type checker, used to decide if connections are valid during - * a drag. - */ - constructor(checker: () => void); - /** - * Array of connections sorted by y position in workspace units. - * @type {!Array} - * @private - */ - private connections_; - /** - * The workspace's connection type checker, used to decide if connections - * are valid during a drag. - * @type {!IConnectionChecker} - * @private - */ - private connectionChecker_; - /** - * Add a connection to the database. Should not already exist in the database. - * @param {!RenderedConnection} connection The connection to be added. - * @param {number} yPos The y position used to decide where to insert the - * connection. - * @package - */ - addConnection(connection: RenderedConnection, yPos: number): void; - /** - * Finds the index of the given connection. - * - * Starts by doing a binary search to find the approximate location, then - * linearly searches nearby for the exact connection. - * @param {!RenderedConnection} conn The connection to find. - * @param {number} yPos The y position used to find the index of the - * connection. - * @return {number} The index of the connection, or -1 if the connection was - * not found. - * @private - */ - private findIndexOfConnection_; - /** - * Finds the correct index for the given y position. - * @param {number} yPos The y position used to decide where to - * insert the connection. - * @return {number} The candidate index. - * @private - */ - private calculateIndexForYPos_; - /** - * Remove a connection from the database. Must already exist in DB. - * @param {!RenderedConnection} connection The connection to be removed. - * @param {number} yPos The y position used to find the index of the - * connection. - * @throws {Error} If the connection cannot be found in the database. - */ - removeConnection(connection: RenderedConnection, yPos: number): void; - /** - * Find all nearby connections to the given connection. - * Type checking does not apply, since this function is used for bumping. - * @param {!RenderedConnection} connection The connection whose - * neighbours should be returned. - * @param {number} maxRadius The maximum radius to another connection. - * @return {!Array} List of connections. - */ - getNeighbours(connection: RenderedConnection, maxRadius: number): Array; - /** - * Is the candidate connection close to the reference connection. - * Extremely fast; only looks at Y distance. - * @param {number} index Index in database of candidate connection. - * @param {number} baseY Reference connection's Y value. - * @param {number} maxRadius The maximum radius to another connection. - * @return {boolean} True if connection is in range. - * @private - */ - private isInYRange_; - /** - * Find the closest compatible connection to this connection. - * @param {!RenderedConnection} conn The connection searching for a compatible - * mate. - * @param {number} maxRadius The maximum radius to another connection. - * @param {!Coordinate} dxy Offset between this connection's - * location in the database and the current location (as a result of - * dragging). - * @return {!{connection: RenderedConnection, radius: number}} - * Contains two properties: 'connection' which is either another - * connection or null, and 'radius' which is the distance. - */ - searchForClosest(conn: RenderedConnection, maxRadius: number, dxy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - connection: RenderedConnection; - radius: number; - }; - } - import { RenderedConnection } from "core/rendered_connection"; -} -declare module "core/rendered_connection" { - /** - * Class for a connection between blocks that may be rendered on screen. - * @extends {Connection} - * @alias Blockly.RenderedConnection - */ - export class RenderedConnection extends Connection { - /** - * @param {!BlockSvg} source The block establishing this connection. - * @param {number} type The type of the connection. - */ - constructor(source: BlockSvg, type: number); - /** - * Connection database for connections of this type on the current - * workspace. - * @const {!ConnectionDB} - * @private - */ - private db_; - /** - * Connection database for connections compatible with this type on the - * current workspace. - * @const {!ConnectionDB} - * @private - */ - private dbOpposite_; - /** - * Workspace units, (0, 0) is top left of block. - * @type {!Coordinate} - * @private - */ - private offsetInBlock_; - /** - * Describes the state of this connection's tracked-ness. - * @type {RenderedConnection.TrackedState} - * @private - */ - private trackedState_; - /** - * Returns the distance between this connection and another connection in - * workspace units. - * @param {!Connection} otherConnection The other connection to measure - * the distance to. - * @return {number} The distance between connections, in workspace units. - */ - distanceFrom(otherConnection: Connection): number; - /** - * Move the block(s) belonging to the connection to a point where they don't - * visually interfere with the specified connection. - * @param {!RenderedConnection} staticConnection The connection to move away - * from. - * @package - */ - bumpAwayFrom(staticConnection: RenderedConnection): void; - /** - * Change the connection's coordinates. - * @param {number} x New absolute x coordinate, in workspace coordinates. - * @param {number} y New absolute y coordinate, in workspace coordinates. - */ - moveTo(x: number, y: number): void; - /** - * Change the connection's coordinates. - * @param {number} dx Change to x coordinate, in workspace units. - * @param {number} dy Change to y coordinate, in workspace units. - */ - moveBy(dx: number, dy: number): void; - /** - * Move this connection to the location given by its offset within the block - * and the location of the block's top left corner. - * @param {!Coordinate} blockTL The location of the top left - * corner of the block, in workspace coordinates. - */ - moveToOffset(blockTL: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Set the offset of this connection relative to the top left of its block. - * @param {number} x The new relative x, in workspace units. - * @param {number} y The new relative y, in workspace units. - */ - setOffsetInBlock(x: number, y: number): void; - /** - * Get the offset of this connection relative to the top left of its block. - * @return {!Coordinate} The offset of the connection. - * @package - */ - getOffsetInBlock(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Move the blocks on either side of this connection right next to each other. - * @package - */ - tighten(): void; - /** - * Find the closest compatible connection to this connection. - * All parameters are in workspace units. - * @param {number} maxLimit The maximum radius to another connection. - * @param {!Coordinate} dxy Offset between this connection's location - * in the database and the current location (as a result of dragging). - * @return {!{connection: ?Connection, radius: number}} Contains two - * properties: 'connection' which is either another connection or null, - * and 'radius' which is the distance. - */ - closest(maxLimit: number, dxy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - connection: Connection | null; - radius: number; - }; - /** - * Add highlighting around this connection. - */ - highlight(): void; - /** - * Remove the highlighting around this connection. - */ - unhighlight(): void; - /** - * Set whether this connections is tracked in the database or not. - * @param {boolean} doTracking If true, start tracking. If false, stop - * tracking. - * @package - */ - setTracking(doTracking: boolean): void; - /** - * Stop tracking this connection, as well as all down-stream connections on - * any block attached to this connection. This happens when a block is - * collapsed. - * - * Also closes down-stream icons/bubbles. - * @package - */ - stopTrackingAll(): void; - /** - * Start tracking this connection, as well as all down-stream connections on - * any block attached to this connection. This happens when a block is - * expanded. - * @return {!Array} List of blocks to render. - */ - startTrackingAll(): Array; - } - export namespace RenderedConnection { - namespace TrackedState { - const WILL_TRACK: number; - const UNTRACKED: number; - const TRACKED: number; - } - /** - * Enum for different kinds of tracked states. - * - * WILL_TRACK means that this connection will add itself to - * the db on the next moveTo call it receives. - * - * UNTRACKED means that this connection will not add - * itself to the database until setTracking(true) is explicitly called. - * - * TRACKED means that this connection is currently being tracked. - */ - type TrackedState = number; - } - import { Connection } from "core/connection"; - import { Block } from "core/block"; - import { BlockSvg } from "core/block_svg"; -} -declare module "core/insertion_marker_manager" { - /** - * Class that controls updates to connections during drags. It is primarily - * responsible for finding the closest eligible connection and highlighting or - * unhighlighting it as needed during a drag. - * @alias Blockly.InsertionMarkerManager - */ - export class InsertionMarkerManager { - /** - * @param {!BlockSvg} block The top block in the stack being dragged. - */ - constructor(block: BlockSvg); - /** - * The top block in the stack being dragged. - * Does not change during a drag. - * @type {!BlockSvg} - * @private - */ - private topBlock_; - /** - * The workspace on which these connections are being dragged. - * Does not change during a drag. - * @type {!WorkspaceSvg} - * @private - */ - private workspace_; - /** - * The last connection on the stack, if it's not the last connection on the - * first block. - * Set in initAvailableConnections, if at all. - * @type {RenderedConnection} - * @private - */ - private lastOnStack_; - /** - * The insertion marker corresponding to the last block in the stack, if - * that's not the same as the first block in the stack. - * Set in initAvailableConnections, if at all - * @type {BlockSvg} - * @private - */ - private lastMarker_; - /** - * The insertion marker that shows up between blocks to show where a block - * would go if dropped immediately. - * @type {BlockSvg} - * @private - */ - private firstMarker_; - /** - * The connection that this block would connect to if released immediately. - * Updated on every mouse move. - * This is not on any of the blocks that are being dragged. - * @type {RenderedConnection} - * @private - */ - private closestConnection_; - /** - * The connection that would connect to this.closestConnection_ if this - * block were released immediately. Updated on every mouse move. This is on - * the top block that is being dragged or the last block in the dragging - * stack. - * @type {RenderedConnection} - * @private - */ - private localConnection_; - /** - * Whether the block would be deleted if it were dropped immediately. - * Updated on every mouse move. - * @type {boolean} - * @private - */ - private wouldDeleteBlock_; - /** - * Connection on the insertion marker block that corresponds to - * this.localConnection_ on the currently dragged block. - * @type {RenderedConnection} - * @private - */ - private markerConnection_; - /** - * The block that currently has an input being highlighted, or null. - * @type {BlockSvg} - * @private - */ - private highlightedBlock_; - /** - * The block being faded to indicate replacement, or null. - * @type {BlockSvg} - * @private - */ - private fadedBlock_; - /** - * The connections on the dragging blocks that are available to connect to - * other blocks. This includes all open connections on the top block, as - * well as the last connection on the block stack. Does not change during a - * drag. - * @type {!Array} - * @private - */ - private availableConnections_; - /** - * Sever all links from this object. - * @package - */ - dispose(): void; - /** - * Update the available connections for the top block. These connections can - * change if a block is unplugged and the stack is healed. - * @package - */ - updateAvailableConnections(): void; - /** - * Return whether the block would be deleted if dropped immediately, based on - * information from the most recent move event. - * @return {boolean} True if the block would be deleted if dropped - * immediately. - * @package - */ - wouldDeleteBlock(): boolean; - /** - * Return whether the block would be connected if dropped immediately, based - * on information from the most recent move event. - * @return {boolean} True if the block would be connected if dropped - * immediately. - * @package - */ - wouldConnectBlock(): boolean; - /** - * Connect to the closest connection and render the results. - * This should be called at the end of a drag. - * @package - */ - applyConnections(): void; - /** - * Update connections based on the most recent move location. - * @param {!Coordinate} dxy Position relative to drag start, - * in workspace units. - * @param {?IDragTarget} dragTarget The drag target that the block is - * currently over. - * @package - */ - update(dxy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }, dragTarget: (() => void) | null): void; - /** - * Create an insertion marker that represents the given block. - * @param {!BlockSvg} sourceBlock The block that the insertion marker - * will represent. - * @return {!BlockSvg} The insertion marker that represents the given - * block. - * @private - */ - private createMarkerBlock_; - /** - * Populate the list of available connections on this block stack. This - * should only be called once, at the beginning of a drag. If the stack has - * more than one block, this function will populate lastOnStack_ and create - * the corresponding insertion marker. - * @return {!Array} A list of available - * connections. - * @private - */ - private initAvailableConnections_; - /** - * Whether the previews (insertion marker and replacement marker) should be - * updated based on the closest candidate and the current drag distance. - * @param {!Object} candidate An object containing a local connection, a - * closest connection, and a radius. Returned by getCandidate_. - * @param {!Coordinate} dxy Position relative to drag start, - * in workspace units. - * @return {boolean} Whether the preview should be updated. - * @private - */ - private shouldUpdatePreviews_; - /** - * Find the nearest valid connection, which may be the same as the current - * closest connection. - * @param {!Coordinate} dxy Position relative to drag start, - * in workspace units. - * @return {!Object} An object containing a local connection, a closest - * connection, and a radius. - * @private - */ - private getCandidate_; - /** - * Decide the radius at which to start searching for the closest connection. - * @return {number} The radius at which to start the search for the closest - * connection. - * @private - */ - private getStartRadius_; - /** - * Whether ending the drag would delete the block. - * @param {!Object} candidate An object containing a local connection, a - * closest - * connection, and a radius. - * @param {?IDragTarget} dragTarget The drag target that the block is - * currently over. - * @return {boolean} Whether dropping the block immediately would delete the - * block. - * @private - */ - private shouldDelete_; - /** - * Show an insertion marker or replacement highlighting during a drag, if - * needed. - * At the beginning of this function, this.localConnection_ and - * this.closestConnection_ should both be null. - * @param {!Object} candidate An object containing a local connection, a - * closest connection, and a radius. - * @private - */ - private maybeShowPreview_; - /** - * A preview should be shown. This function figures out if it should be a - * block highlight or an insertion marker, and shows the appropriate one. - * @private - */ - private showPreview_; - /** - * Show an insertion marker or replacement highlighting during a drag, if - * needed. - * At the end of this function, this.localConnection_ and - * this.closestConnection_ should both be null. - * @param {!Object} candidate An object containing a local connection, a - * closest connection, and a radius. - * @private - */ - private maybeHidePreview_; - /** - * A preview should be hidden. This function figures out if it is a block - * highlight or an insertion marker, and hides the appropriate one. - * @private - */ - private hidePreview_; - /** - * Shows an insertion marker connected to the appropriate blocks (based on - * manager state). - * @private - */ - private showInsertionMarker_; - /** - * Disconnects and hides the current insertion marker. Should return the - * blocks to their original state. - * @private - */ - private hideInsertionMarker_; - /** - * Shows an outline around the input the closest connection belongs to. - * @private - */ - private showInsertionInputOutline_; - /** - * Hides any visible input outlines. - * @private - */ - private hideInsertionInputOutline_; - /** - * Shows a replacement fade affect on the closest connection's target block - * (the block that is currently connected to it). - * @private - */ - private showReplacementFade_; - /** - * Hides/Removes any visible fade affects. - * @private - */ - private hideReplacementFade_; - /** - * Get a list of the insertion markers that currently exist. Drags have 0, 1, - * or 2 insertion markers. - * @return {!Array} A possibly empty list of insertion - * marker blocks. - * @package - */ - getInsertionMarkers(): Array; - } - export namespace InsertionMarkerManager { - namespace PREVIEW_TYPE { - const INSERTION_MARKER: number; - const INPUT_OUTLINE: number; - const REPLACEMENT_FADE: number; - } - /** - * An enum describing different kinds of previews the InsertionMarkerManager - * could display. - */ - type PREVIEW_TYPE = number; - } - import { BlockSvg } from "core/block_svg"; -} -declare module "core/events/events_block_drag" { - /** - * Class for a block drag event. - * @extends {UiBase} - * @alias Blockly.Events.BlockDrag - */ - export class BlockDrag extends UiBase { - /** - * @param {!Block=} opt_block The top block in the stack that is being - * dragged. Undefined for a blank event. - * @param {boolean=} opt_isStart Whether this is the start of a block drag. - * Undefined for a blank event. - * @param {!Array=} opt_blocks The blocks affected by this - * drag. Undefined for a blank event. - */ - constructor(opt_block?: Block | undefined, opt_isStart?: boolean | undefined, opt_blocks?: Array | undefined); - blockId: string | null; - /** - * Whether this is the start of a block drag. - * @type {boolean|undefined} - */ - isStart: boolean | undefined; - /** - * The blocks affected by this drag event. - * @type {!Array|undefined} - */ - blocks: Array | undefined; - } - import { UiBase } from "core/events/events_ui_base"; - import { Block } from "core/block"; -} -declare module "core/block_dragger" { - /** - * Class for a block dragger. It moves blocks around the workspace when they - * are being dragged by a mouse or touch. - * @implements {IBlockDragger} - * @alias Blockly.BlockDragger - */ - export const BlockDragger: { - new (block: BlockSvg, workspace: WorkspaceSvg): { - /** - * The top block in the stack that is being dragged. - * @type {!BlockSvg} - * @protected - */ - draggingBlock_: BlockSvg; - /** - * The workspace on which the block is being dragged. - * @type {!WorkspaceSvg} - * @protected - */ - workspace_: WorkspaceSvg; - /** - * Object that keeps track of connections on dragged blocks. - * @type {!InsertionMarkerManager} - * @protected - */ - draggedConnectionManager_: InsertionMarkerManager; - /** - * Which drag area the mouse pointer is over, if any. - * @type {?IDragTarget} - * @private - */ - dragTarget_: (() => void) | null; - /** - * Whether the block would be deleted if dropped immediately. - * @type {boolean} - * @protected - */ - wouldDeleteBlock_: boolean; - /** - * The location of the top left corner of the dragging block at the - * beginning of the drag in workspace coordinates. - * @type {!Coordinate} - * @protected - */ - startXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * A list of all of the icons (comment, warning, and mutator) that are - * on this block and its descendants. Moving an icon moves the bubble that - * extends from it if that bubble is open. - * @type {Array} - * @protected - */ - dragIconData_: Array; - /** - * Sever all links from this object. - * @package - */ - dispose(): void; - /** - * Start dragging a block. This includes moving it to the drag surface. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at mouse down, in pixel units. - * @param {boolean} healStack Whether or not to heal the stack after - * disconnecting. - * @public - */ - startDrag(currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }, healStack: boolean): void; - /** - * Whether or not we should disconnect the block when a drag is started. - * @param {boolean} healStack Whether or not to heal the stack after - * disconnecting. - * @return {boolean} True to disconnect the block, false otherwise. - * @protected - */ - shouldDisconnect_(healStack: boolean): boolean; - /** - * Disconnects the block and moves it to a new location. - * @param {boolean} healStack Whether or not to heal the stack after - * disconnecting. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at mouse down, in pixel units. - * @protected - */ - disconnectBlock_(healStack: boolean, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Fire a UI event at the start of a block drag. - * @protected - */ - fireDragStartEvent_(): void; - /** - * Execute a step of block dragging, based on the given event. Update the - * display accordingly. - * @param {!Event} e The most recent move event. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @public - */ - drag(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Finish a block drag and put the block back on the workspace. - * @param {!Event} e The mouseup/touchend event. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the position at the start of the drag, in pixel units. - * @public - */ - endDrag(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Calculates the drag delta and new location values after a block is dragged. - * @param {!Coordinate} currentDragDeltaXY How far the pointer has - * moved from the start of the drag, in pixel units. - * @return {{delta: !Coordinate, newLocation: - * !Coordinate}} New location after drag. delta is in - * workspace units. newLocation is the new coordinate where the block - * should end up. - * @protected - */ - getNewLocationAfterDrag_(currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - delta: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - newLocation: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - }; - /** - * May delete the dragging block, if allowed. If `this.wouldDeleteBlock_` is - * not true, the block will not be deleted. This should be called at the end - * of a block drag. - * @return {boolean} True if the block was deleted. - * @protected - */ - maybeDeleteBlock_(): boolean; - /** - * Updates the necessary information to place a block at a certain location. - * @param {!Coordinate} delta The change in location from where - * the block started the drag to where it ended the drag. - * @protected - */ - updateBlockAfterMove_(delta: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Fire a UI event at the end of a block drag. - * @protected - */ - fireDragEndEvent_(): void; - /** - * Adds or removes the style of the cursor for the toolbox. - * This is what changes the cursor to display an x when a deletable block is - * held over the toolbox. - * @param {boolean} isEnd True if we are at the end of a drag, false - * otherwise. - * @protected - */ - updateToolboxStyle_(isEnd: boolean): void; - /** - * Fire a move event at the end of a block drag. - * @protected - */ - fireMoveEvent_(): void; - /** - * Update the cursor (and possibly the trash can lid) to reflect whether the - * dragging block would be deleted if released immediately. - * @protected - */ - updateCursorDuringBlockDrag_(): void; - /** - * Convert a coordinate object from pixels to workspace units, including a - * correction for mutator workspaces. - * This function does not consider differing origins. It simply scales the - * input's x and y values. - * @param {!Coordinate} pixelCoord A coordinate with x and y - * values in CSS pixel units. - * @return {!Coordinate} The input coordinate divided by the - * workspace scale. - * @protected - */ - pixelsToWorkspaceUnits_(pixelCoord: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - /** - * Move all of the icons connected to this drag. - * @param {!Coordinate} dxy How far to move the icons from their - * original positions, in workspace units. - * @protected - */ - dragIcons_(dxy: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - /** - * Get a list of the insertion markers that currently exist. Drags have 0, 1, - * or 2 insertion markers. - * @return {!Array} A possibly empty list of insertion - * marker blocks. - * @public - */ - getInsertionMarkers(): Array; - }; - }; - import { BlockSvg } from "core/block_svg"; - import { WorkspaceSvg } from "core/workspace_svg"; - import { InsertionMarkerManager } from "core/insertion_marker_manager"; -} -declare module "core/events/events_click" { - /** - * Class for a click event. - * @extends {UiBase} - * @alias Blockly.Events.Click - */ - export class Click extends UiBase { - /** - * @param {?Block=} opt_block The affected block. Null for click events - * that do not have an associated block (i.e. workspace click). Undefined - * for a blank event. - * @param {?string=} opt_workspaceId The workspace identifier for this event. - * Not used if block is passed. Undefined for a blank event. - * @param {string=} opt_targetType The type of element targeted by this click - * event. Undefined for a blank event. - */ - constructor(opt_block?: (Block | null) | undefined, opt_workspaceId?: (string | null) | undefined, opt_targetType?: string | undefined); - blockId: string | null; - /** - * The type of element targeted by this click event. - * @type {string|undefined} - */ - targetType: string | undefined; - } - import { UiBase } from "core/events/events_ui_base"; - import { Block } from "core/block"; -} -declare module "core/gesture" { - /** - * Note: In this file "start" refers to touchstart, mousedown, and pointerstart - * events. "End" refers to touchend, mouseup, and pointerend events. - */ - /** - * Class for one gesture. - * @alias Blockly.Gesture - */ - export class Gesture { - /** - * Is a drag or other gesture currently in progress on any workspace? - * @return {boolean} True if gesture is occurring. - */ - static inProgress(): boolean; - /** - * @param {!Event} e The event that kicked off this gesture. - * @param {!WorkspaceSvg} creatorWorkspace The workspace that created - * this gesture and has a reference to it. - */ - constructor(e: Event, creatorWorkspace: WorkspaceSvg); - /** - * The position of the mouse when the gesture started. Units are CSS - * pixels, with (0, 0) at the top left of the browser window (mouseEvent - * clientX/Y). - * @type {Coordinate} - * @private - */ - private mouseDownXY_; - /** - * How far the mouse has moved during this drag, in pixel units. - * (0, 0) is at this.mouseDownXY_. - * @type {!Coordinate} - * @private - */ - private currentDragDeltaXY_; - /** - * The bubble that the gesture started on, or null if it did not start on a - * bubble. - * @type {IBubble} - * @private - */ - private startBubble_; - /** - * The field that the gesture started on, or null if it did not start on a - * field. - * @type {Field} - * @private - */ - private startField_; - /** - * The block that the gesture started on, or null if it did not start on a - * block. - * @type {BlockSvg} - * @private - */ - private startBlock_; - /** - * The block that this gesture targets. If the gesture started on a - * shadow block, this is the first non-shadow parent of the block. If the - * gesture started in the flyout, this is the root block of the block group - * that was clicked or dragged. - * @type {BlockSvg} - * @private - */ - private targetBlock_; - /** - * The workspace that the gesture started on. There may be multiple - * workspaces on a page; this is more accurate than using - * Blockly.common.getMainWorkspace(). - * @type {WorkspaceSvg} - * @protected - */ - protected startWorkspace_: WorkspaceSvg; - /** - * The workspace that created this gesture. This workspace keeps a - * reference to the gesture, which will need to be cleared at deletion. This - * may be different from the start workspace. For instance, a flyout is a - * workspace, but its parent workspace manages gestures for it. - * @type {!WorkspaceSvg} - * @private - */ - private creatorWorkspace_; - /** - * Whether the pointer has at any point moved out of the drag radius. - * A gesture that exceeds the drag radius is a drag even if it ends exactly - * at its start point. - * @type {boolean} - * @private - */ - private hasExceededDragRadius_; - /** - * Whether the workspace is currently being dragged. - * @type {boolean} - * @private - */ - private isDraggingWorkspace_; - /** - * Whether the block is currently being dragged. - * @type {boolean} - * @private - */ - private isDraggingBlock_; - /** - * Whether the bubble is currently being dragged. - * @type {boolean} - * @private - */ - private isDraggingBubble_; - /** - * The event that most recently updated this gesture. - * @type {!Event} - * @private - */ - private mostRecentEvent_; - /** - * A handle to use to unbind a mouse move listener at the end of a drag. - * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?browserEvents.Data} - * @protected - */ - protected onMoveWrapper_: any[][] | null; - /** - * A handle to use to unbind a mouse up listener at the end of a drag. - * Opaque data returned from Blockly.bindEventWithChecks_. - * @type {?browserEvents.Data} - * @protected - */ - protected onUpWrapper_: any[][] | null; - /** - * The object tracking a bubble drag, or null if none is in progress. - * @type {BubbleDragger} - * @private - */ - private bubbleDragger_; - /** - * The object tracking a block drag, or null if none is in progress. - * @type {?IBlockDragger} - * @private - */ - private blockDragger_; - /** - * The object tracking a workspace or flyout workspace drag, or null if none - * is in progress. - * @type {WorkspaceDragger} - * @private - */ - private workspaceDragger_; - /** - * The flyout a gesture started in, if any. - * @type {IFlyout} - * @private - */ - private flyout_; - /** - * Boolean for sanity-checking that some code is only called once. - * @type {boolean} - * @private - */ - private calledUpdateIsDragging_; - /** - * Boolean for sanity-checking that some code is only called once. - * @type {boolean} - * @private - */ - private hasStarted_; - /** - * Boolean used internally to break a cycle in disposal. - * @type {boolean} - * @protected - */ - protected isEnding_: boolean; - /** - * Boolean used to indicate whether or not to heal the stack after - * disconnecting a block. - * @type {boolean} - * @private - */ - private healStack_; - /** - * Sever all links from this object. - * @package - */ - dispose(): void; - /** - * Update internal state based on an event. - * @param {!Event} e The most recent mouse or touch event. - * @private - */ - private updateFromEvent_; - /** - * DO MATH to set currentDragDeltaXY_ based on the most recent mouse position. - * @param {!Coordinate} currentXY The most recent mouse/pointer - * position, in pixel units, with (0, 0) at the window's top left corner. - * @return {boolean} True if the drag just exceeded the drag radius for the - * first time. - * @private - */ - private updateDragDelta_; - /** - * Update this gesture to record whether a block is being dragged from the - * flyout. - * This function should be called on a mouse/touch move event the first time - * the drag radius is exceeded. It should be called no more than once per - * gesture. If a block should be dragged from the flyout this function creates - * the new block on the main workspace and updates targetBlock_ and - * startWorkspace_. - * @return {boolean} True if a block is being dragged from the flyout. - * @private - */ - private updateIsDraggingFromFlyout_; - /** - * Update this gesture to record whether a bubble is being dragged. - * This function should be called on a mouse/touch move event the first time - * the drag radius is exceeded. It should be called no more than once per - * gesture. If a bubble should be dragged this function creates the necessary - * BubbleDragger and starts the drag. - * @return {boolean} True if a bubble is being dragged. - * @private - */ - private updateIsDraggingBubble_; - /** - * Update this gesture to record whether a block is being dragged. - * This function should be called on a mouse/touch move event the first time - * the drag radius is exceeded. It should be called no more than once per - * gesture. If a block should be dragged, either from the flyout or in the - * workspace, this function creates the necessary BlockDragger and starts the - * drag. - * @return {boolean} True if a block is being dragged. - * @private - */ - private updateIsDraggingBlock_; - /** - * Update this gesture to record whether a workspace is being dragged. - * This function should be called on a mouse/touch move event the first time - * the drag radius is exceeded. It should be called no more than once per - * gesture. If a workspace is being dragged this function creates the - * necessary WorkspaceDragger and starts the drag. - * @private - */ - private updateIsDraggingWorkspace_; - /** - * Update this gesture to record whether anything is being dragged. - * This function should be called on a mouse/touch move event the first time - * the drag radius is exceeded. It should be called no more than once per - * gesture. - * @private - */ - private updateIsDragging_; - /** - * Create a block dragger and start dragging the selected block. - * @private - */ - private startDraggingBlock_; - /** - * Create a bubble dragger and start dragging the selected bubble. - * @private - */ - private startDraggingBubble_; - /** - * Start a gesture: update the workspace to indicate that a gesture is in - * progress and bind mousemove and mouseup handlers. - * @param {!Event} e A mouse down or touch start event. - * @package - */ - doStart(e: Event): void; - /** - * Bind gesture events. - * @param {!Event} e A mouse down or touch start event. - * @package - */ - bindMouseEvents(e: Event): void; - /** - * Handle a mouse move or touch move event. - * @param {!Event} e A mouse move or touch move event. - * @package - */ - handleMove(e: Event): void; - /** - * Handle a mouse up or touch end event. - * @param {!Event} e A mouse up or touch end event. - * @package - */ - handleUp(e: Event): void; - /** - * Cancel an in-progress gesture. If a workspace or block drag is in - * progress, end the drag at the most recent location. - * @package - */ - cancel(): void; - /** - * Handle a real or faked right-click event by showing a context menu. - * @param {!Event} e A mouse move or touch move event. - * @package - */ - handleRightClick(e: Event): void; - /** - * Handle a mousedown/touchstart event on a workspace. - * @param {!Event} e A mouse down or touch start event. - * @param {!WorkspaceSvg} ws The workspace the event hit. - * @package - */ - handleWsStart(e: Event, ws: WorkspaceSvg): void; - /** - * Fires a workspace click event. - * @param {!WorkspaceSvg} ws The workspace that a user clicks on. - * @private - */ - private fireWorkspaceClick_; - /** - * Handle a mousedown/touchstart event on a flyout. - * @param {!Event} e A mouse down or touch start event. - * @param {!IFlyout} flyout The flyout the event hit. - * @package - */ - handleFlyoutStart(e: Event, flyout: IFlyout): void; - /** - * Handle a mousedown/touchstart event on a block. - * @param {!Event} e A mouse down or touch start event. - * @param {!BlockSvg} block The block the event hit. - * @package - */ - handleBlockStart(e: Event, block: BlockSvg): void; - /** - * Handle a mousedown/touchstart event on a bubble. - * @param {!Event} e A mouse down or touch start event. - * @param {!IBubble} bubble The bubble the event hit. - * @package - */ - handleBubbleStart(e: Event, bubble: () => void): void; - /** - * Execute a bubble click. - * @private - */ - private doBubbleClick_; - /** - * Execute a field click. - * @private - */ - private doFieldClick_; - /** - * Execute a block click. - * @private - */ - private doBlockClick_; - /** - * Execute a workspace click. When in accessibility mode shift clicking will - * move the cursor. - * @param {!Event} _e A mouse up or touch end event. - * @private - */ - private doWorkspaceClick_; - /** - * Move the dragged/clicked block to the front of the workspace so that it is - * not occluded by other blocks. - * @private - */ - private bringBlockToFront_; - /** - * Record the field that a gesture started on. - * @param {Field} field The field the gesture started on. - * @package - */ - setStartField(field: Field): void; - /** - * Record the bubble that a gesture started on - * @param {IBubble} bubble The bubble the gesture started on. - * @package - */ - setStartBubble(bubble: () => void): void; - /** - * Record the block that a gesture started on, and set the target block - * appropriately. - * @param {BlockSvg} block The block the gesture started on. - * @package - */ - setStartBlock(block: BlockSvg): void; - /** - * Record the block that a gesture targets, meaning the block that will be - * dragged if this turns into a drag. If this block is a shadow, that will be - * its first non-shadow parent. - * @param {BlockSvg} block The block the gesture targets. - * @private - */ - private setTargetBlock_; - /** - * Record the workspace that a gesture started on. - * @param {WorkspaceSvg} ws The workspace the gesture started on. - * @private - */ - private setStartWorkspace_; - /** - * Record the flyout that a gesture started on. - * @param {IFlyout} flyout The flyout the gesture started on. - * @private - */ - private setStartFlyout_; - /** - * Whether this gesture is a click on a bubble. This should only be called - * when ending a gesture (mouse up, touch end). - * @return {boolean} Whether this gesture was a click on a bubble. - * @private - */ - private isBubbleClick_; - /** - * Whether this gesture is a click on a block. This should only be called - * when ending a gesture (mouse up, touch end). - * @return {boolean} Whether this gesture was a click on a block. - * @private - */ - private isBlockClick_; - /** - * Whether this gesture is a click on a field. This should only be called - * when ending a gesture (mouse up, touch end). - * @return {boolean} Whether this gesture was a click on a field. - * @private - */ - private isFieldClick_; - /** - * Whether this gesture is a click on a workspace. This should only be called - * when ending a gesture (mouse up, touch end). - * @return {boolean} Whether this gesture was a click on a workspace. - * @private - */ - private isWorkspaceClick_; - /** - * Whether this gesture is a drag of either a workspace or block. - * This function is called externally to block actions that cannot be taken - * mid-drag (e.g. using the keyboard to delete the selected blocks). - * @return {boolean} True if this gesture is a drag of a workspace or block. - * @package - */ - isDragging(): boolean; - /** - * Whether this gesture has already been started. In theory every mouse down - * has a corresponding mouse up, but in reality it is possible to lose a - * mouse up, leaving an in-process gesture hanging. - * @return {boolean} Whether this gesture was a click on a workspace. - * @package - */ - hasStarted(): boolean; - /** - * Get a list of the insertion markers that currently exist. Block drags have - * 0, 1, or 2 insertion markers. - * @return {!Array} A possibly empty list of insertion - * marker blocks. - * @package - */ - getInsertionMarkers(): Array; - /** - * Gets the current dragger if an item is being dragged. Null if nothing is - * being dragged. - * @return {!WorkspaceDragger|!BubbleDragger|!IBlockDragger|null} - * The dragger that is currently in use or null if no drag is in progress. - */ - getCurrentDragger(): WorkspaceDragger | { - draggingBubble_: () => void; - workspace_: WorkspaceSvg; - dragTarget_: (() => void) | null; - wouldDeleteBubble_: boolean; - startXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - dragSurface_: { - SVG_: SVGElement | null; - dragGroup_: SVGElement | null; - container_: Element; - scale_: number; - surfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - } | null; - childSurfaceXY_: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - createDom(): void; - setBlocksAndShow(blocks: SVGElement): void; - translateAndScaleGroup(x: number, y: number, scale: number): void; - translateSurfaceInternal_(): void; - translateBy(deltaX: number, deltaY: number): void; - translateSurface(x: number, y: number): void; - getSurfaceTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - getGroup(): SVGElement | null; - getSvgRoot(): SVGElement | null; - getCurrentBlock(): Element | null; - getWsTranslation(): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - clearAndHide(opt_newSurface?: Element | undefined): void; - }; - dispose(): void; - startBubbleDrag(): void; - dragBubble(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - shouldDelete_(dragTarget: (() => void) | null): boolean; - updateCursorDuringBubbleDrag_(): void; - endBubbleDrag(e: Event, currentDragDeltaXY: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): void; - fireMoveEvent_(): void; - pixelsToWorkspaceUnits_(pixelCoord: { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }): { - x: number; - y: number; - clone(): any; - scale(s: number): any; - translate(tx: number, ty: number): any; - }; - moveToDragSurface_(): void; - } | (() => void) | null; - } - import { WorkspaceSvg } from "core/workspace_svg"; - import { IFlyout } from "core/interfaces/i_flyout"; - import { BlockSvg } from "core/block_svg"; - import { Field } from "core/field"; - import { WorkspaceDragger } from "core/workspace_dragger"; -} -declare module "core/touch" { - /** - * Whether touch is enabled in the browser. - * Copied from Closure's goog.events.BrowserFeature.TOUCH_ENABLED - * @const - */ - export const TOUCH_ENABLED: boolean; - /** - * The TOUCH_MAP lookup dictionary specifies additional touch events to fire, - * in conjunction with mouse events. - * @type {Object} - * @alias Blockly.Touch.TOUCH_MAP - */ - export let TOUCH_MAP: Object; - /** - * Context menus on touch devices are activated using a long-press. - * Unfortunately the contextmenu touch event is currently (2015) only supported - * by Chrome. This function is fired on any touchstart event, queues a task, - * which after about a second opens the context menu. The tasks is killed - * if the touch event terminates early. - * @param {!Event} e Touch start event. - * @param {Gesture} gesture The gesture that triggered this longStart. - * @alias Blockly.Touch.longStart - * @package - */ - export function longStart(e: Event, gesture: Gesture): void; - /** - * Nope, that's not a long-press. Either touchend or touchcancel was fired, - * or a drag hath begun. Kill the queued long-press task. - * @alias Blockly.Touch.longStop - * @package - */ - export function longStop(): void; - /** - * Clear the touch identifier that tracks which touch stream to pay attention - * to. This ends the current drag/gesture and allows other pointers to be - * captured. - * @alias Blockly.Touch.clearTouchIdentifier - */ - export function clearTouchIdentifier(): void; - /** - * Decide whether Blockly should handle or ignore this event. - * Mouse and touch events require special checks because we only want to deal - * with one touch stream at a time. All other events should always be handled. - * @param {!Event} e The event to check. - * @return {boolean} True if this event should be passed through to the - * registered handler; false if it should be blocked. - * @alias Blockly.Touch.shouldHandleEvent - */ - export function shouldHandleEvent(e: Event): boolean; - /** - * Get the touch identifier from the given event. If it was a mouse event, the - * identifier is the string 'mouse'. - * @param {!Event} e Mouse event or touch event. - * @return {string} The touch identifier from the first changed touch, if - * defined. Otherwise 'mouse'. - * @alias Blockly.Touch.getTouchIdentifierFromEvent - */ - export function getTouchIdentifierFromEvent(e: Event): string; - /** - * Check whether the touch identifier on the event matches the current saved - * identifier. If there is no identifier, that means it's a mouse event and - * we'll use the identifier "mouse". This means we won't deal well with - * multiple mice being used at the same time. That seems okay. - * If the current identifier was unset, save the identifier from the - * event. This starts a drag/gesture, during which touch events with other - * identifiers will be silently ignored. - * @param {!Event} e Mouse event or touch event. - * @return {boolean} Whether the identifier on the event matches the current - * saved identifier. - * @alias Blockly.Touch.checkTouchIdentifier - */ - export function checkTouchIdentifier(e: Event): boolean; - /** - * Set an event's clientX and clientY from its first changed touch. Use this to - * make a touch event work in a mouse event handler. - * @param {!Event} e A touch event. - * @alias Blockly.Touch.setClientFromTouch - */ - export function setClientFromTouch(e: Event): void; - /** - * Check whether a given event is a mouse or touch event. - * @param {!Event} e An event. - * @return {boolean} True if it is a mouse or touch event; false otherwise. - * @alias Blockly.Touch.isMouseOrTouchEvent - */ - export function isMouseOrTouchEvent(e: Event): boolean; - /** - * Check whether a given event is a touch event or a pointer event. - * @param {!Event} e An event. - * @return {boolean} True if it is a touch event; false otherwise. - * @alias Blockly.Touch.isTouchEvent - */ - export function isTouchEvent(e: Event): boolean; - /** - * Split an event into an array of events, one per changed touch or mouse - * point. - * @param {!Event} e A mouse event or a touch event with one or more changed - * touches. - * @return {!Array} An array of mouse or touch events. Each touch - * event will have exactly one changed touch. - * @alias Blockly.Touch.splitEventByTouches - */ - export function splitEventByTouches(e: Event): Array; - import { Gesture } from "core/gesture"; -} -declare module "core/browser_events" { - /** - * Blockly opaque event data used to unbind events when using - * `bind` and `conditionalBind`. - */ - export type Data = Array; - /** - * Blockly opaque event data used to unbind events when using - * `bind` and `conditionalBind`. - * @typedef {!Array} - * @alias Blockly.browserEvents.Data - */ - export let Data: any; - /** - * Bind an event handler that can be ignored if it is not part of the active - * touch stream. - * Use this for events that either start or continue a multi-part gesture (e.g. - * mousedown or mousemove, which may be part of a drag or click). - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {?Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @param {boolean=} opt_noCaptureIdentifier True if triggering on this event - * should not block execution of other event handlers on this touch or - * other simultaneous touches. False by default. - * @param {boolean=} opt_noPreventDefault True if triggering on this event - * should prevent the default handler. False by default. If - * opt_noPreventDefault is provided, opt_noCaptureIdentifier must also be - * provided. - * @return {!Data} Opaque data that can be passed to - * unbindEvent_. - * @alias Blockly.browserEvents.conditionalBind - */ - export function conditionalBind(node: EventTarget, name: string, thisObject: Object | null, func: Function, opt_noCaptureIdentifier?: boolean | undefined, opt_noPreventDefault?: boolean | undefined): any[][]; - /** - * Bind an event handler that should be called regardless of whether it is part - * of the active touch stream. - * Use this for events that are not part of a multi-part gesture (e.g. - * mouseover for tooltips). - * @param {!EventTarget} node Node upon which to listen. - * @param {string} name Event name to listen to (e.g. 'mousedown'). - * @param {?Object} thisObject The value of 'this' in the function. - * @param {!Function} func Function to call when event is triggered. - * @return {!Data} Opaque data that can be passed to - * unbindEvent_. - * @alias Blockly.browserEvents.bind - */ - export function bind(node: EventTarget, name: string, thisObject: Object | null, func: Function): any[][]; - /** - * Unbind one or more events event from a function call. - * @param {!Data} bindData Opaque data from bindEvent_. - * This list is emptied during the course of calling this function. - * @return {!Function} The function call. - * @alias Blockly.browserEvents.unbind - */ - export function unbind(bindData: any[][]): Function; - /** - * Returns true if this event is targeting a text input widget? - * @param {!Event} e An event. - * @return {boolean} True if text input. - * @alias Blockly.browserEvents.isTargetInput - */ - export function isTargetInput(e: Event): boolean; - /** - * Returns true this event is a right-click. - * @param {!Event} e Mouse event. - * @return {boolean} True if right-click. - * @alias Blockly.browserEvents.isRightButton - */ - export function isRightButton(e: Event): boolean; - /** - * Returns the converted coordinates of the given mouse event. - * The origin (0,0) is the top-left corner of the Blockly SVG. - * @param {!Event} e Mouse event. - * @param {!Element} svg SVG element. - * @param {?SVGMatrix} matrix Inverted screen CTM to use. - * @return {!SVGPoint} Object with .x and .y properties. - * @alias Blockly.browserEvents.mouseToSvg - */ - export function mouseToSvg(e: Event, svg: Element, matrix: SVGMatrix | null): SVGPoint; - /** - * Returns the scroll delta of a mouse event in pixel units. - * @param {!Event} e Mouse event. - * @return {{x: number, y: number}} Scroll delta object with .x and .y - * properties. - * @alias Blockly.browserEvents.getScrollDeltaPixels - */ - export function getScrollDeltaPixels(e: Event): { - x: number; - y: number; - }; -} -declare module "core/tooltip" { - /** - * A type which can define a tooltip. - * Either a string, an object containing a tooltip property, or a function which - * returns either a string, or another arbitrarily nested function which - * eventually unwinds to a string. - */ - export type TipInfo = string | { - tooltip: any; - } | (() => (string | Function)); - /** - * A type which can define a tooltip. - * Either a string, an object containing a tooltip property, or a function which - * returns either a string, or another arbitrarily nested function which - * eventually unwinds to a string. - * @typedef {string|{tooltip}|function(): (string|!Function)} - * @alias Blockly.Tooltip.TipInfo - */ - export let TipInfo: any; - /** - * A function that renders custom tooltip UI. - * 1st parameter: the div element to render content into. - * 2nd parameter: the element being moused over (i.e., the element for which the - * tooltip should be shown). - */ - export type CustomTooltip = (arg0: Element, arg1: Element) => any; - /** - * A function that renders custom tooltip UI. - * 1st parameter: the div element to render content into. - * 2nd parameter: the element being moused over (i.e., the element for which the - * tooltip should be shown). - * @typedef {function(!Element, !Element)} - * @alias Blockly.Tooltip.CustomTooltip - */ - export let CustomTooltip: any; - /** - * Sets a custom function that will be called if present instead of the default - * tooltip UI. - * @param {!CustomTooltip} customFn A custom tooltip used to render an alternate - * tooltip UI. - * @alias Blockly.Tooltip.setCustomTooltip - */ - export function setCustomTooltip(customFn: CustomTooltip): void; - /** - * Gets the custom tooltip function. - * @returns {!CustomTooltip|undefined} The custom tooltip function, if defined. - */ - export function getCustomTooltip(): CustomTooltip | undefined; - /** - * Returns whether or not a tooltip is showing - * @returns {boolean} True if a tooltip is showing - * @alias Blockly.Tooltip.isVisible - */ - export function isVisible(): boolean; - /** - * Maximum width (in characters) of a tooltip. - * @alias Blockly.Tooltip.LIMIT - */ - export const LIMIT: 50; - /** - * Horizontal offset between mouse cursor and tooltip. - * @alias Blockly.Tooltip.OFFSET_X - */ - export const OFFSET_X: 0; - /** - * Vertical offset between mouse cursor and tooltip. - * @alias Blockly.Tooltip.OFFSET_Y - */ - export const OFFSET_Y: 10; - /** - * Radius mouse can move before killing tooltip. - * @alias Blockly.Tooltip.RADIUS_OK - */ - export const RADIUS_OK: 10; - /** - * Delay before tooltip appears. - * @alias Blockly.Tooltip.HOVER_MS - */ - export const HOVER_MS: 750; - /** - * Horizontal padding between tooltip and screen edge. - * @alias Blockly.Tooltip.MARGINS - */ - export const MARGINS: 5; - /** - * Returns the HTML tooltip container. - * @returns {?HTMLDivElement} The HTML tooltip container. - * @alias Blockly.Tooltip.getDiv - */ - export function getDiv(): HTMLDivElement | null; - /** - * Returns the tooltip text for the given element. - * @param {?Object} object The object to get the tooltip text of. - * @return {string} The tooltip text of the element. - * @alias Blockly.Tooltip.getTooltipOfObject - */ - export function getTooltipOfObject(object: Object | null): string; - /** - * Create the tooltip div and inject it onto the page. - * @alias Blockly.Tooltip.createDom - */ - export function createDom(): void; - /** - * Binds the required mouse events onto an SVG element. - * @param {!Element} element SVG element onto which tooltip is to be bound. - * @alias Blockly.Tooltip.bindMouseEvents - */ - export function bindMouseEvents(element: Element): void; - /** - * Unbinds tooltip mouse events from the SVG element. - * @param {!Element} element SVG element onto which tooltip is bound. - * @alias Blockly.Tooltip.unbindMouseEvents - */ - export function unbindMouseEvents(element: Element): void; - /** - * Dispose of the tooltip. - * @alias Blockly.Tooltip.dispose - * @package - */ - export function dispose(): void; - /** - * Hide the tooltip. - * @alias Blockly.Tooltip.hide - */ - export function hide(): void; - /** - * Hide any in-progress tooltips and block showing new tooltips until the next - * call to unblock(). - * @alias Blockly.Tooltip.block - * @package - */ - export function block(): void; - /** - * Unblock tooltips: allow them to be scheduled and shown according to their own - * logic. - * @alias Blockly.Tooltip.unblock - * @package - */ - export function unblock(): void; -} -declare module "core/utils/object" { - /** - * Inherit the prototype methods from one constructor into another. - * @param {!Function} childCtor Child class. - * @param {!Function} parentCtor Parent class. - * @suppress {strictMissingProperties} superClass_ is not defined on Function. - * @alias Blockly.utils.object.inherits - */ - export function inherits(childCtor: Function, parentCtor: Function): void; - /** - * Copies all the members of a source object to a target object. - * @param {!Object} target Target. - * @param {!Object} source Source. - * @alias Blockly.utils.object.mixin - */ - export function mixin(target: Object, source: Object): void; - /** - * Complete a deep merge of all members of a source object with a target object. - * @param {!Object} target Target. - * @param {!Object} source Source. - * @return {!Object} The resulting object. - * @alias Blockly.utils.object.deepMerge - */ - export function deepMerge(target: Object, source: Object): Object; - /** - * Returns an array of a given object's own enumerable property values. - * @param {!Object} obj Object containing values. - * @return {!Array} Array of values. - * @alias Blockly.utils.object.values - */ - export function values(obj: Object): any[]; -} -declare module "core/theme" { - /** - * Class for a theme. - * @alias Blockly.Theme - */ - export class Theme { - /** - * Define a new Blockly theme. - * @param {string} name The name of the theme. - * @param {!Object} themeObj An object containing theme properties. - * @return {!Theme} A new Blockly theme. - */ - static defineTheme(name: string, themeObj: Object): Theme; - /** - * @param {string} name Theme name. - * @param {!Object=} opt_blockStyles A map - * from style names (strings) to objects with style attributes for blocks. - * @param {!Object=} opt_categoryStyles A - * map from style names (strings) to objects with style attributes for - * categories. - * @param {!Theme.ComponentStyle=} opt_componentStyles A map of Blockly - * component names to style value. - */ - constructor(name: string, opt_blockStyles?: { - [x: string]: Theme.BlockStyle; - } | undefined, opt_categoryStyles?: { - [x: string]: Theme.CategoryStyle; - } | undefined, opt_componentStyles?: Theme.ComponentStyle | undefined); - /** - * The theme name. This can be used to reference a specific theme in CSS. - * @type {string} - */ - name: string; - /** - * The block styles map. - * @type {!Object} - * @package - */ - blockStyles: { - [x: string]: Theme.BlockStyle; - }; - /** - * The category styles map. - * @type {!Object} - * @package - */ - categoryStyles: { - [x: string]: Theme.CategoryStyle; - }; - /** - * The UI components styles map. - * @type {!Theme.ComponentStyle} - * @package - */ - componentStyles: Theme.ComponentStyle; - /** - * The font style. - * @type {!Theme.FontStyle} - * @package - */ - fontStyle: Theme.FontStyle; - /** - * Whether or not to add a 'hat' on top of all blocks with no previous or - * output connections. - * @type {?boolean} - * @package - */ - startHats: boolean | null; - /** - * Gets the class name that identifies this theme. - * @return {string} The CSS class name. - * @package - */ - getClassName(): string; - /** - * Overrides or adds a style to the blockStyles map. - * @param {string} blockStyleName The name of the block style. - * @param {Theme.BlockStyle} blockStyle The block style. - */ - setBlockStyle(blockStyleName: string, blockStyle: Theme.BlockStyle): void; - /** - * Overrides or adds a style to the categoryStyles map. - * @param {string} categoryStyleName The name of the category style. - * @param {Theme.CategoryStyle} categoryStyle The category style. - */ - setCategoryStyle(categoryStyleName: string, categoryStyle: Theme.CategoryStyle): void; - /** - * Gets the style for a given Blockly UI component. If the style value is a - * string, we attempt to find the value of any named references. - * @param {string} componentName The name of the component. - * @return {?string} The style value. - */ - getComponentStyle(componentName: string): string | null; - /** - * Configure a specific Blockly UI component with a style value. - * @param {string} componentName The name of the component. - * @param {*} styleValue The style value. - */ - setComponentStyle(componentName: string, styleValue: any): void; - /** - * Configure a theme's font style. - * @param {Theme.FontStyle} fontStyle The font style. - */ - setFontStyle(fontStyle: Theme.FontStyle): void; - /** - * Configure a theme's start hats. - * @param {boolean} startHats True if the theme enables start hats, false - * otherwise. - */ - setStartHats(startHats: boolean): void; - } - export namespace Theme { - /** - * A block style. - */ - type BlockStyle = { - colourPrimary: string; - colourSecondary: string; - colourTertiary: string; - hat: string; - }; - /** - * A category style. - */ - type CategoryStyle = { - colour: string; - }; - /** - * A component style. - */ - type ComponentStyle = { - workspaceBackgroundColour: string | null; - toolboxBackgroundColour: string | null; - toolboxForegroundColour: string | null; - flyoutBackgroundColour: string | null; - flyoutForegroundColour: string | null; - flyoutOpacity: number | null; - scrollbarColour: string | null; - scrollbarOpacity: number | null; - insertionMarkerColour: string | null; - insertionMarkerOpacity: number | null; - markerColour: string | null; - cursorColour: string | null; - selectedGlowColour: string | null; - selectedGlowOpacity: number | null; - replacementGlowColour: string | null; - replacementGlowOpacity: number | null; - }; - /** - * A font style. - */ - type FontStyle = { - family: string | null; - weight: string | null; - size: number | null; - }; - } -} -declare module "core/renderers/common/constants" { - /** - * An object that provides constants for rendering blocks. - * @alias Blockly.blockRendering.ConstantProvider - */ - export class ConstantProvider { - /** - * The size of an empty spacer. - * @type {number} - */ - NO_PADDING: number; - /** - * The size of small padding. - * @type {number} - */ - SMALL_PADDING: number; - /** - * The size of medium padding. - * @type {number} - */ - MEDIUM_PADDING: number; - /** - * The size of medium-large padding. - * @type {number} - */ - MEDIUM_LARGE_PADDING: number; - /** - * The size of large padding. - * @type {number} - */ - LARGE_PADDING: number; - /** - * Offset from the top of the row for placing fields on inline input rows - * and statement input rows. - * Matches existing rendering (in 2019). - * @type {number} - */ - TALL_INPUT_FIELD_OFFSET_Y: number; - /** - * The height of the puzzle tab used for input and output connections. - * @type {number} - */ - TAB_HEIGHT: number; - /** - * The offset from the top of the block at which a puzzle tab is positioned. - * @type {number} - */ - TAB_OFFSET_FROM_TOP: number; - /** - * Vertical overlap of the puzzle tab, used to make it look more like a - * puzzle piece. - * @type {number} - */ - TAB_VERTICAL_OVERLAP: number; - /** - * The width of the puzzle tab used for input and output connections. - * @type {number} - */ - TAB_WIDTH: number; - /** - * The width of the notch used for previous and next connections. - * @type {number} - */ - NOTCH_WIDTH: number; - /** - * The height of the notch used for previous and next connections. - * @type {number} - */ - NOTCH_HEIGHT: number; - /** - * The minimum width of the block. - * @type {number} - */ - MIN_BLOCK_WIDTH: number; - EMPTY_BLOCK_SPACER_HEIGHT: number; - /** - * The minimum height of a dummy input row. - * @type {number} - */ - DUMMY_INPUT_MIN_HEIGHT: number; - /** - * The minimum height of a dummy input row in a shadow block. - * @type {number} - */ - DUMMY_INPUT_SHADOW_MIN_HEIGHT: number; - /** - * Rounded corner radius. - * @type {number} - */ - CORNER_RADIUS: number; - /** - * Offset from the left side of a block or the inside of a statement input - * to the left side of the notch. - * @type {number} - */ - NOTCH_OFFSET_LEFT: number; - /** - * Additional offset added to the statement input's width to account for the - * notch. - * @type {number} - */ - STATEMENT_INPUT_NOTCH_OFFSET: number; - STATEMENT_BOTTOM_SPACER: number; - STATEMENT_INPUT_PADDING_LEFT: number; - /** - * Vertical padding between consecutive statement inputs. - * @type {number} - */ - BETWEEN_STATEMENT_PADDING_Y: number; - /** - * The top row's minimum height. - * @type {number} - */ - TOP_ROW_MIN_HEIGHT: number; - /** - * The top row's minimum height if it precedes a statement. - * @type {number} - */ - TOP_ROW_PRECEDES_STATEMENT_MIN_HEIGHT: number; - /** - * The bottom row's minimum height. - * @type {number} - */ - BOTTOM_ROW_MIN_HEIGHT: number; - /** - * The bottom row's minimum height if it follows a statement input. - * @type {number} - */ - BOTTOM_ROW_AFTER_STATEMENT_MIN_HEIGHT: number; - /** - * Whether to add a 'hat' on top of all blocks with no previous or output - * connections. Can be overridden by 'hat' property on Theme.BlockStyle. - * @type {boolean} - */ - ADD_START_HATS: boolean; - /** - * Height of the top hat. - * @type {number} - */ - START_HAT_HEIGHT: number; - /** - * Width of the top hat. - * @type {number} - */ - START_HAT_WIDTH: number; - SPACER_DEFAULT_HEIGHT: number; - MIN_BLOCK_HEIGHT: number; - EMPTY_INLINE_INPUT_PADDING: number; - /** - * The height of an empty inline input. - * @type {number} - */ - EMPTY_INLINE_INPUT_HEIGHT: number; - EXTERNAL_VALUE_INPUT_PADDING: number; - /** - * The height of an empty statement input. Note that in the old rendering - * this varies slightly depending on whether the block has external or - * inline inputs. In the new rendering this is consistent. It seems - * unlikely that the old behaviour was intentional. - * @type {number} - */ - EMPTY_STATEMENT_INPUT_HEIGHT: number; - START_POINT: string; - /** - * Height of SVG path for jagged teeth at the end of collapsed blocks. - * @type {number} - */ - JAGGED_TEETH_HEIGHT: number; - /** - * Width of SVG path for jagged teeth at the end of collapsed blocks. - * @type {number} - */ - JAGGED_TEETH_WIDTH: number; - /** - * Point size of text. - * @type {number} - */ - FIELD_TEXT_FONTSIZE: number; - /** - * Text font weight. - * @type {string} - */ - FIELD_TEXT_FONTWEIGHT: string; - /** - * Text font family. - * @type {string} - */ - FIELD_TEXT_FONTFAMILY: string; - /** - * Height of text. This constant is dynamically set in - * ``setFontConstants_`` to be the height of the text based on the font - * used. - * @type {number} - */ - FIELD_TEXT_HEIGHT: number; - /** - * Text baseline. This constant is dynamically set in ``setFontConstants_`` - * to be the baseline of the text based on the font used. - * @type {number} - */ - FIELD_TEXT_BASELINE: number; - /** - * A field's border rect corner radius. - * @type {number} - */ - FIELD_BORDER_RECT_RADIUS: number; - /** - * A field's border rect default height. - * @type {number} - */ - FIELD_BORDER_RECT_HEIGHT: number; - /** - * A field's border rect X padding. - * @type {number} - */ - FIELD_BORDER_RECT_X_PADDING: number; - /** - * A field's border rect Y padding. - * @type {number} - */ - FIELD_BORDER_RECT_Y_PADDING: number; - /** - * The backing colour of a field's border rect. - * @type {string} - * @package - */ - FIELD_BORDER_RECT_COLOUR: string; - /** - * A field's text element's dominant baseline. - * @type {boolean} - */ - FIELD_TEXT_BASELINE_CENTER: boolean; - /** - * A dropdown field's border rect height. - * @type {number} - */ - FIELD_DROPDOWN_BORDER_RECT_HEIGHT: number; - /** - * Whether or not a dropdown field should add a border rect when in a shadow - * block. - * @type {boolean} - */ - FIELD_DROPDOWN_NO_BORDER_RECT_SHADOW: boolean; - /** - * Whether or not a dropdown field's div should be coloured to match the - * block colours. - * @type {boolean} - */ - FIELD_DROPDOWN_COLOURED_DIV: boolean; - /** - * Whether or not a dropdown field uses a text or SVG arrow. - * @type {boolean} - */ - FIELD_DROPDOWN_SVG_ARROW: boolean; - /** - * A dropdown field's SVG arrow padding. - * @type {number} - */ - FIELD_DROPDOWN_SVG_ARROW_PADDING: number; - /** - * A dropdown field's SVG arrow size. - * @type {number} - */ - FIELD_DROPDOWN_SVG_ARROW_SIZE: number; - /** - * A dropdown field's SVG arrow datauri. - * @type {string} - */ - FIELD_DROPDOWN_SVG_ARROW_DATAURI: string; - /** - * Whether or not to show a box shadow around the widget div. This is only a - * feature of full block fields. - * @type {boolean} - */ - FIELD_TEXTINPUT_BOX_SHADOW: boolean; - /** - * Whether or not the colour field should display its colour value on the - * entire block. - * @type {boolean} - */ - FIELD_COLOUR_FULL_BLOCK: boolean; - /** - * A colour field's default width. - * @type {number} - */ - FIELD_COLOUR_DEFAULT_WIDTH: number; - /** - * A colour field's default height. - * @type {number} - */ - FIELD_COLOUR_DEFAULT_HEIGHT: number; - /** - * A checkbox field's X offset. - * @type {number} - */ - FIELD_CHECKBOX_X_OFFSET: number; - /** - * A random identifier used to ensure a unique ID is used for each - * filter/pattern for the case of multiple Blockly instances on a page. - * @type {string} - * @package - */ - randomIdentifier: string; - /** - * The defs tag that contains all filters and patterns for this Blockly - * instance. - * @type {?SVGElement} - * @private - */ - private defs_; - /** - * The ID of the emboss filter, or the empty string if no filter is set. - * @type {string} - * @package - */ - embossFilterId: string; - /** - * The element to use for highlighting, or null if not set. - * @type {SVGElement} - * @private - */ - private embossFilter_; - /** - * The ID of the disabled pattern, or the empty string if no pattern is set. - * @type {string} - * @package - */ - disabledPatternId: string; - /** - * The element to use for disabled blocks, or null if not set. - * @type {SVGElement} - * @private - */ - private disabledPattern_; - /** - * The ID of the debug filter, or the empty string if no pattern is set. - * @type {string} - * @package - */ - debugFilterId: string; - /** - * The element to use for a debug highlight, or null if not set. - * @type {SVGElement} - * @private - */ - private debugFilter_; - /** - * The