From a404d4de7ee14d16f9068c7f112aa0bc255151bc Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 26 Nov 2021 15:45:44 +0300 Subject: [PATCH 01/14] a lot of rewrite Lol --- .babelrc | 18 - .gitignore | 2 +- .npmignore | 7 +- Licence | 2 +- changelog.md | 58 + package-lock.json | 5675 +-- package.json | 29 +- rollup.config.js => rollup.config.mjs | 26 +- samples/factorial.tsk | 2 +- samples/index.tsk | 46 +- samples/module.tsk | 48000 ++++++++++++++++++++++-- samples/narcissistic.tsk | 6 +- samples/palindromic.tsk | 10 +- samples/some.tsk | 2 +- server.crt | 35 + server.key | 28 + server.mjs | 204 + src/bin/tsconfig.json | 13 + src/bin/tskc.mts | 33 + src/bin/tskc.ts | 36 - src/lib/compiler.ts | 48 +- src/lib/emitter.ts | 338 +- src/lib/enums.ts | 43 +- src/lib/keywords.ts | 743 - src/lib/lexer.ts | 330 +- src/lib/nodes.ts | 116 +- src/lib/parse-dummies.ts | 6 - src/lib/parser.ts | 433 +- src/lib/parsers/__all__.ts | 11 + src/lib/parsers/__external_var.ts | 30 - src/lib/parsers/array-expression.ts | 39 +- src/lib/parsers/assignments.ts | 34 +- src/lib/parsers/body-parser.ts | 43 +- src/lib/parsers/call-expression.ts | 32 +- src/lib/parsers/common-expressions.ts | 17 +- src/lib/parsers/external-var.ts | 20 + src/lib/parsers/group-expression.ts | 33 +- src/lib/parsers/keywords.ts | 643 + src/lib/parsers/member-access.ts | 130 +- src/lib/parsers/object-expression.ts | 23 + src/lib/parsers/regexp.ts | 74 + src/lib/utils/advancers.ts | 55 +- src/lib/utils/constants.ts | 12 +- src/lib/utils/diagnostics.ts | 12 +- src/lib/utils/stream.ts | 68 +- src/lib/utils/table.ts | 12 +- src/lib/utils/util.ts | 68 +- src/lib/wrapper.ts | 24 +- tsconfig.json | 13 +- 49 files changed, 46902 insertions(+), 10780 deletions(-) delete mode 100644 .babelrc rename rollup.config.js => rollup.config.mjs (57%) create mode 100644 server.crt create mode 100644 server.key create mode 100644 server.mjs create mode 100644 src/bin/tsconfig.json create mode 100644 src/bin/tskc.mts delete mode 100644 src/bin/tskc.ts delete mode 100644 src/lib/keywords.ts delete mode 100644 src/lib/parse-dummies.ts create mode 100644 src/lib/parsers/__all__.ts delete mode 100644 src/lib/parsers/__external_var.ts create mode 100644 src/lib/parsers/external-var.ts create mode 100644 src/lib/parsers/keywords.ts create mode 100644 src/lib/parsers/object-expression.ts create mode 100644 src/lib/parsers/regexp.ts diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 4e19bab..0000000 --- a/.babelrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "presets": [ - [ - "minify", - { - "typeConstructors": { - "string": false - }, - "evaluate": true, - "infinity": false, - "mangle": { - "topLevel": true - } - } - ] - ], - "comments": false -} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 15b75c5..4e2b9eb 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ build index.js index.html -server.js node_modules *.tgz +*.7z diff --git a/.npmignore b/.npmignore index 3fd39a0..5ba7e36 100644 --- a/.npmignore +++ b/.npmignore @@ -4,10 +4,11 @@ src build/tsconfig.tsbuildinfo build/deps build/out -*.map +bundle.js.map +bundle.cjs.map +bundle.min.js.map bundle.js bundle.cjs -bundle.mjs bundle.min.js samples index.js @@ -17,5 +18,7 @@ syntax.md .babelrc package-lock.json *.tgz +*.7z node_modules tsconfig.json +rollup.config.js diff --git a/Licence b/Licence index ce87899..b098477 100644 --- a/Licence +++ b/Licence @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2020 MadProbe#7435 +Copyright (c) 2020-present MadProbe#7435 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/changelog.md b/changelog.md index 4a8fc73..f4d7a29 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,61 @@ +# Version 0.3.0 +## New Features + +### Word aliases for binary ariphmetic +```ts +not true; +not 0 + 1; +true and false; +false or true; +``` +transforms to: +```ts +!true; +!(0 + 1); +true && false; +false || true; +``` + +### Symbol constructor property shortcuts +```ts +iterator = [0, 1, 2, 3, 4][@@iterator](); +while (not (next = iterator.next()).done) { + __external_var("console").log(next.value); +} + +/** + * Prints to console: + * 0 + * 1 + * 2 + * 3 + * 4 + */ +``` +transforms to: +```js +var $iterator, $next; +$iterator = [0, 1, 2, 3, 4][Symbol.iterator](); +while (!(($next = $iterator.next())).done) { + console.log($next.value); +}; +``` + +### include { symbol } from "module.tsk"; +Same as normal `include "module.tsk";`, except only some symbols from module are exported. +NOTE: WHOLE module is evaluated and NO functionality is stripped and ALL symbols (variables and functions) in module available to exported symbols! +Exmaples: +```ts +include { symbol, function } from "module.tsk"; +include { symbol as newSymbolName } from "module.tsk"; +``` + +### Import expressions +```ts +// Import expression are same as in js +fs = await import("fs"); +``` + # Version 0.2.0 ## Bug fixes Removed Extra newline emitted on code block and try statment. diff --git a/package-lock.json b/package-lock.json index 5d812d7..c13988d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,52 +9,20 @@ "version": "0.2.0", "license": "ISC", "bin": { - "tskc": "build/tskc.js" + "tskc": "build/tskc.mjs" }, "devDependencies": { - "@babel/cli": "^7.13.10", - "@babel/core": "^7.13.10", - "@rollup/plugin-babel": "^5.3.0", - "@rollup/plugin-typescript": "^8.2.0", - "@types/node": "^14.14.35", - "babel-preset-minify": "^0.5.1", - "rollup": "^2.42.3", - "tslib": "^2.1.0", - "typescript": "^4.3.0-dev.20210323" + "@types/node": "^15.0.2", + "rollup": "^2.47.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-typescript2": "^0.30.0", + "tslib": "^2.2.0", + "typescript": "^4.5.2" }, "peerDependencies": { "node-fetch": "^2.6.1" } }, - "node_modules/@babel/cli": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.10.tgz", - "integrity": "sha512-lYSBC7B4B9hJ7sv0Ojx1BrGhuzCoOIYfLjd+Xpd4rOzdS+a47yi8voV8vFkfjlZR1N5qZO7ixOCbobUdT304PQ==", - "dev": true, - "dependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - }, - "bin": { - "babel": "bin/babel.js", - "babel-external-helpers": "bin/babel-external-helpers.js" - }, - "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/code-frame": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", @@ -64,97 +32,124 @@ "@babel/highlight": "^7.12.13" } }, - "node_modules/@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true + }, + "node_modules/@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "node_modules/@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", "dev": true }, - "node_modules/@babel/core": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", - "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", + "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": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.10", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=4" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "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": { - "ms": "2.1.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6.0" + "node": ">=4" + } + }, + "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/@babel/core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "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, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", + "node_modules/find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "dependencies": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" + "semver": "^6.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "node_modules/find-cache-dir/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", @@ -163,276 +158,319 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", + "node_modules/fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "dependencies": { - "@babel/types": "^7.13.12" + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", + "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": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "engines": { + "node": ">=4" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", + "node_modules/is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "dependencies": { - "@babel/types": "^7.13.12" + "engines": { + "node": ">=8" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@babel/types": "^7.12.13" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "p-try": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "engines": { + "node": ">=6" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, - "node_modules/@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", + "node_modules/picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "optional": true, "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "safe-buffer": "^5.1.0" } }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", - "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">= 10.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rollup": { + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", + "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" + "engines": { + "node": ">=10.0.0" }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } + "optionalDependencies": { + "fsevents": "~2.3.1" } }, - "node_modules/@rollup/plugin-typescript": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.0.tgz", - "integrity": "sha512-5DyVsb7L+ehLfNPu/nat8Gq3uJGzku4bMFPt90XahtgiSBf7z9YKPLqFUJKMT41W/mJ98SVGDPOhzikGrr/Lhg==", + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-typescript2": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", + "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^4.1.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "8.1.0", + "resolve": "1.20.0", + "tslib": "2.1.0" }, "peerDependencies": { - "rollup": "^2.14.0", - "tslib": "*", - "typescript": ">=3.4.0" + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" } }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", + "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", "dev": true, "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", + "estree-walker": "^2.0.1", "picomatch": "^2.2.2" }, "engines": { @@ -442,4363 +480,426 @@ "rollup": "^1.20.0||^2.0.0" } }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, - "node_modules/@types/node": { - "version": "14.14.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", - "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", + "node_modules/rollup-plugin-typescript2/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", "dev": true }, - "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==", + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "randombytes": "^2.1.0" } }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, - "optional": true, "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "node_modules/source-map-support/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, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, "engines": { "node": ">=0.10.0" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "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, - "optional": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, - "optional": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, "bin": { - "atob": "bin/atob.js" + "terser": "bin/terser" }, "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==", - "dev": true - }, - "node_modules/babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=", - "dev": true - }, - "node_modules/babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", - "dev": true - }, - "node_modules/babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=", - "dev": true - }, - "node_modules/babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=", - "dev": true - }, - "node_modules/babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=", - "dev": true - }, - "node_modules/babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==", - "dev": true - }, - "node_modules/babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==", - "dev": true - }, - "node_modules/babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "dev": true, - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "node_modules/babel-plugin-minify-dead-code-elimination": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", - "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", - "dev": true, - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash": "^4.17.11" - } - }, - "node_modules/babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", - "dev": true, - "dependencies": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-guarded-expressions": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", - "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", - "dev": true, - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=", - "dev": true - }, - "node_modules/babel-plugin-minify-mangle-names": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", - "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", - "dev": true, - "dependencies": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "node_modules/babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=", - "dev": true - }, - "node_modules/babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==", - "dev": true - }, - "node_modules/babel-plugin-minify-simplify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", - "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", - "dev": true, - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "node_modules/babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", - "dev": true, - "dependencies": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "node_modules/babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=", - "dev": true - }, - "node_modules/babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=", - "dev": true - }, - "node_modules/babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", - "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=", - "dev": true - }, - "node_modules/babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=", - "dev": true - }, - "node_modules/babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" + "node": ">=10" } }, - "node_modules/babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=", - "dev": true - }, - "node_modules/babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", - "dev": true - }, - "node_modules/babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", + "node_modules/terser/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 }, - "node_modules/babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, - "dependencies": { - "babel-helper-evaluate-path": "^0.5.0" + "engines": { + "node": ">= 8" } }, - "node_modules/babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=", - "dev": true - }, - "node_modules/babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=", - "dev": true - }, - "node_modules/babel-preset-minify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", - "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", - "dev": true, - "dependencies": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.1", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.4", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.0", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.1", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.4", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash": "^4.17.11" - } + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "peer": true }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "node_modules/tslib": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/typescript": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=0.10.0" + "node": ">=4.2.0" } }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "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, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 4.0.0" } }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "peer": true }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "peer": true, "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "requires": { + "@babel/highlight": "^7.12.13" } }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } + "@babel/helper-validator-identifier": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", + "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "dev": true }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "@babel/highlight": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", + "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "@babel/helper-validator-identifier": "^7.14.0", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" } }, - "node_modules/browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "dependencies": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "@types/node": { + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", + "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", + "dev": true }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "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, - "optional": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "requires": { + "color-convert": "^1.9.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001204", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", - "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/chalk": { + "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": { + "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" } }, - "node_modules/chokidar": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", - "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "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, - "optional": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "engines": { - "node": ">= 8.10.0" + "requires": { + "color-name": "1.1.3" } }, - "node_modules/chokidar/node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } + "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/chokidar/node_modules/binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=8" - } + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "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 }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, - "optional": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chokidar/node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/chokidar/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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/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/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.3.696", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.696.tgz", - "integrity": "sha512-yuKKvBuXe+IWRp6DxqbGUxbPtamh5C+mEC38vZ0KLxQFpGG9TQn0DbPL9WhWhQnfNhLyzxmPYlCzShbs8QxGbA==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "optional": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true, - "optional": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "optional": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "optional": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "dev": true, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/rollup": { - "version": "2.42.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.42.3.tgz", - "integrity": "sha512-JjaT9WaUS5vmjy6xUrnPOskjkQg2cN4WSACNCwbOvBz8VDmbiKVdmTFUoMPRqTud0tsex8Xy9/boLbDW9HKD1w==", - "dev": true, - "dependencies": { - "fsevents": "~2.3.1" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.1" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true, - "optional": true - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.3.0-dev.20210323", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.0-dev.20210323.tgz", - "integrity": "sha512-13er73BHxa49JxfDuKDEmQ2w7F9In/ma5AhO6GxDwgdnlYcQUyvBr8pSx1O3zclWI9JEu1cH88G7j0ZSQQ6t2w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - }, - "dependencies": { - "@babel/cli": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.13.10.tgz", - "integrity": "sha512-lYSBC7B4B9hJ7sv0Ojx1BrGhuzCoOIYfLjd+Xpd4rOzdS+a47yi8voV8vFkfjlZR1N5qZO7ixOCbobUdT304PQ==", - "dev": true, - "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents", - "chokidar": "^3.4.0", - "commander": "^4.0.1", - "convert-source-map": "^1.1.0", - "fs-readdir-recursive": "^1.1.0", - "glob": "^7.0.0", - "lodash": "^4.17.19", - "make-dir": "^2.1.0", - "slash": "^2.0.0", - "source-map": "^0.5.0" - } - }, - "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.12.13" - } - }, - "@babel/compat-data": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz", - "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==", - "dev": true - }, - "@babel/core": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz", - "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.9", - "@babel/helper-compilation-targets": "^7.13.10", - "@babel/helper-module-transforms": "^7.13.0", - "@babel/helpers": "^7.13.10", - "@babel/parser": "^7.13.10", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "lodash": "^4.17.19", - "semver": "^6.3.0", - "source-map": "^0.5.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/generator": { - "version": "7.13.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz", - "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz", - "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.13.8", - "@babel/helper-validator-option": "^7.12.17", - "browserslist": "^4.14.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "@babel/helper-function-name": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", - "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.12.13", - "@babel/template": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", - "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz", - "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-imports": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz", - "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-module-transforms": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz", - "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.13.12", - "@babel/helper-replace-supers": "^7.13.12", - "@babel/helper-simple-access": "^7.13.12", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/helper-validator-identifier": "^7.12.11", - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", - "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-replace-supers": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz", - "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==", - "dev": true, - "requires": { - "@babel/helper-member-expression-to-functions": "^7.13.12", - "@babel/helper-optimise-call-expression": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-simple-access": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz", - "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==", - "dev": true, - "requires": { - "@babel/types": "^7.13.12" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", - "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", - "dev": true, - "requires": { - "@babel/types": "^7.12.13" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", - "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.12.17", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz", - "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==", - "dev": true - }, - "@babel/helpers": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz", - "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==", - "dev": true, - "requires": { - "@babel/template": "^7.12.13", - "@babel/traverse": "^7.13.0", - "@babel/types": "^7.13.0" - } - }, - "@babel/highlight": { - "version": "7.13.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz", - "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz", - "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==", - "dev": true - }, - "@babel/template": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", - "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/parser": "^7.12.13", - "@babel/types": "^7.12.13" - } - }, - "@babel/traverse": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz", - "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.13", - "@babel/generator": "^7.13.0", - "@babel/helper-function-name": "^7.12.13", - "@babel/helper-split-export-declaration": "^7.12.13", - "@babel/parser": "^7.13.0", - "@babel/types": "^7.13.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.13.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz", - "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.12.11", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz", - "integrity": "sha512-+nb9vWloHNNMFHjGofEam3wopE3m1yuambrrd/fnPc+lFOMB9ROTqQlche9ByFWNkdNqfSgR/kkQtQ8DzEWt2w==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "@rollup/plugin-babel": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", - "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-typescript": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.2.0.tgz", - "integrity": "sha512-5DyVsb7L+ehLfNPu/nat8Gq3uJGzku4bMFPt90XahtgiSBf7z9YKPLqFUJKMT41W/mJ98SVGDPOhzikGrr/Lhg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "resolve": "^1.17.0" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/node": { - "version": "14.14.35", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.35.tgz", - "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==", - "dev": true - }, - "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" - } - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true - }, - "babel-helper-evaluate-path": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz", - "integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==", - "dev": true - }, - "babel-helper-flip-expressions": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz", - "integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=", - "dev": true - }, - "babel-helper-is-nodes-equiv": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz", - "integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=", - "dev": true - }, - "babel-helper-is-void-0": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz", - "integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=", - "dev": true - }, - "babel-helper-mark-eval-scopes": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz", - "integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=", - "dev": true - }, - "babel-helper-remove-or-void": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz", - "integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=", - "dev": true - }, - "babel-helper-to-multiple-sequence-expressions": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz", - "integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==", - "dev": true - }, - "babel-plugin-minify-builtins": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz", - "integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==", - "dev": true - }, - "babel-plugin-minify-constant-folding": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz", - "integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-minify-dead-code-elimination": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz", - "integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-mark-eval-scopes": "^0.4.3", - "babel-helper-remove-or-void": "^0.4.3", - "lodash": "^4.17.11" - } - }, - "babel-plugin-minify-flip-comparisons": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz", - "integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-minify-guarded-expressions": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz", - "integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3" - } - }, - "babel-plugin-minify-infinity": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz", - "integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=", - "dev": true - }, - "babel-plugin-minify-mangle-names": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz", - "integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==", - "dev": true, - "requires": { - "babel-helper-mark-eval-scopes": "^0.4.3" - } - }, - "babel-plugin-minify-numeric-literals": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz", - "integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=", - "dev": true - }, - "babel-plugin-minify-replace": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz", - "integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==", - "dev": true - }, - "babel-plugin-minify-simplify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz", - "integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0", - "babel-helper-flip-expressions": "^0.4.3", - "babel-helper-is-nodes-equiv": "^0.0.1", - "babel-helper-to-multiple-sequence-expressions": "^0.5.0" - } - }, - "babel-plugin-minify-type-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz", - "integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=", - "dev": true, - "requires": { - "babel-helper-is-void-0": "^0.4.3" - } - }, - "babel-plugin-transform-inline-consecutive-adds": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz", - "integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=", - "dev": true - }, - "babel-plugin-transform-member-expression-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz", - "integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=", - "dev": true - }, - "babel-plugin-transform-merge-sibling-variables": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz", - "integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=", - "dev": true - }, - "babel-plugin-transform-minify-booleans": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz", - "integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=", - "dev": true - }, - "babel-plugin-transform-property-literals": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz", - "integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "babel-plugin-transform-regexp-constructors": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz", - "integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=", - "dev": true - }, - "babel-plugin-transform-remove-console": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", - "dev": true - }, - "babel-plugin-transform-remove-debugger": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz", - "integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=", - "dev": true - }, - "babel-plugin-transform-remove-undefined": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz", - "integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==", - "dev": true, - "requires": { - "babel-helper-evaluate-path": "^0.5.0" - } - }, - "babel-plugin-transform-simplify-comparison-operators": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz", - "integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=", - "dev": true - }, - "babel-plugin-transform-undefined-to-void": { - "version": "6.9.4", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz", - "integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=", - "dev": true - }, - "babel-preset-minify": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz", - "integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==", - "dev": true, - "requires": { - "babel-plugin-minify-builtins": "^0.5.0", - "babel-plugin-minify-constant-folding": "^0.5.0", - "babel-plugin-minify-dead-code-elimination": "^0.5.1", - "babel-plugin-minify-flip-comparisons": "^0.4.3", - "babel-plugin-minify-guarded-expressions": "^0.4.4", - "babel-plugin-minify-infinity": "^0.4.3", - "babel-plugin-minify-mangle-names": "^0.5.0", - "babel-plugin-minify-numeric-literals": "^0.4.3", - "babel-plugin-minify-replace": "^0.5.0", - "babel-plugin-minify-simplify": "^0.5.1", - "babel-plugin-minify-type-constructors": "^0.4.3", - "babel-plugin-transform-inline-consecutive-adds": "^0.4.3", - "babel-plugin-transform-member-expression-literals": "^6.9.4", - "babel-plugin-transform-merge-sibling-variables": "^6.9.4", - "babel-plugin-transform-minify-booleans": "^6.9.4", - "babel-plugin-transform-property-literals": "^6.9.4", - "babel-plugin-transform-regexp-constructors": "^0.4.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "babel-plugin-transform-remove-debugger": "^6.9.4", - "babel-plugin-transform-remove-undefined": "^0.5.0", - "babel-plugin-transform-simplify-comparison-operators": "^6.9.4", - "babel-plugin-transform-undefined-to-void": "^6.9.4", - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "browserslist": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", - "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001181", - "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.649", - "escalade": "^3.1.1", - "node-releases": "^1.1.70" - } - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "optional": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001204", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz", - "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==", - "dev": 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, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chokidar": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", - "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "dev": true, - "optional": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true, - "optional": true - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "optional": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "optional": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "optional": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "optional": true, - "requires": { - "is-number": "^7.0.0" - } - } - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.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 - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "electron-to-chromium": { - "version": "1.3.696", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.696.tgz", - "integrity": "sha512-yuKKvBuXe+IWRp6DxqbGUxbPtamh5C+mEC38vZ0KLxQFpGG9TQn0DbPL9WhWhQnfNhLyzxmPYlCzShbs8QxGbA==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "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 - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "optional": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "dependencies": { - "is-glob": { + "make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", - "dev": true, - "optional": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "optional": true - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "optional": true, "requires": { - "is-buffer": "^1.1.5" + "semver": "^6.0.0" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true } } }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "optional": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "optional": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", "dev": true, "optional": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, - "optional": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "function-bind": "^1.1.1" } }, - "node-releases": { - "version": "1.1.71", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", - "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", "dev": true, - "optional": true + "requires": { + "has": "^1.0.3" + } }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, - "optional": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "optional": true, "requires": { - "is-buffer": "^1.1.5" + "has-flag": "^4.0.0" } } } }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, - "optional": true, "requires": { - "isobject": "^3.0.0" + "graceful-fs": "^4.1.6" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, "requires": { - "isobject": "^3.0.1" + "p-locate": "^4.1.0" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "peer": true, "requires": { - "wrappy": "1" + "whatwg-url": "^5.0.0" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "optional": true + "requires": { + "p-try": "^2.0.0" + } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "optional": true + "requires": { + "p-limit": "^2.2.0" + } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "picomatch": { @@ -4807,86 +908,24 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "optional": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "find-up": "^4.0.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, - "optional": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "safe-buffer": "^5.1.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true, - "optional": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true - }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -4897,269 +936,97 @@ "path-parse": "^1.0.6" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true - }, "rollup": { - "version": "2.42.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.42.3.tgz", - "integrity": "sha512-JjaT9WaUS5vmjy6xUrnPOskjkQg2cN4WSACNCwbOvBz8VDmbiKVdmTFUoMPRqTud0tsex8Xy9/boLbDW9HKD1w==", + "version": "2.47.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", + "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", "dev": true, "requires": { "fsevents": "~2.3.1" } }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "requires": { - "ret": "~0.1.10" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", "dev": true, - "optional": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "rollup-plugin-typescript2": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", + "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", "dev": true, - "optional": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "@rollup/pluginutils": "^4.1.0", + "find-cache-dir": "^3.3.1", + "fs-extra": "8.1.0", + "resolve": "1.20.0", + "tslib": "2.1.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "@rollup/pluginutils": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", + "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", "dev": true, - "optional": true, "requires": { - "kind-of": "^6.0.0" + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - } + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true } } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true, - "optional": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", "dev": true, - "optional": true, "requires": { - "extend-shallow": "^3.0.0" + "randombytes": "^2.1.0" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", "dev": true, - "optional": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } + "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 } } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5169,160 +1036,70 @@ "has-flag": "^3.0.0" } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", "dev": true, - "optional": true, "requires": { - "kind-of": "^3.0.2" + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } + "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 + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "peer": true }, "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true }, "typescript": { - "version": "4.3.0-dev.20210323", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.0-dev.20210323.tgz", - "integrity": "sha512-13er73BHxa49JxfDuKDEmQ2w7F9In/ma5AhO6GxDwgdnlYcQUyvBr8pSx1O3zclWI9JEu1cH88G7j0ZSQQ6t2w==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", + "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } + "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 }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "peer": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "peer": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true - } + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true } } } diff --git a/package.json b/package.json index 1b103d9..fa97957 100644 --- a/package.json +++ b/package.json @@ -4,35 +4,35 @@ "description": "Compiler for TSK programming language", "author": "MadProbe#7435", "license": "ISC", + "main": "./build/bundle.min.cjs", + "module": "./build/bundle.min.mjs", "exports": { ".": { "import": "./build/bundle.min.mjs", "browser": "./build/bundle.min.mjs", + "import-non-minified": "./build.mjs", "require": "./build/bundle.min.cjs" } }, "type": "module", "bin": { - "tskc": "build/tskc.js" + "tskc": "build/tskc.mjs" }, - "types": "./build/out/lib/compiler.d.ts", + "types": "./build/decls/lib/compiler.d.ts", "devDependencies": { - "@babel/cli": "^7.13.10", - "@babel/core": "^7.13.10", - "@rollup/plugin-babel": "^5.3.0", - "@rollup/plugin-typescript": "^8.2.0", - "@types/node": "^14.14.35", - "babel-preset-minify": "^0.5.1", - "rollup": "^2.42.3", - "tslib": "^2.1.0", - "typescript": "^4.3.0-dev.20210323" + "@types/node": "^15.0.2", + "rollup": "^2.47.0", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-typescript2": "^0.30.0", + "tslib": "^2.2.0", + "typescript": "^4.5.2" }, "peerDependencies": { "node-fetch": "^2.6.1" }, "scripts": { - "build": "rollup -c && tsc src/bin/tskc.ts --outDir build -t es2018 -m esnext", - "update": "npm i --legacy-peer-deps -D @rollup/plugin-typescript@latest @rollup/plugin-babel@latest @babel/cli@latest @babel/core@latest @types/node@latest babel-preset-minify@latest typescript@next rollup@latest tslib@latest", + "build": "rollup -c && tsc -p src/bin/tsconfig.json", + "update": "npm i --legacy-peer-deps -D rollup-plugin-typescript2@latest @rollup/plugin-babel@latest @babel/cli@latest @babel/core@latest @types/node@latest babel-preset-minify@latest typescript@latest rollup@latest tslib@latest", "start": "node server.js", "globalinstall": "npm pack && npm install -g ./tskc-0.2.0.tgz", "clearbuild": "rm -rf build/out build/bundle.*", @@ -43,7 +43,8 @@ "url": "git+https://github.com/MadProbe/tsk.git" }, "bugs": { - "url": "https://github.com/MadProbe/tsk/issues" + "url": "https://github.com/MadProbe/tsk/issues", + "discord": "https://discord.gg/5dPuBvZjjx" }, "homepage": "https://github.com/MadProbe/tsk#readme" } diff --git a/rollup.config.js b/rollup.config.mjs similarity index 57% rename from rollup.config.js rename to rollup.config.mjs index b004409..b97e09f 100644 --- a/rollup.config.js +++ b/rollup.config.mjs @@ -1,13 +1,12 @@ -// rollup.config.js -import typescript from '@rollup/plugin-typescript'; -import { getBabelOutputPlugin } from '@rollup/plugin-babel'; -import { readFileSync } from "fs"; +import typescript from 'rollup-plugin-typescript2'; +import { terser } from 'rollup-plugin-terser'; +const plugin_terser = terser({ format: { comments: false }, mangle: true, compress: true }); export default { onwarn(warning) { if (warning.code !== 'CIRCULAR_DEPENDENCY') { - console.error(`(!) ${ warning.message }`); + console.error(`(!) ${warning.message}`); } }, input: 'src/lib/compiler.ts', @@ -36,32 +35,23 @@ export default { exports: "named", format: 'iife', sourcemap: true, - plugins: [getBabelOutputPlugin({ - allowAllFormats: true, - ...JSON.parse(readFileSync('./.babelrc', "utf-8")) - })], + plugins: [plugin_terser], }, { file: './build/bundle.min.mjs', format: 'esm', sourcemap: true, - plugins: [getBabelOutputPlugin({ - allowAllFormats: true, - ...JSON.parse(readFileSync('./.babelrc', "utf-8")) - })], + plugins: [plugin_terser], }, { file: './build/bundle.min.cjs', exports: "named", format: 'cjs', sourcemap: true, - plugins: [getBabelOutputPlugin({ - allowAllFormats: true, - ...JSON.parse(readFileSync('./.babelrc', "utf-8")) - })], + plugins: [plugin_terser], } ] : []) ], plugins: [ - typescript() + typescript({ useTsconfigDeclarationDir: true }) ] }; \ No newline at end of file diff --git a/samples/factorial.tsk b/samples/factorial.tsk index 5a20cbc..afdefa9 100644 --- a/samples/factorial.tsk +++ b/samples/factorial.tsk @@ -20,4 +20,4 @@ fn factorial_r(n) { return 1; } -console.log(factorial_r(5)); \ No newline at end of file +console.log(factorial_r(5)); diff --git a/samples/index.tsk b/samples/index.tsk index dac39b3..565b29f 100644 --- a/samples/index.tsk +++ b/samples/index.tsk @@ -1,10 +1,13 @@ +#!/usr/bin/env -S tskc --pretty --out=../build +"use strict"; // Include statment includes code from specified file -include "./example-module.tsk"; +// include "./example-module.tsk"; [1, 2, 3]; // variable declarations a = 2; b = 4; c = 6; +テスト = 2; // __external_var is for exposing external variable // (also can be used for executing statments that are implented in js but not yet in tsk) Function = __external_var("Function"); @@ -69,7 +72,8 @@ lol?.null?.dsa?.[2].p; fn p() { return arguments; } -p::(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); +p::(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)?.p; +(p::(null)); async fn _temp() => { await 0; console.log(1); @@ -117,9 +121,15 @@ restTest2(1, 2, 3); restTest3(1, 2, 3); restTest4(1, 2, 3); restTest5(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); -class A extends leel with echo { - -} +// class A extends leel with echo { +// static a = 0; +// async constructor(public name, public descriptions) { +// console.log(class.a); +// } +// async static class() { +// return class.a; +// } +// } try { null!; } catch (e) { @@ -132,7 +142,7 @@ try { } try { 0; -} catch (cought) { +} catch (caught) { 1; } else { 2; @@ -143,7 +153,6 @@ try { try { } finally { } try { } else { } try { } catch { } - try { } } i = 0; while (i < 10) { @@ -157,7 +166,7 @@ fn test__() { return "Hello from else block!"; } } -__external_var("console").log(test__()); // Prints "Hello from try block!" +console.log(test__()); // Prints "Hello from try block!" try { try { console.log("inner try"); @@ -172,9 +181,24 @@ try { console.log("inner finally"); } } catch (error) { - console.error("outer", error); + console.log("outer", error); +} +console.log("$$$".replace(/\$?/g,"()")); +(fn () {}, fn() {})(); +(fn () { + iterator = (0..6)[@@iterator](); + while (not (next = iterator.next()).done) { + console.log(next.value); + } +})(); +(1 + 1 ** 1 + 1); + +for range (0 to 5 as i) { + console.log("i:", i); } -console.log("$$$".replace(__external_var("/\$?/g"), "()")); -(fn () {}, fn() {})() +if (1) {} else 0xff; +((fn () => fn () {})()()?.p); +// 0 or 1; +// / /; //;~; ; \ No newline at end of file diff --git a/samples/module.tsk b/samples/module.tsk index 68337c9..3b7aff2 100644 --- a/samples/module.tsk +++ b/samples/module.tsk @@ -1,4000 +1,44004 @@ -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} - -fn kek(a, b, c) { - return a + b + c; -} +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); + +console = __external_var("console"); + +fn is_palindromic(n) => + n.toString().split('').reverse() + .join('') == n.toString(); + +fn find_largest_palindromic(big) { + res = 0; + for range (100 to big as i) { + for range (100 to big as j) { + v = i * j; + t = is_palindromic(v); + if (t && v > res) { + res = v; + } + } + } + return res; +} + +console.log(find_largest_palindromic(1000)); -fn kek(a, b, c) { - return a + b + c; -} diff --git a/samples/narcissistic.tsk b/samples/narcissistic.tsk index 323138b..e4181a5 100644 --- a/samples/narcissistic.tsk +++ b/samples/narcissistic.tsk @@ -2,10 +2,10 @@ console = __external_var("console"); fn is_narcissistic(n) { - fn pow(a) => __external_var("Math.pow")(__external_var("Number")(a), n.toString().length); - return n.toString().split("").map(pow).reduce(fn(s, v) => s += v) == n; + fn pow(a) => a ** n.toString().length; + return n.toString().split("").map(pow).reduce(fn(s, v) => s + v) == n; } // testing... console.log("is_narcissistic(153) = ", is_narcissistic(153)); -console.log("is_narcissistic(1625) = ", is_narcissistic(1625)); \ No newline at end of file +console.log("is_narcissistic(1625) = ", is_narcissistic(1625)); diff --git a/samples/palindromic.tsk b/samples/palindromic.tsk index c479b8a..3fb54ee 100644 --- a/samples/palindromic.tsk +++ b/samples/palindromic.tsk @@ -8,20 +8,16 @@ fn is_palindromic(n) => fn find_largest_palindromic(big) { res = 0; - i = 100; - while (i < big) { - j = 100; - while (j < big) { + for range (100 to big as i) { + for range (100 to big as j) { v = i * j; t = is_palindromic(v); if (t && v > res) { res = v; } - j += 1; } - i += 1; } return res; } -console.log(find_largest_palindromic(1000)); \ No newline at end of file +console.log(find_largest_palindromic(1000)); diff --git a/samples/some.tsk b/samples/some.tsk index d96f930..7d4b886 100644 --- a/samples/some.tsk +++ b/samples/some.tsk @@ -4,7 +4,7 @@ console = __external_var("console"); fn to_word(val) { v = val % 10; if (v == 1) { return "рубль"; } - else if (v == 2) { return "рубля"; } + else if (v == 2 or v == 3 or v == 4) { return "рубля"; } else { return "рублей"; } } diff --git a/server.crt b/server.crt new file mode 100644 index 0000000..a3d87ba --- /dev/null +++ b/server.crt @@ -0,0 +1,35 @@ +-----BEGIN CERTIFICATE----- +MIIGCjCCA/KgAwIBAgIUcZV+U+4KN3FzTYIUSvttm6kj1jswDQYJKoZIhvcNAQEL +BQAwga8xCzAJBgNVBAYTAlVTMRQwEgYDVQQIDAtSYW5kb21TdGF0ZTETMBEGA1UE +BwwKUmFuZG9tQ2l0eTEbMBkGA1UECgwSUmFuZG9tT3JnYW5pemF0aW9uMR8wHQYD +VQQLDBZSYW5kb21Pcmdhbml6YXRpb25Vbml0MSQwIgYJKoZIhvcNAQkBFhVuZXJk +Y2FycmllckBnbWFpbC5jb20xETAPBgNVBAMMCE1hZFByb2JlMCAXDTIxMDIwNjEx +NDI0M1oYDzMwMjAwNjA5MTE0MjQzWjCBrDELMAkGA1UEBhMCVVMxFDASBgNVBAgM +C1JhbmRvbVN0YXRlMRMwEQYDVQQHDApSYW5kb21DaXR5MRswGQYDVQQKDBJSYW5k +b21Pcmdhbml6YXRpb24xFDASBgNVBAMMCyoubG9jYWxob3N0MR0wGwYDVQQLDBRQ +b3NpdGl2ZVNTTCBXaWxkY2FyZDEgMB4GCSqGSIb3DQEJARYRaGVsbG9AZXhhbXBs +ZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNQAm3J2pWPAtW +56QKt7CbKKGgZCJWuLREoCM9lsIqqPJ21PexzxHTyTGnlMWylqFDCf8ySQXPd9B/ +5wmgcMPoeLZA4QFgtWgVpQmWttAlVTt1nMcVmmzTFb8JVPD4Fgz1eeCmcGzW27vR +EGQudSvBD0z3bba1D6joyW7lZL8Vomyvguo5HzWlv0wY5JwasG5aTHVIc+4XnSDm +lYHonkfFdSvF6hj7oShSRkHruu/SwefYwQs3xM5JRwRTC6LSeanCXDCFlJvOxPja +fpzSR5O5f5C2s6HSB7KnFfPdmIEBt5AiT/wUPhCcIpR5nZUX8km9iARELfbRaVTs +xWhDnztPAgMBAAGjggEbMIIBFzCB2QYDVR0jBIHRMIHOoYG1pIGyMIGvMQswCQYD +VQQGEwJVUzEUMBIGA1UECAwLUmFuZG9tU3RhdGUxEzARBgNVBAcMClJhbmRvbUNp +dHkxGzAZBgNVBAoMElJhbmRvbU9yZ2FuaXphdGlvbjEfMB0GA1UECwwWUmFuZG9t +T3JnYW5pemF0aW9uVW5pdDEkMCIGCSqGSIb3DQEJARYVbmVyZGNhcnJpZXJAZ21h +aWwuY29tMREwDwYDVQQDDAhNYWRQcm9iZYIUdMqEhHg69bN6yfRfcSg4QsXTh8Yw +CQYDVR0TBAIwADALBgNVHQ8EBAMCBPAwIQYDVR0RBBowGIILKi5sb2NhbGhvc3SC +CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAgEAPFMYkp+fH2PpNLTJlfWdzYqu +u7yiSYPVI3Kwjahgwbc3E3AF67nh9eRMqobvPbU0NczlCnoK6jLDRslg/WENKwDK +u3JSLTtg0TuGSTeVTBantN/Pt1OQJPoMPR++TnLCvtr91XAuum2sTfjD4OcfU1fR +h/DLJcahQ7jUNZZja6JA8+4yE8h3ZdJgUkQ02MMvCyTM7dDhWNMcyVAh2Fe+rIV2 +Nkswy7KRm4oSve1xvnjCnUCVerWl3SDBqjxGyNqtmTMR75wxrQZprbygj/akwXmP +zDR9nu0e55kGaNra8hCqjclKRBIuWRnyYqjrwi1Ru5rSe1jyYXF3CQ3EJVjeQHK4 +4H2Jtol9EZmy3687V0EtxfIjHgeAizQPXKf5LgnrpghRK8/KA7ecotiT7Rhnmf0i +MwkJy1Qk9mHKAenXA8YhBgObfKXrwefND197sTXxVqxf6wPnR/y3WbRuF7fj6Tsb +P1mSaYRuat/DUFVquud+v6DvKxscpeYazW5r+rUaGcMxNp7zeJ0C/s1gU+/8RSP0 +Rj6uiD/YI4SJZh9DLiVCBuknCF/hn24X/qCZICjPI5ByDlZ/r6irTSuT8NEe16lC +n8VU/NtmV9QSHBnLyahZzZ0mIzoPe/+wnwl73yfr2PunErlpTjZ5Av2kpeF0kgWQ +J+pYEWT1GHq7wzvA+jo= +-----END CERTIFICATE----- diff --git a/server.key b/server.key new file mode 100644 index 0000000..b59617a --- /dev/null +++ b/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDNQAm3J2pWPAtW +56QKt7CbKKGgZCJWuLREoCM9lsIqqPJ21PexzxHTyTGnlMWylqFDCf8ySQXPd9B/ +5wmgcMPoeLZA4QFgtWgVpQmWttAlVTt1nMcVmmzTFb8JVPD4Fgz1eeCmcGzW27vR +EGQudSvBD0z3bba1D6joyW7lZL8Vomyvguo5HzWlv0wY5JwasG5aTHVIc+4XnSDm +lYHonkfFdSvF6hj7oShSRkHruu/SwefYwQs3xM5JRwRTC6LSeanCXDCFlJvOxPja +fpzSR5O5f5C2s6HSB7KnFfPdmIEBt5AiT/wUPhCcIpR5nZUX8km9iARELfbRaVTs +xWhDnztPAgMBAAECggEAS24OY/4bSUfVzwFgOwQY5ly/UWebaw2ESngjm13NS8o9 +GUjZIsJ7xb55/iFhqmlLKI0C+WL2vLFGscqhshHfHY9HQ36td/ITJ2k4pefXhPDW +4jlUvO68sbKbO3249SN9bbV1xxUoGqo0UvfYKW6sPs41tfTfIZl4tNxaYfltdDBN +jg7si3jzYPsEzUc/J4XIHQK+KgjTgM0LNWb9DAUfKrM0nhZ6odZ6QgjlyHOzEWDv +XwwKiBXXYJQASauEPiuV7ZncFIqW1qUqKoN3FgzPtaC2cYZiVqHimFPpNCUdHf7v +l1hgtkihpf9Pqkr/cJjRkQQytz2n90oAAHZu+ZdPaQKBgQDm4a+6vIPCAzODEICp +oQQPvmboGFcGrkAEqTvsGm5vA1ePAqFDdeclVyKgvmHNFZqGCOds+rny5asFIELI +2TuJgcKLWLyGNo+HjY++Go4NisPwGzreJIxWk+qpP7ezaIBGS6s9f6lIBCgVN8BN +GP7syj9sETltKgiJ+S1/bmJ7JQKBgQDjlHyl8Wd/pX8mUg9Fk0+qx1w7ur9SAN0t +5nzLWrYfBJtcZqbML8zothStLykebuyYeieN+YXcm2LuWtjx2YcKP4+PyQqD2M/a +Nl8gmfxcq+rELhyPHfH3bSjffzBToRol5hPDlGLe0qlpcKrkUjymAV6ZdZA4A0xZ +nrdNkF5sYwKBgCP2Q0jy1BMELKHdkCzbx6YsIhtEr0l7Gr2fHpZIB6uC+cBsyHGZ +i8dlKx+eh91J4CfAe0ueQhhzbY/+1mgybfOdIpBR4guFtBWJFzqlKDszwhFELIct +ai6SG5sBMbvgKxrH7oRFvjhZbWTgqjNYEV0Qo5BRnoBCa9IR3eRbbTuBAoGBANAQ +eGmKrFJCb14MlhPJG4QKYmPlV3dUfOKzIBMXKvxuzM+MtiBl71Qu6/Zt8Iz3Yu4A +eFtP7reDhM5gVom+k7yl4c3WQvvJ5DYfkZcP0W60ap3Tfp7GBOtubHjxIrDC0FIn +6Jfd+Qq41NQmgsbd/L7U77Uji6f6M/qXpgSO4hT7AoGAKMbnT5lr+eCvdQuBV9kk +PbS+kfmnJISpqKsMhOGOhqDa20R1K0eFsCcJBH57Id1ScEVpevLmwj3J47WAQINN +o5RL6EESFWg7X0V4HLD9zEYDyK2/cGrvWSH1xLgMgjOvGWRGVlYT3rsmK1kGWP1C +kyqApaZX3c+ZobgpMulEt+Y= +-----END PRIVATE KEY----- diff --git a/server.mjs b/server.mjs new file mode 100644 index 0000000..50a0372 --- /dev/null +++ b/server.mjs @@ -0,0 +1,204 @@ +#!/usr/bin/env -S node --experimental-import-meta-resolve --use-largepages=silent --experimental-json-modules --no-warnings --unhandled-rejections=warn +import { constants as FSConstants } from "fs"; +import { extname, join } from "path"; +import { createServer } from "http"; +import { createSecureServer } from "http2"; +import { brotliCompress, constants, gzip } from "zlib"; +import { open, readFile } from "fs/promises"; +import { promisify } from "util"; +import { pathToFileURL } from "url"; +import { argv, cwd } from "process"; + +const compressBrotli = promisify(brotliCompress); +const compressGzip = promisify(gzip); +const __dirname = cwd(); +const content_type_for_ext = { + ".html": "text/html", + ".js": "application/javascript", + ".mjs": "application/javascript", + ".cjs": "application/javascript", + ".css": "text/css", + ".map": "application/json", + ".json": "application/json", + ".webmanifest": "application/json", +}; +const uncompressable_files = { + ".ico": "image/png", + ".flac": "audio/flac", + ".m3u": "audio/mpegurl", + ".m3u8": "audio/mpegurl", + ".m4a": "audio/mp4", + ".m4b": "audio/mp4", + ".mp3": "audio/mpeg", + ".ogg": "audio/ogg", + ".opus": "audio/ogg", + ".pls": "audio/x-scpls", + ".wav": "audio/wav", + ".jpg": "image/jpeg", + ".png": "image/png", + ".webp": "image/webp", + ".avif": "image/avif" +}; +const contentTypeFromExt = ext => (content_type_for_ext[ext] && (content_type_for_ext[ext] + ";charset=utf-8")) ?? uncompressable_files[ext] ?? "text/plain;charset=utf-8"; +const port = argv.find(arg => /^--port=\d{2,}$/m.test(arg))?.match(/\d+$/gm)?.[0]; +const $cache = {}; +const $cache3 = {}; +const { settings } = await import(pathToFileURL(`${__dirname}/.serverconfig.json`), { assert: { type: "json" } }).then(x => x.default).catch(() => ({})); +/**@type {import("http").RequestListener} */ +const http1RequestProcessor = async (req, res) => { + const path = join(__dirname, req.url === "/" ? "/index.html" : req.url); + const ext = extname(path); + if (!~req.headers["accept-encoding"].indexOf("gzip")) { + res.setHeader("Content-Type", contentTypeFromExt(ext)); + res.writeHead(200, "OK"); + res.end(await readFile(path)); + return; + } + var handle; + try { + handle = await open(path); + const { mtime, compressed } = $cache[path] || {}; + const stats = await handle.stat({ bigint: true }); + const ext = extname(path); + const read = stats === mtime ? compressed : ($cache[path] = { + compressed: ext in uncompressable_files ? await handle.readFile() : await compressGzip(await handle.readFile(), { level: constants.Z_BEST_COMPRESSION }), + mtime: stats.mtimeNs + }).compressed; + res.setHeader("Content-Type", contentTypeFromExt(ext)); + if (!uncompressable_files[ext]) { + res.setHeader("Content-Encoding", "gzip"); + } + res.writeHead(200, "OK"); + res.end(read); + } catch (error) { + if (error.code !== "ENOENT") { + console.error(error); + } + res.writeHead(404, "Not found"); + res.end(); + } finally { + await handle?.close(); + } +}; +createServer(http1RequestProcessor).listen(settings?.http1?.port || port || 80); + +createSecureServer({ + cert: await readFile(new URL(await import.meta.resolve("./server.crt"))), + key: await readFile(new URL(await import.meta.resolve("./server.key"))) +}, (req, res) => { + const { httpVersion } = req; + if (httpVersion !== '2.0') { + return http1RequestProcessor(req, res); + } +}).on("stream", async (stream, headers) => { + const url = headers[":path"] === "/" ? "/index.html" : headers[":path"]; + const path = join(__dirname, url); + let handle; + + try { + stream.on('error', console.error); + handle = await open(path); + const { read, headers } = await readSaved(handle, path); + + if (stream.destroyed) return; + stream.respond(headers); + for (const _url of settings?.http2?.["push-paths"]?.[url] ?? []) { + if (_url === url) { + console.warn(`Weird configuration setting found: Ignoring attempt of self-push (url: "${url}")`); + continue; + } + try { + /** + * @type {import("http2").ServerHttp2Stream} + */ + const _stream = await new Promise((resolve, reject) => stream.pushStream({ + ":path": _url + }, (error, stream, headers) => error ? reject(error) : resolve(stream))); + _stream.on('error', console.error); + let read, headers, handle; + try { + const path = join(__dirname, _url); + handle = await open(path, FSConstants.O_RDONLY); + ({ read, headers } = await readSaved(handle, path)); + } catch (error) { + handleError(error, _stream); + } finally { + await handle?.close(); + } + _stream.destroyed || _stream.respond(headers); + _stream.destroyed || _stream.end(read); + } catch (error) { + console.error(error); + continue; + } + } + stream.destroyed || stream.end(read); + } catch (error) { + handleError(error, stream); + return; + } finally { + await handle?.close(); + } +}).listen(settings?.http2?.port ?? 443); +const CSPPolicy = `upgrade-insecure-requests; default-src 'self' https:; script-src 'self' https: 'unsafe-inline' 'unsafe-eval'; style-src 'self' https: 'unsafe-inline'`; +/** + * @param {import("fs/promises").FileHandle} handle + * @param {string} path + * @returns {Promise<{ read: Buffer, headers: import("http2").OutgoingHttpHeaders }>} + */ +async function readSaved(handle, path) { + const stats = await handle.stat({ bigint: true }); + const ext = extname(path); + let read, headers; + if (ext in uncompressable_files) { + const { mtime, buffer } = $cache3[path] ?? {}; + if (mtime !== stats.mtimeNs) { + $cache3[path] = { + mtime: stats.mtimeNs, + buffer: read = await handle.readFile() + }; + } else { + read = buffer; + } + headers = { + ':status': 200, + "access-control-allow-origin": "*", + 'content-type': uncompressable_files[ext], + 'content-length': `${stats.size}`, + 'content-security-policy': CSPPolicy + }; + } else { + const { mtime, buffer } = $cache3[path] ?? {}; + if (mtime !== stats.mtimeNs) { + $cache3[path] = { + mtime: stats.mtimeNs, + buffer: read = await compressBrotli(await handle.readFile()) + }; + } else { + read = buffer; + } + headers = { + ':status': 200, + "access-control-allow-origin": "*", + 'content-type': `${content_type_for_ext[ext] ?? 'text/plain'}; charset=utf-8`, + 'content-length': `${stats.size}`, + 'content-encoding': 'br', + 'content-security-policy': CSPPolicy + }; + } + return { read, headers }; +} + +function handleError(error, stream) { + if (error.code !== "ENOENT") { + console.error(error); + } + if (!stream.destroyed) { + stream.respond({ + ":status": 404, + "content-type": "text/plain; charset=utf-8" + }); + stream.end("FILE NOT FOUND"); + } +} + diff --git a/src/bin/tsconfig.json b/src/bin/tsconfig.json new file mode 100644 index 0000000..dde5a9e --- /dev/null +++ b/src/bin/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "pretty": true, + "strict": true, + "outDir": "../../build", + "skipLibCheck": true + }, + "include": ["../../build/*", "tskc.mts"], + "exclude": [] +} \ No newline at end of file diff --git a/src/bin/tskc.mts b/src/bin/tskc.mts new file mode 100644 index 0000000..20a8d3d --- /dev/null +++ b/src/bin/tskc.mts @@ -0,0 +1,33 @@ +#!/usr/bin/env -S node --use-largepages=silent --enable-source-maps +import { writeFileSync } from "fs"; +import { createRequire } from "module"; +import { dirname, extname, join, resolve } from "path"; +import { argv } from "process"; +import { pathToFileURL } from "url"; +// @ts-expect-error +import compile from "./bundle.min.mjs"; + + +process.on("unhandledRejection", console.error.bind(console, "Error: ")); +function log_errors(errors: any[]) { + if (errors && errors.length) { + for (var index = 0; index < errors.length; index++) { + console.error("TSK Error:", errors[index]); + } + } +} +if (typeof global.require !== "function") { + global.require = createRequire(new URL(import.meta.url)); +} +const outDir = /^--out=(.+)$/gm.exec(argv.find(arg => /^--out=.+$/gm.test(arg))!)![1]; +const mains = argv.filter(arg => /^--main=.+$/gm.test(arg) || /^[^|*?\\<>$:"\r\n-]{2,}[^|*?\\<>$:"\r\n]*$/gm.test(arg) && arg !== ".").map(arg => resolve(/^--main=(.+)$/gm.exec(arg)?.[1] ?? arg)); +const pretty = argv.includes("--pretty"); +for (const main of mains) { + const compiled = await compile(pathToFileURL(main), { pretty }); + log_errors(compiled.diagnostics); + const ext = extname(main); + const newName = join(outDir, main.slice(dirname(main).length + 1, ext ? -ext.length : Infinity) + ".js"); + // console.log(newName); // debug shit + writeFileSync(newName, compiled.output); +} + diff --git a/src/bin/tskc.ts b/src/bin/tskc.ts deleted file mode 100644 index b91f939..0000000 --- a/src/bin/tskc.ts +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env node -import { writeFileSync } from "fs"; -import { createRequire } from "module"; -import { dirname, extname, join, resolve } from "path"; -import { pathToFileURL } from "url"; -// This file is not here! -// @ts-ignore -import compile from "./bundle.min.mjs"; - - -(async () => { - process.on("unhandledRejection", console.error.bind(console, "Error: ")); - function log_errors(errors: any[]) { - if (errors && errors.length) { - for (var index = 0; index < errors.length; index++) { - console.error("TSK Error:", errors[index]); - } - } - } - if (typeof global.require !== "function") { - global.require = createRequire(import.meta.url); - } - const args = process.argv; - const outDir = /^--out=(.+)$/gm.exec(args.find(arg => /^--out=.+$/gm.test(arg))!)![1]; - const mains = args.filter(arg => /^--main=.+$/gm.test(arg)).map(arg => resolve(/^--main=(.+)$/gm.exec(arg)![1])); - const pretty = args.includes("--pretty"); - for (const main of mains) { - const compiled = await compile(pathToFileURL(main), { pretty }); - log_errors(compiled.diagnostics); - const ext = extname(main); - const newName = join(outDir, main.slice(dirname(main).length + 1, ext ? -ext.length : Infinity) + ".js"); - console.log(newName); - writeFileSync(newName, compiled.output); - } -})().catch(console.error.bind(console, "Error: ")); - diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index 63240b9..4e0f93a 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -1,19 +1,19 @@ -import { Diagnostic, IDiagnostic } from "./utils/diagnostics.js"; -import { DiagnosticSeverity } from "./enums.js"; +import { IDiagnostic } from "./utils/diagnostics.js"; +import { DiagnosticSeverity } from "./enums"; import { include } from "./utils/util.js"; -import { parse } from "./parser.js"; +import { parse, ParserOutput, pushDiagnostic } from "./parser.js"; import { emit } from "./emitter.js"; import { wrap } from "./wrapper.js"; import { lex } from "./lexer.js"; export interface CompilerOutput { - diagnostics: IDiagnostic[]; - output: string; + readonly diagnostics: readonly IDiagnostic[]; + readonly output: string; } export interface CompilerOptions { - url?: string; - pretty?: boolean; - cache?: boolean; + readonly url?: string; + readonly pretty?: boolean; + readonly cache?: boolean; } /** * Complies tsk language code and transplies it into js code @@ -21,18 +21,18 @@ export interface CompilerOptions { * @param {import("./compiler").CompilerOptions & { url: string }} opts Options passed to parser * @returns {import("./compiler").CompilerOutput | Promise} js code & diagnostic messages */ -export function compileCode(code: string, opts: CompilerOptions & { url: string; }): CompilerOutput | Promise { - var parsed = parse(lex(code), opts.url, opts.cache ?? true); +export function compileCode(code: string, opts: CompilerOptions): CompilerOutput | Promise { + var parsed = parse(lex(code), opts.url!, opts.cache ?? true); /**@param {import("../parser").ParserOutput} parsed */ - function _(parsed: import("./parser").ParserOutput) { + function _(parsed: ParserOutput) { var obj = { diagnostics: parsed.diagnostics, output: `/*#EMPTY${ Math.random() }*/` - } as CompilerOutput; + }; try { obj.output = wrap(emit(parsed.output, opts), parsed.__used); } catch (error) { - obj.diagnostics.push(Diagnostic(DiagnosticSeverity.FatalError, error)); + pushDiagnostic(DiagnosticSeverity.FatalError, error as never); } return obj; } @@ -47,7 +47,7 @@ export function compileCode(code: string, opts: CompilerOptions & { url: string; export default function compile(url: string | URL | import("url").URL, opts?: CompilerOptions): CompilerOutput | Promise { var included = include(typeof url === "string" ? new URL(url) : url); opts ||= {}; - opts.url ||= url.toString(); + (opts as Record).url ||= url.toString(); if (typeof included === "string") { return compileCode(included, opts as CompilerOptions & { url: string; }); } else return included.then(included => compileCode(included, opts as CompilerOptions & { url: string; })); @@ -61,32 +61,32 @@ export type { SyntaxTree } from "./parser"; export type { - AccessChainItem, - ClassNode, + AccessChainItem as AccessChainItem, + IClassNode, ClassConstructor, ClassNodeProps, ClassProperty, ClassGetter, ClassSetter, ClassMethod, - Node, - NodeBase, + INode, + INodeBase, NodeName, - TryStatmentNode, - UsingStatmentNode, + ITryStatmentNode, + IUsingStatmentNode, MixinNode, - ParameterNode + IParameterNode as ParameterNode } from "./nodes"; export type { AccessChainItemKind, Scopes, DiagnosticSeverity, - ParameterNodeType, + ParameterNodeKind, NodeType, Nodes, Tokens, - FNNodeType, - ParseNodeType + FunctionNodeKind, + ParseNodeKind } from "./enums"; export type { ArrayValueType diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index af5a0d8..2316204 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -1,21 +1,13 @@ -import { AccessChainItemKind, Nodes, NodeType, ParameterNodeType } from "./enums"; +import { AccessChainItemKind, Nodes, NodeType, ParameterNodeKind } from "./enums"; import { occurrences } from "./utils/occurrences.js"; -import { assert, call, includes, randomVarName, undefined } from "./utils/util.js"; -import type { AccessChainItem, ClassNode, Node, ParameterNode, TryStatmentNode } from "./nodes"; +import { assert_type, includes, random_var_name, undefined } from "./utils/util.js"; +import { _echo } from "./utils/_echo.js"; +import { AccessChainItem } from "./nodes"; +import type { IClassNode, INode, IParameterNode, ITryStatmentNode } from "./nodes"; var __pretty = true; -var hasOwnProperty = {}.hasOwnProperty; -function assign(value: T, vals: Partial) { - var result = new Object(value) as T; - for (const key in value) { - if (call(hasOwnProperty, value, key)) { - result[key] = vals[key]!; - } - } - return result; -} -function as_expression(exp: Node) { +function as_expression(exp: INode) { if (exp.type === NodeType.Expression) { return exp; } else { @@ -28,23 +20,23 @@ function as_expression(exp: Node) { body: [exp] }], args: [] - } as Node; + } as INode; } } -function isFunctionNode(node: Node) { +function isBlockNode(node: INode) { return includes([ Nodes.FunctionExpression, Nodes.AsyncFunctionExpression, Nodes.GeneratorFunctionExpression, Nodes.AsyncGeneratorFunctionExpression, - Nodes.IncludeStatment, // Don't represent function node, but don't require any ; + Nodes.IncludeStatment, Nodes.KeepStatment, Nodes.CodeBlock, Nodes.TryStatment, Nodes.IfStatment ] as const, node.name); } -function isSimple(node: Node) { +function isSimple(node: INode) { return includes([ Nodes.Array, Nodes.ArgumentBindingExpression, @@ -70,11 +62,11 @@ function isSimple(node: Node) { } /** * @param {import("./parser").Node} node - * @param {any} [meta] + * @param {any} meta */ -export function _emit(node: Node, meta: any) { - var __text = "", elementParams: ParameterNode[], elementArgs: Node[], - length: number, index: number, body: string | Node[] | string[] | AccessChainItem[], __diff: boolean, +function _emit(node: INode, meta: Record) { + var __text = "", elementParams: IParameterNode[], elementArgs: INode[], + length: number, index: number, body: string | readonly INode[] | readonly object[] | readonly AccessChainItem[], __diff: boolean, quote: string, rquote: string, name: string, node_name: Nodes, _: any; /** * Inserts space into __text variable if text must be prettified @@ -109,7 +101,7 @@ export function _emit(node: Node, meta: any) { function declare(name: T): T { (__top.params ||= []).push({ name, - type: ParameterNodeType.NoPrefix + kind: ParameterNodeKind.NoPrefix }); return name; } @@ -125,15 +117,15 @@ export function _emit(node: Node, meta: any) { ([__text, saved] = [saved, __text]); return saved; } - function emit_body(_body?: Node[]) { - _body ||= body as Node[]; + function emit_body(_body: readonly INode[] = body as readonly INode[]) { index = 0, length = _body.length; for (var assigned = 0; index < length; index++) { - if (_body[index].name !== Nodes.Empty) { + const element = _body[index]; + if (element.name !== Nodes.Empty) { assigned++; is(); - __text += _emit(_body[index], meta); - if ((index + 1 < length || __pretty) && !isFunctionNode(_body[index])) { + __text += _emit(element, meta); + if ((index + 1 < length || __pretty) && !isBlockNode(element) && element.type !== NodeType.Ephemerial) { __text += ";"; } nl(); @@ -157,7 +149,7 @@ export function _emit(node: Node, meta: any) { } else if (nodeKind === AccessChainItemKind.Computed) { __text += `[${ _emit(body, meta) }]`; } else if (nodeKind === AccessChainItemKind.Optional || nodeKind === AccessChainItemKind.OptionalComputed) { - var randomName = randomVarName(), ___text = `(n(${ randomName }`; + var randomName = random_var_name(), ___text = `(n(${ randomName }`; declare(randomName); sp(); ___text += "="; @@ -170,27 +162,21 @@ export function _emit(node: Node, meta: any) { sp(); ___text += ":"; sp(); - nodes.splice(0, index, { - kind: AccessChainItemKind.Head, - body: { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbolName: randomName - } - }); + nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: randomName + })); nodes[1].kind = nodeKind === AccessChainItemKind.Optional ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; return `${ ___text }${ emitChain(nodes) })`; } else { - nodes.splice(0, index, { - kind: AccessChainItemKind.Head, - body: { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbolName: `__na(${ __text })` - } - }); + nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: `__na(${ __text })` + })); nodes[1].kind = nodeKind === AccessChainItemKind.NormalNullAsserted ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; @@ -226,8 +212,7 @@ export function _emit(node: Node, meta: any) { } __text += ")"; } - function simple_body_emit(_body?: Node[]) { - _body ||= body as Node[]; + function simple_body_emit(_body: readonly INode[] = body as readonly INode[]) { __text += "{"; _body.length && nl(); ri(); @@ -236,7 +221,6 @@ export function _emit(node: Node, meta: any) { length && is(); __text += "}"; } - meta ??= {}; meta.sp ??= ""; body = node.body!; switch (node_name = node.name) { @@ -245,16 +229,18 @@ export function _emit(node: Node, meta: any) { case Nodes.Empty: break; case Nodes.IncludeStatment: - assert(body); + assert_type(body); for (let index = 0, length = body.length; index < length; index++) { const element = body[index]; __text += _emit(element, meta); - if (__pretty && !isFunctionNode(body[index])) { - __text += ";"; - } - if (index < length - 1) { - nl(); - is(); + if (element.name !== Nodes.Shebang || !meta.forgetShebang) { + if (__pretty && !isBlockNode(element) && element.type !== NodeType.Ephemerial) { + __text += ";"; + } + if (index < length - 1) { + nl(); + is(); + } } } break; @@ -263,33 +249,35 @@ export function _emit(node: Node, meta: any) { case Nodes.GeneratorFunctionExpression: case Nodes.AsyncFunctionExpression: case Nodes.FunctionExpression: - assert(body); + assert_type(body); __text += "function"; if (node_name === Nodes.GeneratorFunctionExpression) { __text += "*"; } - if (node.symbolName) { - __text += ` $${ node.symbolName }`; + if (node.symbol) { + __text += ` $${ node.symbol }`; } else sp(); __text += "("; var pre_emitted = pre_emit_body(); - elementParams = node.params ||= []; + elementParams = node.params ??= []; length = elementParams.length; index = 0; - var hasBody = body.length > 0 || elementParams.some(element => !!element.default || element.type === ParameterNodeType.Rest); + var hasBody = body.length > 0; for (; index < length; index++) { - let node = elementParams[index]; - var namae = node.name; - if (node.type === ParameterNodeType.Rest) { + const element = elementParams[index]; + var namae = element.name; + if (!!element.default) hasBody = true; + if (element.kind === ParameterNodeKind.Rest) { + hasBody = true; break; } if (typeof namae === "string") { - __text += node.name = name = `${ node.type === ParameterNodeType.NoPrefix ? "" : "$" }${ namae || randomVarName() }`; + __text += element.name = name = `${ element.kind === ParameterNodeKind.NoPrefix ? "" : "$" }${ namae || random_var_name() }`; } else { throw "Destructing parameters are not supported yet"; //__text += _emit(name as unknown as Node, meta); } - if (index + 1 < length && elementParams[index + 1].type !== ParameterNodeType.Rest) { + if (index + 1 < length && elementParams[index + 1].kind !== ParameterNodeKind.Rest) { __text += ","; sp(); } @@ -299,7 +287,7 @@ export function _emit(node: Node, meta: any) { __text += "{"; ri(); hasBody && nl(); - if (node.locals && node.locals.length) { + if (node.locals?.length) { is(); __text += `var ${ node.locals.map(local => `$${ local }`).join(`,${ __pretty ? " " : "" }`) };`; nl(); @@ -324,9 +312,9 @@ export function _emit(node: Node, meta: any) { if (hadRestParam) { if (typeof namae === "string") { is(); - __text += node.name = name = `${ node.type === ParameterNodeType.NoPrefix ? "" : "$" }${ namae || randomVarName() }`; + __text += node.name = name = `${ node.kind === ParameterNodeKind.NoPrefix ? "" : "$" }${ namae || random_var_name() }`; if (node.default) { - var _tempVar = randomVarName(); + var _tempVar = random_var_name(); declare(_tempVar); sp(); __text += "="; @@ -355,10 +343,10 @@ export function _emit(node: Node, meta: any) { //__text += _emit(name as unknown as Node, meta); } } - if (node.type === ParameterNodeType.Rest) { + if (node.kind === ParameterNodeKind.Rest) { hadRestParam = true; is(); - __text += `var ${ `$${ namae || randomVarName() }` }`; + __text += `var ${ `$${ namae || random_var_name() }` }`; sp(); __text += "="; sp(); @@ -381,7 +369,7 @@ export function _emit(node: Node, meta: any) { } if (node.default && !hadRestParam) { is(); - __text += name || (name = typeof node.name === "string" ? node.name : _emit(node.name, meta)); + __text += name ||= typeof node.name === "string" ? node.name : _emit(node.name, meta); sp(); __text += "==="; sp(); @@ -442,32 +430,30 @@ export function _emit(node: Node, meta: any) { break; case Nodes.Symbol: - __text += `$${ node.symbolName }`; + __text += `$${ node.symbol }`; break; + case Nodes.ExternalVariable: case Nodes.SymbolNoPrefix: - __text += node.symbolName; - break; - case Nodes.NumberValue: - assert(body); - __text += body; + __text += node.symbol!; break; case Nodes.ThrowExpression: - assert<[Node]>(body); + assert_type<[INode]>(body); __text += `__throw(${ _emit(body[0], meta) })`; break; - case Nodes.StringValue: - assert(body); + case Nodes.StringValue: { + const body = node.symbol!; __diff = occurrences(body, "'") >= occurrences(body, '"'), quote = __diff ? '"' : "'", rquote = __diff ? "'" : '"'; __text += `${ quote }${ body.replace("\\" + rquote, rquote).replace("\n", "\\n") }${ quote }`; break; + } case Nodes.PipelineExpression: - assert<[Node, Node]>(body); - name = randomVarName(); + assert_type<[INode, INode]>(body); + name = random_var_name(); __text += _emit({ name: Nodes.CallExpression, type: NodeType.Expression, @@ -476,7 +462,7 @@ export function _emit(node: Node, meta: any) { type: NodeType.Expression, params: [{ name, - type: ParameterNodeType.Normal + kind: ParameterNodeKind.Normal }], body: [{ name: Nodes.ReturnStatment, @@ -485,17 +471,17 @@ export function _emit(node: Node, meta: any) { }] }], args: [body[1]] - } as Node, __pretty); + } as INode, meta); break; case Nodes.CallExpression: - assert(body); + assert_type(body); __text += _emit(body[0], meta); emitCallExpression(); break; case Nodes.GroupExpression: - assert(body); + assert_type(body); __text += "("; length = body.length; index = 0; @@ -511,51 +497,30 @@ export function _emit(node: Node, meta: any) { break; case Nodes.ReturnStatment: - assert<[Node]>(body); + assert_type<[INode]>(body); __text += "return " + _emit(as_expression(body[0]), meta); break; case Nodes.RangeValue: - type NodeWithStringBody = Node & { body: string; }; - assert<[NodeWithStringBody, NodeWithStringBody]>(body); - var s = +body[0].body, e = +body[1].body; - __text += s === e ? "(function*(){})()" : - `(function*(){for(var i=${ s },e=${ e };i${ s > e ? ">" : "<" }e;i${ s > e ? "--" : "++" })yield i})()`; - break; - - case Nodes.ExternalVariable: - assert(body); - __text += body; + assert_type<[INode, INode]>(body); + __text += `(function*(){for(var i=${ _emit(body[0], meta) },e=${ _emit(body[1], meta) };i(body); + assert_type<[INode, INode]>(body); __text += _emit(body[0], meta); sp(); __text += "="; sp(); case Nodes.ExponentiationExpression: - assert<[Node, Node]>(body); + assert_type<[INode, INode]>(body); __text += `Math.pow(${ _emit(body[0], meta) },`; sp(); __text += `${ _emit(body[1], meta) })`; break; case Nodes.AssignmentExpression: - assert<[Node, Node]>(body); - // if (~[Nodes.OptionalMemberAccessExpression, Nodes.OptionalComputedMemberAccessExpression].indexOf(body[0].name)) { - // throw "The left-hand side of an assignment expression may not be an optional property access."; - // } - // if (~[Nodes.Symbol, Nodes.ComputedMemberAccessExpression, Nodes.MemberAccessExpression].indexOf(body[0].name)) { - // } - __text += _emit(body[0], meta); - sp(); - __text += "="; - sp(); - __text += _emit(as_expression(body[1]), meta); - break; - case Nodes.AddictionAssignmentExpression: case Nodes.SubstractionAssignmentExpression: case Nodes.MultiplicationAssignmentExpression: @@ -571,6 +536,14 @@ export function _emit(node: Node, meta: any) { case Nodes.BitwiseLeftShiftAssignmentExpression: case Nodes.BitwiseRightShiftAssignmentExpression: case Nodes.BitwiseUnsignedRightShiftAssignmentExpression: + assert_type<[INode, INode]>(body); + __text += _emit(body[0], meta); + sp(); + __text += node.symbol; + sp(); + __text += _emit(as_expression(body[1]), meta); + break; + case Nodes.AddictionExpression: case Nodes.SubstractionExpression: case Nodes.MultiplicationExpression: @@ -595,20 +568,20 @@ export function _emit(node: Node, meta: any) { case Nodes.GreaterThanOrEqual: case Nodes.LessThan: case Nodes.GreaterThan: - assert<[Node, Node]>(body); - __text += _emit(body[0], meta); + assert_type<[INode, INode]>(body); + __text += _emit(as_expression(body[0]), meta); sp(); - __text += node.symbolName; + __text += node.symbol; sp(); __text += _emit(as_expression(body[1]), meta); break; case Nodes.IfStatment: - assert(body); + assert_type(body); __text += "if"; sp(); __text += "("; - __text += _emit(as_expression(node.args as unknown as Node), meta); + __text += _emit(as_expression(node.args![0]), meta); __text += ")"; sp(); __text += "{"; @@ -639,8 +612,8 @@ export function _emit(node: Node, meta: any) { break; case Nodes.YieldExpression: - assert(_); - assert<[Node]>(body); + assert_type(_); + assert_type<[INode]>(body); __text += "yield"; if (_ = node.outerBody!.name === Nodes.AsyncGeneratorFunctionExpression) { sp(); @@ -656,8 +629,8 @@ export function _emit(node: Node, meta: any) { break; case Nodes.YieldFromExpression: - assert(_); - assert<[Node]>(body); + assert_type(_); + assert_type<[INode]>(body); __text += "yield*"; if (_ = node.outerBody!.name === Nodes.AsyncGeneratorFunctionExpression) { sp(); @@ -671,8 +644,8 @@ export function _emit(node: Node, meta: any) { break; case Nodes.AwaitExpression: - assert(_); - assert<[Node]>(body); + assert_type(_); + assert_type<[INode]>(body); __text += "yield"; if (_ = node.outerBody!.name === Nodes.AsyncGeneratorFunctionExpression) { sp(); @@ -688,7 +661,7 @@ export function _emit(node: Node, meta: any) { break; case Nodes.MemberAccessExpression: - assert(body); + assert_type(body); __text += emitChain(body); break; @@ -712,12 +685,12 @@ export function _emit(node: Node, meta: any) { // break; case Nodes.Array: - assert(body); + assert_type(body); __text += `[${ body.map(node => _emit(as_expression(node), meta)).join(`,${ __pretty ? " " : "" }`) }]`; break; case Nodes.ArgumentBindingExpression: - assert<[Node]>(body); + assert_type<[INode]>(body); __text += `__bind(${ _emit(body[0], meta) },`; sp(); __text += `u,`; @@ -726,19 +699,18 @@ export function _emit(node: Node, meta: any) { break; case Nodes.LiteralLogicalNotExpression: - assert<[Node]>(body); - assert(_); + assert_type<[INode]>(body); + assert_type(_); _ = as_expression(body[0]); __text += `!${ isSimple(_) ? _emit(_, meta) : `(${ _emit(_, meta) })` }`; break; case Nodes.KeepStatment: - assert(body); + assert_type(body); elementArgs = node.args!; bodyLength = body.length; var declared = elementArgs.map((arg, index) => { - var name = randomVarName(); - declare(name); + const name = declare(random_var_name()); index && is(); __text += name; sp(); @@ -750,16 +722,14 @@ export function _emit(node: Node, meta: any) { }); emit_body(); __pretty || (__text += ";"); - length = elementArgs.length; - for (var index = 0; index < length; index++) { + for (var index = 0; index < elementArgs.length; index++) { index && nl(); is(); - var tempVar = declared[index]; __text += _emit(elementArgs[index], meta); sp(); __text += "="; sp(); - __text += tempVar + ";"; + __text += declared[index] + ";"; } break; @@ -768,29 +738,30 @@ export function _emit(node: Node, meta: any) { break; case Nodes.NullAssertionExpression: - assert<[Node]>(body); + assert_type<[INode]>(body); __text += `__na(${ _emit(as_expression(body[0]), meta) })`; break; case Nodes.NewExpression: - assert<[Node]>(body); + assert_type<[INode]>(body); __text += "new " + _emit(as_expression(body[0]), meta); break; case Nodes.TryStatment: - assert(node); - assert(body); + assert_type(node); + assert_type(body); __text += "try"; sp(); - namae = node.else ? declare(randomVarName()) : ""; + namae = node.else ? declare(random_var_name()) : ""; simple_body_emit(namae ? [{ name: Nodes.AssignmentExpression, type: NodeType.Expression, body: [ - { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: namae }, + { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }, { name: Nodes.TrueValue, type: NodeType.Expression } - ] - } as Node].concat(body || []) : undefined); + ], + symbol: "=" + } as INode].concat(body || []) : undefined); if (node.catch) { sp(); __text += "catch"; @@ -801,10 +772,11 @@ export function _emit(node: Node, meta: any) { name: Nodes.AssignmentExpression, type: NodeType.Expression, body: [ - { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: namae }, + { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }, { name: Nodes.FalseValue, type: NodeType.Expression } - ] - } as Node].concat(node.catch[1]) : node.catch[1]); + ], + symbol: "=" + } as INode].concat(node.catch[1]) : node.catch[1]); } if (node.finally || namae) { sp(); @@ -818,22 +790,21 @@ export function _emit(node: Node, meta: any) { name: Nodes.IfStatment, type: NodeType.Statment, body: node.else, - args: { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: namae } + args: [{ name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }] }], finally: node.finally || [] - } as TryStatmentNode | { else?: Node[], catch?: TryStatmentNode["catch"]; } as unknown as Node] : node.finally); + } as ITryStatmentNode | { else?: INode[], catch?: ITryStatmentNode["catch"]; } as INode] : node.finally); } break; case Nodes.SymbolShortcut: - assert(body); - __text += `Symbol.${ body }`; + __text += `Symbol.${ node.symbol! }`; break; case Nodes.WhileStatment: __text += "while"; sp(); - __text += `(${ _emit(node.args![0], meta) })`; + __text += `(${ _emit(as_expression(node.args![0]), meta) })`; sp(); simple_body_emit(); break; @@ -845,7 +816,7 @@ export function _emit(node: Node, meta: any) { sp(); __text += "while"; sp(); - __text += `(${ _emit(node.args![0], meta) })`; + __text += `(${ _emit(as_expression(node.args![0]), meta) })`; break; case Nodes.ImportExpression: @@ -853,6 +824,54 @@ export function _emit(node: Node, meta: any) { emitCallExpression(); break; + case Nodes.RegularExpression: + __text += body; + break; + + case Nodes.ForRangeStatment: + { + const [from, to, as] = node.args as [INode, INode, string]; + __text += "for"; + sp(); + __text += "(var"; + sp(); + __text += as; + sp(); + __text += "="; + sp(); + __text += _emit(from, meta); + if (isSimple(to)) { + __text += ";"; + sp(); + __text += as; + sp(); + __text += "<"; + sp(); + __text += _emit(to, meta); + } else { + __text += ","; + sp(); + const _ = random_var_name(); + __text += _; + sp(); + __text += "="; + sp(); + __text += _emit(to, meta) + ";"; + sp(); + __text += as; + sp(); + __text += "<"; + sp(); + __text += _; + } + __text += ";"; + sp(); + __text += as + "++)"; + sp(); + simple_body_emit(); + } + break; + case undefined: { const sp = meta.sp + " "; __text += `/*\n${ sp }Cannot emit undefined, has something gone wrong?` + @@ -860,29 +879,32 @@ export function _emit(node: Node, meta: any) { break; } + case Nodes.Shebang: + if (!meta.forgetShebang) __text += "#!" + body; + break; + case Nodes.ClassExpression: - assert(node); + assert_type(node); console.log(node); default: __text += `/*cannot emit node Nodes[${ node_name }]*/`; break; } - assert(__text.toString()); return __text; } export interface EmitterOptions { pretty?: boolean; + forgetShebang?: boolean; url?: string; } -var __top: Node; +var __top: INode; /** * @param {import("./parser").Node} node * @param {import("./emitter").EmitterOptions} opts */ -export function emit(node: Node, { pretty = false, url = "" }: EmitterOptions = {}) { +export function emit(node: INode, { pretty = false, forgetShebang = true, ...other }: EmitterOptions = {}) { __pretty = pretty; - // inspectLog(node); - return _emit(__top = node, { url }); + return _emit(__top = node, { forgetShebang, ...other }); } diff --git a/src/lib/enums.ts b/src/lib/enums.ts index 395c842..ccb2287 100644 --- a/src/lib/enums.ts +++ b/src/lib/enums.ts @@ -100,15 +100,21 @@ export const enum Nodes { StrictNegativeComparison, ImportExpression, NamedIncludeStatment, - SymbolShortcut + SymbolShortcut, + ObjectExpression, + Decorator, + ForRangeStatment, + ForOfStatment, + RegularExpression, + Shebang } -export const enum FNNodeType { +export const enum FunctionNodeKind { Sync, Generator, Async, AsyncGenerator } -export const enum ParameterNodeType { +export const enum ParameterNodeKind { Normal, Rest, Empty, @@ -119,7 +125,8 @@ export const enum ParameterNodeType { */ export const enum NodeType { Statment, - Expression + Expression, + Ephemerial } export const enum Scopes { Sync, @@ -137,17 +144,15 @@ export const enum AccessChainItemKind { ComputedNullAsserted } export const enum Tokens { - String, - Number, - Symbol, - Operator, - Special, - Regex, - Whitespace, - Comment, - Keyword, - Range, - MultilineComment + String = 0x0000001, + Number = 0x0000002, + Symbol = 0x0000004, + Operator = 0x00000008, + Whitespace = 0x00000010, + Comment = 0x00000020, + MultilineComment = 0x00000040, + Keyword = 0x00000080, + Range = 0x00000100 } export const enum DiagnosticSeverity { Info, @@ -156,10 +161,16 @@ export const enum DiagnosticSeverity { Error, FatalError } -export const enum ParseNodeType { +export const enum ParseNodeKind { Expression = "expression", String = "string", Number = "number", Range = "range", Indentifier = "indentifier" +} +export const enum ObjectBodyNodeKind { + Normal, + Setter, + Getter, + Rest } \ No newline at end of file diff --git a/src/lib/keywords.ts b/src/lib/keywords.ts deleted file mode 100644 index a2f9213..0000000 --- a/src/lib/keywords.ts +++ /dev/null @@ -1,743 +0,0 @@ -import { Stream, TokenStream } from "./utils/stream.js"; -import { - isArray, - include, - undefined, - SyntaxError, - randomVarName, - includes, - error_unexcepted_token, - abruptify, - assert -} from "./utils/util.js"; -import { _echo } from "./utils/_echo.js"; -import { FNNodeType, Nodes, ParameterNodeType, NodeType, AccessChainItemKind, Tokens, DiagnosticSeverity } from "./enums"; -import { lex } from "./lexer.js"; -import { Diagnostic } from "./utils/diagnostics.js"; -import { meberAccessOperators, end_expression } from "./utils/constants.js"; -import { _parseMemberAccess } from "./parsers/member-access.js"; -import { downgrade_next, advance_next } from "./utils/advancers.js"; -import { parse_body } from "./parsers/body-parser.js"; -import { __cache, main_parse, promises, _parse, diagnostics, parse_expression, __parse, __used } from "./parser.js"; -import { __external_var_creator } from "./parsers/__external_var.js"; -import { parse_call_expression } from "./parsers/call-expression.js"; -import type { ParseMeta, Node, ParameterNode, ClassNode, AccessChainItem, UsingStatmentNode } from "./nodes"; - -interface KeywordParsers { - [name: string]: (stream: TokenStream, meta: ParseMeta, ...args: any[]) => Node; -} -export var keywordsHandlers = { - /** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ - nonlocal(stream, meta) { - if (!meta.outer.nonlocals) { - throw "Nonlocal statment: this statment cannot be used in top-level scope!"; - } - var next = advance_next(stream, "symbol"); - if (next[0] !== Tokens.Symbol) { - error_unexcepted_token(next); - } - meta.outer.nonlocals.push(next[1]); - meta.outer.locals = (meta.outer.locals as string[]).filter(sym => sym !== next[1]); - return { - name: Nodes.Empty, - type: NodeType.Expression - }; - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ - include(stream, meta) { - var next = advance_next(stream, `string" | "{`), node: Node, file: URL; - if (next[0] === Tokens.String) { - node = { - name: Nodes.IncludeStatment, - type: NodeType.Expression - }; - } else if (next[0] === Tokens.Special && next[1] === "{") { - node = { - name: Nodes.NamedIncludeStatment, - type: NodeType.Statment - }; - next = advance_next(stream, "}"); - if (next[0] !== Tokens.Special || next[1] !== "}") { - error_unexcepted_token(next); - } - next = advance_next(stream, "from"); - if (next[0] !== Tokens.Keyword || next[1] !== "from") { - error_unexcepted_token(next); - } - next = advance_next(stream, "string"); - if (next[0] !== Tokens.String) { - error_unexcepted_token(next); - } - } else { - error_unexcepted_token(next); - } - file = new URL(next[1], meta.filename); - // var _next = advance_next(stream, ";"); - // if (_next[0] !== Tokens.Special || _next[1] !== ";") { - // throw "Include statment must be follewed by a semicolon!"; - // } - var included = include(file, __cache); - /** - * @param {string} included - */ - function _(included: string) { - var parsed = main_parse(Stream(lex(included)), file.href, meta.outer); - node.body = parsed; - return parsed; - } - node.body = (typeof included !== "string" ? promises[promises.push(included.then(_)) - 1] : _(included)) as any; - return node; - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ - if(stream, meta) { - var next = advance_next(stream, "("); - if (next[0] !== Tokens.Special || next[1] !== "(") { - error_unexcepted_token(next); - } - var expression = _parse(next = advance_next(stream, end_expression), stream, meta), expressions: Node[]; - // console.log(expression); - if (!isArray(expression)) { - next = advance_next(stream, ")"); - expression = [expression]; - } else - next = stream.next; - if (next[0] !== Tokens.Special || next[1] !== ")") { - error_unexcepted_token(next); - } - next = advance_next(stream, "{"); - if (next[0] === Tokens.Special && next[1] === "{") { - expressions = parse_body(stream, meta); - } else { - expressions = [_parse(next, stream, meta) as Node]; - } - var node = { - name: Nodes.IfStatment, - type: NodeType.Statment, - body: expressions, - args: expression[0] as unknown, - else: undefined, - elseif: undefined - // /** - // * @param {boolean} pretty - // * @param {string} whitespace - // */ - // toString(pretty: boolean, whitespace: string) { - // if (pretty) { - // return `if (${ expression }) ${ impl ? expressions.toString(true) : `{\n${ whitespace + " " }${ expressions.toString(true, whitespace + " ") }${ whitespace }\n}` }`; - // } else { - // return `if(${ expression })${ impl ? expressions.toString(false) : `{${ expressions.toString(false) }}` }`; - // } - // } - } as Node; - try { - next = advance_next(stream, "else"); - } catch (error) { - return node; - } - if (next[0] === Tokens.Keyword && next[1] === "else") { - next = advance_next(stream, "if"); - if (next[0] === Tokens.Keyword && next[1] === "if") { - var parsed = keywordsHandlers.if(stream, meta); - if (isArray(parsed)) { - node.elseif = parsed[0]; - return [node]; - } else { - node.elseif = parsed; - return node; - } - } else if (next[0] === Tokens.Special && next[1] === "{") { - node.else = { - name: Nodes.ElseStatment, - type: NodeType.Statment, - body: parse_body(stream, meta) - }; - return node; - } else { - error_unexcepted_token(next); - } - } else { - return [node]; - } - }, - true() { - return { - name: Nodes.TrueValue, - type: NodeType.Expression - }; - }, - false() { - return { - name: Nodes.FalseValue, - type: NodeType.Expression - }; - }, - undefined() { - return { - name: Nodes.UndefinedValue, - type: NodeType.Expression - }; - }, - null() { - return { - name: Nodes.NullValue, - type: NodeType.Expression - }; - }, - NaN() { - return { - name: Nodes.NaNValue, - type: NodeType.Expression - }; - }, - Infinity() { - return { - name: Nodes.InfinityValue, - type: NodeType.Expression - }; - }, - arguments() { - return { - name: Nodes.ArgumentsObject, - type: NodeType.Expression - }; - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ - interface(stream) { - var prefix = _echo("Interface statment:"); - var next = advance_next(stream, "symbol", prefix); - if (next[0] !== Tokens.Symbol) { - error_unexcepted_token(next); - } - next = advance_next(stream, "{", prefix); - if (next[0] !== Tokens.Special || next[1] !== "{") { - error_unexcepted_token(next); - } - error_unexcepted_token([Tokens.Keyword, "interface"]); - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ - async(stream, meta) { - var next = advance_next(stream, "fn", "Async(Generator?)Function statment:"); - if (next[0] !== Tokens.Keyword || next[1] !== "fn") { - error_unexcepted_token(next); - } - return keywordsHandlers.fn(stream, { filename: meta.filename, outer: null! }, FNNodeType.Async); - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ - not(stream, meta) { - return abruptify({ - name: Nodes.LiteralLogicalNotExpression, - type: NodeType.Expression - }, _parse(advance_next(stream, end_expression), stream, meta)); - }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ - __external_var: __external_var_creator(NodeType.Expression), - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ - __external: __external_var_creator(NodeType.Statment), - /** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ - fn(stream, meta, type: FNNodeType = FNNodeType.Sync) { - type _1 = "Function statment:"; - type _2 = `Generator${ _1 }`; - type _3 = `Async${ _1 }`; - type _4 = `Async${ _2 }`; - var _prefix = _echo("Function statment:"); - var _ = [ - _prefix, - "Generator" + _prefix, - "Async" + _prefix - ] as string[] as [_1, _2, _3, _4]; - _[3] = "Async" + _[1] as _4; - var prefix = _[type]; - var name = ""; - var params = [] as ParameterNode[]; - var next = advance_next(stream, 'symbol" | "(', prefix); - var paramType: ParameterNodeType; - var hasRest = false; - var index: number; - if (next[0] === Tokens.Operator && next[1] === "*") { - if (type === FNNodeType.Sync) { - type = FNNodeType.Generator; - } else if (type === FNNodeType.Async) { - type = FNNodeType.AsyncGenerator; - } - next = advance_next(stream, "symbol", prefix); - } else if (type === FNNodeType.Generator || type === FNNodeType.AsyncGenerator) { - throw `${ prefix } Unexcepted token '${ next[1] }' ('*' excepted)`; - } - if (next[0] === Tokens.Symbol) { - name = next[1]; - next = advance_next(stream, "(", prefix); - } - if (next[0] !== Tokens.Special && next[1] !== "(") { - error_unexcepted_token(next); - } - var node = { - name: type as unknown, - type: NodeType.Expression, - params, - symbolName: name, - locals: [] as string[], - nonlocals: [] as string[] - } as Node; - var innerMeta = { outer: node, filename: meta.filename } as ParseMeta; - for (; ;) { - paramType = ParameterNodeType.Normal; - next = advance_next(stream, "symbol", prefix); - if (next[0] === Tokens.Special && next[1] === ",") { - params.push({ - name: "", - type: ParameterNodeType.Empty - }); - continue; - } - if (next[0] === Tokens.Operator && next[1] === "...") { - if (hasRest) { - throw SyntaxError(`Cannot append second rest parameter to ${ name ? `function ${ name }` : "anonymous function" }`); - } - hasRest = true; - paramType = ParameterNodeType.Rest; - next = advance_next(stream, "symbol", prefix); - } - if (next[0] === Tokens.Symbol) { - var paramNode = { - name: next[1], - type: paramType - } as ParameterNode; - params.push(paramNode); - next = advance_next(stream, ",", prefix); - - if (next[0] === Tokens.Operator && next[1] === "=") { - var parsed = _parse(advance_next(stream, end_expression, prefix), stream, innerMeta); - if (isArray(parsed)) { - parsed = parsed[0]; - next = stream.next; - } else { - next = advance_next(stream, end_expression, prefix); - } - paramNode.default = parsed; - } - - if (next[0] === Tokens.Special && next[1] === ")") { - break; - } else if (next[0] !== Tokens.Special && next[1] !== ",") { - error_unexcepted_token(next); - } - } else if (next[0] === Tokens.Special && next[1] === ",") { - params.push({ - name: "", - type: paramType || ParameterNodeType.Empty - }); - } else if (next[0] === Tokens.Special && next[1] === ")") { - break; - } else { - error_unexcepted_token(next); - } - } - index = params.length; - for (; index && params[--index].type === ParameterNodeType.Empty;) - params.pop(); - // apply(console.log, console, params); // IE 8 is very old and strange shit - next = advance_next(stream, "{", prefix); - if (next[0] === Tokens.Operator && next[1] === "=>") { - next = advance_next(stream, end_expression, prefix); - if (next[0] !== Tokens.Special && next[1] !== "{") { - return abruptify(node, abruptify({ - name: Nodes.ReturnStatment, - type: NodeType.Statment - }, _parse(next, stream, innerMeta))); - } - } - if (next[0] !== Tokens.Special && next[1] !== "{") { - error_unexcepted_token(next); - } - node.body = parse_body(stream, innerMeta); - return node; - }, - class(stream, meta) { - const type = meta.ie ? NodeType.Expression : NodeType.Statment; - const node = { - name: Nodes.ClassExpression, - type, - getters: [], - settets: [], - props: [], - methods: [], - privateGetters: [], - privateSettets: [], - privateMethods: [], - privateProps: [], - mixins: [] - } as ClassNode; - const prefix = _echo("Class expression:"); - var next = advance_next(stream, ["{", "symbol", "extends"].join('" | "'), prefix); - if (next[0] === Tokens.Symbol) { - node.symbolName = next[1]; - next = advance_next(stream, end_expression, prefix); - } - if (next[0] === Tokens.Keyword && next[1] === "extends") { - var extender = _parse(advance_next(stream, end_expression, prefix), stream, meta); - if (isArray(extender)) { - node.extends = extender[0]; - next = stream.next; - } else { - node.extends = extender; - next = advance_next(stream, "any", prefix); - } - if (next[0] === Tokens.Keyword && next[1] === "with") { - while (next[0] !== Tokens.Special || next[1] !== "{") { - var parsed = _parse(advance_next(stream, end_expression, prefix), stream, meta); - if (isArray(parsed)) { - parsed = parsed[0]; - next = stream.next; - } else { - next = advance_next(stream, "any", prefix); - } - if (next[0] !== Tokens.Special || (next[1] !== "," && next[1] !== "{")) { - error_unexcepted_token(next); - } - node.mixins.push(parsed); - } - } - } - if (!type && !node.symbolName) { - diagnostics.push(Diagnostic(DiagnosticSeverity.Warn, "Class statment doesn't have a name - " + - "a random name will be given during compilation")); - node.symbolName = randomVarName(); - } - if (next[0] === Tokens.Special && next[1] === "{") { - while ((next = advance_next(stream, ["keyword", "symbol", "string"].join('" | "'), prefix))[1] !== "}" && - next[0] !== Tokens.Special) { - if (includes([Tokens.Symbol, Tokens.String, Tokens.Keyword], next[0])) { - var next2 = advance_next(stream, ["=", "symbol", "("].join('" | "'), prefix); - if (next[0] === Tokens.Keyword) - if (next2[0] === Tokens.Symbol && includes(["get", "set", "async"] as const, next[1])) { - } - } - } - // next = next_and_skip_shit_or_fail(stream, "}", prefix); - // if (next[0] !== Tokens.Special || next[1] !== "}") { - // error_unexcepted_token(next); - // } - } else - error_unexcepted_token(next); - return node; - }, - return(stream, meta) { - return abruptify({ - name: Nodes.ReturnStatment, - type: NodeType.Statment - }, _parse(advance_next(stream, end_expression, "Return statment:"), stream, meta)); - }, - throw(stream, meta) { - __used.throw = true; - return abruptify({ - name: Nodes.ThrowExpression, - type: NodeType.Statment - }, _parse(advance_next(stream, end_expression, "Throw statment:"), stream, meta)); - }, - yield(stream, meta) { - var next = advance_next(stream, end_expression, "Yield expression:"); - var yield_from = next[0] === Tokens.Operator && next[1] === "*"; - var expression = yield_from ? - parse_expression(stream, meta) : - _parse(next, stream, meta); - return abruptify({ - name: yield_from ? Nodes.YieldFromExpression : Nodes.YieldExpression, - type: NodeType.Expression, - outerBody: meta.outer - }, expression); - }, - await(stream, meta) { - if (meta.outer.name === Nodes.FunctionExpression) { - diagnostics.push(Diagnostic(DiagnosticSeverity.RuntimeError, - `Using await inside Sync Function Expression will fail at runtime`)); - } - if (meta.outer.name === Nodes.GeneratorFunctionExpression) { - diagnostics.push(Diagnostic(DiagnosticSeverity.Warn, `Await is not intended to be used inside Generator Functions`)); - } - var prefix = _echo("Await expression:" as const); - var next = advance_next(stream, end_expression, prefix); - if (next[0] === Tokens.Operator && next[1] === ".") { - next = advance_next(stream, ['any', 'all', 'allSettled', 'race'].join('" | "'), prefix); - if (next[0] === Tokens.Symbol && /^(any|all(Settled)?|race)$/m.test(next[1])) { - var expression = _parse(advance_next(stream, end_expression, prefix), stream, meta); - var _ = { - name: Nodes.CallExpression, - type: NodeType.Expression, - body: [{ - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbolName: `p.${ next[1] }` - }], - args: [expression] - } as any; - if (isArray(expression)) { - _.args[0] = expression[0]; - expression = [_]; - } else - expression = _; - } else { - error_unexcepted_token(next); - } - } else { - expression = _parse(next, stream, meta); - } - return abruptify({ - name: Nodes.AwaitExpression, - type: NodeType.Expression, - outerBody: meta.outer - }, expression); - }, - this() { - return { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbolName: "this" - }; - }, - keep(stream, meta) { - var prefix = _echo("Keep statment:"); - var next = advance_next(stream, "(", prefix); - var args = [] as Node[]; - if (next[0] !== Tokens.Special && next[1] !== "(") { - error_unexcepted_token(next); - } - next = advance_next(stream, "symbol", prefix); - if (next[0] === Tokens.Special || next[1] !== ")") { - while (1) { - if (next[0] === Tokens.Special && next[1] === ")") { - break; - } - if (next[0] === Tokens.Special && next[1] === ",") { - next = advance_next(stream, end_expression); - continue; - } else { - var next2, isConstantObject = next[0] === Tokens.Keyword && includes(["this", "arguments"] as const, next[1]), - arg = (isConstantObject ? keywordsHandlers[next[1]]() : { - name: Nodes.Symbol, - type: NodeType.Expression, - symbolName: next[1] - }) as Node; - if (!(isConstantObject || next[0] === Tokens.Symbol)) { - error_unexcepted_token(next); - } - next2 = advance_next(stream, [',', ')'].join('" | "') + meberAccessOperators.join('" | "'), prefix); - if (next2[0] === Tokens.Operator && includes(meberAccessOperators, next2[1])) { - arg = { - name: Nodes.MemberAccessExpression, - type: NodeType.Expression, - body: _parseMemberAccess(arg, next, stream, meta), - }; - } else { - isConstantObject && diagnostics.push(Diagnostic(DiagnosticSeverity.RuntimeError, `Assignment to "${ next[0] }" will fail at runtime!`)); - next = next2; - } - } - args.push(arg); - if (next[0] === Tokens.Special) { - if (next[1] === ")") { - break; - } else if (next[1] !== ",") { - error_unexcepted_token(next); - } - } else - error_unexcepted_token(next); - next = advance_next(stream, "symbol"); - } - } - next = advance_next(stream, "{"); - if (next[0] !== Tokens.Special && next[1] !== "{") { - error_unexcepted_token(next); - } - var body = parse_body(stream, meta); - return { - name: Nodes.KeepStatment, - type: NodeType.Statment, - body, - args - }; - }, - new(stream, meta) { - var expression = __parse(advance_next(stream, end_expression), stream, meta), - is_array; - if (is_array = isArray(expression)) { - expression = expression[0]; - } - // The logic is to intercept from parsed node last CallExpression and mutate it into NewExpression - var node = { name: Nodes.NewExpression, type: NodeType.Expression, body: [expression] as Node[] } as Node, - body = expression.body, intercepted: Node[] = [], expression_ = expression; - while (expression_.type === NodeType.Expression && isArray(body)) { - expression_ = (body[0] as Node).name ? body[0] as Node : (body[0] as AccessChainItem).body; - intercepted.push(expression_); - body = expression_.body; - } - for (var index = 0, length = intercepted.reverse().length; index < length; index++) { - var intercepted_ = intercepted[index]; - if (intercepted_.name === Nodes.CallExpression) { - var expressionAbove = intercepted[index + 1] || expression; - (node.body as Node[])[0] = intercepted_; - if (expressionAbove.name !== Nodes.MemberAccessExpression) { - (expressionAbove.body as Node[])[0] = node; - } else { - (expressionAbove.body as AccessChainItem[])[0] = { - body: node, - kind: AccessChainItemKind.Head - }; - } - return expression; - } - } - return is_array ? [node] : node; - }, - // TODO - try(stream, meta) { - var node = { - name: Nodes.TryStatment, - type: NodeType.Statment, - catch: undefined, - else: undefined, - body: undefined, - finally: undefined, - args: undefined - } as Partial, - prefix = _echo("Try statment:" as const), - next = advance_next(stream, end_expression, prefix); - if (next[0] === Tokens.Keyword && next[1] === "using") { - assert(node); - node.args = []; - - } - if (next[0] === Tokens.Special && next[1] === "{") { - node.body = parse_body(stream, meta); - } - next = advance_next(stream, end_expression, prefix); - nonuseless = false; - while (next[0] === Tokens.Keyword && includes(["catch", "else", "finally"] as const, next[1])) { - var word = next[1], toAppend = word === "catch" ? ["", []] as UsingStatmentNode["catch"] : undefined, nonuseless = true; - next = advance_next(stream, end_expression, prefix); - if (word === "catch" && next[0] === Tokens.Special && next[1] === "(") { - next = advance_next(stream, end_expression, prefix); - if (next[0] !== Tokens.Symbol) { - error_unexcepted_token(next); - } - toAppend![0] = next[1]; - next = advance_next(stream, end_expression, prefix); - if (next[0] !== Tokens.Special || next[1] !== ")") { - error_unexcepted_token(next); - } - next = advance_next(stream, end_expression, prefix); - } - if (next[0] !== Tokens.Special || next[1] !== "{") { - error_unexcepted_token(next); - } - if (word === "catch") { - toAppend![1] = parse_body(stream, meta); - node[word] = toAppend!; - } else { - node[word] = parse_body(stream, meta); - } - next = advance_next(stream, end_expression, prefix); - } - downgrade_next(stream); - if (!nonuseless) { - diagnostics.push(Diagnostic(DiagnosticSeverity.Warn, `Try statment is useless without else, catch, finally clauses!`)); - node.finally = []; - } - return node as unknown as Node; - }, - else() { - throw "Else cannot exist as standalone statment"; - }, - while(stream, meta) { - var prefix = _echo("While statment:" as const); - var next = advance_next(stream, "(", prefix); - if (next[0] !== Tokens.Special || next[1] !== "(") { - error_unexcepted_token(next); - } - var arg = _parse(next = advance_next(stream, end_expression, prefix), stream, meta); - if (isArray(arg)) { - next = stream.next; - } else { - arg = [arg]; - next = advance_next(stream, ")", prefix); - } - if (next[0] !== Tokens.Special || next[1] !== ")") { - error_unexcepted_token(next); - } - next = advance_next(stream, "{", prefix); - if (next[0] !== Tokens.Special || next[1] !== "{") { - error_unexcepted_token(next); - } - return { - name: Nodes.WhileStatment, - type: NodeType.Statment, - body: parse_body(stream, meta), - args: arg - }; - }, - do(stream, meta) { - var prefix = _echo("Do-While statment:" as const); - var next = advance_next(stream, "{", prefix); - var body, arg; - if (next[0] !== Tokens.Special || next[1] !== "{") { - error_unexcepted_token(next); - } - body = parse_body(stream, meta); - next = advance_next(stream, "while", prefix); - if (next[0] !== Tokens.Keyword || next[1] !== "while") { - error_unexcepted_token(next); - } - next = advance_next(stream, "(", prefix); - if (next[0] !== Tokens.Special || next[1] !== "(") { - error_unexcepted_token(next); - } - arg = _parse(next = advance_next(stream, end_expression, prefix), stream, meta); - if (isArray(arg)) { - next = stream.next; - } else { - arg = [arg]; - next = advance_next(stream, ")", prefix); - } - if (next[0] !== Tokens.Special || next[1] !== ")") { - error_unexcepted_token(next); - } - return { - name: Nodes.DoWhileStatment, - type: NodeType.Statment, - body, - args: arg - }; - }, - import(stream, meta) { - const next = advance_next(stream, end_expression, "Import statment:"); - if (next[0] !== Tokens.Special && next[1] !== "(") { - error_unexcepted_token(next); - } - return { - name: Nodes.ImportExpression, - type: NodeType.Expression, - args: parse_call_expression(advance_next(stream, end_expression, "Import statment:"), stream, meta) - } as Node; - } -} as KeywordParsers as { [key: string]: (...args: any[]) => Readonly | [Readonly]; }; diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index b059809..b807198 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -1,17 +1,19 @@ -import { Stream, TextStream, Token, TokenList } from "./utils/stream.js"; -import { includes, nullish } from "./utils/util.js"; +import { Stream, type TextStream, Token, type TokenStream } from "./utils/stream.js"; +import { error_unexcepted_token, includes, nullish, undefined } from "./utils/util.js"; import { Tokens } from "./enums"; import { keywords, validChars, $2charoperators, $3charoperators } from "./utils/constants.js"; +import { advance_next, type Prefix } from "./utils/advancers.js"; -var numberChar = /[0-9.\-\+]/; -var numberTest = /^(?:[\-\+]?[0-9][_0-9]*)?(?:\.(\.[\-\+]?)?[0-9_]+)?$/m; -var specialCharsTest = /[(){};,]/m; -var operatorCharsTest = /^[<>\/*+\-?|&\^!%\.@:=\[\]~#]$/m; -var regexTest = /^`$/m; -var stringTest = /^'|"$/m; -var regexModTest = /^[gmiyus]$/m; -var whitespaceTest = /\s/; -var symbolic = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; +const numberChars = /[\d\.\-\+]/; +const numberRegex = /^(?:[\-\+]?\d[_\d]*)?(?:\.(\.[\-\+]?)?[\d_]+)?$/m; +const operatorCharsRegex = /^[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]$/m; +const stringStartRegex = /^'|"$/m; +const whitespaceRegex = /\s/; +export const symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; + +function isWhitespace(char: string) { + return char === "\r" || char === "\n" || char === " " || char === "\t" || char === "\f" || char === "\v"; +} // /** // * @param {any[]} array @@ -26,37 +28,21 @@ var symbolic = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; // } // return false; // } -/** - * @param {string} firstChar - * @param {import("./utils/stream").TextStream} iter - * @returns {import("./utils/stream").Token} - */ -function scanNumber(firstChar: string, iter: TextStream): Token { - var result = firstChar, c: string; - while (!nullish(c = iter.next) && numberChar.test(c)) { - result += iter.move(); - } - if (!numberTest.test(result) || !result) { - throw `${ result } is not a valid number!`; - } - return [/[\-\+]?\d+\.\.[\-\+]?\d+/.test(result) ? Tokens.Range : Tokens.Number, result]; -} /** * @param {string} quot * @param {import("./utils/stream").TextStream} iter */ -function scanText(quot: string, iter: TextStream) { - arguments - var result = "", last = "", compound = '\\' + quot; - while (iter.next !== quot || last + iter.next === compound) { - last = iter.move(); +function scanText(quot: string, iter: TextStream): Token { + var result = "", last = "", compound = '\\' + quot, next: string; + while (!nullish(next = iter.next) && (next !== quot || last + next === compound)) { + last = (iter.advance(), next); if (nullish(last)) { throw "Unexcepted EOF"; } result += last; } - iter.move(); - return result; + iter.advance(); + return new Token(Tokens.String, result); } /** * @param {string} char @@ -65,144 +51,204 @@ function scanText(quot: string, iter: TextStream) { */ function scanSymbol(char: string, iter: TextStream): Token { var result = char, next: string; - while (!nullish(next = iter.next) && symbolic.test(next)) { - result += iter.move(); + while (!nullish(next = iter.next) && symbolicCharsRegex.test(next)) { + result += (iter.advance(), next); } if (!validChars.test(result)) { throw `${ result } is not a valid symbol!`; } - return [~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result]; + return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); } /** * @param {string} char * @param {import("./utils/stream").TextStream} iter */ -function scanWhitespace(char: string, iter: TextStream) { - var result = char, next: string; - while (!nullish(next = iter.next) && whitespaceTest.test(next)) { - result += iter.move(); - } - return result; -} -/** - * @param {import("./utils/stream").TextStream} iter - * @returns {import("./utils/stream").Token} - */ -function scanRegex(iter: TextStream): Token { - var result = "", regexMods = "", next: string; - while ((next = iter.next) !== '`') { - if (nullish(next)) { - throw "Invalid regular expression: missing `"; - } - result += iter.move(); - } - iter.move(); - // TS thinks that stream's next property doesn't change - // @ts-ignore - while (!~regexMods.indexOf(next = iter.next) && next.trim() && next !== ";" && !whitespaceTest.test(next)) { - if (!regexModTest.test(next)) throw `Invalid regular expression flag: '${ next }'`; - if (~regexMods.indexOf(next)) throw `Duplicated regular expression flag: '${ next }'`; - regexMods += iter.move(); - } - return [Tokens.Regex, result, regexMods]; +function scanWhitespace(char: string, iter: TextStream): Token | void { + var next: string; + while (!nullish(next = iter.next) && isWhitespace(next)) iter.advance(); + // return { [IsTokenSymbol]: true, type: Tokens.Whitespace, body: ' ' }; } /** * @param {import("./utils/stream").TextStream} iter * @param {string} firstChar */ -function scanComment(iter: TextStream, firstChar: string) { - var result = firstChar || ""; - while (iter.next && iter.next !== '\n') { - result += iter.move(); - } - iter.move(); - return result + "\n"; +function scanComment(iter: TextStream): Token | void { + var next: string; + while (!nullish(next = iter.move()) && next !== '\n'); + // return { [IsTokenSymbol]: true, type: Tokens.Comment, body: result + "\n" }; } /** * @param {import("./utils/stream").TextStream} iter * @param {string} firstChar */ -function scanMultiineComment(iter: TextStream, firstChar: string) { - var result = firstChar, length = 0; - while (result[length] + iter.next !== '*/') { - result += iter.move(); - length++; +function scanMultiineComment(iter: TextStream, firstChar: string): Token | void { + var result = firstChar; + while (result + iter.next !== '*/') { + result = iter.move(); } - iter.move(); - return result.slice(0, -1); + iter.advance(); + // return { [IsTokenSymbol]: true, type: Tokens.MultilineComment, body: result.slice(0, -1) }; } -/** - * @param {import("./utils/stream").TokenList} tokens - * @param {string} char - * @param {import("./utils/stream").TextStream} iter - */ -function _lex(tokens: TokenList, char: string, iter: TextStream) { - if (whitespaceTest.test(char)) { - tokens.push([Tokens.Whitespace, scanWhitespace(char, iter)]); - } else if (specialCharsTest.test(char)) { - tokens.push([Tokens.Special, char]); - } else if (operatorCharsTest.test(char) || char === ".") { - _char = iter.move(); - joined = char + _char; - if ((char === "-" || char === "+") && /^[\d\.]$/m.test(_char)) { - _lex(tokens, joined, iter); - } else if (includes($2charoperators, joined)) { - __char = iter.move(); - _joined = joined + __char; - if (includes($3charoperators, _joined)) { - ___char = iter.move(); - __joined = _joined + ___char; - if (">>>=" === __joined) { - tokens.push([Tokens.Operator, __joined]); - _lex(tokens, iter.move(), iter); + +class Lexer implements TokenStream { + private readonly numberChars = /[0-9\.\-\+]/; + private readonly numberRegex = /^(?:[\-\+]?[0-9][_0-9]*)?(?:\.(\.[\-\+]?)?[0-9_]+)?$/m; + private readonly operatorCharsRegex = /[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]/y; + private readonly stringStartRegex = /^['"]/y; + private readonly whitespaceRegex = /\s+/y; + private readonly symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/y; + public readonly next: Token = undefined!; + private _triaged?: Token; + private _triageLength: number = 0; + private _inited: boolean = false; + constructor(public readonly text_stream: TextStream) { } + public advance() { + this._inited = true; + if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot advance token stream when a token is triaged!"; + return (this as { next: unknown; }).next = this._lex(this.text_stream.move()); + } + public move() { + this._inited = true; + if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot move token stream when a token is triaged!"; + const __next = this.next; + (this as { next: unknown; }).next = this._lex(this.text_stream.move()); + return __next; + } + public try

(end: string, prefix?: Prefix

): Token { + this._inited = true; + if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot try a token 2 times!"; + const initialIndex = this.text_stream.index; + const result = advance_next(this, end, prefix); + this._triageLength = this.text_stream.index - initialIndex; + return this._triaged = result; + } + public confirm_try() { + this._triaged = undefined!; + this._triageLength = 0; + } + public cancel_try() { + this.text_stream.down(this._triageLength); + this._triaged = undefined!; + this._triageLength = 0; + } + public *[Symbol.iterator]() { + this._inited || this.move(); + while (!nullish(this.next)) { yield this.move(); } + } + _lex(char: string): Token { + if (nullish(char)) { + return char; + } else if (operatorCharsRegex.test(char)) { + var _char = this.text_stream.move(); + var joined = char + _char; + if (includes($2charoperators, joined)) { + var __char = this.text_stream.move(); + var _joined = joined + __char; + if (includes($3charoperators, _joined)) { + var ___char = this.text_stream.move(); + var __joined = _joined + ___char; + if (">>>=" === __joined) { + return new Token(Tokens.Operator, __joined); + } else { + this.text_stream.down(); + return new Token(Tokens.Operator, _joined); + } + } else if (joined === "//") { + return scanComment(this.text_stream), this._lex(this.text_stream.move()); + } else if (joined === "/*") { + return scanMultiineComment(this.text_stream, __char), this._lex(this.text_stream.move()); } else { - tokens.push([Tokens.Operator, _joined]); - _lex(tokens, ___char, iter); + this.text_stream.down(); + return new Token(Tokens.Operator, joined); } - } else if (joined === "//") { - tokens.push([Tokens.Comment, scanComment(iter, __char)]); - } else if (joined === "/*") { - tokens.push([Tokens.MultilineComment, scanMultiineComment(iter, __char)]); } else { - tokens.push([Tokens.Operator, joined]); - _lex(tokens, __char, iter); + this.text_stream.down(); + return new Token(Tokens.Operator, char); } + } else if (isWhitespace(char)) { + return scanWhitespace(char, this.text_stream), this._lex(this.text_stream.move()); + } else if (char === "'" || char === "\"") { + return scanText(char, this.text_stream); + } else if ('0' <= char && char <= '9') { + return this.scanNumber(char); + } else if (validChars.test(char)) { + return scanSymbol(char, this.text_stream); } else { - // console.log(`Char: '${char}', NextChar: '${_char}'`); - tokens.push([Tokens.Operator, char]); - _lex(tokens, _char, iter); + throw `Unrecognised character: "${ char }"!`; } - } else if (whitespaceTest.test(char)) { - tokens.push([Tokens.Whitespace, scanWhitespace(char, iter)]); - } else if (specialCharsTest.test(char)) { - tokens.push([Tokens.Special, char]); - } else if (regexTest.test(char)) { - tokens.push(scanRegex(iter)); - } else if (stringTest.test(char)) { - tokens.push([Tokens.String, scanText(char, iter)]); - } else if (/[0-9\-\+]/.test(char)) { - tokens.push(scanNumber(char, iter)); - } else if (validChars.test(char)) { - tokens.push(scanSymbol(char, iter)); - } else { - throw `Unrecognised character: "${ char }"!`; } -} -var _char: string, - __char: string, - ___char: string, - joined: string, - _joined: string, - __joined: string; + scanNumber(firstChar: string): Token { + var result = firstChar, next: string; + if (firstChar === "0") { + const format = this.text_stream.move(); + if (format === "x") { + result += format; + while ( + '0' <= (next = this.text_stream.move()) && next <= '9' || + 'a' <= next && next <= 'f' || 'A' <= next && next <= 'F' + ) { + result += next; + } + if (validChars.test(next)) { + error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a hexadecimal digit.`); + } + } else if (format === "o") { + result += format; + while ('0' <= (next = this.text_stream.move()) && next <= '7') { + result += next; + } + if (next === "8" || next === "9") { + error_unexcepted_token(new Token(Tokens.Number, next), `; ${ next } is not an octal digit.`); + } + if (validChars.test(next)) { + error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not an octal digit.`); + } + } else if (format === ".") { + const next = this.text_stream.move(); + if (next === ".") { + this.text_stream.down(); + } else { + result += format; + let next; + while ('0' <= (next = this.text_stream.move()) && next <= '9') { + result += next; + } + if (validChars.test(next)) { + error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); + } + } + } else if (validChars.test(format)) { + error_unexcepted_token(new Token(Tokens.Symbol, format), `; ${ format } is not a decimal digit.`); + } + } else { + while ('0' <= (next = this.text_stream.move()) && next <= '9') { + result += next; + } + if (next === ".") { + result += next; + while ('0' <= (next = this.text_stream.move()) && next <= '9') { + result += next; + } + } + if (validChars.test(next)) { + error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); + } + } + this.text_stream.down(); + return new Token(Tokens.Number, result); + } + scanSymbol(char: string, iter: TextStream): Token { + var result = char, next: string; + while (!nullish(next = iter.next) && symbolicCharsRegex.test(next)) { + result += (iter.advance(), next); + } + return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); + } +}; + /** * @param {string} text */ -export function lex(text: string) { - /**@type {import("./utils/stream").TokenList} */ - var tokens: TokenList = [], - iter = Stream(text); - while (!nullish(iter.next)) { - _lex(tokens, iter.move(), iter); - } - return tokens; +export function lex(text: string): TokenStream { + return new Lexer(new Stream(text)); } \ No newline at end of file diff --git a/src/lib/nodes.ts b/src/lib/nodes.ts index 45b131d..6c2be14 100644 --- a/src/lib/nodes.ts +++ b/src/lib/nodes.ts @@ -1,50 +1,63 @@ -import type { Nodes, ParameterNodeType, NodeType, AccessChainItemKind } from "./enums"; +import type { Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, ObjectBodyNodeKind } from "./enums"; export type NodeName = Nodes; -export interface NodeBase { +export interface INodeBase { name: NodeName; type: NodeType; } -export interface Node extends NodeBase { - body?: string | Node[] | AccessChainItem[]; - outerBody?: Node; - params?: ParameterNode[]; - symbolName?: string; +export interface INode extends INodeBase { + body?: INode[] | AccessChainItem[] | Record[]; + outerBody?: INode; + params?: IParameterNode[]; + symbol?: string; meta?: Record; - args?: Node[]; + args?: INode[]; locals?: string[]; nonlocals?: string[]; - else?: Node; - elseif?: Node; + else?: INode; + elseif?: INode; } -export interface TryStatmentNode extends NodeBase { - body: Node[]; - else: Node[]; - catch: [name: string, value: Node[]]; - finally: Node[]; +export abstract class Node implements INode { + public abstract body?: INode[] | AccessChainItem[] | Record[]; + public abstract outerBody?: INode; + public abstract params?: IParameterNode[]; + public abstract symbol?: string; + public abstract meta?: Record; + public abstract args?: INode[]; + public abstract locals?: string[]; + public abstract nonlocals?: string[]; + public abstract else?: INode; + public abstract elseif?: INode; + public constructor(public readonly name: NodeName, public readonly type: NodeType) { } } -export interface UsingStatmentNode extends TryStatmentNode { - args: [indentifier: string, value: Node][]; +export interface ITryStatmentNode extends INodeBase { + body: INode[]; + else: INode[]; + catch: [name: string, value: INode[]]; + finally: INode[]; +} +export interface IUsingStatmentNode extends ITryStatmentNode { + args: [indentifier: string, value: INode][]; } export interface ClassProperty { - name: Node; - body: Node[]; + name: INode; + body: INode[]; } export interface ClassMethod extends ClassProperty { - decorators: Node[]; - params: ParameterNode[]; + decorators: INode[]; + params: IParameterNode[]; } export interface ClassGetter extends ClassMethod { params: []; } export interface ClassSetter extends ClassMethod { - params: [] | [ParameterNode & { type: ParameterNodeType.Normal; }]; + params: [] | [IParameterNode & { kind: ParameterNodeKind.Normal; }]; } export interface ClassConstructor { - body: Node[]; - params: ParameterNode[]; + body: INode[]; + params: IParameterNode[]; async: boolean; gen: boolean; } @@ -52,31 +65,52 @@ export interface ClassNodeProps { methods: ClassMethod[]; getters: ClassGetter[]; settets: ClassSetter[]; - props: [name: Node, value: Node][]; + props: { name: INode; value: INode }[]; } -export interface ClassNode extends Node, Privatify { +export interface IClassNode extends INode, Privatify { construct?: ClassConstructor; - extends?: Node; - mixins: Node[]; + extends?: INode; + mixins: INode[]; } -export interface MixinNode extends ClassNode { } +export interface MixinNode extends IClassNode { } export type PrivatifyString = T | `private${ Capitalize }`; export type Privatify = { [Key in keyof T as PrivatifyString]-?: T[Key]; }; -export interface ParseMeta { - ie?: boolean; - outer: Node; - filename: string; +export interface IParseMeta { + /** insideExpression */ + insideExpression: boolean; + readonly outer: INode; + readonly filename: string; + readonly cache: boolean; + [key: string]: unknown; +} +export class ParseMeta implements IParseMeta { + constructor(public readonly filename: string, public readonly outer: INode, public readonly cache: boolean, public insideExpression = false) {}; [key: string]: unknown; } -export interface ParameterNode { - name: string | Node; - type: ParameterNodeType; - default?: Node; - _meta?: any; +export interface IParameterNode { + name: string | INode; + kind: ParameterNodeKind; + default?: INode; + _meta?: Record; } -export interface AccessChainItem { - kind: AccessChainItemKind; - body: Node; +export class ParameterNode { + public readonly default?: INode; + constructor(public readonly name: string | INode, public readonly kind: ParameterNodeKind, default_: INode | undefined) { + this.default = default_; + } +} +export class AccessChainItem { + constructor(public kind: AccessChainItemKind, public body: INode) { } +} +export type ObjectBodyNode = { + name: INode; + type: ObjectBodyNodeKind; + body: INode[]; +}; +export interface ObjectNode extends INodeBase { + name: Nodes.ObjectExpression; + type: NodeType.Expression; + body: ObjectBodyNode[]; } diff --git a/src/lib/parse-dummies.ts b/src/lib/parse-dummies.ts deleted file mode 100644 index ad97b23..0000000 --- a/src/lib/parse-dummies.ts +++ /dev/null @@ -1,6 +0,0 @@ -// These wrappers needed for babel to complete and not hang (23 minutes and it couldn't finish the job, i checked) -import { _parse as _parse_, __parse as __parse__ } from "./parser.js"; - -export const __parse = __parse__; -export const _parse = _parse_; -export { __used, diagnostics } from "./parser.js"; diff --git a/src/lib/parser.ts b/src/lib/parser.ts index 7aa4aab..6510f5f 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -1,97 +1,77 @@ // @ts-check /** @author MadProbe#7435 */ -import { Stream, Token, TokenList, TokenStream } from "./utils/stream.js"; import { - nullish, - assert, - isArray, - apply, - resetCounter, - undefined, - SyntaxError, - inspectLog, - includes, - error_unexcepted_token, - isSymbol, - remove_trailing_undefined, - isNode, - abruptify + nullish, assert_type, resetCounter, undefined, SyntaxError, includes, error_unexcepted_token, isSymbol, remove_trailing_undefined } from "./utils/util.js"; -import { Nodes, ParameterNodeType, NodeType, Tokens, DiagnosticSeverity, ParseNodeType } from "./enums"; -import { _emit } from "./emitter.js"; +import { Nodes, ParameterNodeKind, NodeType, Tokens, DiagnosticSeverity, ParseNodeKind } from "./enums"; import { _echo } from "./utils/_echo.js"; import { AssignmentOperatorTable } from "./utils/table.js"; -import { Diagnostic, IDiagnostic } from "./utils/diagnostics.js"; -import { end_expression, expression } from "./utils/constants.js"; -import { parseMemberAccess } from "./parsers/member-access.js"; -import { advance_next } from "./utils/advancers.js"; -import { parse_call_expression } from "./parsers/call-expression.js"; -import { parse_body } from "./parsers/body-parser.js"; -import { parse_common_expressions } from "./parsers/common-expressions.js"; -import { parse_assignment } from "./parsers/assignments.js"; -import { keywordsHandlers } from "./keywords.js"; -import { parse_array_expression } from "./parsers/array-expression.js"; -import { parse_group_expression } from "./parsers/group-expression.js"; -import type { Node, ParseMeta, AccessChainItem } from "./nodes"; +import { end_expression } from "./utils/constants.js"; +import { advance_next, except_next_token, type Prefix } from "./utils/advancers.js"; +import { + parse_call_expression, parse_body, parseMemberAccess, parse_common_expressions, parse_regexp, + parse_array_expression, parse_assignment, parse_group_expression, keywords_handlers +} from "./parsers/__all__.js"; +import { INode, IParseMeta, ParseMeta } from "./nodes"; +import { occurrences } from "./utils/occurrences.js"; +import type { IDiagnostic } from "./utils/diagnostics.js"; +import type { Token, TokenStream } from "./utils/stream.js"; -export type SyntaxTree = Node[]; -// /** -// * @param {string} included -// * @param {string} filename -// * @param {boolean} pretty -// * @param {string} whitespace -// */ -// function __include_helper__(included: string, pretty: boolean, whitespace: string) { -// return _emit(parse(lex(included), filename), { url: filename }); -// } +export type SyntaxTree = readonly INode[]; /** * @param {import("./utils/stream.js").Token | import("./parser").Node} next * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta - * @returns {import("./parser").Node | [import("./parser").Node]} + * @returns {import("./parser").Node} */ -export function _parse(next: Token | Node, stream: TokenStream, meta: ParseMeta): Node | [Node] { +export function _parse(next: Token, stream: TokenStream, meta: IParseMeta): INode { var parsed = __parse(next, stream, meta); - meta.ie = false; + meta.insideExpression = false; return parsed; } -const indentifier = ParseNodeType.Indentifier; -function parse_operators(_sym: Node, stream: TokenStream, meta: ParseMeta, type: ParseNodeType): Node | [Node] { - meta.ie = true; +const indentifier = ParseNodeKind.Indentifier; +export function parse_operators(_sym: INode, stream: TokenStream, meta: IParseMeta, type: ParseNodeKind): INode { + meta.insideExpression = true; var prefix: string; - var node: Node; - var parsed: Node | [Node] | undefined; - var next = stream.next; - var canBeObject = type !== ParseNodeType.Number && type !== ParseNodeType.String; - var notExpressionOrIndentifier = !canBeObject || type === ParseNodeType.Range; - if (next[0] !== Tokens.Operator && next[0] !== Tokens.Special) { + var node: INode; + var parsed: INode | undefined; + var next = stream.try(end_expression); + var canBeObject = type !== ParseNodeKind.Number && type !== ParseNodeKind.String; + var notExpressionOrIndentifier = !canBeObject || type === ParseNodeKind.Range; + if ((next.type === Tokens.Keyword || next.type === Tokens.Symbol) && includes(["with", "to", "as"] as const, next.body)) { + stream.cancel_try(); + return _sym; + } + if (next.type !== Tokens.Operator && (next.type !== Tokens.Keyword || next.body !== "and" && next.body !== "or")) { + stream.confirm_try(); error_unexcepted_token(next); } - switch (next[1]) { + switch (next.body) { case "{": case ")": case "}": case "]": case ",": case ";": - return [_sym]; + stream.cancel_try(); + return _sym; case "(": case "?.(": + stream.confirm_try(); // console.log("():", next); - notExpressionOrIndentifier && pushDiagnosticMessage(DiagnosticSeverity.RuntimeError, - `Call on ${ type } will fail at runtime because ${ type } is not callable.`); + notExpressionOrIndentifier && pushDiagnostic(DiagnosticSeverity.RuntimeError, + `Call on ${ type } will fail at runtime because ${ type } is not callable.`, stream); var args = parse_call_expression(advance_next(stream, ")", "Call expression:"), stream, meta); remove_trailing_undefined(args); - node = { - name: next[1] === "(" ? Nodes.CallExpression : Nodes.OptionalCallExpression, + return parse_operators({ + name: next.body === "(" ? Nodes.CallExpression : Nodes.OptionalCallExpression, type: NodeType.Expression, body: [_sym], - args: args - }; - return _parse(node, stream, meta); + args + }, stream, meta, ParseNodeKind.Expression); case ".": case "[": @@ -99,92 +79,98 @@ function parse_operators(_sym: Node, stream: TokenStream, meta: ParseMeta, type: case "![": case "?.": case "?.[": { - let body = next[1]; - assert(_); + stream.confirm_try(); + const body = next.body; if (body === ".") { - type === ParseNodeType.Number && pushDiagnosticMessage(DiagnosticSeverity.Warn, - `Please disambiguate normal member access expression when member access performed on ${ type } value by wrapping ${ type } value in parenthezis`); + type === ParseNodeKind.Number && pushDiagnostic(DiagnosticSeverity.Warn, + `Please disambiguate normal member access expression when member access \ +performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream); } if (notExpressionOrIndentifier && includes(["!.", "![", "?.", "?.["] as const, body)) { var isDotMemberAccess = body == "!." || body == "?."; - pushDiagnosticMessage(DiagnosticSeverity.Warn, + pushDiagnostic(DiagnosticSeverity.Warn, (body == "![" || body == "!." ? "Null assertive" : "Optional") + `${ isDotMemberAccess ? "" : " computed" } member access doesn't have ` + - `any effect when performed on ${ type } value, assertion will be stripped.`); - next[1] = isDotMemberAccess ? "." : "["; + `any effect when performed on ${ type } value, assertion will be stripped.`, stream); + (next as never as string[])[1] = isDotMemberAccess ? "." : "["; } return parseMemberAccess(_sym, next, stream, meta); } case "=>": + stream.confirm_try(); if (type !== indentifier) { - pushDiagnosticMessage(DiagnosticSeverity.RuntimeError, "Arrow functions shortcut cannot contain non-symbol parameter"); + pushDiagnostic(DiagnosticSeverity.RuntimeError, "Arrow functions shortcut cannot contain non-symbol parameter", stream); } node = { name: Nodes.FunctionExpression, type: NodeType.Expression, - params: [{ name: _sym.symbolName, type: ParameterNodeType.Normal }], + params: [{ name: _sym.symbol!, kind: ParameterNodeKind.Normal }], locals: [], nonlocals: [] - } as Node; - var innerMeta = { outer: node, filename: meta.filename }; + }; + const innerMeta: IParseMeta = new ParseMeta(meta.filename, node, meta.cache); next = advance_next(stream, end_expression); - if (next[0] !== Tokens.Special && next[1] !== "{") { - return abruptify(node, abruptify({ - name: Nodes.ReturnStatment, - type: NodeType.Statment - }, _parse(next, stream, innerMeta))); + if (next.type === Tokens.Operator && next.body === "{") { + node.body = parse_body(stream, innerMeta); } else { - return (node.body = parse_body(stream, innerMeta), node); + node.body = [{ + name: Nodes.ReturnStatment, + type: NodeType.Statment, + body: [_parse(next, stream, innerMeta)], + outerBody: meta.outer + }]; } + return node; case "::": + stream.confirm_try(); prefix = "Argument binding expression: "; - next = advance_next(stream, "(", prefix); - if (next[0] !== Tokens.Special || next[1] !== "(") { - error_unexcepted_token(next); - } + except_next_token(stream, Tokens.Operator, "(", prefix); next = advance_next(stream, ")", prefix); - var args = parse_call_expression(next, stream, meta); - return { + return parse_operators({ name: Nodes.ArgumentBindingExpression, type: NodeType.Expression, body: [_sym], - args - }; + args: parse_call_expression(next, stream, meta) + }, stream, meta, ParseNodeKind.Expression); + + case "..": + stream.confirm_try(); + return parse_operators({ + name: Nodes.RangeValue, + type: NodeType.Expression, + body: [_sym, __parse(advance_next(stream, end_expression, "RangeValue expression:"), stream, meta)] + }, stream, meta, ParseNodeKind.Expression); case "!": - assert(_); - node = _parse(notExpressionOrIndentifier ? _sym : { + stream.confirm_try(); + node = parse_operators(notExpressionOrIndentifier ? _sym : { name: Nodes.NullAssertionExpression, type: NodeType.Expression, body: [_sym] - }, stream, meta) as Node; + }, stream, meta, ParseNodeKind.Expression); if (notExpressionOrIndentifier) { - pushDiagnosticMessage(DiagnosticSeverity.Warn, + pushDiagnostic(DiagnosticSeverity.Warn, `Null assertion expression doesn't have any effect on ${ type } value, ` + - `null assertion operator will be stripped in output`); + `null assertion operator will be stripped in output`, stream); } else { __used.na = true; } - return node as Node | [Node]; + return node; default: + stream.confirm_try(); parsed = parse_common_expressions(_sym, next, stream, meta); - if (next[1] in AssignmentOperatorTable) { - type === indentifier || _sym.name === Nodes.MemberAccessExpression || pushDiagnosticMessage(DiagnosticSeverity.RuntimeError, `Assignment on ${ type } will fail at runtime.`); + if (next.body in AssignmentOperatorTable) { + type === indentifier || _sym.name === Nodes.MemberAccessExpression || + pushDiagnostic(DiagnosticSeverity.RuntimeError, `Assignment on ${ type } will fail at runtime.`, stream); parsed = parse_assignment(_sym, next, stream, meta); } if (!parsed) { - pushDiagnosticMessage(DiagnosticSeverity.Warn, `Operator "${ next[1] }" is not supported`); + pushDiagnostic(DiagnosticSeverity.Warn, `Operator "${ next.body }" is not supported.`, stream); parsed = _sym; } - var _ = parsed && parsed.body; - if (_ && parsed.symbolName && isArray(_[1])) { - assert(_); - _[1] = _[1][0]; - parsed = [parsed]; - } return parsed; } } @@ -194,119 +180,106 @@ function parse_operators(_sym: Node, stream: TokenStream, meta: ParseMeta, type: * @param {import("./parser").ParseMeta} meta * @returns {import("./parser").Node | [import("./parser").Node]} */ -export function __parse(next: Token | Node, stream: TokenStream, meta: ParseMeta): Node | [Node] { - var prefix: string; - var _sym: Node; - var expression__ = expression as ParseNodeType.Expression; - var type__ = expression__ as ParseNodeType; - if (isNode(next) || isSymbol(next)) { - if (isNode(next)) { - _sym = next; - } else { - type__ = indentifier; - if (next[0] === Tokens.Keyword) { - _sym = keywordsHandlers[next[1]](stream) as Node; // Only __external_var and JS auto variable handlers can be invoked here - } else { - _sym = { - name: Nodes.Symbol, - type: NodeType.Expression, - symbolName: next[1] - }; - } - } - next = advance_next(stream, end_expression); - if (next[0] === Tokens.Keyword && next[1] === "with") { - return [_sym]; - } - if (next[0] === Tokens.String) { - advance_next(stream, end_expression); - return parse_operators({ - name: Nodes.CallExpression, - type: NodeType.Expression, - body: [_sym], - args: [{ - name: Nodes.StringValue, - type: NodeType.Expression, - body: next[1] - }] - }, stream, meta, expression__); - } - return parse_operators(_sym, stream, meta, type__); - } else if (next[0] === Tokens.Keyword) { - assert(next); - return keywordsHandlers[next[1]](stream, meta); - } else if (next[0] === Tokens.Number) { - assert(next); - let _temp = next[1]; +export function __parse(next: Token, stream: TokenStream, meta: IParseMeta): INode { + var _sym: INode; + if (isSymbol(next)) { + // next = stream.try(end_expression); + // if (next.type === Tokens.String) { + // stream.confirm_try(); + // return parse_operators({ + // name: Nodes.CallExpression, + // type: NodeType.Expression, + // body: [_sym], + // args: [{ + // name: Nodes.StringValue, + // type: NodeType.Expression, + // body: next.body + // }] + // }, stream, meta, expression__); + // } + // stream.cancel_try(); + return parse_operators(next.type === Tokens.Keyword ? keywords_handlers[next.body](stream, meta) : { + name: Nodes.Symbol, + type: NodeType.Expression, + symbol: next.body + }, stream, meta, indentifier); + } else if (next.type === Tokens.Keyword) { + assert_type(next); + return keywords_handlers[next.body](stream, meta); + } else if (next.type === Tokens.Number) { + assert_type(next); + let _temp = next.body; _sym = { name: Nodes.NumberValue, type: NodeType.Expression, - body: _temp + symbol: _temp }; - advance_next(stream, expression); - return parse_operators(_sym, stream, meta, ParseNodeType.Number); - } else if (next[0] === Tokens.Range) { - assert(next); - var splitted = next[1].split('..'); - advance_next(stream, expression); - return parse_operators({ - name: Nodes.RangeValue, - type: NodeType.Expression, - body: splitted.map(v => ({ name: Nodes.StringValue, type: NodeType.Expression, body: v })) - }, stream, meta, ParseNodeType.Range); - } else if (next[0] === Tokens.String) { - assert(next); - advance_next(stream, expression); + return parse_operators(_sym, stream, meta, ParseNodeKind.Number); + } else if (next.type === Tokens.String) { + assert_type(next); return parse_operators({ name: Nodes.StringValue, type: NodeType.Expression, - body: next[1] - }, stream, meta, ParseNodeType.String); - } else if (next[0] === Tokens.Comment || next[0] === Tokens.MultilineComment || next[0] === Tokens.Whitespace) { - // return (void next)!; - } else if (next[0] === Tokens.Special && ~[";", ")", "}", ","].indexOf(next[1])) { - // throw +(next[1] === ","); - } else if (next[0] === Tokens.Special) { - if (next[1] === "{") { + symbol: next.body + }, stream, meta, ParseNodeKind.String); + } else if (next.type === Tokens.Operator && ~[";", ")", "}", ","].indexOf(next.body)) { + + } else if (next.type === Tokens.Operator) { + if (next.body === "{") { return { name: Nodes.CodeBlock, type: NodeType.Statment, - body: parse_body(stream, meta) + body: parse_body(stream, meta), + outerBody: meta.outer }; - } else if (next[1] === "(") { + } else if (next.body === "(") { return parse_group_expression(stream, meta); } - } else if (next[0] === Tokens.Operator) { - meta.ie = true; - switch (next[1]) { + meta.insideExpression = true; + switch (next.body) { case "[": return parse_array_expression(stream, meta); case "@": - pushDiagnosticMessage(DiagnosticSeverity.Warn, "Decorators are not supported yet!"); - break; - - case "@@": - next = advance_next(stream, "symbol-constructor-property"); - if (next[0] !== Tokens.Symbol && next[0] !== Tokens.Keyword) { + pushDiagnostic(DiagnosticSeverity.Warn, "Decorators are not emitting yet!", stream); + next = advance_next(stream, "decorator name"); + if (isSymbol(next)) { + _sym = { + name: Nodes.Decorator, + type: NodeType.Expression, + symbol: next.body + }; + } else if (next.type === Tokens.Operator && next.body === "(") { + _sym = { + name: Nodes.Decorator, + type: NodeType.Expression + }; + var body = parse_group_expression(stream, meta); + throw "Decorators are not finished at all!"; + } else { error_unexcepted_token(next); } - advance_next(stream, end_expression); + break; + + case "@@": return parse_operators({ name: Nodes.SymbolShortcut, type: NodeType.Expression, - body: next[1] - }, stream, meta, expression__); + symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword, undefined, undefined, "symbol-constructor-property").body + }, stream, meta, ParseNodeKind.Expression); + + case "/": + return parse_operators(parse_regexp(stream), stream, meta, ParseNodeKind.Expression); case "-": case "+": case "!": - pushDiagnosticMessage(DiagnosticSeverity.Warn, `The operator "${ next[1] }" is not supported!`); + pushDiagnostic(DiagnosticSeverity.Warn, `The operator "${ next.body }" is not supported!`, stream); break; default: - pushDiagnosticMessage(DiagnosticSeverity.Warn, "?????????"); + pushDiagnostic(DiagnosticSeverity.Warn, "?????????", stream); } } return undefined!; @@ -316,55 +289,68 @@ export function __parse(next: Token | Node, stream: TokenStream, meta: ParseMeta * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta */ -function parse_any(stream: TokenStream, meta: ParseMeta) { - return null; +export function parse_expression

(stream: import("./utils/stream.js").TokenStream, meta: IParseMeta, prefix?: Prefix

) { + return __parse(advance_next(stream, end_expression, prefix), stream, meta); } -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ -export function parse_expression(stream: import("./utils/stream.js").TokenStream, meta: ParseMeta) { - return _parse(advance_next(stream, end_expression), stream, meta); + +export function _parse_and_assert_last_token

(stream: TokenStream, meta: IParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

, parse: typeof __parse = _parse) { + var arg: INode | [INode], next: Token; + arg = parse(advance_next(stream, end_expression, prefix), stream, meta); + except_next_token(stream, token_type, token_string); + return arg; } // var __line = 0; // var __column = 0; /**@type {import("./parser").Node} */ -var __top_fn_node: Node; -export var diagnostics = [] as IDiagnostic[]; -export function pushDiagnosticMessage(severity: DiagnosticSeverity, message: string) { - diagnostics!.push(Diagnostic(severity, message)); +var __top_fn_node: INode; +export const diagnostics: readonly IDiagnostic[] = []; +export class Diagnostic implements IDiagnostic { + public readonly line: number; + public readonly column: number; + constructor(public readonly severity: DiagnosticSeverity, public readonly message: string, { text_stream }: TokenStream = {} as never) { + const text = text_stream?.text.slice(0, text_stream.index); + this.line = text ? occurrences(text, '\n') + 1 : '?' as never; + this.column = text ? text_stream?.index - text?.lastIndexOf('\n') : '?' as never; + } + log() { + const level = (["Info", "Warn", "RuntimeError", "Error", "FatalError"] as Array)[this.severity]; + console.log(`Diagnostic[Level: ${ level }, Line: ${ this.line }, Column: ${ this.column }]:`, this.message); + } } -export var promises = [] as Promise[]; +export function pushDiagnostic(severity: DiagnosticSeverity, message: string, stream?: TokenStream, _diagnostics: readonly IDiagnostic[] = diagnostics) { + (diagnostics as IDiagnostic[]).push(new Diagnostic(severity, message, stream)); +} +export var promises: Promise[] = []; export interface ParserOutput { - output: Node; - diagnostics: IDiagnostic[]; - __used: Record; + readonly output: Readonly; + readonly diagnostics: readonly IDiagnostic[]; + readonly __used: Readonly>; } export var __cache = true; -export var __used: any; +export var __used: Record; /** - * @param {import("./utils/stream.js").TokenList} lexed + * @param {import("./utils/stream.js").TokenList} stream * @param {string} filename * @returns {import("./parser").ParserOutput | Promise} */ -export function parse(lexed: TokenList, filename: string, cache: boolean): ParserOutput | Promise { +export function parse(stream: TokenStream, filename: string, cache: boolean): ParserOutput | Promise { resetCounter(); __cache = cache; - var stream = Stream(lexed); // __line = __column = 0; __top_fn_node = { name: Nodes.AsyncFunctionExpression, type: NodeType.Expression, params: [], - locals: [] + locals: [], + meta: {} }; __used = {}; - __top_fn_node.body = main_parse(stream, filename, __top_fn_node); - var output = { + const output: ParserOutput = { diagnostics, output: __top_fn_node, __used - } as ParserOutput; + }; + __top_fn_node.body = main_parse(stream, filename, __top_fn_node, cache) as never; return promises.length ? Promise.all(promises).then(() => output) : output; } /* それは、にんげんはかたちをした〈モノ〉 */ @@ -373,8 +359,11 @@ export function parse(lexed: TokenList, filename: string, cache: boolean): Parse * @param {string} filename * @param {import("./parser").Node} outer */ -export function main_parse(stream: TokenStream, filename: string, outer: Node) { - var parsed = [] as Node[], next: Token; +export function main_parse(stream: TokenStream, filename: string, outer: INode, cache: boolean, insideExpression = false): SyntaxTree { + const parsed: INode[] = [], meta = new ParseMeta(filename, outer, cache, insideExpression); + var next: Token; + parse_shebang(stream, outer); + stream.move(); while (!nullish(next = stream.next)) { // try { // var newlines = occurrences(next[1], '\n'); @@ -384,12 +373,15 @@ export function main_parse(stream: TokenStream, filename: string, outer: Node) { // } // var __column_cache = __column += next[1].length - next[1].lastIndexOf("\n"); try { - var _parsed = _parse(next, stream, { outer, filename }); - _parsed && parsed.push(isArray(_parsed) ? _parsed[0] : _parsed); + var _parsed = _parse(next, stream, meta); + _parsed && parsed.push(_parsed); } catch (error) { - pushDiagnosticMessage(error && typeof error !== "string" && !(error instanceof SyntaxError) ? - DiagnosticSeverity.FatalError : - DiagnosticSeverity.Error, error); + if (String(error).startsWith("SyntaxError") ? error + "" != last! : true) { + var last = error + ""; + console.log(error && typeof error !== "string" && !(error instanceof SyntaxError) ? + DiagnosticSeverity.FatalError : + DiagnosticSeverity.Error, error as never); + } } // } catch (error) { // if (typeof error === "string") { @@ -403,3 +395,16 @@ export function main_parse(stream: TokenStream, filename: string, outer: Node) { return parsed; } +function parse_shebang({ text_stream }: TokenStream, outer: INode) { + var next = text_stream.move(), text = ""; + if (next === "#") { + if (text_stream.move() === "!") { + while ((next = text_stream.move()) !== "\n" && next !== "\r") { + text += next; + } + } else text_stream.down(2); + } else text_stream.down(); + if (__top_fn_node === outer) + __top_fn_node.meta!.shebang = text; +} + diff --git a/src/lib/parsers/__all__.ts b/src/lib/parsers/__all__.ts new file mode 100644 index 0000000..c5c1287 --- /dev/null +++ b/src/lib/parsers/__all__.ts @@ -0,0 +1,11 @@ +export * from "./array-expression.js"; +export * from "./assignments.js"; +export * from "./body-parser.js"; +export * from "./call-expression.js"; +export * from "./common-expressions.js"; +export * from "./external-var.js"; +export * from "./group-expression.js"; +export * from "./keywords.js"; +export * from "./member-access.js"; +export * from "./regexp.js"; + diff --git a/src/lib/parsers/__external_var.ts b/src/lib/parsers/__external_var.ts deleted file mode 100644 index 6216199..0000000 --- a/src/lib/parsers/__external_var.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { error_unexcepted_token } from "../utils/util.js"; -import { Nodes, NodeType, Tokens } from "../enums"; -import { end_expression } from "../utils/constants.js"; -import { advance_next } from "../utils/advancers.js"; -import { Node } from "../nodes.js"; -import type { TokenStream } from "../utils/stream.js"; - -export function __external_var_creator(type: NodeType) { - return function __external_var(stream: TokenStream) { - var prefix = `External variable ${ end_expression }:`; - var next = advance_next(stream, "(", prefix); - if (next[0] !== Tokens.Special || next[1] !== "(") { - error_unexcepted_token(next); - } - next = advance_next(stream, "string", prefix); - if (next[0] !== Tokens.String) { - error_unexcepted_token(next); - } - var name = next[1]; - next = advance_next(stream, ")", prefix); - if (next[0] !== Tokens.Special || next[1] !== ")") { - error_unexcepted_token(next); - } - return { - name: Nodes.ExternalVariable, - type: type, - body: name - } as Node; - }; -} diff --git a/src/lib/parsers/array-expression.ts b/src/lib/parsers/array-expression.ts index 0e2fb43..aaf8df5 100644 --- a/src/lib/parsers/array-expression.ts +++ b/src/lib/parsers/array-expression.ts @@ -1,50 +1,43 @@ -import { isArray, error_unexcepted_token } from "../utils/util.js"; -import { Nodes, NodeType, Tokens } from "../enums"; +import { error_unexcepted_token } from "../utils/util.js"; +import { Nodes, NodeType, ParseNodeKind, Tokens } from "../enums"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; -import { _parse, __parse } from "../parse-dummies.js"; -import type { Node, ParseMeta } from "../nodes"; +import { parse_operators, _parse, __parse } from "../parser.js"; +import type { INode, IParseMeta } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; -export function parse_array_expression(stream: TokenStream, meta: ParseMeta) { +export function parse_array_expression(stream: TokenStream, meta: IParseMeta) { + var body: INode[] = []; /**@type {import("./parser").Node}*/ - var node: Node = { + var node: INode = { name: Nodes.Array, type: NodeType.Expression, - body: [] + body }; - var body = node.body! as Node[]; - var parsed: Node | [Node]; + var parsed: INode; var next: Token; - while (1) { - next = advance_next(stream, end_expression); - if (next[0] === Tokens.Special && next[1] === ",") { + while (next = advance_next(stream, end_expression)) { + if (next.type === Tokens.Operator && next.body === ",") { body.push({ name: Nodes.UndefinedValue, type: NodeType.Expression }); continue; - } else if (next[0] === Tokens.Operator && next[1] === "]") { + } else if (next.type === Tokens.Operator && next.body === "]") { break; } parsed = __parse(next, stream, meta); - if (isArray(parsed)) { - next = stream.next; - parsed = parsed[0]; - } - else - next = advance_next(stream, ']" or ",'); - if ((next[0] !== Tokens.Special || next[1] !== ",") && - (next[0] !== Tokens.Operator || next[1] !== ']')) { + next = advance_next(stream, ']" or ",'); + if (next.type !== Tokens.Operator || next.body !== "," && next.body !== ']') { error_unexcepted_token(next); } body.push(parsed); - if (next[1] === "]") { + if (next.body === "]") { break; } } // trailing undefineds are needed here // remove_trailing_undefined(body); - parsed = __parse(node, stream, meta); + parsed = parse_operators(node, stream, meta, ParseNodeKind.Expression); return parsed; } diff --git a/src/lib/parsers/assignments.ts b/src/lib/parsers/assignments.ts index a61c100..892ce4b 100644 --- a/src/lib/parsers/assignments.ts +++ b/src/lib/parsers/assignments.ts @@ -1,37 +1,35 @@ import { Nodes, NodeType, AccessChainItemKind, DiagnosticSeverity } from "../enums"; -import { AssignmentOperatorTable, AssignmentOperatorTableKeys } from "../utils/table.js"; -import { Diagnostic } from "../utils/diagnostics.js"; +import { AssignmentOperatorTable, type AssignmentOperatorTableKeys } from "../utils/table.js"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; -import { diagnostics, _parse } from "../parse-dummies.js"; +import { pushDiagnostic, _parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { Node, ParseMeta, AccessChainItem } from "../nodes"; +import type { INode, IParseMeta, AccessChainItem } from "../nodes"; -export function parse_assignment(_sym: Node, next: Token, stream: TokenStream, meta: ParseMeta): Node | undefined { - if (name = AssignmentOperatorTable[next[1] as AssignmentOperatorTableKeys] as Nodes | undefined) { +export function parse_assignment(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta): INode | undefined { + if (name = AssignmentOperatorTable[next.body as AssignmentOperatorTableKeys] as Nodes | undefined) { if (_sym.name === Nodes.MemberAccessExpression) { - var body = _sym.body!; - var length = body.length; - var name: Nodes | undefined, parsed: Node, node: Node; - for (var index = 0, item: AccessChainItem; index < length; index++) { - item = body[index] as AccessChainItem; + var body = _sym.body as AccessChainItem[]; + var name: Nodes | undefined, parsed: INode, node: INode; + for (var index = 0; index < body.length; index++) { + const item = body[index]; if (item.kind === AccessChainItemKind.Optional || item.kind === AccessChainItemKind.OptionalComputed) { - diagnostics.push(Diagnostic(DiagnosticSeverity.RuntimeError, - `The left-hand side of an assignment expression may not be an optional property access.`)); + pushDiagnostic(DiagnosticSeverity.RuntimeError, + `The left-hand side of an assignment expression may not be an optional property access.`, stream); } } } - parsed = _parse(advance_next(stream, end_expression), stream, meta) as Node; + parsed = _parse(advance_next(stream, end_expression), stream, meta) as INode; node = { name, type: NodeType.Expression, body: [_sym, parsed], - symbolName: next[1] + symbol: next.body }; if (_sym.name !== Nodes.MemberAccessExpression && - !~meta.outer.locals!.indexOf(_sym.symbolName!) && - !~(meta.outer.nonlocals?.indexOf(_sym.symbolName!) ?? -1)) { - meta.outer.locals!.push(_sym.symbolName!); + !~meta.outer.locals!.indexOf(_sym.symbol!) && + !~(meta.outer.nonlocals?.indexOf(_sym.symbol!) ?? -1)) { + meta.outer.locals!.push(_sym.symbol!); } return node; } diff --git a/src/lib/parsers/body-parser.ts b/src/lib/parsers/body-parser.ts index c970445..55364e6 100644 --- a/src/lib/parsers/body-parser.ts +++ b/src/lib/parsers/body-parser.ts @@ -1,42 +1,31 @@ -import { isArray } from "../utils/util.js"; import { Tokens, DiagnosticSeverity } from "../enums"; -import { Diagnostic } from "../utils/diagnostics.js"; -import { advance_next } from "../utils/advancers.js"; -import { _parse, diagnostics } from "../parse-dummies.js"; +import { advance_next, except_next_token, type Prefix } from "../utils/advancers.js"; +import { _parse, pushDiagnostic } from "../parser.js"; +import type { IParseMeta, INode } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { ParseMeta, Node } from "../nodes"; /** * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta */ -export function parse_body(stream: TokenStream, meta: ParseMeta): Node[] { - var next: Token = advance_next(stream, "}"), tokens = [] as Node[]; +export function parse_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { + var next: Token = advance_next(stream, "}", prefix), nodes: INode[] = []; //console.log(1123124); - while ((next /*, console.log("next:", next), next*/)[0] !== Tokens.Special || next[1] !== "}") { + while ((next /*, console.log("next:", next), next*/).type !== Tokens.Operator || next.body !== "}") { // console.log(next); try { var _parsed = _parse(next, stream, meta); - if (isArray(_parsed)) { - _parsed[0] && tokens.push(_parsed[0]); - next = stream.next; - if (next[0] === Tokens.Special && next[1] === "}") { - break; - } - } else { - _parsed && tokens.push(_parsed); - next = advance_next(stream, "}"); - } + _parsed && nodes.push(_parsed); + next = advance_next(stream, "}", prefix); } catch (_e) { - if (_e === 1) { - break; - } else if (_e === 0) { - break; - } else { - diagnostics.push(Diagnostic(DiagnosticSeverity.Error, String(_e))); - next = advance_next(stream, "}"); - } + pushDiagnostic(DiagnosticSeverity.Error, _e as never, stream); + next = advance_next(stream, "}", prefix); } } - return tokens; + return nodes; +} + +export function parse_next_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { + except_next_token(stream, Tokens.Operator, "{", prefix); + return parse_body(stream, meta, prefix); } diff --git a/src/lib/parsers/call-expression.ts b/src/lib/parsers/call-expression.ts index 7a4e4f6..d8bed65 100644 --- a/src/lib/parsers/call-expression.ts +++ b/src/lib/parsers/call-expression.ts @@ -1,38 +1,32 @@ -import { isArray, error_unexcepted_token } from "../utils/util.js"; +import { error_unexcepted_token } from "../utils/util.js"; import { Nodes, NodeType, Tokens } from "../enums"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; -import { __parse } from "../parse-dummies.js"; +import { __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { ParseMeta, Node } from "../nodes"; +import type { IParseMeta, INode } from "../nodes"; -export function parse_call_expression(next: Token, stream: TokenStream, meta: ParseMeta) { - var arg: Node | [Node], args = [] as Node[]; - if (next[0] !== Tokens.Special || next[1] !== ")") { +export function parse_call_expression(next: Token, stream: TokenStream, meta: IParseMeta): INode[] { + const args: INode[] = []; + if (next.type !== Tokens.Operator || next.body !== ")") { while (1) { - if (next[0] === Tokens.Special && next[1] === ")") { + if (next.type === Tokens.Operator && next.body === ")") { break; } - if (next[0] === Tokens.Special && next[1] === ",") { + if (next.type === Tokens.Operator && next.body === ",") { args.push({ name: Nodes.UndefinedValue, type: NodeType.Expression }); next = advance_next(stream, end_expression); continue; - } else { - arg = __parse(next, stream, meta) as Node | [Node]; } - if (isArray(arg)) { - next = stream.next; - arg = arg[0]; - } else - next = advance_next(stream, ")"); - args.push(arg); - if (next[0] === Tokens.Special) { - if (next[1] === ")") { + args.push(__parse(next, stream, meta)); + next = advance_next(stream, ")"); + if (next.type === Tokens.Operator) { + if (next.body === ")") { break; - } else if (next[1] !== ",") { + } else if (next.body !== ",") { error_unexcepted_token(next); } } else diff --git a/src/lib/parsers/common-expressions.ts b/src/lib/parsers/common-expressions.ts index 55abb80..6351030 100644 --- a/src/lib/parsers/common-expressions.ts +++ b/src/lib/parsers/common-expressions.ts @@ -1,27 +1,28 @@ import { isArray } from "../utils/util.js"; import { Nodes, NodeType } from "../enums"; -import { CommonOperatorTable, CommonOperatorTableKeys } from "../utils/table.js"; +import { CommonOperatorTable, type CommonOperatorTableKeys } from "../utils/table.js"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; -import { __parse } from "../parse-dummies.js"; +import { __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { Node, ParseMeta } from "../nodes"; +import type { INode, IParseMeta } from "../nodes"; -export function parse_common_expressions(_sym: Node, next: Token, stream: TokenStream, meta: ParseMeta) { - var parsed: Node, node: Node, name = CommonOperatorTable[next[1] as CommonOperatorTableKeys] as Nodes | undefined; +export function parse_common_expressions(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { + var parsed: INode, node: INode, name: Nodes | undefined = CommonOperatorTable[next.body as CommonOperatorTableKeys]; if (name) { - parsed = __parse(advance_next(stream, end_expression), stream, meta) as Node; + parsed = __parse(advance_next(stream, end_expression), stream, meta) as INode; node = { name, type: NodeType.Expression, body: [_sym, parsed], - symbolName: next[1] + symbol: { and: "&&", or: "||" }[next.body] || next.body }; if (name === Nodes.ExponentiationExpression) { // Here is the logic: // If parsed is a common | assignment expression + // Succumb it onto this ** expression // @ts-ignore - if (typeof parsed.symbolName === "string" && isArray(parsed.body)) { + if (typeof parsed.symbol === "string" && isArray(parsed.body)) { // // @ts-ignore node.body[1] = parsed.body[0]; diff --git a/src/lib/parsers/external-var.ts b/src/lib/parsers/external-var.ts new file mode 100644 index 0000000..b918acd --- /dev/null +++ b/src/lib/parsers/external-var.ts @@ -0,0 +1,20 @@ +import { Nodes, NodeType, Tokens } from "../enums"; +import { except_next_token } from "../utils/advancers.js"; +import { undefined } from "../utils/util.js"; +import type { INode } from "../nodes.js"; +import type { TokenStream } from "../utils/stream.js"; + +export function __external_var_creator(type: NodeType) { + return function __external_var(stream: TokenStream): INode { + const prefix = `External variable expression:`; + except_next_token(stream, Tokens.Operator, "(", prefix); + except_next_token(stream, Tokens.String, undefined, prefix); + const { body } = stream.next; + except_next_token(stream, Tokens.Operator, ")", prefix); + return { + name: Nodes.ExternalVariable, + type: type, + symbol: body + }; + }; +} diff --git a/src/lib/parsers/group-expression.ts b/src/lib/parsers/group-expression.ts index 4d529a6..a2dc967 100644 --- a/src/lib/parsers/group-expression.ts +++ b/src/lib/parsers/group-expression.ts @@ -1,29 +1,26 @@ -import { Nodes, NodeType, Tokens } from "../enums.js"; +import { Nodes, NodeType, ParseNodeKind, Tokens } from "../enums.js"; import { advance_next } from "../utils/advancers.js"; import { end_expression } from "../utils/constants.js"; -import { error_unexcepted_token, includes, isArray } from "../utils/util.js"; -import { __parse } from "../parse-dummies.js"; -import { Token, TokenStream } from "../utils/stream.js"; -import type { Node, ParseMeta } from "../nodes.js"; +import { error_unexcepted_token, includes } from "../utils/util.js"; +import { parse_operators, __parse } from "../parser.js"; +import type { Token, TokenStream } from "../utils/stream.js"; +import type { INode, IParseMeta } from "../nodes.js"; -export function parse_group_expression(stream: TokenStream, meta: ParseMeta) { - var prefix = "Group expression:" as const, +export function parse_group_expression(stream: TokenStream, meta: IParseMeta) { + var prefix = "Group expression:" as const, next: Token, - body: Node[] = [], - node = { name: Nodes.GroupExpression, type: NodeType.Expression, body } as Node, - parsed: Node | [Node]; - while (next = advance_next(stream, end_expression, prefix), next[0] !== Tokens.Special || next[1] !== ")") { + body: INode[] = [], + node: INode = { name: Nodes.GroupExpression, type: NodeType.Expression, body }, + parsed: INode; + while (next = advance_next(stream, end_expression, prefix), next.type !== Tokens.Operator || next.body !== ")") { parsed = __parse(next, stream, meta); - if (isArray(parsed)) { - parsed = parsed[0]; - next = stream.next; - } else next = advance_next(stream, end_expression, prefix); + next = advance_next(stream, end_expression, prefix); body.push(parsed); - if (next[0] !== Tokens.Special && !includes(",)", next[1])) { + if (next.type !== Tokens.Operator && !includes(",)", next.body)) { error_unexcepted_token(next); - } else if (next[1] === ")") { + } else if (next.body === ")") { break; } } - return __parse(node, stream, meta); + return parse_operators(node, stream, meta, ParseNodeKind.Expression); } \ No newline at end of file diff --git a/src/lib/parsers/keywords.ts b/src/lib/parsers/keywords.ts new file mode 100644 index 0000000..2439614 --- /dev/null +++ b/src/lib/parsers/keywords.ts @@ -0,0 +1,643 @@ +import { + isArray, include, undefined, SyntaxError, random_var_name, includes, + error_unexcepted_token, assert_type, except_token +} from "../utils/util.js"; +import { _echo } from "../utils/_echo.js"; +import { FunctionNodeKind, Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, Tokens, DiagnosticSeverity } from "../enums"; +import { lex } from "../lexer.js"; +import { meberAccessOperators, end_expression } from "../utils/constants.js"; +import { _parseMemberAccess } from "./member-access.js"; +import { advance_next, except_next_token } from "../utils/advancers.js"; +import { parse_body, parse_next_body } from "./body-parser.js"; +import { __cache, main_parse, promises, _parse, __parse, __used, _parse_and_assert_last_token, pushDiagnostic } from "../parser.js"; +import { __external_var_creator } from "./external-var.js"; +import { parse_call_expression } from "./call-expression.js"; +import { type IParseMeta, type INode, type IParameterNode, type IClassNode, type AccessChainItem, type IUsingStatmentNode, ParseMeta, ParameterNode } from "../nodes"; +import type { TokenStream } from "../utils/stream.js"; + +type KeywordParsers = Readonly Readonly>>; +export var keywords_handlers = { + /** + * @param {import("./utils/stream.js").TokenStream} stream + * @param {import("./parser").ParseMeta} meta + */ + nonlocal(stream, meta) { + if (!meta.outer.nonlocals) { + throw "Nonlocal statment: this statment cannot be used in top-level scope!"; + } + const next = except_next_token(stream, Tokens.Symbol); + meta.outer.nonlocals.push(next.body); + meta.outer.locals = meta.outer.locals!.filter(sym => sym !== next.body); + return { + name: Nodes.Empty, + type: NodeType.Ephemerial + }; + }, + /** + * @param {import("./utils/stream.js").TokenStream} stream + * @param {import("./parser").ParseMeta} meta + */ + include(stream, meta) { + var next = advance_next(stream, `string" | "{`), node: INode, file: URL; + if (next.type === Tokens.String) { + node = { + name: Nodes.IncludeStatment, + type: NodeType.Expression + }; + } else if (next.type === Tokens.Operator && next.body === "{") { + node = { + name: Nodes.NamedIncludeStatment, + type: NodeType.Statment, + outerBody: meta.outer + }; + except_next_token(stream, Tokens.Operator, "}", "Include statment:"); + except_next_token(stream, Tokens.Keyword, "from", "Include statment:"); + except_next_token(stream, Tokens.String, undefined, "Include statment:"); + } else { + error_unexcepted_token(next); + } + file = new URL(next.body, meta.filename); + const included = include(file, __cache); + /** + * @param {string} included + */ + function _(included: string) { + var parsed = main_parse(lex(included), file.href, meta.outer, meta.cache); + node.body = parsed as never; + return parsed; + } + node.body = (typeof included !== "string" ? promises[promises.push(included.then(_)) - 1] : _(included)) as never; + return node; + }, + /** + * @param {import("./utils/stream.js").TokenStream} stream + * @param {import("./parser").ParseMeta} meta + */ + if(stream, meta) { + except_next_token(stream, Tokens.Operator, "("); + var expression = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")"), expressions: INode[]; + var next = advance_next(stream, "{"); + if (next.type === Tokens.Operator && next.body === "{") { + expressions = parse_body(stream, meta); + } else { + expressions = [_parse(next, stream, meta) as INode]; + } + var node: INode = { + name: Nodes.IfStatment, + type: NodeType.Statment, + body: expressions, + args: [expression], + else: undefined!, + elseif: undefined!, + outerBody: meta.outer + // /** + // * @param {boolean} pretty + // * @param {string} whitespace + // */ + // toString(pretty: boolean, whitespace: string) { + // if (pretty) { + // return `if (${ expression }) ${ impl ? expressions.toString(true) : `{\n${ whitespace + " " }${ expressions.toString(true, whitespace + " ") }${ whitespace }\n}` }`; + // } else { + // return `if(${ expression })${ impl ? expressions.toString(false) : `{${ expressions.toString(false) }}` }`; + // } + // } + }; + try { + next = stream.try("else"); + } catch (error) { + return node; + } + if (next.type === Tokens.Keyword && next.body === "else") { + stream.confirm_try(); + next = advance_next(stream, "if"); + if (next.type === Tokens.Keyword && next.body === "if") { + node.elseif = keywords_handlers.if(stream, meta); + } else { + node.else = { + name: Nodes.ElseStatment, + type: NodeType.Statment, + body: next.type === Tokens.Operator && next.body === "{" ? parse_body(stream, meta) : [_parse(next, stream, meta) as INode], + outerBody: meta.outer + }; + } + } else { + stream.cancel_try(); + } + return node; + }, + true() { + return { + name: Nodes.TrueValue, + type: NodeType.Expression + }; + }, + false() { + return { + name: Nodes.FalseValue, + type: NodeType.Expression + }; + }, + undefined() { + return { + name: Nodes.UndefinedValue, + type: NodeType.Expression + }; + }, + null() { + return { + name: Nodes.NullValue, + type: NodeType.Expression + }; + }, + NaN() { + return { + name: Nodes.NaNValue, + type: NodeType.Expression + }; + }, + Infinity() { + return { + name: Nodes.InfinityValue, + type: NodeType.Expression + }; + }, + arguments() { + return { + name: Nodes.ArgumentsObject, + type: NodeType.Expression + }; + }, + // /** + // * @param {import("./utils/stream.js").TokenStream} stream + // */ + // interface(stream) { + // // const prefix = "Interface statment:"; + // // var next = advance_next(stream, "symbol", prefix); + // // if (next[0] !== Tokens.Symbol) { + // // error_unexcepted_token(next); + // // } + // // next = advance_next(stream, "{", prefix); + // // if (next[0] !== Tokens.Special || next[1] !== "{") { + // // error_unexcepted_token(next); + // // } + // assert<0>(0, ""); + // }, + /** + * @param {import("./utils/stream.js").TokenStream} stream + */ + async(stream, meta) { + except_next_token(stream, Tokens.Keyword, "fn", "Async(Generator?)Function statment:"); + return keywords_handlers.fn(stream, meta, FunctionNodeKind.Async); + }, + /** + * @param {import("./utils/stream.js").TokenStream} stream + */ + not(stream, meta) { + return { + name: Nodes.LiteralLogicalNotExpression, + type: NodeType.Expression, + body: [__parse(advance_next(stream, end_expression), stream, meta)] + }; + }, + /** + * @param {import("./utils/stream.js").TokenStream} stream + */ + __external_var: __external_var_creator(NodeType.Expression), + /** + * @param {import("./utils/stream.js").TokenStream} stream + */ + __external: __external_var_creator(NodeType.Statment), + /** + * @param {import("./utils/stream.js").TokenStream} stream + * @param {import("./parser").ParseMeta} meta + */ + fn(stream, meta, type: FunctionNodeKind = FunctionNodeKind.Sync) { + type _1 = "Function statment:"; + type _2 = `Generator${ _1 }`; + type _3 = `Async${ _1 }`; + type _4 = `Async${ _2 }`; + var _prefix = "Function statment:"; + var _ = [ + _prefix, + "Generator" + _prefix, + "Async" + _prefix + ] as string[] as [_1, _2, _3, _4]; + _[3] = "Async" + _[1] as _4; + const prefix = _[type]; + var name = ""; + var params: IParameterNode[] = []; + var next = advance_next(stream, 'symbol" | "(', prefix); + var paramType: ParameterNodeKind; + var hasRest = false; + var index: number; + if (next.type === Tokens.Operator && next.body === "*") { + if (type === FunctionNodeKind.Sync) { + type = FunctionNodeKind.Generator; + } else if (type === FunctionNodeKind.Async) { + type = FunctionNodeKind.AsyncGenerator; + } + next = advance_next(stream, "symbol", prefix); + } else if (type === FunctionNodeKind.Generator || type === FunctionNodeKind.AsyncGenerator) { + throw `${ prefix } Unexcepted token '${ next.body }' ('*' excepted)`; + } + if (next.type === Tokens.Symbol) { + name = next.body; + next = advance_next(stream, "(", prefix); + } + if (next.type !== Tokens.Operator && next.body !== "(") { + error_unexcepted_token(next); + } + const node: INode = { + name: type as never, + type: NodeType.Expression, + params, + symbol: name, + locals: [], + nonlocals: [] + }; + const innerMeta: IParseMeta = new ParseMeta(meta.filename, node, meta.cache); + for (; ;) { + paramType = ParameterNodeKind.Normal; + next = advance_next(stream, "symbol", prefix); + if (next.type === Tokens.Operator && next.body === ",") { + params.push(new ParameterNode("", ParameterNodeKind.Empty, undefined)); + continue; + } + if (next.type === Tokens.Operator && next.body === "...") { + if (hasRest) { + throw SyntaxError(`Cannot append second rest parameter to ${ name ? `function ${ name }` : "anonymous function" }`); + } + hasRest = true; + paramType = ParameterNodeKind.Rest; + next = advance_next(stream, "symbol", prefix); + } + if (next.type === Tokens.Symbol) { + const { body } = next; + next = advance_next(stream, ",", prefix); + + if (next.type === Tokens.Operator && next.body === "=") { + var parsed = _parse(advance_next(stream, end_expression, prefix), stream, innerMeta); + next = advance_next(stream, end_expression, prefix); + } + params.push(new ParameterNode(body, paramType, parsed!)); + + if (next.type === Tokens.Operator && next.body === ")") { + break; + } else if (next.type !== Tokens.Operator && next.body !== ",") { + error_unexcepted_token(next); + } + } else if (next.type === Tokens.Operator && next.body === ",") { + params.push(new ParameterNode("", paramType || ParameterNodeKind.Empty, undefined)); + } else if (next.type === Tokens.Operator && next.body === ")") { + break; + } else { + error_unexcepted_token(next); + } + } + index = params.length; + for (; index && params[--index].kind === ParameterNodeKind.Empty;) + params.pop(); + // apply(console.log, console, params); // IE 8 is very old and strange shit + next = advance_next(stream, "{", prefix); + if (next.type === Tokens.Operator && next.body === "=>") { + next = advance_next(stream, end_expression, prefix); + innerMeta.insideExpression = true; + if (next.type !== Tokens.Operator && next.body !== "{") { + node.body = [{ + name: Nodes.ReturnStatment, + type: NodeType.Statment, + body: [_parse(next, stream, innerMeta)], + outerBody: node + }]; + return node; + } + } + except_token(next, Tokens.Operator, "{"); + node.body = parse_body(stream, innerMeta); + return node; + }, + class(stream, meta) { + const type = meta.insideExpression ? NodeType.Expression : NodeType.Statment; + const node: IClassNode = { + name: Nodes.ClassExpression, + type, + getters: [], + settets: [], + props: [], + methods: [], + privateGetters: [], + privateSettets: [], + privateMethods: [], + privateProps: [], + mixins: [], + outerBody: meta.outer + }; + const prefix = "Class expression:"; + var next = advance_next(stream, ["{", "symbol", "extends"].join('" | "'), prefix); + if (next.type === Tokens.Symbol) { + node.symbol = next.body; + next = advance_next(stream, end_expression, prefix); + } + if (next.type === Tokens.Keyword && next.body === "extends") { + var extender = _parse(advance_next(stream, end_expression, prefix), stream, meta); + node.extends = extender; + next = advance_next(stream, "any", prefix); + if (next.type === Tokens.Keyword && next.body === "with") { + while (next.type !== Tokens.Operator || next.body !== "{") { + var parsed = _parse(advance_next(stream, end_expression, prefix), stream, meta); + next = advance_next(stream, "any", prefix); + if (next.type !== Tokens.Operator || (next.body !== "," && next.body !== "{")) { + error_unexcepted_token(next); + } + node.mixins.push(parsed); + } + } + } + if (!type && !node.symbol) { + pushDiagnostic(DiagnosticSeverity.Warn, "Class statment doesn't have a name - a random name will be given during compilation", stream); + node.symbol = random_var_name(); + } + if (next.type === Tokens.Operator && next.body === "{") { + while ((next = advance_next(stream, ["keyword", "symbol", "string"].join('" | "'), prefix)).body !== "}" && + next.type !== Tokens.Operator) { + if (includes([Tokens.Symbol, Tokens.String, Tokens.Keyword], next.type)) { + var next2 = advance_next(stream, ["=", "symbol", "("].join('" | "'), prefix); + if (next.type === Tokens.Keyword) + if (next2.type === Tokens.Symbol && includes(["get", "set", "async"] as const, next.body)) { + } + } + } + // next = next_and_skip_shit_or_fail(stream, "}", prefix); + // if (next[0] !== Tokens.Special || next[1] !== "}") { + // error_unexcepted_token(next); + // } + } else + error_unexcepted_token(next); + return node; + }, + return(stream, meta) { + return { + name: Nodes.ReturnStatment, + type: NodeType.Statment, + body: [_parse(advance_next(stream, end_expression, "Return statment:"), stream, meta)], + outerBody: meta.outer + }; + }, + throw(stream, meta) { + __used.throw = true; + return { + name: Nodes.ThrowExpression, + type: NodeType.Expression, + body: [__parse(advance_next(stream, end_expression, "Throw statment:"), stream, meta)] + }; + }, + yield(stream, meta) { + var next = advance_next(stream, end_expression, "Yield expression:"); + var yield_from = next.type === Tokens.Operator && next.body === "*"; + var expression = yield_from ? + __parse(advance_next(stream, end_expression), stream, meta) : + __parse(next, stream, meta); + return { + name: yield_from ? Nodes.YieldFromExpression : Nodes.YieldExpression, + type: NodeType.Expression, + outerBody: meta.outer, + body: [expression] + }; + }, + await(stream, meta) { + if (meta.outer.name === Nodes.FunctionExpression) { + pushDiagnostic(DiagnosticSeverity.RuntimeError, `Using await inside Sync Function Expression will fail at runtime`, stream); + } + if (meta.outer.name === Nodes.GeneratorFunctionExpression) { + pushDiagnostic(DiagnosticSeverity.Warn, `Await is not intended to be used inside Generator Functions`, stream); + } + const prefix = "Await expression:"; + var next = advance_next(stream, end_expression, prefix); + if (next.type === Tokens.Operator && next.body === ".") { + next = advance_next(stream, ['any', 'all', 'allSettled', 'race'].join('" | "'), prefix); + if (next.type === Tokens.Symbol && /^(any|all(Settled)?|race)$/m.test(next.body)) { + var expression = _parse(advance_next(stream, end_expression, prefix), stream, meta); + var _: INode = { + name: Nodes.CallExpression, + type: NodeType.Expression, + body: [{ + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: `p.${ next.body }` + }], + args: [expression as never] + }; + expression = _; + } else { + error_unexcepted_token(next); + } + } else { + expression = _parse(next, stream, meta); + } + return { + name: Nodes.AwaitExpression, + type: NodeType.Expression, + outerBody: meta.outer, + body: [expression as never] + }; + }, + this() { + return { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: "this" + }; + }, + keep(stream, meta) { + const prefix = "Keep statment:"; + const args: INode[] = []; + except_next_token(stream, Tokens.Operator, "("); + var next = advance_next(stream, "symbol", prefix); + // ??? + if (next.type === Tokens.Operator || next.body !== ")") { + while (1) { + if (next.type === Tokens.Operator && next.body === ")") { + break; + } + if (next.type === Tokens.Operator && next.body === ",") { + next = advance_next(stream, end_expression); + continue; + } else { + var next2, isConstantObject = next.type === Tokens.Keyword && includes(["this", "arguments"] as const, next.body), + arg: INode = (isConstantObject ? keywords_handlers[next.body]() : { + name: Nodes.Symbol, + type: NodeType.Expression, + symbol: next.body + }); + if (!(isConstantObject || next.type === Tokens.Symbol)) { + error_unexcepted_token(next); + } + next2 = advance_next(stream, [',', ')'].join('" | "') + meberAccessOperators.join('" | "'), prefix); + if (next2.type === Tokens.Operator && includes(meberAccessOperators, next2.body)) { + arg = { + name: Nodes.MemberAccessExpression, + type: NodeType.Expression, + body: _parseMemberAccess(arg, next, stream, meta), + }; + } else { + isConstantObject && pushDiagnostic(DiagnosticSeverity.RuntimeError, `Assignment to "${ next.type }" will fail at runtime!`, stream); + next = next2; + } + } + args.push(arg); + if (next.type === Tokens.Operator) { + if (next.body === ")") { + break; + } else if (next.body !== ",") { + error_unexcepted_token(next); + } + } else + error_unexcepted_token(next); + next = advance_next(stream, "symbol"); + } + } + except_next_token(stream, Tokens.Operator, "{", prefix); + return { + name: Nodes.KeepStatment, + type: NodeType.Statment, + body: parse_body(stream, meta), + args, + outerBody: meta.outer + } as INode; + }, + new(stream, meta) { + const expression = __parse(advance_next(stream, end_expression), stream, meta); + // The logic is to intercept from parsed node last CallExpression and mutate it into NewExpression + const node: INode = { name: Nodes.NewExpression, type: NodeType.Expression, body: [expression] }, intercepted: INode[] = []; + var body = expression.body, expression_ = expression; + while (expression_.type === NodeType.Expression && isArray(body)) { + expression_ = (body[0] as INode).name ? body[0] as INode : (body[0] as AccessChainItem).body; + intercepted.push(expression_); + body = expression_.body; + } + for (var index = 0, length = intercepted.reverse().length; index < length; index++) { + const intercepted_ = intercepted[index]; + if (intercepted_.name === Nodes.CallExpression) { + const expressionAbove = intercepted[index + 1] ?? expression; + (node.body as INode[])[0] = intercepted_; + if (expressionAbove.name !== Nodes.MemberAccessExpression) { + (expressionAbove.body as INode[])[0] = node; + } else { + (expressionAbove.body as AccessChainItem[])[0] = { + body: node, + kind: AccessChainItemKind.Head + }; + } + return expression; + } + } + return node; + }, + // TODO + try(stream, meta) { + const node = { + name: Nodes.TryStatment, + type: NodeType.Statment, + catch: null!, + else: null!, + body: null!, + finally: null!, + args: null!, + outerBody: meta.outer + } as Partial; + var prefix: `Try${"" | "-Using"} statment:` = "Try statment:", + next = advance_next(stream, end_expression, prefix), nonuseless = true; + if (next.type === Tokens.Keyword && next.body === "using") { + assert_type(node); + node.args = []; + prefix = "Try-Using statment:"; + } + if (next.type === Tokens.Operator && next.body === "{") { + node.body = parse_body(stream, meta); + } + next = advance_next(stream, end_expression, prefix); + nonuseless = false; + while (next.type === Tokens.Keyword && includes(["catch", "else", "finally"] as const, next.body)) { + nonuseless = true; + stream.confirm_try(); + const word = next.body, toAppend = word === "catch" ? ["", []] as IUsingStatmentNode["catch"] : undefined; + next = stream.try(end_expression, prefix); + if (word === "catch" && next.type === Tokens.Operator && next.body === "(") { + stream.confirm_try(); + except_next_token(stream, Tokens.Symbol); + toAppend![0] = stream.next.body; + except_next_token(stream, Tokens.Operator, ")", prefix); + } else stream.cancel_try(); + if (word === "catch") { + toAppend![1] = parse_next_body(stream, meta); + node[word] = toAppend!; + } else { + node[word] = parse_next_body(stream, meta); + } + next = stream.try(end_expression, prefix); + } + stream.cancel_try(); + if (!nonuseless) { + pushDiagnostic(DiagnosticSeverity.Warn, `Try statment is useless without else, catch, finally clauses!`, stream); + node.finally = []; + } + return node; + }, + else(stream) { + error_unexcepted_token(stream.next); + }, + while(stream, meta) { + const prefix = "While statment:"; + except_next_token(stream, Tokens.Operator, "(", prefix); + const arg = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix); + return { + name: Nodes.WhileStatment, + type: NodeType.Statment, + body: parse_next_body(stream, meta, prefix), + args: [arg], + outerBody: meta.outer + }; + }, + do(stream, meta) { + const prefix = "Do-While statment:"; + var body = parse_next_body(stream, meta, prefix); + except_next_token(stream, Tokens.Keyword, "while", prefix); + except_next_token(stream, Tokens.Operator, "(", prefix); + return { + name: Nodes.DoWhileStatment, + type: NodeType.Statment, + body, + args: [_parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix)], + outerBody: meta.outer + }; + }, + to(stream) { + error_unexcepted_token(stream.next); + }, + as(stream) { + error_unexcepted_token(stream.next); + }, + import(stream, meta): INode { + except_next_token(stream, Tokens.Operator, "(", "Import statment:"); + return { + name: Nodes.ImportExpression, + type: NodeType.Expression, + args: parse_call_expression(advance_next(stream, end_expression, "Import statment:"), stream, meta) + }; + }, + for(stream, meta) { + except_next_token(stream, Tokens.Symbol, "range", "For statment:"); + except_next_token(stream, Tokens.Operator, "(", "For statment:"); + return { + name: Nodes.ForRangeStatment, + type: NodeType.Statment, + args: [ + _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "to"), + _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "as"), + "$" + except_next_token(stream, Tokens.Symbol, undefined, "For statment:").body + ], + body: (except_next_token(stream, Tokens.Operator, ")", "For statment:"), parse_next_body(stream, meta)), + outerBody: meta.outer + }; + } +} as KeywordParsers as Readonly Readonly>>; diff --git a/src/lib/parsers/member-access.ts b/src/lib/parsers/member-access.ts index aa82809..bed7070 100644 --- a/src/lib/parsers/member-access.ts +++ b/src/lib/parsers/member-access.ts @@ -1,103 +1,63 @@ -import { isArray, includes, error_unexcepted_token } from "../utils/util.js"; -import { Nodes, NodeType, AccessChainItemKind, Tokens } from "../enums"; +import { includes } from "../utils/util.js"; +import { Nodes, NodeType, AccessChainItemKind, Tokens, ParseNodeKind } from "../enums"; import { meberAccessOperators, end_expression } from "../utils/constants.js"; -import { __parse, __used, _parse } from "../parse-dummies.js"; -import { advance_next, downgrade_next } from "../utils/advancers.js"; +import { __parse, __used, _parse, parse_operators } from "../parser.js"; +import { advance_next, except_next_token } from "../utils/advancers.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { Node, ParseMeta, AccessChainItem } from "../nodes"; +import { INode, IParseMeta, AccessChainItem } from "../nodes"; -export function _parseMemberAccess(sym: Node, next: Token, stream: TokenStream, meta: ParseMeta) { - var chain = [{ - kind: AccessChainItemKind.Head, - body: sym - }] as AccessChainItem[]; - while (next[0] === Tokens.Operator && includes(meberAccessOperators, next[1])) { - if (next[1] === ".") { - next = advance_next(stream, "symbol"); - if (next[0] !== Tokens.Symbol && next[0] !== Tokens.Keyword) { - error_unexcepted_token(next); - } - chain.push({ - kind: AccessChainItemKind.Normal, - body: { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: next[1] } - }); - } else if (next[1] === "[") { +export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { + var chain: AccessChainItem[] = [new AccessChainItem(AccessChainItemKind.Head, sym)]; + while (next.type === Tokens.Operator && includes(meberAccessOperators, next.body)) { + stream.confirm_try(); + if (next.body === ".") { + chain.push(new AccessChainItem(AccessChainItemKind.Normal, { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body + })); + } else if (next.body === "[") { var parsed = __parse(advance_next(stream, end_expression), stream, meta); - if (isArray(parsed)) { - next = stream.next; - parsed = parsed[0]; - } else { - next = advance_next(stream, "]"); - } - if (next[0] !== Tokens.Operator || next[1] !== "]") { - error_unexcepted_token(next); - } - chain.push({ - kind: AccessChainItemKind.Computed, - body: parsed - }); - } else if (next[1] === "?.") { - next = advance_next(stream, "symbol"); - if (next[0] !== Tokens.Symbol && next[0] !== Tokens.Keyword) { - error_unexcepted_token(next); - } - chain.push({ - kind: AccessChainItemKind.Optional, - body: { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: next[1] } - }); - } else if (next[1] === "?.[") { + except_next_token(stream, Tokens.Operator, "]"); + chain.push(new AccessChainItem(AccessChainItemKind.Computed, parsed)); + } else if (next.body === "?.") { + chain.push(new AccessChainItem(AccessChainItemKind.Optional, { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body + })); + } else if (next.body === "?.[") { var parsed = __parse(advance_next(stream, end_expression), stream, meta); - if (isArray(parsed)) { - next = stream.next; - parsed = parsed[0]; - } else { - next = advance_next(stream, "]"); - } - if (next[0] !== Tokens.Operator || next[1] !== "]") { - error_unexcepted_token(next); - } - chain.push({ - kind: AccessChainItemKind.OptionalComputed, - body: parsed - }); - } else if (next[1] === "!.") { - next = advance_next(stream, "symbol"); - if (next[0] !== Tokens.Symbol && next[0] !== Tokens.Keyword) { - error_unexcepted_token(next); - } + except_next_token(stream, Tokens.Operator, "]"); + chain.push(new AccessChainItem(AccessChainItemKind.OptionalComputed, parsed)); + } else if (next.body === "!.") { __used.na = true; - chain.push({ - kind: AccessChainItemKind.NormalNullAsserted, - body: { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbolName: next[1] } - }); - } else if (next[1] === "![") { + chain.push(new AccessChainItem(AccessChainItemKind.NormalNullAsserted, { + name: Nodes.SymbolNoPrefix, + type: NodeType.Expression, + symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body + })); + } else if (next.body === "!.[") { var parsed = __parse(advance_next(stream, end_expression), stream, meta); - if (isArray(parsed)) { - next = stream.next; - parsed = parsed[0]; - } else { - next = advance_next(stream, "]"); - } - if (next[0] !== Tokens.Operator || next[1] !== "]") { - error_unexcepted_token(next); - } + except_next_token(stream, Tokens.Operator, "]"); __used.na = true; - chain.push({ - kind: AccessChainItemKind.ComputedNullAsserted, - body: parsed - }); + chain.push(new AccessChainItem(AccessChainItemKind.ComputedNullAsserted, parsed)); } else { break; } - next = advance_next(stream, "any"); + try { + next = stream.try("operator"); + } catch { + break; + } } - downgrade_next(stream); + stream.cancel_try(); return chain; } -export function parseMemberAccess(sym: Node, next: Token, stream: TokenStream, meta: ParseMeta) { - return _parse({ +export function parseMemberAccess(sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { + return parse_operators({ name: Nodes.MemberAccessExpression, type: NodeType.Expression, body: _parseMemberAccess(sym, next, stream, meta), - }, stream, meta); + }, stream, meta, ParseNodeKind.Expression); } diff --git a/src/lib/parsers/object-expression.ts b/src/lib/parsers/object-expression.ts new file mode 100644 index 0000000..8b95148 --- /dev/null +++ b/src/lib/parsers/object-expression.ts @@ -0,0 +1,23 @@ +import { advance_next } from "../utils/advancers.js"; +import { end_expression } from "../utils/constants.js"; +import { Nodes, NodeType, Tokens } from "../enums.js"; +import type { INode, ObjectNode, IParseMeta } from "../nodes.js"; +import type { Token, TokenStream } from "../utils/stream.js"; +import { except_token } from "../utils/util.js"; + + +function recursive_attrs(stream: TokenStream, next: Token, meta: IParseMeta, mods: string[]): void { + +} +export function parse_object_expression(stream: TokenStream, meta: IParseMeta): INode { + var node: ObjectNode = { + name: Nodes.ObjectExpression, + type: NodeType.Expression, + body: [] + }, next; + while (next = advance_next(stream, end_expression), next.type === Tokens.Operator && next.body === ",") { + recursive_attrs(stream, next, meta, []); + } + except_token(next, Tokens.Operator, "}"); + return node; +} \ No newline at end of file diff --git a/src/lib/parsers/regexp.ts b/src/lib/parsers/regexp.ts new file mode 100644 index 0000000..4f46383 --- /dev/null +++ b/src/lib/parsers/regexp.ts @@ -0,0 +1,74 @@ +import { Nodes, NodeType } from "../enums"; +import { TokenStream } from "../utils/stream.js"; +import { undefined } from "../utils/util.js"; +import { symbolicCharsRegex } from "../lexer.js"; +import type { INode } from "../nodes.js"; + + +export function parse_regexp({ text_stream }: TokenStream) { + function parse_list() { + while (next !== "]") { + if (next == undefined) { + throw "Unterminated regular expression character list."; + } + if (next === "\\") { + body += next + text_stream.move(); + next = text_stream.move(); + continue; + } + if (next === "(") { + parse_group(); + } + body += next; + next = text_stream.move(); + } + } + function parse_group() { + while (next !== ")") { + if (next == undefined) { + throw "Unterminated regular expression character list."; + } + if (next === "\\") { + body += next + text_stream.move(); + next = text_stream.move(); + continue; + } + if (next === "[") { + parse_list(); + } + body += next; + next = text_stream.move(); + } + } + var node: INode = { + name: Nodes.RegularExpression, + type: NodeType.Expression, + body: "" as never + }, next: string, body = "/"; + while ((next = text_stream.next) !== "/") { + if (next == undefined) { + throw "Unterminated regular expression"; + } + if (next === "\\") { + ; + body += text_stream.move() + text_stream.move(); + continue; + } + if (next === "[") { + parse_list(); + } + if (next === "(") { + parse_group(); + } + body += next; + next = text_stream.move(); + } + body += text_stream.move(); + while (text_stream.next != undefined && symbolicCharsRegex.test(text_stream.next)) { + if (!/[dgmuiys]/.test(text_stream.next)) throw `Invalid regular expression flag ${ text_stream.next }`; + body += text_stream.next; + text_stream.move(); + } + node.body = body as never; + return node; +} \ No newline at end of file diff --git a/src/lib/utils/advancers.ts b/src/lib/utils/advancers.ts index 8b57ce6..0454504 100644 --- a/src/lib/utils/advancers.ts +++ b/src/lib/utils/advancers.ts @@ -1,51 +1,14 @@ -import { includes } from "./util.js"; -import { Tokens } from "../enums"; -import type { Token, TokenStream } from "./stream.js"; +import { except_token } from "./util.js"; +import type { Tokens } from "../enums"; +import type { TokenStream } from "./stream.js"; -export function downgrade_next(stream: TokenStream) { - while (includes([Tokens.Whitespace, Tokens.MultilineComment, Tokens.Comment], stream.down()[0])); -} -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {string} end - * @param {string} [prefix] - */ -function next_or_fail

(stream: import("./stream.js").TokenStream, end: string, prefix?: Prefix

) { - stream.move(); - var next = stream.next, newlines: number; - if (!next) { - throw `${ prefix ? ` ${ prefix }` : "" }Unexcepted EOF - '${ end }' excepted`; - } - // __line += newlines = occurrences(next[1], '\n'); - // if (newlines !== 0) { - // __column = 0; - // } - // __column += next[1].length - next[1].lastIndexOf("\n"); +export function advance_next

(stream: TokenStream, end: string, prefix?: Prefix

) { + const next = stream.advance(); + if (!next) throw `${ prefix ? `${ prefix } ` : "" }Unexcepted EOF - '${ end }' excepted`; return next; } -type Prefix

= string extends P ? string : P extends `${ infer _ } ${ "statment" | "expression" }:` ? P : never; -/** - * @param {import("./utils/stream.js").Token} next - * @param {import("./utils/stream.js").TokenStream} stream - * @param {string} end - * @param {string} [prefix] - */ -function skip_whitespace

(next: Token, stream: TokenStream, end: string, prefix?: Prefix

) { - return next[0] === Tokens.Whitespace ? next_or_fail(stream, end, prefix) : next; -} -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {string} end - * @param {string} [prefix] - */ +export declare type Prefix

= string extends P ? string : P extends `${ infer S }${ string } ${ "statment" | "expression" }:` ? S extends Uppercase ? P : never: never; -export function advance_next

(stream: TokenStream, end: string, prefix?: Prefix

) { - var _temp: Token; - while ((_temp = skip_whitespace(next_or_fail(stream, end, prefix), stream, end, prefix))[0] === Tokens.MultilineComment || _temp[0] === Tokens.Comment) { - var _exec = /\s*internal\:\s*(.+)/.exec(_temp[1]); - if (_exec) { - Function(_exec[1])(); - } - }; - return _temp; +export function except_next_token

(stream: TokenStream, token_type: Tokens, token_string?: string, prefix?: Prefix

, end = token_string, rest = "") { + return except_token(advance_next(stream, end!, prefix), token_type, token_string, rest); } diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts index f7a86c7..7279dfa 100644 --- a/src/lib/utils/constants.ts +++ b/src/lib/utils/constants.ts @@ -1,15 +1,15 @@ import { _echo } from "./_echo.js"; -export const meberAccessOperators = [".", "?.", "!.", "![", "?.[", "["] as const; -export const end_expression = _echo("expression"); +export const meberAccessOperators = [".", "?.", "!.", "!.[", "?.[", "["] as const; +export const end_expression = "expression"; export const js_auto_variables = ["__external_var", "this", "arguments", "null", "NaN", "undefined", "Infinity", "true", "false"] as const; -export const keywords: readonly string[] = _echo("do|if|in|for|new|try|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|arguments|interface|protected|implements|instanceof|include|fn|async|await|undefined|not|contains|__external|__external_var|nonlocal|keep|using").split("|"); +export const keywords: readonly string[] = _echo("do|if|in|for|new|try|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|arguments|interface|protected|implements|instanceof|include|fn|async|await|undefined|or|and|not|contains|__external|__external_var|nonlocal|keep|using|macro").split("|"); export const validChars = (function () { try { - return Function("return/^[$_\\u200C\\u200D\\p{ID_Continue}^\\d][$_\\u200C\\u200D\\p{ID_Continue}]*$/u")() as RegExp; + return Function("return/^(?!\\d)[$_\\u200C\\u200D\\p{ID_Continue}]+$/u")() as RegExp; } catch { return /^[$\w_][\d\w$_]*$/m; } })(); -export const $2charoperators = ["&&", "**", "||", "??", "==", "!=", "=>", "<=", ">=", "..", "+=", "/=", "&=", "-=", "++", "--", "*=", "|=", "//", ">>", "<<", "?.", "%=", "^=", "|>", "@@", "/*", "::", "!.", "!["] as const; -export const $3charoperators = ["?.[", "?.(", "??=", "||=", "&&=", "**=", ">>>", "...", ">>=", "<<=", "===", "!=="] as const; +export const $2charoperators = ["&&", "**", "||", "??", "==", "!=", "=>", "<=", ">=", "..", "+=", "/=", "&=", "-=", "++", "--", "*=", "|=", "//", ">>", "<<", "?.", "%=", "^=", "|>", "@@", "/*", "::", "!.", "##"] as const; +export const $3charoperators = ["!.[", "?.[", "?.(", "??=", "||=", "&&=", "**=", ">>>", "...", ">>=", "<<=", "===", "!==", "##[", "##{", "##<"] as const; export { end_expression as expression }; diff --git a/src/lib/utils/diagnostics.ts b/src/lib/utils/diagnostics.ts index 4a890c1..89a1364 100644 --- a/src/lib/utils/diagnostics.ts +++ b/src/lib/utils/diagnostics.ts @@ -1,13 +1,7 @@ -import type { DiagnosticSeverity } from "../enums.js"; +import type { DiagnosticSeverity } from "../enums"; export interface IDiagnostic { - severity: DiagnosticSeverity; - message: string; -} -export function Diagnostic(severity: DiagnosticSeverity, message: string): IDiagnostic { - return { - severity, - message - }; + readonly severity: DiagnosticSeverity; + readonly message: string; } \ No newline at end of file diff --git a/src/lib/utils/stream.ts b/src/lib/utils/stream.ts index d05dd08..812adcc 100644 --- a/src/lib/utils/stream.ts +++ b/src/lib/utils/stream.ts @@ -1,36 +1,44 @@ import type { Tokens } from "../enums"; +import type { Prefix } from "./advancers.js"; -type Streamable = { - [index: number]: any; +export interface TextStream { + readonly text: string; + index: number; + next: string; + move(): string; + advance(): string; + down(times?: number): string; +} +export interface TokenStream { + readonly next: Token; + move(): Token; + advance(): Token; + try

(end: string, prefix?: Prefix

): Token; + confirm_try(): void; + cancel_try(): void; + readonly text_stream: TextStream; + [Symbol.iterator]?(): Iterator; }; -type ValueType = A extends { [index: number]: infer P; } ? P : never; -export interface ValueStream { - next: ValueType; - move(): ValueType; - down(): ValueType; +export class Token { + constructor(public readonly type: Tokens, public readonly body: string) { } } -export type TextStream = ValueStream; -export type TokenStream = ValueStream; -export type Token = [Tokens, string, ...string[]]; -export type TokenList = Token[]; +export type TokenList = readonly Token[]; -/** - * @template {import("./stream").Streamable} T - * @param {T} streamable - * @returns {T} - */ -export function Stream(streamable: T): ValueStream { - var __index = 0; - return { - next: streamable[0], - /**@param {any} [__next]*/ - move(__next?: any) { - __next = streamable[__index++]; - this.next = streamable[__index]; - return __next; - }, - down() { - return this.next = streamable[--__index]; - } +export class Stream implements TextStream { + public index = 0; + public next!: string; + constructor(public readonly text: string) { + this.next = text[0]; + } + advance() { + return this.next = this.text[++this.index]; + } + move() { + const __next = this.text[this.index++]; + this.next = this.text[this.index]; + return __next!; } -} \ No newline at end of file + down(times = 1) { + return this.next = this.text[this.index -= times]; + } +} diff --git a/src/lib/utils/table.ts b/src/lib/utils/table.ts index c37ba80..caa3901 100644 --- a/src/lib/utils/table.ts +++ b/src/lib/utils/table.ts @@ -1,10 +1,8 @@ import { Nodes } from "../enums"; -export type CommonOperatorTableType = typeof CommonOperatorTable; -export type CommonOperatorTableKeys = keyof CommonOperatorTableType; -export type AssignmentOperatorTableType = typeof AssignmentOperatorTable; -export type AssignmentOperatorTableKeys = keyof AssignmentOperatorTableType; -export var CommonOperatorTable = { +export type CommonOperatorTableKeys = keyof typeof CommonOperatorTable; +export type AssignmentOperatorTableKeys = keyof typeof AssignmentOperatorTable; +export const CommonOperatorTable = { "+": Nodes.AddictionExpression, "-": Nodes.SubstractionExpression, "*": Nodes.MultiplicationExpression, @@ -17,6 +15,8 @@ export var CommonOperatorTable = { "??": Nodes.NullishCoalescingExpression, "&&": Nodes.LogicalANDExpression, "||": Nodes.LogicalORExpression, + "or": Nodes.LogicalORExpression, + "and": Nodes.LogicalANDExpression, // "!": Nodes.LogicalNOTExpresssion, // Leaving this uncommented may lead to fun bugs // expression ! expression will be parsed without compilation errors LOL "<<": Nodes.BitwiseLeftShiftExpression, @@ -31,7 +31,7 @@ export var CommonOperatorTable = { "===": Nodes.StrictComparison, "!=": Nodes.LooseNegativeComparison, "!==": Nodes.StrictNegativeComparison -} +} as const; export var AssignmentOperatorTable = { "=": Nodes.AssignmentExpression, "+=": Nodes.AddictionAssignmentExpression, diff --git a/src/lib/utils/util.ts b/src/lib/utils/util.ts index b65bd98..87e76f6 100644 --- a/src/lib/utils/util.ts +++ b/src/lib/utils/util.ts @@ -1,7 +1,7 @@ import { js_auto_variables } from "./constants.js"; import { Nodes, Tokens } from "../enums"; -import type { Token } from "./stream"; -import type { Node } from "../nodes"; +import type { Token } from "./stream.js"; +import type { INode } from "../nodes"; export type CallFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, ...args: Parameters) => ReturnType; export type ApplyFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, args: Parameters | IArguments) => ReturnType; @@ -10,32 +10,25 @@ var __call = nullish.call; export var bind = __call.bind(nullish.bind) as BindFunctionType; export var call = bind(__call, __call as any) as CallFunctionType; export var apply = bind(__call, nullish.apply as any) as ApplyFunctionType; -export type ArrayValueType = { +export type ArrayValueType = { [key in Exclude]: T[key]; -} extends { [key: string]: infer V } ? V : never; -export function includes(array: A, value: unknown): +} extends { [key: string]: infer V; } ? V : never; +export function includes(array: A, value: unknown): value is A extends string ? string : any[] extends A ? boolean : ArrayValueType> { - return ~array.indexOf(value as any) as unknown as boolean; + return ~array.indexOf(value as never) as never; } export function nullish(arg: unknown): arg is null | undefined { return arg === void 0 || arg === null; } export var undefined: undefined; var __counter__ = 0; -export function randomVarName() { +export function random_var_name() { return `_${ (__counter__++).toString(36) }`; // + "__" + Math.random().toString(16).slice(2); } export function resetCounter() { __counter__ = 0; } -export function assert(value: unknown): asserts value is T { } -export function log_errors(errors: any[]) { - if (errors && errors.length) { - for (var index = 0; index < errors.length; index++) { - console.error("TSK Error:", errors[index]); - } - } -} +export function assert_type(value: unknown): asserts value is T { } export var isArray = Array.isArray as ((arg: any) => arg is T[]) || (function (value) { return value instanceof Array; }); @@ -43,7 +36,7 @@ interface CacheEntry { code: string; mtime: number; } -var __cache = {} as { [key: string]: CacheEntry; }; +const __cache: Record = {}; // var __warned__ = false; var __is_node = typeof process === "object" && ({}).toString.call(process) === "[object process]"; export function include(path: URL, cache = true): string | Promise { @@ -55,12 +48,14 @@ export function include(path: URL, cache = true): string | Promise { } var fs = require("fs") as typeof import("fs"); if (cache) { - var mtime = fs.statSync(path).mtimeMs, cached = __cache[String(path)] || {}, cacheMTime = cached.mtime; + var handle = fs.openSync(path, "r"); + var mtime = fs.fstatSync(handle).mtimeMs, cached = __cache[path.href] || {}, cacheMTime = cached.mtime; if (mtime !== cacheMTime) { - _ = fs.readFileSync(path, "utf-8"); + _ = fs.readFileSync(handle, "utf-8"); __cache[String(path)] = { mtime, code: _ }; + fs.closeSync(handle); return _; - } else return cached.code; + } else return fs.closeSync(handle), cached.code; } else { return fs.readFileSync(path, "utf-8"); } @@ -79,7 +74,7 @@ export function include(path: URL, cache = true): string | Promise { // console.warn("Since http requests are asynchronous i dont guarantee that include statment will work correctly (atleast please dont use them in web env)"); // __warned__ = true; // } - return fetch(String(path)).then(function (responce) { + return fetch(path.href).then(function (responce) { if (!responce.ok) { throw "Something went wrong while fetching " + path + "!"; } @@ -93,34 +88,37 @@ export function inspectLog(shit: any) { console.log(typeof require === "function" ? require("util").inspect(shit, !0, 1 / 0, !0) : shit); } export function isSymbol(next: Token) { - return next[0] === Tokens.Symbol || next[0] === Tokens.Keyword && includes(js_auto_variables, next[1]); + return next.type === Tokens.Symbol || next.type === Tokens.Keyword && includes(js_auto_variables, next.body); } -export function remove_trailing_undefined(values: Node[]) { +export function remove_trailing_undefined(values: INode[]) { for (var index = values.length; index && values[--index].name === Nodes.UndefinedValue;) values.pop(); } export function error_unexcepted_token(next: Token, rest = ""): never { - throw SyntaxError(`Unexcepted token '${ next[1] }'${ rest }`); + assert(0, `Unexcepted token '${ next.body }'${ rest }`); +} + +export function except_token(next: Token, token_type: Tokens, token_string?: string, rest = "") { + if (((next.type & token_type) !== 0) && next.body !== token_string && token_string !== undefined) error_unexcepted_token(next, rest); + return next; } -export function isNode(value: any): value is Node { - return !isArray(value) && typeof value === "object" && !nullish(value); + +export function assert(condition: 0 | false, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type?: ErrorConstructor): never; +export function assert(condition: unknown, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type?: ErrorConstructor): void; +export function assert(condition: unknown, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type: ErrorConstructor = _SyntaxError) { + if (!condition) { + throw error_type(message + ""); + } } + /** * Checks if expression is an abrupt node ([Node]) and * returns abrupt node with body with abrupted expression * else returns node with body equal to passed expression */ -export function abruptify(node: Node | [Node], expression: Node | [Node]): Node | [Node] { - if (isArray(expression)) { - assert(node); - node.body = expression; - node = [node]; - } else { - assert(node); - node.body = [expression]; - } +export function abruptify(node: INode, expression: INode | [INode]): INode { return node; } -var _SyntaxError = SyntaxError; +const _SyntaxError = SyntaxError; export { _SyntaxError as SyntaxError }; diff --git a/src/lib/wrapper.ts b/src/lib/wrapper.ts index a99c235..b3b3f6c 100644 --- a/src/lib/wrapper.ts +++ b/src/lib/wrapper.ts @@ -1,23 +1,23 @@ -var __async = `function __async(f,t,a){` + - `return new p(function(r){` + - `var g=__apply(f,t,a),n=g.next;` + - `function _(p){` + +const __async = `function __async(f,t,a){` + + `return new p(r=>{` + + `var g=__apply(f,t,a),n=g.next,` + + `_=p=>{` + `var v=__call(n,g,p);` + - `v.done?r(v.value):pr(v.value).then(function(v){_(v)})` + - `}` + + `v.done?r(v.value):pr(v.value).then(_)` + + `};` + `_();` + `})` + `}`; -var __null_assert = `function __na(v){if(n(v))throw TypeError("Null assertion");return v}`; -var __nullish = `function n(v){return v===null||v===u}`; -var __contains = `function __contains(i,v){` + // i = iterable, v = value +const __null_assert = `function __na(v){if(n(v))throw TypeError("Null assertion");return v}`; +const __nullish = `function n(v){return v===null||v===u}`; +const __contains = `function __contains(i,v){` + // i = iterable, v = value // _ = iterator, n = next method of _, t = temp variable - `for(var _=i[Symbol.iterator](),n=__bind(_.next,_),t;!(t=n()).done;)if((t=t.value)===v||v!==v&&j!==t)return!0;` + + `for(var _=i[Symbol.iterator](),n=_.next,t;!(t=__call(n,_)).done;)if((t=t.value)===v||v!==v&&t!==t)return!0;` + `return!1}`; -var __throw = "function __throw(e){throw e}"; +const __throw = "function __throw(e){throw e}"; -export function wrap(code: string, used: Record) { +export function wrap(code: string, used: Readonly>) { return `(function(p,u){var c=n.call,__bind=c.bind(n.bind),` + `pr=__bind(p.resolve,p),__call=__bind(c,c),__apply=__bind(c,n.apply);` + `${ __nullish }${ __async }${ used.contains ? __contains : "" }${ used.na ? __null_assert : "" }${ used.throw ? diff --git a/tsconfig.json b/tsconfig.json index 5dc0938..472350c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es3", + "target": "ES2021", "lib": [ "dom", "dom.iterable", @@ -18,13 +18,18 @@ "moduleResolution": "node", "preserveConstEnums": true, "declaration": true, + "declarationDir": "./build/decls", "pretty": true, "strict": true, "rootDir": "src", - "outDir": "build/out", - "skipDefaultLibCheck": true + "outDir": "./build", + "skipDefaultLibCheck": true, + "sourceMap": true, + "composite": true, + "tsBuildInfoFile": ".tsbuildinfo", + "incremental": true }, "include": [ - "./src" + "./src/lib" ] } \ No newline at end of file From 9c59f651533b507b8bf2312a5715177027e56598 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 26 Nov 2021 20:29:07 +0300 Subject: [PATCH 02/14] update deps --- package-lock.json | 853 +++++++++++++++++++++++++++++++++------------- package.json | 8 +- 2 files changed, 615 insertions(+), 246 deletions(-) diff --git a/package-lock.json b/package-lock.json index c13988d..5b6c674 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,11 @@ "tskc": "build/tskc.mjs" }, "devDependencies": { - "@types/node": "^15.0.2", - "rollup": "^2.47.0", + "@types/node": "^16.11.10", + "rollup": "^2.60.1", "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.30.0", - "tslib": "^2.2.0", + "rollup-plugin-typescript2": "^0.31.1", + "tslib": "^2.3.1", "typescript": "^4.5.2" }, "peerDependencies": { @@ -24,37 +24,124 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", - "dev": true + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", + "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@ts-type/package-dts": { + "version": "1.0.53", + "resolved": "https://registry.npmjs.org/@ts-type/package-dts/-/package-dts-1.0.53.tgz", + "integrity": "sha512-P8bMcjqaUsaBbXOCxBtzT4/pvhQSHTMc91WrpErVfB52zpNRVw2evOYWMe6q3c087+wpvITB7HtppYDnQe1RwA==", + "dev": true, + "dependencies": { + "@types/semver": "^7.3.9", + "ts-type": "^1.2.40" + } + }, + "node_modules/@ts-type/package-dts/node_modules/ts-type": { + "version": "1.2.40", + "resolved": "https://registry.npmjs.org/ts-type/-/ts-type-1.2.40.tgz", + "integrity": "sha512-Ux5e7Frys5pX7w8gYchEd0KfhG1H5puXOQC8yOBgMJ1aEwDSypeHLwxIUpKjecni1IGwtLI3JrxCVZaQO9JKmw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0", + "typedarray-dts": "^1.0.0" + }, + "peerDependencies": { + "@types/bluebird": "*", + "@types/node": "*", + "ts-toolbelt": "^8.0.7" } }, + "node_modules/@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", + "dev": true, + "peer": true + }, "node_modules/@types/node": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", - "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", + "dev": true + }, + "node_modules/@yarn-tool/resolve-package": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.38.tgz", + "integrity": "sha512-WmYM/Znh/vPQw7PBfbH2PmZSrzCF0AfGMfpA4z3SbNa2UUcdpqq9yD9pYKcHY1FP3yjMB7KwcVD8mhojROXCQQ==", + "dev": true, + "dependencies": { + "@ts-type/package-dts": "^1.0.53", + "pkg-dir": "< 6 >= 5", + "tslib": "^2.3.1", + "upath2": "^3.1.10" + } + }, + "node_modules/@yarn-tool/resolve-package/node_modules/upath2": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.10.tgz", + "integrity": "sha512-7ph3GzTaVbQX+oIoMsGtM+9BAWQr+6Mn28TJKPu28+yGpZ+J4am590CPDBlDG0zyuo9T9T7o21ciqNzwIp/q0A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21", + "path-is-network-drive": "^1.0.10", + "path-strip-sep": "^1.0.7", + "tslib": "^2.3.1" + }, + "peerDependencies": { + "@types/node": "*" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -102,6 +189,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "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 + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -117,10 +210,16 @@ "node": ">=0.8.0" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "dependencies": { "commondir": "^1.0.1", @@ -134,41 +233,84 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-cache-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/fs-extra": { @@ -186,10 +328,11 @@ } }, "node_modules/fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -205,9 +348,9 @@ "dev": true }, "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "node_modules/has": { @@ -232,9 +375,9 @@ } }, "node_modules/is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -294,15 +437,39 @@ } }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { @@ -324,30 +491,33 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -368,31 +538,52 @@ "node": ">=8" } }, + "node_modules/path-is-network-drive": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.10.tgz", + "integrity": "sha512-D6kJYPUSKGZBpTM2nv10sOWNdC056p4JDx0y7ARe6gop0aXXm5G86Gn/SyKvaf0Ce8c9Guctf+J+qoFmzuhDQg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-strip-sep": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.7.tgz", + "integrity": "sha512-9xDVZPblHde4lTuTDnwqBKr9LTbPZW+Iae63ho500+BpEiZe3X6wvLInHgbB6FSMtwCTvztljw3k2zcNDNESzg==", + "dev": true, + "dependencies": { + "tslib": "^2.3.1" + } + }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true, "engines": { "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "dependencies": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/randombytes": { @@ -418,9 +609,9 @@ } }, "node_modules/rollup": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", - "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", + "version": "2.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", + "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -429,7 +620,7 @@ "node": ">=10.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-terser": { @@ -448,55 +639,57 @@ } }, "node_modules/rollup-plugin-typescript2": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", - "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.1.tgz", + "integrity": "sha512-sklqXuQwQX+stKi4kDfEkneVESPi3YM/2S899vfRdF9Yi40vcC50Oq4A4cSZJNXsAQE/UsBZl5fAOsBLziKmjw==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.1.0", + "@yarn-tool/resolve-package": "^1.0.36", "find-cache-dir": "^3.3.1", "fs-extra": "8.1.0", "resolve": "1.20.0", - "tslib": "2.1.0" + "tslib": "2.2.0" }, "peerDependencies": { "rollup": ">=1.26.3", "typescript": ">=2.4.0" } }, - "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", - "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/rollup-plugin-typescript2/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/serialize-javascript": { "version": "4.0.0", @@ -507,10 +700,19 @@ "randombytes": "^2.1.0" } }, + "node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "dependencies": { "buffer-from": "^1.0.0", @@ -539,9 +741,9 @@ } }, "node_modules/terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "dependencies": { "commander": "^2.20.0", @@ -553,21 +755,14 @@ }, "engines": { "node": ">=10" - } - }, - "node_modules/terser/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 - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } } }, "node_modules/tr46": { @@ -576,10 +771,23 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", "peer": true }, + "node_modules/ts-toolbelt": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-8.4.0.tgz", + "integrity": "sha512-hnGJXIgC49ZuF5g5oDthoge8t4cvT0dYg2pYO5C6yV/HmUUy1koooU2U/5K2N+Uw++hcXQpJAToLRa+GRp28Sg==", + "dev": true, + "peer": true + }, "node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/typedarray-dts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typedarray-dts/-/typedarray-dts-1.0.0.tgz", + "integrity": "sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==", "dev": true }, "node_modules/typescript": { @@ -619,41 +827,124 @@ "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } }, "dependencies": { "@babel/code-frame": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", - "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", "dev": true, "requires": { - "@babel/highlight": "^7.12.13" + "@babel/highlight": "^7.16.0" } }, "@babel/helper-validator-identifier": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz", - "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==", + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", "dev": true }, "@babel/highlight": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz", - "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.14.0", + "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, + "@rollup/pluginutils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", + "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", + "dev": true, + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@ts-type/package-dts": { + "version": "1.0.53", + "resolved": "https://registry.npmjs.org/@ts-type/package-dts/-/package-dts-1.0.53.tgz", + "integrity": "sha512-P8bMcjqaUsaBbXOCxBtzT4/pvhQSHTMc91WrpErVfB52zpNRVw2evOYWMe6q3c087+wpvITB7HtppYDnQe1RwA==", + "dev": true, + "requires": { + "@types/semver": "^7.3.9", + "ts-type": "^1.2.40" + }, + "dependencies": { + "ts-type": { + "version": "1.2.40", + "resolved": "https://registry.npmjs.org/ts-type/-/ts-type-1.2.40.tgz", + "integrity": "sha512-Ux5e7Frys5pX7w8gYchEd0KfhG1H5puXOQC8yOBgMJ1aEwDSypeHLwxIUpKjecni1IGwtLI3JrxCVZaQO9JKmw==", + "dev": true, + "requires": { + "tslib": "^2.3.0", + "typedarray-dts": "^1.0.0" + } + } + } + }, + "@types/bluebird": { + "version": "3.5.36", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", + "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", + "dev": true, + "peer": true + }, "@types/node": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", - "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", + "version": "16.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", + "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", + "dev": true + }, + "@types/semver": { + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", + "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", "dev": true }, + "@yarn-tool/resolve-package": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.38.tgz", + "integrity": "sha512-WmYM/Znh/vPQw7PBfbH2PmZSrzCF0AfGMfpA4z3SbNa2UUcdpqq9yD9pYKcHY1FP3yjMB7KwcVD8mhojROXCQQ==", + "dev": true, + "requires": { + "@ts-type/package-dts": "^1.0.53", + "pkg-dir": "< 6 >= 5", + "tslib": "^2.3.1", + "upath2": "^3.1.10" + }, + "dependencies": { + "upath2": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.10.tgz", + "integrity": "sha512-7ph3GzTaVbQX+oIoMsGtM+9BAWQr+6Mn28TJKPu28+yGpZ+J4am590CPDBlDG0zyuo9T9T7o21ciqNzwIp/q0A==", + "dev": true, + "requires": { + "lodash": "^4.17.21", + "path-is-network-drive": "^1.0.10", + "path-strip-sep": "^1.0.7", + "tslib": "^2.3.1" + } + } + } + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -695,6 +986,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "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 + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -707,10 +1004,16 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "find-cache-dir": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", - "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -718,30 +1021,61 @@ "pkg-dir": "^4.1.0" }, "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "semver": "^6.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } } } }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, @@ -757,9 +1091,9 @@ } }, "fsevents": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", - "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -770,9 +1104,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", "dev": true }, "has": { @@ -791,9 +1125,9 @@ "dev": true }, "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "dev": true, "requires": { "has": "^1.0.3" @@ -843,12 +1177,27 @@ } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" } }, "merge-stream": { @@ -867,21 +1216,21 @@ } }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "p-try": { @@ -896,25 +1245,43 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, + "path-is-network-drive": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.10.tgz", + "integrity": "sha512-D6kJYPUSKGZBpTM2nv10sOWNdC056p4JDx0y7ARe6gop0aXXm5G86Gn/SyKvaf0Ce8c9Guctf+J+qoFmzuhDQg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "path-strip-sep": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.7.tgz", + "integrity": "sha512-9xDVZPblHde4lTuTDnwqBKr9LTbPZW+Iae63ho500+BpEiZe3X6wvLInHgbB6FSMtwCTvztljw3k2zcNDNESzg==", + "dev": true, + "requires": { + "tslib": "^2.3.1" + } + }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", + "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", "dev": true, "requires": { - "find-up": "^4.0.0" + "find-up": "^5.0.0" } }, "randombytes": { @@ -937,12 +1304,12 @@ } }, "rollup": { - "version": "2.47.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.47.0.tgz", - "integrity": "sha512-rqBjgq9hQfW0vRmz+0S062ORRNJXvwRpzxhFXORvar/maZqY6za3rgQ/p1Glg+j1hnc1GtYyQCPiAei95uTElg==", + "version": "2.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", + "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", "dev": true, "requires": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "rollup-plugin-terser": { @@ -958,46 +1325,37 @@ } }, "rollup-plugin-typescript2": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.30.0.tgz", - "integrity": "sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==", + "version": "0.31.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.1.tgz", + "integrity": "sha512-sklqXuQwQX+stKi4kDfEkneVESPi3YM/2S899vfRdF9Yi40vcC50Oq4A4cSZJNXsAQE/UsBZl5fAOsBLziKmjw==", "dev": true, "requires": { "@rollup/pluginutils": "^4.1.0", + "@yarn-tool/resolve-package": "^1.0.36", "find-cache-dir": "^3.3.1", "fs-extra": "8.1.0", "resolve": "1.20.0", - "tslib": "2.1.0" + "tslib": "2.2.0" }, "dependencies": { - "@rollup/pluginutils": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.0.tgz", - "integrity": "sha512-TrBhfJkFxA+ER+ew2U2/fHbebhLT/l/2pRk0hfj9KusXUuRXd2v0R58AfaZK9VXDQ4TogOSEmICVrQAA3zFnHQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "serialize-javascript": { @@ -1009,10 +1367,16 @@ "randombytes": "^2.1.0" } }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -1037,28 +1401,14 @@ } }, "terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", "source-map": "~0.7.2", "source-map-support": "~0.5.20" - }, - "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 - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } } }, "tr46": { @@ -1067,10 +1417,23 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", "peer": true }, + "ts-toolbelt": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-8.4.0.tgz", + "integrity": "sha512-hnGJXIgC49ZuF5g5oDthoge8t4cvT0dYg2pYO5C6yV/HmUUy1koooU2U/5K2N+Uw++hcXQpJAToLRa+GRp28Sg==", + "dev": true, + "peer": true + }, "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "typedarray-dts": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typedarray-dts/-/typedarray-dts-1.0.0.tgz", + "integrity": "sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==", "dev": true }, "typescript": { @@ -1100,6 +1463,12 @@ "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index fa97957..b35478e 100644 --- a/package.json +++ b/package.json @@ -20,11 +20,11 @@ }, "types": "./build/decls/lib/compiler.d.ts", "devDependencies": { - "@types/node": "^15.0.2", - "rollup": "^2.47.0", + "@types/node": "^16.11.10", + "rollup": "^2.60.1", "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.30.0", - "tslib": "^2.2.0", + "rollup-plugin-typescript2": "^0.31.1", + "tslib": "^2.3.1", "typescript": "^4.5.2" }, "peerDependencies": { From c0ddf73e294094cb8a708e9d36cada1651a8a5c9 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Thu, 30 Dec 2021 14:27:29 +0300 Subject: [PATCH 03/14] continue development --- .gitignore | 1 + package-lock.json | 1387 +------------------------ package.json | 14 +- src/lib/compiler.ts | 16 +- src/lib/emitter.ts | 117 +-- src/lib/lexer.ts | 192 ++-- src/lib/nodes.ts | 40 +- src/lib/parser.ts | 16 +- src/lib/parsers/array-expression.ts | 5 +- src/lib/parsers/assignments.ts | 3 +- src/lib/parsers/body-parser.ts | 4 +- src/lib/parsers/call-expression.ts | 1 + src/lib/parsers/common-expressions.ts | 18 +- src/lib/parsers/external-var.ts | 1 + src/lib/parsers/group-expression.ts | 9 +- src/lib/parsers/keywords.ts | 25 +- src/lib/parsers/member-access.ts | 15 +- src/lib/parsers/object-expression.ts | 4 +- src/lib/parsers/regexp.ts | 7 +- src/lib/utils/advancers.ts | 1 + src/lib/utils/constants.ts | 8 +- src/lib/utils/stream.ts | 7 +- src/lib/utils/table.ts | 1 + src/lib/utils/util.ts | 19 +- src/lib/utils/valid-chars.ts | 2 +- src/lib/utils/variable-namer.ts | 3 +- tsconfig.json | 20 +- 27 files changed, 246 insertions(+), 1690 deletions(-) diff --git a/.gitignore b/.gitignore index 4e2b9eb..4f9102a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ index.html node_modules *.tgz *.7z +test-perf.mjs diff --git a/package-lock.json b/package-lock.json index 5b6c674..eb72bfc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,470 +12,16 @@ "tskc": "build/tskc.mjs" }, "devDependencies": { - "@types/node": "^16.11.10", - "rollup": "^2.60.1", - "rollup-plugin-terser": "^7.0.2", - "rollup-plugin-typescript2": "^0.31.1", - "tslib": "^2.3.1", - "typescript": "^4.5.2" + "@types/node": "^17.0.5" }, "peerDependencies": { "node-fetch": "^2.6.1" } }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", - "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@ts-type/package-dts": { - "version": "1.0.53", - "resolved": "https://registry.npmjs.org/@ts-type/package-dts/-/package-dts-1.0.53.tgz", - "integrity": "sha512-P8bMcjqaUsaBbXOCxBtzT4/pvhQSHTMc91WrpErVfB52zpNRVw2evOYWMe6q3c087+wpvITB7HtppYDnQe1RwA==", - "dev": true, - "dependencies": { - "@types/semver": "^7.3.9", - "ts-type": "^1.2.40" - } - }, - "node_modules/@ts-type/package-dts/node_modules/ts-type": { - "version": "1.2.40", - "resolved": "https://registry.npmjs.org/ts-type/-/ts-type-1.2.40.tgz", - "integrity": "sha512-Ux5e7Frys5pX7w8gYchEd0KfhG1H5puXOQC8yOBgMJ1aEwDSypeHLwxIUpKjecni1IGwtLI3JrxCVZaQO9JKmw==", - "dev": true, - "dependencies": { - "tslib": "^2.3.0", - "typedarray-dts": "^1.0.0" - }, - "peerDependencies": { - "@types/bluebird": "*", - "@types/node": "*", - "ts-toolbelt": "^8.0.7" - } - }, - "node_modules/@types/bluebird": { - "version": "3.5.36", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", - "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", - "dev": true, - "peer": true - }, "node_modules/@types/node": { - "version": "16.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", - "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", - "dev": true - }, - "node_modules/@yarn-tool/resolve-package": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.38.tgz", - "integrity": "sha512-WmYM/Znh/vPQw7PBfbH2PmZSrzCF0AfGMfpA4z3SbNa2UUcdpqq9yD9pYKcHY1FP3yjMB7KwcVD8mhojROXCQQ==", - "dev": true, - "dependencies": { - "@ts-type/package-dts": "^1.0.53", - "pkg-dir": "< 6 >= 5", - "tslib": "^2.3.1", - "upath2": "^3.1.10" - } - }, - "node_modules/@yarn-tool/resolve-package/node_modules/upath2": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.10.tgz", - "integrity": "sha512-7ph3GzTaVbQX+oIoMsGtM+9BAWQr+6Mn28TJKPu28+yGpZ+J4am590CPDBlDG0zyuo9T9T7o21ciqNzwIp/q0A==", - "dev": true, - "dependencies": { - "lodash": "^4.17.21", - "path-is-network-drive": "^1.0.10", - "path-strip-sep": "^1.0.7", - "tslib": "^2.3.1" - }, - "peerDependencies": { - "@types/node": "*" - } - }, - "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/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "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/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/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/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 - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "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/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", + "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", "dev": true }, "node_modules/node-fetch": { @@ -490,328 +36,12 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-network-drive": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.10.tgz", - "integrity": "sha512-D6kJYPUSKGZBpTM2nv10sOWNdC056p4JDx0y7ARe6gop0aXXm5G86Gn/SyKvaf0Ce8c9Guctf+J+qoFmzuhDQg==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-strip-sep": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.7.tgz", - "integrity": "sha512-9xDVZPblHde4lTuTDnwqBKr9LTbPZW+Iae63ho500+BpEiZe3X6wvLInHgbB6FSMtwCTvztljw3k2zcNDNESzg==", - "dev": true, - "dependencies": { - "tslib": "^2.3.1" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "dependencies": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/rollup": { - "version": "2.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", - "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-typescript2": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.1.tgz", - "integrity": "sha512-sklqXuQwQX+stKi4kDfEkneVESPi3YM/2S899vfRdF9Yi40vcC50Oq4A4cSZJNXsAQE/UsBZl5fAOsBLziKmjw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^4.1.0", - "@yarn-tool/resolve-package": "^1.0.36", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.20.0", - "tslib": "2.2.0" - }, - "peerDependencies": { - "rollup": ">=1.26.3", - "typescript": ">=2.4.0" - } - }, - "node_modules/rollup-plugin-typescript2/node_modules/tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/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/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/terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "acorn": "^8.5.0" - }, - "peerDependenciesMeta": { - "acorn": { - "optional": true - } - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", "peer": true }, - "node_modules/ts-toolbelt": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-8.4.0.tgz", - "integrity": "sha512-hnGJXIgC49ZuF5g5oDthoge8t4cvT0dYg2pYO5C6yV/HmUUy1koooU2U/5K2N+Uw++hcXQpJAToLRa+GRp28Sg==", - "dev": true, - "peer": true - }, - "node_modules/tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "node_modules/typedarray-dts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedarray-dts/-/typedarray-dts-1.0.0.tgz", - "integrity": "sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==", - "dev": true - }, - "node_modules/typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -827,383 +57,13 @@ "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.16.0" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.15.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@rollup/pluginutils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.1.1.tgz", - "integrity": "sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==", - "dev": true, - "requires": { - "estree-walker": "^2.0.1", - "picomatch": "^2.2.2" - } - }, - "@ts-type/package-dts": { - "version": "1.0.53", - "resolved": "https://registry.npmjs.org/@ts-type/package-dts/-/package-dts-1.0.53.tgz", - "integrity": "sha512-P8bMcjqaUsaBbXOCxBtzT4/pvhQSHTMc91WrpErVfB52zpNRVw2evOYWMe6q3c087+wpvITB7HtppYDnQe1RwA==", - "dev": true, - "requires": { - "@types/semver": "^7.3.9", - "ts-type": "^1.2.40" - }, - "dependencies": { - "ts-type": { - "version": "1.2.40", - "resolved": "https://registry.npmjs.org/ts-type/-/ts-type-1.2.40.tgz", - "integrity": "sha512-Ux5e7Frys5pX7w8gYchEd0KfhG1H5puXOQC8yOBgMJ1aEwDSypeHLwxIUpKjecni1IGwtLI3JrxCVZaQO9JKmw==", - "dev": true, - "requires": { - "tslib": "^2.3.0", - "typedarray-dts": "^1.0.0" - } - } - } - }, - "@types/bluebird": { - "version": "3.5.36", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.36.tgz", - "integrity": "sha512-HBNx4lhkxN7bx6P0++W8E289foSu8kO8GCk2unhuVggO+cE7rh9DhZUyPhUxNRG9m+5B5BTKxZQ5ZP92x/mx9Q==", - "dev": true, - "peer": true - }, "@types/node": { - "version": "16.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.10.tgz", - "integrity": "sha512-3aRnHa1KlOEEhJ6+CvyHKK5vE9BcLGjtUpwvqYLRvYNQKMfabu3BwfJaA/SLW8dxe28LsNDjtHwePTuzn3gmOA==", - "dev": true - }, - "@types/semver": { - "version": "7.3.9", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz", - "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==", - "dev": true - }, - "@yarn-tool/resolve-package": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@yarn-tool/resolve-package/-/resolve-package-1.0.38.tgz", - "integrity": "sha512-WmYM/Znh/vPQw7PBfbH2PmZSrzCF0AfGMfpA4z3SbNa2UUcdpqq9yD9pYKcHY1FP3yjMB7KwcVD8mhojROXCQQ==", - "dev": true, - "requires": { - "@ts-type/package-dts": "^1.0.53", - "pkg-dir": "< 6 >= 5", - "tslib": "^2.3.1", - "upath2": "^3.1.10" - }, - "dependencies": { - "upath2": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/upath2/-/upath2-3.1.10.tgz", - "integrity": "sha512-7ph3GzTaVbQX+oIoMsGtM+9BAWQr+6Mn28TJKPu28+yGpZ+J4am590CPDBlDG0zyuo9T9T7o21ciqNzwIp/q0A==", - "dev": true, - "requires": { - "lodash": "^4.17.21", - "path-is-network-drive": "^1.0.10", - "path-strip-sep": "^1.0.7", - "tslib": "^2.3.1" - } - } - } - }, - "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" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": 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, - "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 - }, - "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 - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "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 - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "is-core-module": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", - "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "version": "17.0.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.5.tgz", + "integrity": "sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw==", "dev": true }, "node-fetch": { @@ -1215,239 +75,12 @@ "whatwg-url": "^5.0.0" } }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-network-drive": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/path-is-network-drive/-/path-is-network-drive-1.0.10.tgz", - "integrity": "sha512-D6kJYPUSKGZBpTM2nv10sOWNdC056p4JDx0y7ARe6gop0aXXm5G86Gn/SyKvaf0Ce8c9Guctf+J+qoFmzuhDQg==", - "dev": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-strip-sep": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-strip-sep/-/path-strip-sep-1.0.7.tgz", - "integrity": "sha512-9xDVZPblHde4lTuTDnwqBKr9LTbPZW+Iae63ho500+BpEiZe3X6wvLInHgbB6FSMtwCTvztljw3k2zcNDNESzg==", - "dev": true, - "requires": { - "tslib": "^2.3.1" - } - }, - "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "rollup": { - "version": "2.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.60.1.tgz", - "integrity": "sha512-akwfnpjY0rXEDSn1UTVfKXJhPsEBu+imi1gqBA1ZkHGydUnkV/fWCC90P7rDaLEW8KTwBcS1G3N4893Ndz+jwg==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - } - }, - "rollup-plugin-typescript2": { - "version": "0.31.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.31.1.tgz", - "integrity": "sha512-sklqXuQwQX+stKi4kDfEkneVESPi3YM/2S899vfRdF9Yi40vcC50Oq4A4cSZJNXsAQE/UsBZl5fAOsBLziKmjw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^4.1.0", - "@yarn-tool/resolve-package": "^1.0.36", - "find-cache-dir": "^3.3.1", - "fs-extra": "8.1.0", - "resolve": "1.20.0", - "tslib": "2.2.0" - }, - "dependencies": { - "tslib": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", - "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", - "dev": true - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "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 - } - } - }, - "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, - "requires": { - "has-flag": "^3.0.0" - } - }, - "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", "peer": true }, - "ts-toolbelt": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-8.4.0.tgz", - "integrity": "sha512-hnGJXIgC49ZuF5g5oDthoge8t4cvT0dYg2pYO5C6yV/HmUUy1koooU2U/5K2N+Uw++hcXQpJAToLRa+GRp28Sg==", - "dev": true, - "peer": true - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", - "dev": true - }, - "typedarray-dts": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typedarray-dts/-/typedarray-dts-1.0.0.tgz", - "integrity": "sha512-Ka0DBegjuV9IPYFT1h0Qqk5U4pccebNIJCGl8C5uU7xtOs+jpJvKGAY4fHGK25hTmXZOEUl9Cnsg5cS6K/b5DA==", - "dev": true - }, - "typescript": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz", - "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==", - "dev": true - }, - "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 - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1463,12 +96,6 @@ "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/package.json b/package.json index b35478e..caf7d54 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.2.0", "description": "Compiler for TSK programming language", "author": "MadProbe#7435", - "license": "ISC", - "main": "./build/bundle.min.cjs", - "module": "./build/bundle.min.mjs", + "license": "MIT", + "main": "build/bundle.min.cjs", + "module": "build/bundle.min.mjs", "exports": { ".": { "import": "./build/bundle.min.mjs", @@ -15,12 +15,10 @@ } }, "type": "module", - "bin": { - "tskc": "build/tskc.mjs" - }, - "types": "./build/decls/lib/compiler.d.ts", + "bin": "build/tskc.mjs", + "types": "build/decls/lib/compiler.d.ts", "devDependencies": { - "@types/node": "^16.11.10", + "@types/node": "^17.0.5", "rollup": "^2.60.1", "rollup-plugin-terser": "^7.0.2", "rollup-plugin-typescript2": "^0.31.1", diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index 4e0f93a..5b8d3d3 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -6,14 +6,16 @@ import { emit } from "./emitter.js"; import { wrap } from "./wrapper.js"; import { lex } from "./lexer.js"; + export interface CompilerOutput { readonly diagnostics: readonly IDiagnostic[]; readonly output: string; } export interface CompilerOptions { - readonly url?: string; - readonly pretty?: boolean; readonly cache?: boolean; + readonly forgetShebang?: boolean; + readonly pretty?: boolean; + readonly url?: string; } /** * Complies tsk language code and transplies it into js code @@ -24,13 +26,13 @@ export interface CompilerOptions { export function compileCode(code: string, opts: CompilerOptions): CompilerOutput | Promise { var parsed = parse(lex(code), opts.url!, opts.cache ?? true); /**@param {import("../parser").ParserOutput} parsed */ - function _(parsed: ParserOutput) { + function _({ diagnostics, __used, output }: ParserOutput) { var obj = { - diagnostics: parsed.diagnostics, + diagnostics, output: `/*#EMPTY${ Math.random() }*/` }; try { - obj.output = wrap(emit(parsed.output, opts), parsed.__used); + obj.output = wrap(emit(output, opts), __used); } catch (error) { pushDiagnostic(DiagnosticSeverity.FatalError, error as never); } @@ -61,7 +63,7 @@ export type { SyntaxTree } from "./parser"; export type { - AccessChainItem as AccessChainItem, + AccessChainItem, IClassNode, ClassConstructor, ClassNodeProps, @@ -75,7 +77,7 @@ export type { ITryStatmentNode, IUsingStatmentNode, MixinNode, - IParameterNode as ParameterNode + IParameterNode } from "./nodes"; export type { AccessChainItemKind, diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index 2316204..b1d3c3d 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -2,12 +2,13 @@ import { AccessChainItemKind, Nodes, NodeType, ParameterNodeKind } from "./enums import { occurrences } from "./utils/occurrences.js"; import { assert_type, includes, random_var_name, undefined } from "./utils/util.js"; import { _echo } from "./utils/_echo.js"; -import { AccessChainItem } from "./nodes"; -import type { IClassNode, INode, IParameterNode, ITryStatmentNode } from "./nodes"; +import { AccessChainItem, ParameterNode } from "./nodes"; +import type { IClassNode, INode, ITryStatmentNode } from "./nodes"; var __pretty = true; -function as_expression(exp: INode) { +var commaAndWhitespace: string; +function as_expression(exp: INode): INode { if (exp.type === NodeType.Expression) { return exp; } else { @@ -20,7 +21,7 @@ function as_expression(exp: INode) { body: [exp] }], args: [] - } as INode; + }; } } function isBlockNode(node: INode) { @@ -43,7 +44,7 @@ function isSimple(node: INode) { Nodes.AsyncFunctionExpression, Nodes.AsyncGeneratorFunctionExpression, Nodes.BigIntValue, - Nodes.CallExpression, + // Nodes.CallExpression, Nodes.MemberAccessExpression, Nodes.FalseValue, Nodes.TrueValue, @@ -64,9 +65,9 @@ function isSimple(node: INode) { * @param {import("./parser").Node} node * @param {any} meta */ -function _emit(node: INode, meta: Record) { - var __text = "", elementParams: IParameterNode[], elementArgs: INode[], - length: number, index: number, body: string | readonly INode[] | readonly object[] | readonly AccessChainItem[], __diff: boolean, +function _emit(node: INode, meta: EmitterOptions) { + var __text = "", elementParams: ParameterNode[], elementArgs: INode[], + length: number, index: number, body: readonly INode[] | readonly AccessChainItem[], __diff: boolean, quote: string, rquote: string, name: string, node_name: Nodes, _: any; /** * Inserts space into __text variable if text must be prettified @@ -84,25 +85,22 @@ function _emit(node: INode, meta: Record) { * Inserts indentation into __text variable */ function is() { - __pretty && (__text += meta.sp); + __pretty && (__text += meta.indentation); } /** * Lowers indentation by 4 spaces */ function li() { - meta.sp = meta.sp.slice(0, -4); + __pretty && (meta.indentation = meta.indentation.slice(0, -4)); } /** * Raises indentation by 4 spaces */ function ri() { - meta.sp += " "; + __pretty && (meta.indentation += " "); } function declare(name: T): T { - (__top.params ||= []).push({ - name, - kind: ParameterNodeKind.NoPrefix - }); + __top.params!.push(new ParameterNode(name, ParameterNodeKind.NoPrefix, undefined)); return name; } function pre_emit_body() { @@ -125,7 +123,7 @@ function _emit(node: INode, meta: Record) { assigned++; is(); __text += _emit(element, meta); - if ((index + 1 < length || __pretty) && !isBlockNode(element) && element.type !== NodeType.Ephemerial) { + if ((index + 1 < length || __pretty) && !isBlockNode(element)) { __text += ";"; } nl(); @@ -139,18 +137,17 @@ function _emit(node: INode, meta: Record) { function sp() { __pretty && (___text += " "); } - for (var index = 0, length = nodes.length, __text = ""; index < length; index++) { - var node = nodes[index], body = node.body, nodeKind = node.kind; + for (var index = 0, __text = ""; index < nodes.length; index++) { + const node = nodes[index], body = node.body, nodeKind = node.kind; if (nodeKind === AccessChainItemKind.Head) { - __text += _emit(isSimple(body = as_expression(body)) && body.name !== Nodes.NumberValue ? body : + __text += _emit(isSimple(body) && body.name !== Nodes.NumberValue ? as_expression(body) : ({ name: Nodes.GroupExpression, type: NodeType.Expression, body: [body] }), meta); } else if (nodeKind === AccessChainItemKind.Normal) { __text += `.${ _emit(body, meta) }`; } else if (nodeKind === AccessChainItemKind.Computed) { __text += `[${ _emit(body, meta) }]`; } else if (nodeKind === AccessChainItemKind.Optional || nodeKind === AccessChainItemKind.OptionalComputed) { - var randomName = random_var_name(), ___text = `(n(${ randomName }`; - declare(randomName); + var randomName = declare(random_var_name()), ___text = `(n(${ randomName }`; sp(); ___text += "="; sp(); @@ -167,7 +164,7 @@ function _emit(node: INode, meta: Record) { type: NodeType.Expression, symbol: randomName })); - nodes[1].kind = nodeKind === AccessChainItemKind.Optional ? + node.kind = nodeKind === AccessChainItemKind.Optional ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; return `${ ___text }${ emitChain(nodes) })`; @@ -177,7 +174,7 @@ function _emit(node: INode, meta: Record) { type: NodeType.Expression, symbol: `__na(${ __text })` })); - nodes[1].kind = nodeKind === AccessChainItemKind.NormalNullAsserted ? + node.kind = nodeKind === AccessChainItemKind.NormalNullAsserted ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; return emitChain(nodes); @@ -201,13 +198,11 @@ function _emit(node: INode, meta: Record) { __text += "("; elementArgs = node.args!; length = elementArgs.length; - index = 0; - for (; index < length; index++) { - let node = elementArgs[index]; + for (index = 0; index < length; index++) { + const node = elementArgs[index]; __text += _emit(node, meta); if (index + 1 < length) { - __text += ","; - sp(); + __text += commaAndWhitespace; } } __text += ")"; @@ -221,8 +216,7 @@ function _emit(node: INode, meta: Record) { length && is(); __text += "}"; } - meta.sp ??= ""; - body = node.body!; + body = node.body! as INode[] | AccessChainItem[]; switch (node_name = node.name) { case Nodes.ArgumentsObject: __text += "arguments"; @@ -233,14 +227,12 @@ function _emit(node: INode, meta: Record) { for (let index = 0, length = body.length; index < length; index++) { const element = body[index]; __text += _emit(element, meta); - if (element.name !== Nodes.Shebang || !meta.forgetShebang) { - if (__pretty && !isBlockNode(element) && element.type !== NodeType.Ephemerial) { - __text += ";"; - } - if (index < length - 1) { - nl(); - is(); - } + if (__pretty && !isBlockNode(element) && element.type !== NodeType.Ephemerial) { + __text += ";"; + } + if (index < length - 1) { + nl(); + is(); } } break; @@ -433,6 +425,7 @@ function _emit(node: INode, meta: Record) { __text += `$${ node.symbol }`; break; + case Nodes.RegularExpression: case Nodes.ExternalVariable: case Nodes.SymbolNoPrefix: case Nodes.NumberValue: @@ -469,9 +462,8 @@ function _emit(node: INode, meta: Record) { type: NodeType.Statment, body: [body[0]] }] - }], - args: [body[1]] - } as INode, meta); + }], args: [body[1]] + }, meta); break; case Nodes.CallExpression: @@ -482,18 +474,7 @@ function _emit(node: INode, meta: Record) { case Nodes.GroupExpression: assert_type(body); - __text += "("; - length = body.length; - index = 0; - for (; index < length; index++) { - let node = body[index]; - __text += _emit(as_expression(node), meta); - if (index + 1 < length) { - __text += ","; - sp(); - } - } - __text += ")"; + __text += `(${ body.map(node => _emit(as_expression(node), meta)).join(commaAndWhitespace) })`; break; case Nodes.ReturnStatment: @@ -600,7 +581,7 @@ function _emit(node: INode, meta: Record) { } else { sp(); __text += "{"; - bodyLength = (body = node.else!.body!).length; + bodyLength = (body = node.else!.body! as INode[]).length; bodyLength && nl(); ri(); emit_body(); @@ -644,7 +625,6 @@ function _emit(node: INode, meta: Record) { break; case Nodes.AwaitExpression: - assert_type(_); assert_type<[INode]>(body); __text += "yield"; if (_ = node.outerBody!.name === Nodes.AsyncGeneratorFunctionExpression) { @@ -686,7 +666,7 @@ function _emit(node: INode, meta: Record) { case Nodes.Array: assert_type(body); - __text += `[${ body.map(node => _emit(as_expression(node), meta)).join(`,${ __pretty ? " " : "" }`) }]`; + __text += `[${ body.map(node => _emit(as_expression(node), meta)).join(commaAndWhitespace) }]`; break; case Nodes.ArgumentBindingExpression: @@ -695,12 +675,11 @@ function _emit(node: INode, meta: Record) { sp(); __text += `u,`; sp(); - __text += `${ node.args!.map(node => _emit(as_expression(node), meta)).join(`,${ __pretty ? " " : "" }`) })`; + __text += `${ node.body!.map(node => _emit(as_expression(node as INode), meta)).join(commaAndWhitespace) })`; break; case Nodes.LiteralLogicalNotExpression: assert_type<[INode]>(body); - assert_type(_); _ = as_expression(body[0]); __text += `!${ isSimple(_) ? _emit(_, meta) : `(${ _emit(_, meta) })` }`; break; @@ -824,10 +803,6 @@ function _emit(node: INode, meta: Record) { emitCallExpression(); break; - case Nodes.RegularExpression: - __text += body; - break; - case Nodes.ForRangeStatment: { const [from, to, as] = node.args as [INode, INode, string]; @@ -873,14 +848,14 @@ function _emit(node: INode, meta: Record) { break; case undefined: { - const sp = meta.sp + " "; + const sp = meta.indentation + " "; __text += `/*\n${ sp }Cannot emit undefined, has something gone wrong?` + - `\n${ sp }Stack trace:\n${ sp + Error().stack?.replace(/\n/g, `\n${ sp }`) }\n${ meta.sp }*/`; + `\n${ sp }Stack trace:\n${ sp + Error().stack?.replace(/\n/g, `\n${ sp }`) }\n${ meta.indentation }*/`; break; } case Nodes.Shebang: - if (!meta.forgetShebang) __text += "#!" + body; + __text += "#!" + node.symbol; break; case Nodes.ClassExpression: @@ -893,18 +868,24 @@ function _emit(node: INode, meta: Record) { } return __text; } -export interface EmitterOptions { +export interface IEmitterOptions { pretty?: boolean; forgetShebang?: boolean; url?: string; } var __top: INode; +class EmitterOptions implements IEmitterOptions { + indentation: string = ""; + constructor(public readonly url: string | undefined) { } +} /** * @param {import("./parser").Node} node * @param {import("./emitter").EmitterOptions} opts */ -export function emit(node: INode, { pretty = false, forgetShebang = true, ...other }: EmitterOptions = {}) { +export function emit(node: INode, { pretty = false, forgetShebang = true, ...other }: IEmitterOptions = {}) { __pretty = pretty; + commaAndWhitespace = ',' + (__pretty ? " " : ""); + const options = new EmitterOptions(other.url); - return _emit(__top = node, { forgetShebang, ...other }); + return (!forgetShebang && node.meta!.shebang && _emit(node.meta!.shebang as INode, options) || "") + _emit(__top = node, options); } diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index b807198..9ad6310 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -4,119 +4,32 @@ import { Tokens } from "./enums"; import { keywords, validChars, $2charoperators, $3charoperators } from "./utils/constants.js"; import { advance_next, type Prefix } from "./utils/advancers.js"; -const numberChars = /[\d\.\-\+]/; -const numberRegex = /^(?:[\-\+]?\d[_\d]*)?(?:\.(\.[\-\+]?)?[\d_]+)?$/m; -const operatorCharsRegex = /^[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]$/m; -const stringStartRegex = /^'|"$/m; -const whitespaceRegex = /\s/; -export const symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; + +const operatorCharsRegex = /[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]/; + function isWhitespace(char: string) { return char === "\r" || char === "\n" || char === " " || char === "\t" || char === "\f" || char === "\v"; } -// /** -// * @param {any[]} array -// * @param {any} element -// * @param {number} length -// */ -// function has(array, element, length) { -// for (let index = 0; index < length; index++) { -// if (element === array[index]) { -// return true; -// } -// } -// return false; -// } -/** - * @param {string} quot - * @param {import("./utils/stream").TextStream} iter - */ -function scanText(quot: string, iter: TextStream): Token { - var result = "", last = "", compound = '\\' + quot, next: string; - while (!nullish(next = iter.next) && (next !== quot || last + next === compound)) { - last = (iter.advance(), next); - if (nullish(last)) { - throw "Unexcepted EOF"; - } - result += last; - } - iter.advance(); - return new Token(Tokens.String, result); -} -/** - * @param {string} char - * @param {import("./utils/stream").TextStream} iter - * @returns {import("./utils/stream").Token} - */ -function scanSymbol(char: string, iter: TextStream): Token { - var result = char, next: string; - while (!nullish(next = iter.next) && symbolicCharsRegex.test(next)) { - result += (iter.advance(), next); - } - if (!validChars.test(result)) { - throw `${ result } is not a valid symbol!`; - } - return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); -} -/** - * @param {string} char - * @param {import("./utils/stream").TextStream} iter - */ -function scanWhitespace(char: string, iter: TextStream): Token | void { - var next: string; - while (!nullish(next = iter.next) && isWhitespace(next)) iter.advance(); - // return { [IsTokenSymbol]: true, type: Tokens.Whitespace, body: ' ' }; -} -/** - * @param {import("./utils/stream").TextStream} iter - * @param {string} firstChar - */ -function scanComment(iter: TextStream): Token | void { - var next: string; - while (!nullish(next = iter.move()) && next !== '\n'); - // return { [IsTokenSymbol]: true, type: Tokens.Comment, body: result + "\n" }; -} -/** - * @param {import("./utils/stream").TextStream} iter - * @param {string} firstChar - */ -function scanMultiineComment(iter: TextStream, firstChar: string): Token | void { - var result = firstChar; - while (result + iter.next !== '*/') { - result = iter.move(); - } - iter.advance(); - // return { [IsTokenSymbol]: true, type: Tokens.MultilineComment, body: result.slice(0, -1) }; -} class Lexer implements TokenStream { - private readonly numberChars = /[0-9\.\-\+]/; - private readonly numberRegex = /^(?:[\-\+]?[0-9][_0-9]*)?(?:\.(\.[\-\+]?)?[0-9_]+)?$/m; - private readonly operatorCharsRegex = /[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]/y; - private readonly stringStartRegex = /^['"]/y; - private readonly whitespaceRegex = /\s+/y; - private readonly symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/y; - public readonly next: Token = undefined!; - private _triaged?: Token; - private _triageLength: number = 0; - private _inited: boolean = false; + public readonly next!: Token; + _triaged?: Token; + _triageLength = 0; constructor(public readonly text_stream: TextStream) { } public advance() { - this._inited = true; - if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot advance token stream when a token is triaged!"; - return (this as { next: unknown; }).next = this._lex(this.text_stream.move()); + if (this._triaged !== undefined) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot advance token stream when a token is triaged!"; + return (this as { next: Token; }).next = this.#lex(this.text_stream.move()); } public move() { - this._inited = true; - if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot move token stream when a token is triaged!"; + if (this._triaged !== undefined) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot move token stream when a token is triaged!"; const __next = this.next; - (this as { next: unknown; }).next = this._lex(this.text_stream.move()); + (this as { next: Token; }).next = this.#lex(this.text_stream.move()); return __next; } public try

(end: string, prefix?: Prefix

): Token { - this._inited = true; - if (this._triaged) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot try a token 2 times!"; + if (this._triaged !== undefined) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot try a token 2 times!"; const initialIndex = this.text_stream.index; const result = advance_next(this, end, prefix); this._triageLength = this.text_stream.index - initialIndex; @@ -132,10 +45,11 @@ class Lexer implements TokenStream { this._triageLength = 0; } public *[Symbol.iterator]() { - this._inited || this.move(); + this.next || this.advance(); while (!nullish(this.next)) { yield this.move(); } } - _lex(char: string): Token { + #lex(char: string): Token { + var result: string | undefined; if (nullish(char)) { return char; } else if (operatorCharsRegex.test(char)) { @@ -150,34 +64,61 @@ class Lexer implements TokenStream { if (">>>=" === __joined) { return new Token(Tokens.Operator, __joined); } else { - this.text_stream.down(); + this.text_stream.down(1); return new Token(Tokens.Operator, _joined); } } else if (joined === "//") { - return scanComment(this.text_stream), this._lex(this.text_stream.move()); + return this.#scanComment(), this.#lex(this.text_stream.move()); } else if (joined === "/*") { - return scanMultiineComment(this.text_stream, __char), this._lex(this.text_stream.move()); + return this.#scanMultiineComment(__char), this.#lex(this.text_stream.move()); } else { - this.text_stream.down(); + this.text_stream.down(1); return new Token(Tokens.Operator, joined); } } else { - this.text_stream.down(); + this.text_stream.down(1); return new Token(Tokens.Operator, char); } } else if (isWhitespace(char)) { - return scanWhitespace(char, this.text_stream), this._lex(this.text_stream.move()); + return this.#scanWhitespace(), this.#lex(this.text_stream.move()); } else if (char === "'" || char === "\"") { - return scanText(char, this.text_stream); + return this.#scanText(char); } else if ('0' <= char && char <= '9') { - return this.scanNumber(char); - } else if (validChars.test(char)) { - return scanSymbol(char, this.text_stream); + return this.#scanNumber(char); + } else if (result = this.#match(validChars)) { + this.text_stream.index = validChars.lastIndex; + return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); } else { throw `Unrecognised character: "${ char }"!`; } } - scanNumber(firstChar: string): Token { + #scanText(quot: string): Token { + var result = "", last = "", compound = '\\' + quot, next: string; + while (!nullish(next = this.text_stream.next) && (next !== quot || last + next === compound)) { + last = (this.text_stream.advance(), next); + if (nullish(last)) { + throw "Unexcepted EOF"; + } + result += last; + } + this.text_stream.advance(); + return new Token(Tokens.String, result); + } + #scanWhitespace(): void { + var next: string; + while (!nullish(next = this.text_stream.next) && isWhitespace(next)) this.text_stream.advance(); + } + #scanComment(): void { + var next: string; + while (!nullish(next = this.text_stream.move()) && next !== '\n'); + } + #scanMultiineComment(char: string): void { + while (char + this.text_stream.next !== '*/') { + char = this.text_stream.move(); + } + this.text_stream.advance(); + } + #scanNumber(firstChar: string): Token { var result = firstChar, next: string; if (firstChar === "0") { const format = this.text_stream.move(); @@ -189,7 +130,7 @@ class Lexer implements TokenStream { ) { result += next; } - if (validChars.test(next)) { + if (this.#matchText(validChars, next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a hexadecimal digit.`); } } else if (format === "o") { @@ -200,25 +141,25 @@ class Lexer implements TokenStream { if (next === "8" || next === "9") { error_unexcepted_token(new Token(Tokens.Number, next), `; ${ next } is not an octal digit.`); } - if (validChars.test(next)) { + if (this.#matchText(validChars, next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not an octal digit.`); } } else if (format === ".") { const next = this.text_stream.move(); if (next === ".") { - this.text_stream.down(); + this.text_stream.down(1); } else { result += format; let next; while ('0' <= (next = this.text_stream.move()) && next <= '9') { result += next; } - if (validChars.test(next)) { + if (this.#matchText(validChars, next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); } } - } else if (validChars.test(format)) { - error_unexcepted_token(new Token(Tokens.Symbol, format), `; ${ format } is not a decimal digit.`); + } else if (this.#matchText(validChars, format)) { + throw "A number literal cannot start with zero"; } } else { while ('0' <= (next = this.text_stream.move()) && next <= '9') { @@ -230,19 +171,20 @@ class Lexer implements TokenStream { result += next; } } - if (validChars.test(next)) { + if (this.#matchText(validChars, next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); } } - this.text_stream.down(); + this.text_stream.down(1); return new Token(Tokens.Number, result); } - scanSymbol(char: string, iter: TextStream): Token { - var result = char, next: string; - while (!nullish(next = iter.next) && symbolicCharsRegex.test(next)) { - result += (iter.advance(), next); - } - return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); + #match(regex: RegExp): string | undefined { + regex.lastIndex = this.text_stream.index - 1; + return regex.exec(this.text_stream.text)?.[0]; + } + #matchText(regex: RegExp, text: string): string | undefined { + regex.lastIndex = 0; + return regex.exec(text)?.[0]; } }; diff --git a/src/lib/nodes.ts b/src/lib/nodes.ts index 6c2be14..4a5dfb9 100644 --- a/src/lib/nodes.ts +++ b/src/lib/nodes.ts @@ -1,12 +1,13 @@ import type { Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, ObjectBodyNodeKind } from "./enums"; - export type NodeName = Nodes; + export interface INodeBase { name: NodeName; type: NodeType; } + export interface INode extends INodeBase { body?: INode[] | AccessChainItem[] | Record[]; outerBody?: INode; @@ -19,64 +20,71 @@ export interface INode extends INodeBase { else?: INode; elseif?: INode; } + export abstract class Node implements INode { - public abstract body?: INode[] | AccessChainItem[] | Record[]; - public abstract outerBody?: INode; - public abstract params?: IParameterNode[]; - public abstract symbol?: string; - public abstract meta?: Record; - public abstract args?: INode[]; - public abstract locals?: string[]; - public abstract nonlocals?: string[]; - public abstract else?: INode; - public abstract elseif?: INode; - public constructor(public readonly name: NodeName, public readonly type: NodeType) { } + public constructor(public readonly name: NodeName, public readonly type: NodeType, + public readonly body?: INode[] | AccessChainItem[] | Record[], public readonly outerBody?: INode, + public readonly symbol?: string, public readonly meta?: Record) { } } + export interface ITryStatmentNode extends INodeBase { body: INode[]; else: INode[]; catch: [name: string, value: INode[]]; finally: INode[]; + outerBody: INode; } + export interface IUsingStatmentNode extends ITryStatmentNode { args: [indentifier: string, value: INode][]; } + export interface ClassProperty { name: INode; body: INode[]; } + export interface ClassMethod extends ClassProperty { decorators: INode[]; params: IParameterNode[]; } + export interface ClassGetter extends ClassMethod { params: []; } + export interface ClassSetter extends ClassMethod { params: [] | [IParameterNode & { kind: ParameterNodeKind.Normal; }]; } + export interface ClassConstructor { body: INode[]; params: IParameterNode[]; async: boolean; gen: boolean; } + export interface ClassNodeProps { methods: ClassMethod[]; getters: ClassGetter[]; settets: ClassSetter[]; props: { name: INode; value: INode }[]; } + export interface IClassNode extends INode, Privatify { construct?: ClassConstructor; extends?: INode; mixins: INode[]; } + export interface MixinNode extends IClassNode { } + export type PrivatifyString = T | `private${ Capitalize }`; + export type Privatify = { [Key in keyof T as PrivatifyString]-?: T[Key]; }; + export interface IParseMeta { /** insideExpression */ insideExpression: boolean; @@ -85,30 +93,36 @@ export interface IParseMeta { readonly cache: boolean; [key: string]: unknown; } + export class ParseMeta implements IParseMeta { constructor(public readonly filename: string, public readonly outer: INode, public readonly cache: boolean, public insideExpression = false) {}; [key: string]: unknown; } + export interface IParameterNode { name: string | INode; kind: ParameterNodeKind; default?: INode; _meta?: Record; } + export class ParameterNode { public readonly default?: INode; - constructor(public readonly name: string | INode, public readonly kind: ParameterNodeKind, default_: INode | undefined) { + constructor(public name: string | INode, public readonly kind: ParameterNodeKind, default_: INode | undefined) { this.default = default_; } } + export class AccessChainItem { constructor(public kind: AccessChainItemKind, public body: INode) { } } + export type ObjectBodyNode = { name: INode; type: ObjectBodyNodeKind; body: INode[]; }; + export interface ObjectNode extends INodeBase { name: Nodes.ObjectExpression; type: NodeType.Expression; diff --git a/src/lib/parser.ts b/src/lib/parser.ts index 6510f5f..76e4d7d 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -294,7 +294,7 @@ export function parse_expression

(stream: import("./utils/strea } export function _parse_and_assert_last_token

(stream: TokenStream, meta: IParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

, parse: typeof __parse = _parse) { - var arg: INode | [INode], next: Token; + var arg: INode; arg = parse(advance_next(stream, end_expression, prefix), stream, meta); except_next_token(stream, token_type, token_string); return arg; @@ -307,18 +307,18 @@ export const diagnostics: readonly IDiagnostic[] = []; export class Diagnostic implements IDiagnostic { public readonly line: number; public readonly column: number; - constructor(public readonly severity: DiagnosticSeverity, public readonly message: string, { text_stream }: TokenStream = {} as never) { + constructor(public readonly severity: DiagnosticSeverity, public readonly message: string, { text_stream }: Partial = {}) { const text = text_stream?.text.slice(0, text_stream.index); this.line = text ? occurrences(text, '\n') + 1 : '?' as never; - this.column = text ? text_stream?.index - text?.lastIndexOf('\n') : '?' as never; + this.column = text ? text_stream?.index! - text?.lastIndexOf('\n') : '?' as never; } log() { - const level = (["Info", "Warn", "RuntimeError", "Error", "FatalError"] as Array)[this.severity]; + const level = (["Info", "Warn", "RuntimeError", "Error", "FatalError"] as const)[this.severity]; console.log(`Diagnostic[Level: ${ level }, Line: ${ this.line }, Column: ${ this.column }]:`, this.message); } } export function pushDiagnostic(severity: DiagnosticSeverity, message: string, stream?: TokenStream, _diagnostics: readonly IDiagnostic[] = diagnostics) { - (diagnostics as IDiagnostic[]).push(new Diagnostic(severity, message, stream)); + (_diagnostics as IDiagnostic[]).push(new Diagnostic(severity, message, stream)); } export var promises: Promise[] = []; export interface ParserOutput { @@ -363,8 +363,7 @@ export function main_parse(stream: TokenStream, filename: string, outer: INode, const parsed: INode[] = [], meta = new ParseMeta(filename, outer, cache, insideExpression); var next: Token; parse_shebang(stream, outer); - stream.move(); - while (!nullish(next = stream.next)) { + while (!nullish(next = stream.advance())) { // try { // var newlines = occurrences(next[1], '\n'); // var __line_cache = __line += newlines; @@ -390,7 +389,6 @@ export function main_parse(stream: TokenStream, filename: string, outer: INode, // throw error; // } // } - stream.move(); } return parsed; } @@ -403,7 +401,7 @@ function parse_shebang({ text_stream }: TokenStream, outer: INode) { text += next; } } else text_stream.down(2); - } else text_stream.down(); + } else text_stream.down(1); if (__top_fn_node === outer) __top_fn_node.meta!.shebang = text; } diff --git a/src/lib/parsers/array-expression.ts b/src/lib/parsers/array-expression.ts index aaf8df5..cfd19c6 100644 --- a/src/lib/parsers/array-expression.ts +++ b/src/lib/parsers/array-expression.ts @@ -6,10 +6,11 @@ import { parse_operators, _parse, __parse } from "../parser.js"; import type { INode, IParseMeta } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; + export function parse_array_expression(stream: TokenStream, meta: IParseMeta) { - var body: INode[] = []; + const body: INode[] = []; /**@type {import("./parser").Node}*/ - var node: INode = { + const node: INode = { name: Nodes.Array, type: NodeType.Expression, body diff --git a/src/lib/parsers/assignments.ts b/src/lib/parsers/assignments.ts index 892ce4b..f49b622 100644 --- a/src/lib/parsers/assignments.ts +++ b/src/lib/parsers/assignments.ts @@ -6,10 +6,11 @@ import { pushDiagnostic, _parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; import type { INode, IParseMeta, AccessChainItem } from "../nodes"; + export function parse_assignment(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta): INode | undefined { if (name = AssignmentOperatorTable[next.body as AssignmentOperatorTableKeys] as Nodes | undefined) { if (_sym.name === Nodes.MemberAccessExpression) { - var body = _sym.body as AccessChainItem[]; + const body = _sym.body as AccessChainItem[]; var name: Nodes | undefined, parsed: INode, node: INode; for (var index = 0; index < body.length; index++) { const item = body[index]; diff --git a/src/lib/parsers/body-parser.ts b/src/lib/parsers/body-parser.ts index 55364e6..90b1793 100644 --- a/src/lib/parsers/body-parser.ts +++ b/src/lib/parsers/body-parser.ts @@ -4,12 +4,14 @@ import { _parse, pushDiagnostic } from "../parser.js"; import type { IParseMeta, INode } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; + /** * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta */ export function parse_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { - var next: Token = advance_next(stream, "}", prefix), nodes: INode[] = []; + var next: Token = advance_next(stream, "}", prefix); + const nodes: INode[] = []; //console.log(1123124); while ((next /*, console.log("next:", next), next*/).type !== Tokens.Operator || next.body !== "}") { // console.log(next); diff --git a/src/lib/parsers/call-expression.ts b/src/lib/parsers/call-expression.ts index d8bed65..a2f3ee3 100644 --- a/src/lib/parsers/call-expression.ts +++ b/src/lib/parsers/call-expression.ts @@ -6,6 +6,7 @@ import { __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; import type { IParseMeta, INode } from "../nodes"; + export function parse_call_expression(next: Token, stream: TokenStream, meta: IParseMeta): INode[] { const args: INode[] = []; if (next.type !== Tokens.Operator || next.body !== ")") { diff --git a/src/lib/parsers/common-expressions.ts b/src/lib/parsers/common-expressions.ts index 6351030..4215b03 100644 --- a/src/lib/parsers/common-expressions.ts +++ b/src/lib/parsers/common-expressions.ts @@ -1,4 +1,3 @@ -import { isArray } from "../utils/util.js"; import { Nodes, NodeType } from "../enums"; import { CommonOperatorTable, type CommonOperatorTableKeys } from "../utils/table.js"; import { end_expression } from "../utils/constants.js"; @@ -7,11 +6,12 @@ import { __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; import type { INode, IParseMeta } from "../nodes"; -export function parse_common_expressions(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { - var parsed: INode, node: INode, name: Nodes | undefined = CommonOperatorTable[next.body as CommonOperatorTableKeys]; + +export function parse_common_expressions(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta): INode | undefined { + const name: Nodes | undefined = CommonOperatorTable[next.body as CommonOperatorTableKeys]; if (name) { - parsed = __parse(advance_next(stream, end_expression), stream, meta) as INode; - node = { + const parsed = __parse(advance_next(stream, end_expression), stream, meta); + const node: INode = { name, type: NodeType.Expression, body: [_sym, parsed], @@ -21,12 +21,8 @@ export function parse_common_expressions(_sym: INode, next: Token, stream: Token // Here is the logic: // If parsed is a common | assignment expression // Succumb it onto this ** expression - // @ts-ignore - if (typeof parsed.symbol === "string" && isArray(parsed.body)) { - // - // @ts-ignore - node.body[1] = parsed.body[0]; - // @ts-ignore + if (typeof parsed.symbol === "string" && typeof parsed.body === "object") { + node.body![1] = parsed.body[0]; parsed.body[0] = node; } return parsed; diff --git a/src/lib/parsers/external-var.ts b/src/lib/parsers/external-var.ts index b918acd..e973db3 100644 --- a/src/lib/parsers/external-var.ts +++ b/src/lib/parsers/external-var.ts @@ -4,6 +4,7 @@ import { undefined } from "../utils/util.js"; import type { INode } from "../nodes.js"; import type { TokenStream } from "../utils/stream.js"; + export function __external_var_creator(type: NodeType) { return function __external_var(stream: TokenStream): INode { const prefix = `External variable expression:`; diff --git a/src/lib/parsers/group-expression.ts b/src/lib/parsers/group-expression.ts index a2dc967..5adbf06 100644 --- a/src/lib/parsers/group-expression.ts +++ b/src/lib/parsers/group-expression.ts @@ -6,12 +6,11 @@ import { parse_operators, __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; import type { INode, IParseMeta } from "../nodes.js"; + export function parse_group_expression(stream: TokenStream, meta: IParseMeta) { - var prefix = "Group expression:" as const, - next: Token, - body: INode[] = [], - node: INode = { name: Nodes.GroupExpression, type: NodeType.Expression, body }, - parsed: INode; + const prefix = "Group expression:", body: INode[] = [], + node: INode = { name: Nodes.GroupExpression, type: NodeType.Expression, body }; + var next: Token, parsed: INode; while (next = advance_next(stream, end_expression, prefix), next.type !== Tokens.Operator || next.body !== ")") { parsed = __parse(next, stream, meta); next = advance_next(stream, end_expression, prefix); diff --git a/src/lib/parsers/keywords.ts b/src/lib/parsers/keywords.ts index 2439614..00c8090 100644 --- a/src/lib/parsers/keywords.ts +++ b/src/lib/parsers/keywords.ts @@ -5,7 +5,7 @@ import { import { _echo } from "../utils/_echo.js"; import { FunctionNodeKind, Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, Tokens, DiagnosticSeverity } from "../enums"; import { lex } from "../lexer.js"; -import { meberAccessOperators, end_expression } from "../utils/constants.js"; +import { memberAccessOperators, end_expression } from "../utils/constants.js"; import { _parseMemberAccess } from "./member-access.js"; import { advance_next, except_next_token } from "../utils/advancers.js"; import { parse_body, parse_next_body } from "./body-parser.js"; @@ -15,8 +15,9 @@ import { parse_call_expression } from "./call-expression.js"; import { type IParseMeta, type INode, type IParameterNode, type IClassNode, type AccessChainItem, type IUsingStatmentNode, ParseMeta, ParameterNode } from "../nodes"; import type { TokenStream } from "../utils/stream.js"; + type KeywordParsers = Readonly Readonly>>; -export var keywords_handlers = { +export const keywords_handlers = { /** * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta @@ -255,7 +256,7 @@ export var keywords_handlers = { locals: [], nonlocals: [] }; - const innerMeta: IParseMeta = new ParseMeta(meta.filename, node, meta.cache); + const innerMeta = new ParseMeta(meta.filename, node, meta.cache); for (; ;) { paramType = ParameterNodeKind.Normal; next = advance_next(stream, "symbol", prefix); @@ -416,8 +417,7 @@ export var keywords_handlers = { if (next.type === Tokens.Operator && next.body === ".") { next = advance_next(stream, ['any', 'all', 'allSettled', 'race'].join('" | "'), prefix); if (next.type === Tokens.Symbol && /^(any|all(Settled)?|race)$/m.test(next.body)) { - var expression = _parse(advance_next(stream, end_expression, prefix), stream, meta); - var _: INode = { + var expression: INode = { name: Nodes.CallExpression, type: NodeType.Expression, body: [{ @@ -425,9 +425,8 @@ export var keywords_handlers = { type: NodeType.Expression, symbol: `p.${ next.body }` }], - args: [expression as never] + args: [_parse(advance_next(stream, end_expression, prefix), stream, meta)] }; - expression = _; } else { error_unexcepted_token(next); } @@ -438,7 +437,7 @@ export var keywords_handlers = { name: Nodes.AwaitExpression, type: NodeType.Expression, outerBody: meta.outer, - body: [expression as never] + body: [expression] }; }, this() { @@ -472,8 +471,8 @@ export var keywords_handlers = { if (!(isConstantObject || next.type === Tokens.Symbol)) { error_unexcepted_token(next); } - next2 = advance_next(stream, [',', ')'].join('" | "') + meberAccessOperators.join('" | "'), prefix); - if (next2.type === Tokens.Operator && includes(meberAccessOperators, next2.body)) { + next2 = advance_next(stream, [',', ')'].join('" | "') + memberAccessOperators.join('" | "'), prefix); + if (next2.type === Tokens.Operator && includes(memberAccessOperators, next2.body)) { arg = { name: Nodes.MemberAccessExpression, type: NodeType.Expression, @@ -535,7 +534,7 @@ export var keywords_handlers = { }, // TODO try(stream, meta) { - const node = { + const node: Partial = { name: Nodes.TryStatment, type: NodeType.Statment, catch: null!, @@ -544,7 +543,7 @@ export var keywords_handlers = { finally: null!, args: null!, outerBody: meta.outer - } as Partial; + }; var prefix: `Try${"" | "-Using"} statment:` = "Try statment:", next = advance_next(stream, end_expression, prefix), nonuseless = true; if (next.type === Tokens.Keyword && next.body === "using") { @@ -622,7 +621,7 @@ export var keywords_handlers = { return { name: Nodes.ImportExpression, type: NodeType.Expression, - args: parse_call_expression(advance_next(stream, end_expression, "Import statment:"), stream, meta) + body: parse_call_expression(advance_next(stream, end_expression, "Import statment:"), stream, meta) }; }, for(stream, meta) { diff --git a/src/lib/parsers/member-access.ts b/src/lib/parsers/member-access.ts index bed7070..3099554 100644 --- a/src/lib/parsers/member-access.ts +++ b/src/lib/parsers/member-access.ts @@ -1,14 +1,15 @@ import { includes } from "../utils/util.js"; import { Nodes, NodeType, AccessChainItemKind, Tokens, ParseNodeKind } from "../enums"; -import { meberAccessOperators, end_expression } from "../utils/constants.js"; +import { memberAccessOperators, end_expression } from "../utils/constants.js"; import { __parse, __used, _parse, parse_operators } from "../parser.js"; import { advance_next, except_next_token } from "../utils/advancers.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import { INode, IParseMeta, AccessChainItem } from "../nodes"; +import { type INode, type IParseMeta, AccessChainItem } from "../nodes"; + export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { - var chain: AccessChainItem[] = [new AccessChainItem(AccessChainItemKind.Head, sym)]; - while (next.type === Tokens.Operator && includes(meberAccessOperators, next.body)) { + const chain = [new AccessChainItem(AccessChainItemKind.Head, sym)]; + while (next.type === Tokens.Operator && includes(memberAccessOperators, next.body)) { stream.confirm_try(); if (next.body === ".") { chain.push(new AccessChainItem(AccessChainItemKind.Normal, { @@ -17,7 +18,7 @@ export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body })); } else if (next.body === "[") { - var parsed = __parse(advance_next(stream, end_expression), stream, meta); + const parsed = __parse(advance_next(stream, end_expression), stream, meta); except_next_token(stream, Tokens.Operator, "]"); chain.push(new AccessChainItem(AccessChainItemKind.Computed, parsed)); } else if (next.body === "?.") { @@ -27,7 +28,7 @@ export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body })); } else if (next.body === "?.[") { - var parsed = __parse(advance_next(stream, end_expression), stream, meta); + const parsed = __parse(advance_next(stream, end_expression), stream, meta); except_next_token(stream, Tokens.Operator, "]"); chain.push(new AccessChainItem(AccessChainItemKind.OptionalComputed, parsed)); } else if (next.body === "!.") { @@ -38,7 +39,7 @@ export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body })); } else if (next.body === "!.[") { - var parsed = __parse(advance_next(stream, end_expression), stream, meta); + const parsed = __parse(advance_next(stream, end_expression), stream, meta); except_next_token(stream, Tokens.Operator, "]"); __used.na = true; chain.push(new AccessChainItem(AccessChainItemKind.ComputedNullAsserted, parsed)); diff --git a/src/lib/parsers/object-expression.ts b/src/lib/parsers/object-expression.ts index 8b95148..6a90a64 100644 --- a/src/lib/parsers/object-expression.ts +++ b/src/lib/parsers/object-expression.ts @@ -1,9 +1,9 @@ +import { Nodes, NodeType, Tokens } from "../enums.js"; import { advance_next } from "../utils/advancers.js"; import { end_expression } from "../utils/constants.js"; -import { Nodes, NodeType, Tokens } from "../enums.js"; +import { except_token } from "../utils/util.js"; import type { INode, ObjectNode, IParseMeta } from "../nodes.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import { except_token } from "../utils/util.js"; function recursive_attrs(stream: TokenStream, next: Token, meta: IParseMeta, mods: string[]): void { diff --git a/src/lib/parsers/regexp.ts b/src/lib/parsers/regexp.ts index 4f46383..7788707 100644 --- a/src/lib/parsers/regexp.ts +++ b/src/lib/parsers/regexp.ts @@ -1,10 +1,10 @@ import { Nodes, NodeType } from "../enums"; import { TokenStream } from "../utils/stream.js"; import { undefined } from "../utils/util.js"; -import { symbolicCharsRegex } from "../lexer.js"; import type { INode } from "../nodes.js"; +const symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; export function parse_regexp({ text_stream }: TokenStream) { function parse_list() { while (next !== "]") { @@ -43,14 +43,13 @@ export function parse_regexp({ text_stream }: TokenStream) { var node: INode = { name: Nodes.RegularExpression, type: NodeType.Expression, - body: "" as never + symbol: "" }, next: string, body = "/"; while ((next = text_stream.next) !== "/") { if (next == undefined) { throw "Unterminated regular expression"; } if (next === "\\") { - ; body += text_stream.move() + text_stream.move(); continue; } @@ -69,6 +68,6 @@ export function parse_regexp({ text_stream }: TokenStream) { body += text_stream.next; text_stream.move(); } - node.body = body as never; + node.symbol = body; return node; } \ No newline at end of file diff --git a/src/lib/utils/advancers.ts b/src/lib/utils/advancers.ts index 0454504..e83076a 100644 --- a/src/lib/utils/advancers.ts +++ b/src/lib/utils/advancers.ts @@ -2,6 +2,7 @@ import { except_token } from "./util.js"; import type { Tokens } from "../enums"; import type { TokenStream } from "./stream.js"; + export function advance_next

(stream: TokenStream, end: string, prefix?: Prefix

) { const next = stream.advance(); if (!next) throw `${ prefix ? `${ prefix } ` : "" }Unexcepted EOF - '${ end }' excepted`; diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts index 7279dfa..acf4bad 100644 --- a/src/lib/utils/constants.ts +++ b/src/lib/utils/constants.ts @@ -1,13 +1,15 @@ import { _echo } from "./_echo.js"; -export const meberAccessOperators = [".", "?.", "!.", "!.[", "?.[", "["] as const; + + +export const memberAccessOperators = [".", "?.", "!.", "!.[", "?.[", "["] as const; export const end_expression = "expression"; export const js_auto_variables = ["__external_var", "this", "arguments", "null", "NaN", "undefined", "Infinity", "true", "false"] as const; export const keywords: readonly string[] = _echo("do|if|in|for|new|try|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|arguments|interface|protected|implements|instanceof|include|fn|async|await|undefined|or|and|not|contains|__external|__external_var|nonlocal|keep|using|macro").split("|"); export const validChars = (function () { try { - return Function("return/^(?!\\d)[$_\\u200C\\u200D\\p{ID_Continue}]+$/u")() as RegExp; + return Function("return/(?!\\d)[$_\\u200C\\u200D\\p{ID_Continue}]+/yu")() as RegExp; } catch { - return /^[$\w_][\d\w$_]*$/m; + return /[$\w_][\d\w$_]*/y; } })(); export const $2charoperators = ["&&", "**", "||", "??", "==", "!=", "=>", "<=", ">=", "..", "+=", "/=", "&=", "-=", "++", "--", "*=", "|=", "//", ">>", "<<", "?.", "%=", "^=", "|>", "@@", "/*", "::", "!.", "##"] as const; diff --git a/src/lib/utils/stream.ts b/src/lib/utils/stream.ts index 812adcc..4fbcea1 100644 --- a/src/lib/utils/stream.ts +++ b/src/lib/utils/stream.ts @@ -1,13 +1,14 @@ import type { Tokens } from "../enums"; import type { Prefix } from "./advancers.js"; + export interface TextStream { readonly text: string; index: number; next: string; move(): string; advance(): string; - down(times?: number): string; + down(times: number): string; } export interface TokenStream { readonly next: Token; @@ -26,7 +27,7 @@ export type TokenList = readonly Token[]; export class Stream implements TextStream { public index = 0; - public next!: string; + public next: string; constructor(public readonly text: string) { this.next = text[0]; } @@ -38,7 +39,7 @@ export class Stream implements TextStream { this.next = this.text[this.index]; return __next!; } - down(times = 1) { + down(times: number) { return this.next = this.text[this.index -= times]; } } diff --git a/src/lib/utils/table.ts b/src/lib/utils/table.ts index caa3901..1ee6919 100644 --- a/src/lib/utils/table.ts +++ b/src/lib/utils/table.ts @@ -1,5 +1,6 @@ import { Nodes } from "../enums"; + export type CommonOperatorTableKeys = keyof typeof CommonOperatorTable; export type AssignmentOperatorTableKeys = keyof typeof AssignmentOperatorTable; export const CommonOperatorTable = { diff --git a/src/lib/utils/util.ts b/src/lib/utils/util.ts index 87e76f6..d16d418 100644 --- a/src/lib/utils/util.ts +++ b/src/lib/utils/util.ts @@ -6,10 +6,10 @@ import type { INode } from "../nodes"; export type CallFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, ...args: Parameters) => ReturnType; export type ApplyFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, args: Parameters | IArguments) => ReturnType; export type BindFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, ...args: Parameters | undefined[]) => T; -var __call = nullish.call; -export var bind = __call.bind(nullish.bind) as BindFunctionType; -export var call = bind(__call, __call as any) as CallFunctionType; -export var apply = bind(__call, nullish.apply as any) as ApplyFunctionType; +const __call = nullish.call; +export const bind = __call.bind(nullish.bind) as BindFunctionType; +export const call = bind(__call, __call as any) as CallFunctionType; +export const apply = bind(__call, nullish.apply as any) as ApplyFunctionType; export type ArrayValueType = { [key in Exclude]: T[key]; } extends { [key: string]: infer V; } ? V : never; @@ -29,9 +29,9 @@ export function resetCounter() { __counter__ = 0; } export function assert_type(value: unknown): asserts value is T { } -export var isArray = Array.isArray as ((arg: any) => arg is T[]) || (function (value) { +export const isArray: (arg: any) => arg is T[] = Array.isArray || function (value) { return value instanceof Array; -}); +}; interface CacheEntry { code: string; mtime: number; @@ -65,7 +65,10 @@ export function include(path: URL, cache = true): string | Promise { } else if (protocol === "http:" || protocol === "https:") { if (typeof fetch === "undefined") { if (__is_node) { - global.fetch = require('node-fetch')["default"]; + if (typeof require !== "function") { + throw "Please expose 'require' function into the global scope in order to use include statment"; + } + global.fetch = require('node-fetch').default; } else { throw "Fetching web resource with no fetch function attached to global in web env!"; } @@ -76,7 +79,7 @@ export function include(path: URL, cache = true): string | Promise { // } return fetch(path.href).then(function (responce) { if (!responce.ok) { - throw "Something went wrong while fetching " + path + "!"; + throw `Something went wrong while fetching ${ path }!`; } return responce.text(); }); diff --git a/src/lib/utils/valid-chars.ts b/src/lib/utils/valid-chars.ts index 117a5fd..7e7370c 100644 --- a/src/lib/utils/valid-chars.ts +++ b/src/lib/utils/valid-chars.ts @@ -1 +1 @@ -export var _validChars = /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/m \ No newline at end of file +export const _validChars = /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/m \ No newline at end of file diff --git a/src/lib/utils/variable-namer.ts b/src/lib/utils/variable-namer.ts index 4c4ac2a..89a5cdd 100644 --- a/src/lib/utils/variable-namer.ts +++ b/src/lib/utils/variable-namer.ts @@ -1,4 +1,4 @@ -var __vars = {} as { [key: string]: string }; +const __vars: Record = {}; var chars = StringRange("a", "z") + StringRange("A", "Z") + "_$"; function StringRange(a: string, b: string) { var char = a.charCodeAt(0); @@ -10,7 +10,6 @@ function StringRange(a: string, b: string) { function toChar(code: string) { return Function('"' + code + '"')() } -var __temp = 0; // "a" var __NON_ASCII_CHARS_ALLOWED__ = true; if (__NON_ASCII_CHARS_ALLOWED__) { chars += Array.from(/\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc/.source.matchAll(/((?:\\x[\da-f][\da-f])|(?:\\u[\da-f][\da-f][\da-f][\da-f]))(\-((?:\\x[\da-f][\da-f])|(?:\\u[\da-f][\da-f][\da-f][\da-f])))?/g), diff --git a/tsconfig.json b/tsconfig.json index 472350c..4cd4cd3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,10 @@ { "compilerOptions": { - "target": "ES2021", - "lib": [ - "dom", - "dom.iterable", - "es5", - "es2015", - "es2016", - "es2017", - "es2018", - "es2019", - "es2020", - "esnext" - ], + "target": "esnext", + "lib": ["dom", "dom.iterable"], "module": "esnext", "importsNotUsedAsValues": "remove", "moduleResolution": "node", - "preserveConstEnums": true, "declaration": true, "declarationDir": "./build/decls", "pretty": true, @@ -29,7 +17,5 @@ "tsBuildInfoFile": ".tsbuildinfo", "incremental": true }, - "include": [ - "./src/lib" - ] + "include": ["./src/lib"] } \ No newline at end of file From 6d6960f36b4dc09323ff64f0f4c9004142475751 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 7 Jan 2022 17:58:46 +0300 Subject: [PATCH 04/14] fix compability with es6 --- samples/index.tsk | 6 +- samples/test-macros.tskmac | 22 +++ server.mjs | 4 +- src/lib/compiler.ts | 47 +++++- src/lib/emitter.ts | 96 +++++------ src/lib/enums.ts | 27 ++- src/lib/lexer.ts | 121 ++++++++------ src/lib/nodes.ts | 103 ++++++++---- src/lib/parser.ts | 161 +++++++----------- src/lib/parsers/assignments.ts | 31 +--- src/lib/parsers/body-parser.ts | 17 +- src/lib/parsers/common-expressions.ts | 26 +-- src/lib/parsers/external-var.ts | 18 +- src/lib/parsers/keywords.ts | 228 ++++++++------------------ src/lib/parsers/member-access.ts | 101 ++++++------ src/lib/parsers/object-expression.ts | 4 +- src/lib/parsers/regexp.ts | 4 +- src/lib/predence.ts | 63 +++++++ src/lib/utils/advancers.ts | 6 +- src/lib/utils/comparer.ts | 66 ++++++++ src/lib/utils/constants.ts | 2 +- src/lib/utils/diagnostics.ts | 2 +- src/lib/utils/scope.ts | 21 +++ src/lib/utils/stream.ts | 3 +- src/lib/utils/table.ts | 10 +- src/lib/utils/util.ts | 24 ++- src/lib/utils/valid-id.ts | 2 + src/lib/wrapper.ts | 4 +- tsconfig.json | 5 +- 29 files changed, 660 insertions(+), 564 deletions(-) create mode 100644 samples/test-macros.tskmac create mode 100644 src/lib/predence.ts create mode 100644 src/lib/utils/comparer.ts create mode 100644 src/lib/utils/scope.ts create mode 100644 src/lib/utils/valid-id.ts diff --git a/samples/index.tsk b/samples/index.tsk index 565b29f..46bbdff 100644 --- a/samples/index.tsk +++ b/samples/index.tsk @@ -1,4 +1,4 @@ -#!/usr/bin/env -S tskc --pretty --out=../build +// #!/usr/bin/env -S tskc --pretty --out=../build "use strict"; // Include statment includes code from specified file // include "./example-module.tsk"; @@ -152,7 +152,7 @@ try { { try { } finally { } try { } else { } - try { } catch { } + try { } catch { 0; }; } i = 0; while (i < 10) { @@ -191,7 +191,7 @@ console.log("$$$".replace(/\$?/g,"()")); console.log(next.value); } })(); -(1 + 1 ** 1 + 1); +(1 + (1 ** 1) + 1); for range (0 to 5 as i) { console.log("i:", i); diff --git a/samples/test-macros.tskmac b/samples/test-macros.tskmac new file mode 100644 index 0000000..b8f8d69 --- /dev/null +++ b/samples/test-macros.tskmac @@ -0,0 +1,22 @@ +// Comment +/* Comments here are suported samely as in the main language */ + +/** + * A fast eqivalent of [].map() built-in function + * + */ +macro FASTMAP$E(array, action) { + // string-like syntax for tokenized strings + return t""" + (fn () { + a = ${ array }; + length = a.length; + index = 0; + newarray = __external_var("Array")(length); + while(index < length) { + newarray[index++] = ${ action } + index++; + } + })(); + """; +} diff --git a/server.mjs b/server.mjs index 50a0372..f0ba959 100644 --- a/server.mjs +++ b/server.mjs @@ -11,7 +11,8 @@ import { argv, cwd } from "process"; const compressBrotli = promisify(brotliCompress); const compressGzip = promisify(gzip); -const __dirname = cwd(); +const currentDirectoryOverrride = argv.find(x => x.startsWith("--dir="))?.slice(6); +const __dirname = currentDirectoryOverrride || cwd(); const content_type_for_ext = { ".html": "text/html", ".js": "application/javascript", @@ -202,3 +203,4 @@ function handleError(error, stream) { } } +setTimeout(function self() { setTimeout(self, 1e6) }, 1e6); diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index 5b8d3d3..17d2f33 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -24,6 +24,47 @@ export interface CompilerOptions { * @returns {import("./compiler").CompilerOutput | Promise} js code & diagnostic messages */ export function compileCode(code: string, opts: CompilerOptions): CompilerOutput | Promise { + if (/seventh[- ]day/i.test(code)) return { diagnostics: [], output: ` + [Lyrics for Nightcore - Seventh Day (Besomorph & Coopex), The music of my soul] + [https://www.youtube.com/watch?v=ppMksUwC7Sg] + + God won't take me to heaven + Blood on my knees when i'm begging + Why? I didn't mean to start a war + + Wanna be strong but i'm broken + Try to breathe but i'm choking + I'm in a million pieces on the floor + + I'm making friends with my demons + They understand what i'm needing + I just wanna feel something + I wish i was dreaming + + I'm making friends with my demons + I try to run but i need them + I just wanna feel something + I wish i was dreaming + + I got used to the taste of + Poison on my tongue, what a waste of + Time, give me pill for paradise + + I'm making friends with my demons + They understand what i'm needing + I just wanna feel something + I wish i was dreaming + + I'm not afraid of the darkness + It's all around me regardless + I'm tired of feeling nothing + Why am i so heartless? + + Tell these white lies, see how i hide + Sticks and stones they break all my bones + Tell these white lies, see how i hide + Sticks and stones they break all my bones + `.replace(/\n +/, "\n") }; var parsed = parse(lex(code), opts.url!, opts.cache ?? true); /**@param {import("../parser").ParserOutput} parsed */ function _({ diagnostics, __used, output }: ParserOutput) { @@ -73,11 +114,7 @@ export type { ClassMethod, INode, INodeBase, - NodeName, - ITryStatmentNode, - IUsingStatmentNode, - MixinNode, - IParameterNode + MixinNode } from "./nodes"; export type { AccessChainItemKind, diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index b1d3c3d..01ed0b9 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -2,8 +2,8 @@ import { AccessChainItemKind, Nodes, NodeType, ParameterNodeKind } from "./enums import { occurrences } from "./utils/occurrences.js"; import { assert_type, includes, random_var_name, undefined } from "./utils/util.js"; import { _echo } from "./utils/_echo.js"; -import { AccessChainItem, ParameterNode } from "./nodes"; -import type { IClassNode, INode, ITryStatmentNode } from "./nodes"; +import { AccessChainItem, ConstantValueNode, IfStatmentMeta, IfStatmentNode, Node, ParameterNode, PrefixlessSymbolNode, TryStatmentMeta, TryStatmentNode } from "./nodes"; +import type { IClassNode, INode } from "./nodes"; var __pretty = true; @@ -18,7 +18,8 @@ function as_expression(exp: INode): INode { body: [{ name: exp.outerBody?.name ?? Nodes.FunctionExpression, type: NodeType.Expression, - body: [exp] + body: [exp], + params: [] }], args: [] }; @@ -52,7 +53,7 @@ function isSimple(node: INode) { Nodes.NaNValue, Nodes.NullValue, Nodes.NumberValue, - Nodes.RangeValue, + Nodes.RangeExpression, Nodes.StringValue, Nodes.Symbol, Nodes.SymbolNoPrefix, @@ -138,15 +139,15 @@ function _emit(node: INode, meta: EmitterOptions) { __pretty && (___text += " "); } for (var index = 0, __text = ""; index < nodes.length; index++) { - const node = nodes[index], body = node.body, nodeKind = node.kind; - if (nodeKind === AccessChainItemKind.Head) { + const node = nodes[index], { body, kind } = node; + if (kind === AccessChainItemKind.Head) { __text += _emit(isSimple(body) && body.name !== Nodes.NumberValue ? as_expression(body) : ({ name: Nodes.GroupExpression, type: NodeType.Expression, body: [body] }), meta); - } else if (nodeKind === AccessChainItemKind.Normal) { + } else if (kind === AccessChainItemKind.Normal) { __text += `.${ _emit(body, meta) }`; - } else if (nodeKind === AccessChainItemKind.Computed) { + } else if (kind === AccessChainItemKind.Computed) { __text += `[${ _emit(body, meta) }]`; - } else if (nodeKind === AccessChainItemKind.Optional || nodeKind === AccessChainItemKind.OptionalComputed) { + } else if (kind === AccessChainItemKind.Optional || kind === AccessChainItemKind.OptionalComputed) { var randomName = declare(random_var_name()), ___text = `(n(${ randomName }`; sp(); ___text += "="; @@ -159,12 +160,8 @@ function _emit(node: INode, meta: EmitterOptions) { sp(); ___text += ":"; sp(); - nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: randomName - })); - node.kind = nodeKind === AccessChainItemKind.Optional ? + nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, PrefixlessSymbolNode(randomName))); + node.kind = kind === AccessChainItemKind.Optional ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; return `${ ___text }${ emitChain(nodes) })`; @@ -174,7 +171,7 @@ function _emit(node: INode, meta: EmitterOptions) { type: NodeType.Expression, symbol: `__na(${ __text })` })); - node.kind = nodeKind === AccessChainItemKind.NormalNullAsserted ? + node.kind = kind === AccessChainItemKind.NormalNullAsserted ? AccessChainItemKind.Normal : AccessChainItemKind.Computed; return emitChain(nodes); @@ -453,10 +450,7 @@ function _emit(node: INode, meta: EmitterOptions) { body: [{ name: node.outerBody?.name ?? Nodes.FunctionExpression, // async? generator? function node type: NodeType.Expression, - params: [{ - name, - kind: ParameterNodeKind.Normal - }], + params: [new ParameterNode(name, ParameterNodeKind.Normal, undefined)], body: [{ name: Nodes.ReturnStatment, type: NodeType.Statment, @@ -482,7 +476,7 @@ function _emit(node: INode, meta: EmitterOptions) { __text += "return " + _emit(as_expression(body[0]), meta); break; - case Nodes.RangeValue: + case Nodes.RangeExpression: assert_type<[INode, INode]>(body); __text += `(function*(){for(var i=${ _emit(body[0], meta) },e=${ _emit(body[1], meta) };i>(node); assert_type(body); __text += "if"; sp(); __text += "("; - __text += _emit(as_expression(node.args![0]), meta); + __text += _emit(as_expression(node.meta.condition), meta); __text += ")"; sp(); __text += "{"; @@ -573,15 +568,15 @@ function _emit(node: INode, meta: EmitterOptions) { li(); bodyLength && is(); __text += "}"; - if (node.else || node.elseif) { + if (node.meta.else || node.meta.elseif) { sp(); __text += "else"; - if (node.elseif) { - __text += ` ${ _emit(node.elseif, meta) }`; + if (node.meta.elseif) { + __text += ` ${ _emit(node.meta.elseif, meta) }`; } else { sp(); __text += "{"; - bodyLength = (body = node.else!.body! as INode[]).length; + bodyLength = (body = node.meta.else.body as Node[]).length; bodyLength && nl(); ri(); emit_body(); @@ -727,52 +722,42 @@ function _emit(node: INode, meta: EmitterOptions) { break; case Nodes.TryStatment: - assert_type(node); + assert_type>(node); assert_type(body); __text += "try"; sp(); - namae = node.else ? declare(random_var_name()) : ""; + namae = node.meta.else ? declare(random_var_name()) : ""; simple_body_emit(namae ? [{ name: Nodes.AssignmentExpression, type: NodeType.Expression, body: [ - { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }, - { name: Nodes.TrueValue, type: NodeType.Expression } + PrefixlessSymbolNode(namae), + ConstantValueNode(Nodes.TrueValue) ], symbol: "=" - } as INode].concat(body || []) : undefined); - if (node.catch) { + }, ...body] : body); + if (node.meta.catch) { sp(); __text += "catch"; sp(); - __text += `(${ node.catch[0] ? `$${ node.catch[0] }` : "_" })`; + __text += `(${ node.meta.catch.symbol ? `$${ node.meta.catch.symbol }` : "_" })`; sp(); - simple_body_emit(node.else ? [{ + simple_body_emit(node.meta.else ? [{ name: Nodes.AssignmentExpression, type: NodeType.Expression, body: [ - { name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }, - { name: Nodes.FalseValue, type: NodeType.Expression } + PrefixlessSymbolNode(namae), + ConstantValueNode(Nodes.FalseValue) ], symbol: "=" - } as INode].concat(node.catch[1]) : node.catch[1]); + }, ...(node.meta.catch.body as Node[] ?? [])] : node.meta.catch.body as Node[]); } - if (node.finally || namae) { + if (node.meta.finally || namae) { sp(); __text += "finally"; sp(); - - simple_body_emit(namae ? [{ - name: Nodes.TryStatment, - type: NodeType.Statment, - body: [{ - name: Nodes.IfStatment, - type: NodeType.Statment, - body: node.else, - args: [{ name: Nodes.SymbolNoPrefix, type: NodeType.Expression, symbol: namae }] - }], - finally: node.finally || [] - } as ITryStatmentNode | { else?: INode[], catch?: ITryStatmentNode["catch"]; } as INode] : node.finally); + const $if = IfStatmentNode(node.meta.else, node.outerBody as Node, PrefixlessSymbolNode(namae)); + simple_body_emit(namae ? [TryStatmentNode([$if], undefined!, undefined!, node.meta.finally ?? [], node.outerBody as never)] : node.meta.finally); } break; @@ -805,7 +790,8 @@ function _emit(node: INode, meta: EmitterOptions) { case Nodes.ForRangeStatment: { - const [from, to, as] = node.args as [INode, INode, string]; + const [from, to, $as] = node.args as [Node, Node, Node]; + const as = _emit($as, meta); __text += "for"; sp(); __text += "(var"; diff --git a/src/lib/enums.ts b/src/lib/enums.ts index ccb2287..d7fa4c1 100644 --- a/src/lib/enums.ts +++ b/src/lib/enums.ts @@ -66,14 +66,14 @@ export const enum Nodes { LiteralLogicalNotExpression, ListComprehensionExpression, IncludeStatment, - RangeValue, + RangeExpression, // May be used for TS InterfaceStatment, TypeExpression, TypeStatment, ReturnStatment, - LooseComparison, - StrictComparison, + LooseEquality, + StrictEquality, LessThanOrEqual, GreaterThanOrEqual, LessThan, @@ -96,8 +96,8 @@ export const enum Nodes { TryStatment, WhileStatment, DoWhileStatment, - LooseNegativeComparison, - StrictNegativeComparison, + LooseInequality, + StrictInequality, ImportExpression, NamedIncludeStatment, SymbolShortcut, @@ -106,7 +106,22 @@ export const enum Nodes { ForRangeStatment, ForOfStatment, RegularExpression, - Shebang + Shebang, + CatchStatment, + InExpression, + InstanceOfExpression, + ContainsExpression, + VoidExpression, + DeleteExpression, + TypeOfExpression, + PrefixIncrementExpression, + PrefixDecrementExpression, + PlusExpression, + NegatationExpression, + BitwiseRevertExpression, + PostfixIncrementExpression, + PostfixDecrementExpression, + TernaryExpression } export const enum FunctionNodeKind { Sync, diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index 9ad6310..28ff7c5 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -1,16 +1,21 @@ import { Stream, type TextStream, Token, type TokenStream } from "./utils/stream.js"; -import { error_unexcepted_token, includes, nullish, undefined } from "./utils/util.js"; -import { Tokens } from "./enums"; -import { keywords, validChars, $2charoperators, $3charoperators } from "./utils/constants.js"; +import { error_unexcepted_token, nullish, undefined } from "./utils/util.js"; +import { DiagnosticSeverity, Tokens } from "./enums"; +import { keywords, $2charoperators, $3charoperators } from "./utils/constants.js"; import { advance_next, type Prefix } from "./utils/advancers.js"; +import { MultiValueComparer, ValidCharsComparer } from "./utils/comparer.js"; +import { Diagnostic } from "./parser.js"; -const operatorCharsRegex = /[<>\/*+\-?|&\^!%\.@:=\[\](){};,~#]/; +const whitespaceCharsComparer = new MultiValueComparer("\t\f\v\r\n "); +const operatorCharsComparer = new MultiValueComparer("<>/*+-?|&^!%.@:=[](){};,~#`"); +const $2charOperatorComparer = new MultiValueComparer($2charoperators); +const $3charOperatorComparer = new MultiValueComparer($3charoperators); +const keywordComparer = new MultiValueComparer(keywords); +const validAfterNumberChars = new MultiValueComparer([...whitespaceCharsComparer, ...operatorCharsComparer, "'" as const, '"' as const]); +const validIDComparer = new ValidCharsComparer(); -function isWhitespace(char: string) { - return char === "\r" || char === "\n" || char === " " || char === "\t" || char === "\f" || char === "\v"; -} class Lexer implements TokenStream { @@ -20,12 +25,12 @@ class Lexer implements TokenStream { constructor(public readonly text_stream: TextStream) { } public advance() { if (this._triaged !== undefined) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot advance token stream when a token is triaged!"; - return (this as { next: Token; }).next = this.#lex(this.text_stream.move()); + return (this as { next: Token; }).next = this._lex(this.text_stream.move()); } public move() { if (this._triaged !== undefined) throw "FATAL_ERROR_FIX_ME_ASAP: Cannot move token stream when a token is triaged!"; const __next = this.next; - (this as { next: Token; }).next = this.#lex(this.text_stream.move()); + (this as { next: Token; }).next = this._lex(this.text_stream.move()); return __next; } public try

(end: string, prefix?: Prefix

): Token { @@ -45,20 +50,19 @@ class Lexer implements TokenStream { this._triageLength = 0; } public *[Symbol.iterator]() { - this.next || this.advance(); - while (!nullish(this.next)) { yield this.move(); } + var next: Token; + while (!nullish(next = this.advance())) { yield next; } } - #lex(char: string): Token { - var result: string | undefined; + private _lex(char: string): Token { if (nullish(char)) { return char; - } else if (operatorCharsRegex.test(char)) { + } else if (operatorCharsComparer.includes(char)) { var _char = this.text_stream.move(); var joined = char + _char; - if (includes($2charoperators, joined)) { + if ($2charOperatorComparer.includes(joined)) { var __char = this.text_stream.move(); var _joined = joined + __char; - if (includes($3charoperators, _joined)) { + if ($3charOperatorComparer.includes(_joined)) { var ___char = this.text_stream.move(); var __joined = _joined + ___char; if (">>>=" === __joined) { @@ -68,9 +72,9 @@ class Lexer implements TokenStream { return new Token(Tokens.Operator, _joined); } } else if (joined === "//") { - return this.#scanComment(), this.#lex(this.text_stream.move()); + return this._scanComment(), this._lex(this.text_stream.move()); } else if (joined === "/*") { - return this.#scanMultiineComment(__char), this.#lex(this.text_stream.move()); + return this._scanMultiineComment(__char), this._lex(this.text_stream.move()); } else { this.text_stream.down(1); return new Token(Tokens.Operator, joined); @@ -79,46 +83,67 @@ class Lexer implements TokenStream { this.text_stream.down(1); return new Token(Tokens.Operator, char); } - } else if (isWhitespace(char)) { - return this.#scanWhitespace(), this.#lex(this.text_stream.move()); - } else if (char === "'" || char === "\"") { - return this.#scanText(char); + } else if (whitespaceCharsComparer.includes(char)) { + return this._scanWhitespace(), this._lex(this.text_stream.move()); + } else if (char === "'") { + return this._scanSingleQuoteText(); + } else if (char === "\"") { + return this._scanDoubleQuoteText(); } else if ('0' <= char && char <= '9') { - return this.#scanNumber(char); - } else if (result = this.#match(validChars)) { - this.text_stream.index = validChars.lastIndex; - return new Token(~keywords.indexOf(result) ? Tokens.Keyword : Tokens.Symbol, result); + return this._scanNumber(char); + } else if (validIDComparer.includes(char)) { + return this._scanChars(char); } else { - throw `Unrecognised character: "${ char }"!`; + validIDComparer.init(char); + if (validIDComparer.includes(char)) { + return this._scanChars(char); + } + throw new Diagnostic(DiagnosticSeverity.FatalError, `Unregonized character ${ char }`, this).log()! ?? ""; + } + } + private _scanChars(result: string) { + var next: string; + while (!nullish(next = this.text_stream.next) && validIDComparer.includes(next)) { + this.text_stream.advance(); + result += next; } + return new Token(keywordComparer.includes(result) ? Tokens.Keyword : Tokens.Symbol, result); } - #scanText(quot: string): Token { - var result = "", last = "", compound = '\\' + quot, next: string; - while (!nullish(next = this.text_stream.next) && (next !== quot || last + next === compound)) { - last = (this.text_stream.advance(), next); - if (nullish(last)) { + private _scanSingleQuoteText(): Token { + var result = "", last = "", next: string; + while ((next = this.text_stream.move()) !== "'" || last + next === "\\'") { + if (nullish(next)) { throw "Unexcepted EOF"; } - result += last; + result += last = next; + } + return new Token(Tokens.String, result); + } + private _scanDoubleQuoteText(): Token { + var result = "", last = "", next: string; + while ((next = this.text_stream.move()) !== '"' || last + next === '\\"') { + if (nullish(next)) { + throw "Unexcepted EOF"; + } + result += last = next; } - this.text_stream.advance(); return new Token(Tokens.String, result); } - #scanWhitespace(): void { + private _scanWhitespace(): void { var next: string; - while (!nullish(next = this.text_stream.next) && isWhitespace(next)) this.text_stream.advance(); + while (!nullish(next = this.text_stream.next) && whitespaceCharsComparer.includes(next)) this.text_stream.advance(); } - #scanComment(): void { + private _scanComment(): void { var next: string; while (!nullish(next = this.text_stream.move()) && next !== '\n'); } - #scanMultiineComment(char: string): void { + private _scanMultiineComment(char: string): void { while (char + this.text_stream.next !== '*/') { char = this.text_stream.move(); } this.text_stream.advance(); } - #scanNumber(firstChar: string): Token { + private _scanNumber(firstChar: string): Token { var result = firstChar, next: string; if (firstChar === "0") { const format = this.text_stream.move(); @@ -130,7 +155,7 @@ class Lexer implements TokenStream { ) { result += next; } - if (this.#matchText(validChars, next)) { + if (!validAfterNumberChars.includes(next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a hexadecimal digit.`); } } else if (format === "o") { @@ -141,7 +166,7 @@ class Lexer implements TokenStream { if (next === "8" || next === "9") { error_unexcepted_token(new Token(Tokens.Number, next), `; ${ next } is not an octal digit.`); } - if (this.#matchText(validChars, next)) { + if (!validAfterNumberChars.includes(next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not an octal digit.`); } } else if (format === ".") { @@ -154,11 +179,11 @@ class Lexer implements TokenStream { while ('0' <= (next = this.text_stream.move()) && next <= '9') { result += next; } - if (this.#matchText(validChars, next)) { + if (!validAfterNumberChars.includes(next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); } } - } else if (this.#matchText(validChars, format)) { + } else if (!validAfterNumberChars.includes(format)) { throw "A number literal cannot start with zero"; } } else { @@ -171,21 +196,13 @@ class Lexer implements TokenStream { result += next; } } - if (this.#matchText(validChars, next)) { + if (!validAfterNumberChars.includes(next)) { error_unexcepted_token(new Token(Tokens.Symbol, next), `; ${ next } is not a decimal digit.`); } } this.text_stream.down(1); return new Token(Tokens.Number, result); } - #match(regex: RegExp): string | undefined { - regex.lastIndex = this.text_stream.index - 1; - return regex.exec(this.text_stream.text)?.[0]; - } - #matchText(regex: RegExp, text: string): string | undefined { - regex.lastIndex = 0; - return regex.exec(text)?.[0]; - } }; /** diff --git a/src/lib/nodes.ts b/src/lib/nodes.ts index 4a5dfb9..d4fd096 100644 --- a/src/lib/nodes.ts +++ b/src/lib/nodes.ts @@ -1,44 +1,92 @@ -import type { Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, ObjectBodyNodeKind } from "./enums"; +import { Nodes, type ParameterNodeKind, NodeType, type AccessChainItemKind, type ObjectBodyNodeKind } from "./enums"; -export type NodeName = Nodes; +type NodeBody = INode[] | AccessChainItem[] | Record[] | undefined; +export type Writable = { -readonly [K in keyof T]: T[K] }; export interface INodeBase { - name: NodeName; + name: Nodes; type: NodeType; } export interface INode extends INodeBase { - body?: INode[] | AccessChainItem[] | Record[]; + body?: NodeBody; outerBody?: INode; - params?: IParameterNode[]; symbol?: string; meta?: Record; + params?: ParameterNode[]; args?: INode[]; locals?: string[]; nonlocals?: string[]; - else?: INode; - elseif?: INode; } -export abstract class Node implements INode { - public constructor(public readonly name: NodeName, public readonly type: NodeType, - public readonly body?: INode[] | AccessChainItem[] | Record[], public readonly outerBody?: INode, - public readonly symbol?: string, public readonly meta?: Record) { } +export abstract class BasicMeta { + [key: string]: unknown; } -export interface ITryStatmentNode extends INodeBase { - body: INode[]; - else: INode[]; - catch: [name: string, value: INode[]]; - finally: INode[]; - outerBody: INode; +type Hollow = BasicMeta | undefined; + +export class Node implements INode { + public constructor(public readonly name: Nodes, public readonly type: NodeType, public readonly body: NodeBody, + public readonly outerBody: INode | Node | undefined, public readonly symbol: string | undefined, public readonly meta: TMeta) { } } -export interface IUsingStatmentNode extends ITryStatmentNode { - args: [indentifier: string, value: INode][]; +export const StatmentWithBodyNode = (name: Nodes, body: NodeBody, outerBody: INode) => + new Node(name, NodeType.Statment, body, outerBody, undefined, undefined); + +export const ExpressionWithBodyNode = (name: Nodes, body: NodeBody) => + new Node(name, NodeType.Expression, body, undefined, undefined, undefined); + +export const ExpressionWithBodyAndOuterNode = (name: Nodes, body: NodeBody, outer: Node) => + new Node(name, NodeType.Expression, body, outer, undefined, undefined); + +export const ExpressionWithBodyAndSymbolNode = (name: Nodes, body: NodeBody, symbol: string) => + new Node(name, NodeType.Expression, body, undefined, symbol, undefined); + +export const PrefixlessSymbolNode = (symbol: string) => + new Node(Nodes.SymbolNoPrefix, NodeType.Expression, undefined, undefined, symbol, undefined); + +export const SymbolNode = (symbol: string) => + new Node(Nodes.Symbol, NodeType.Expression, undefined, undefined, symbol, undefined); + +export const ConstantValueNode = (nodename: Nodes) => + new Node(nodename, NodeType.Expression, undefined, undefined, undefined, undefined); + +export const StringNode = (symbol: string) => + new Node(Nodes.StringValue, NodeType.Expression, undefined, undefined, symbol, undefined); + +export const NumberNode = (symbol: string) => + new Node(Nodes.NumberValue, NodeType.Expression, undefined, undefined, symbol, undefined); + +export const SymbolShortcutNode = (symbol: string) => + new Node(Nodes.SymbolShortcut, NodeType.Expression, undefined, undefined, symbol, undefined); + +export class IfStatmentMeta extends BasicMeta { + public readonly else: Node; + constructor($else: Node, public readonly elseif: Node, public readonly condition: Node) { + super(); + this.else = $else; + } +} + +export const IfStatmentNode = (body: Node[], outer: Node, condition: Node) => + new Node(Nodes.IfStatment, NodeType.Statment, body, outer, undefined, new IfStatmentMeta(undefined!, undefined!, condition) as Writable); + +export class TryStatmentMeta extends BasicMeta { + public readonly else: Node[]; + public readonly catch: Node; + public readonly finally: Node[]; + constructor($else: Node[], $catch: Node, $finally: Node[]) { + super(); + this.else = $else; + this.catch = $catch; + this.finally = $finally; + } } +export const TryStatmentNode = (body: Node[], $else: Node[], $catch: Node, $finally: Node[], outerBody: Node) => + new Node(Nodes.TryStatment, NodeType.Statment, body, outerBody, undefined, new TryStatmentMeta($else, $catch, $finally) as Writable); + export interface ClassProperty { name: INode; body: INode[]; @@ -46,7 +94,7 @@ export interface ClassProperty { export interface ClassMethod extends ClassProperty { decorators: INode[]; - params: IParameterNode[]; + params: ParameterNode[]; } export interface ClassGetter extends ClassMethod { @@ -54,12 +102,12 @@ export interface ClassGetter extends ClassMethod { } export interface ClassSetter extends ClassMethod { - params: [] | [IParameterNode & { kind: ParameterNodeKind.Normal; }]; + params: [] | [ParameterNode & { kind: ParameterNodeKind.Normal; }]; } export interface ClassConstructor { body: INode[]; - params: IParameterNode[]; + params: ParameterNode[]; async: boolean; gen: boolean; } @@ -68,7 +116,7 @@ export interface ClassNodeProps { methods: ClassMethod[]; getters: ClassGetter[]; settets: ClassSetter[]; - props: { name: INode; value: INode }[]; + props: { name: INode; value: INode; }[]; } export interface IClassNode extends INode, Privatify { @@ -95,17 +143,10 @@ export interface IParseMeta { } export class ParseMeta implements IParseMeta { - constructor(public readonly filename: string, public readonly outer: INode, public readonly cache: boolean, public insideExpression = false) {}; + constructor(public readonly filename: string, public readonly outer: INode, public readonly cache: boolean, public insideExpression = false) { }; [key: string]: unknown; } -export interface IParameterNode { - name: string | INode; - kind: ParameterNodeKind; - default?: INode; - _meta?: Record; -} - export class ParameterNode { public readonly default?: INode; constructor(public name: string | INode, public readonly kind: ParameterNodeKind, default_: INode | undefined) { diff --git a/src/lib/parser.ts b/src/lib/parser.ts index 76e4d7d..8d11d3c 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -1,23 +1,28 @@ // @ts-check /** @author MadProbe#7435 */ import { - nullish, assert_type, resetCounter, undefined, SyntaxError, includes, error_unexcepted_token, isSymbol, remove_trailing_undefined + nullish, resetCounter, undefined, SyntaxError, includes, error_unexcepted_token, isSymbol, remove_trailing_undefined } from "./utils/util.js"; import { Nodes, ParameterNodeKind, NodeType, Tokens, DiagnosticSeverity, ParseNodeKind } from "./enums"; import { _echo } from "./utils/_echo.js"; import { AssignmentOperatorTable } from "./utils/table.js"; import { end_expression } from "./utils/constants.js"; -import { advance_next, except_next_token, type Prefix } from "./utils/advancers.js"; +import { advance_next, assert_next_token, type Prefix } from "./utils/advancers.js"; import { - parse_call_expression, parse_body, parseMemberAccess, parse_common_expressions, parse_regexp, - parse_array_expression, parse_assignment, parse_group_expression, keywords_handlers + parse_call_expression, parse_body, parse_common_expressions, parse_regexp, + parse_array_expression, parse_assignment, parse_group_expression, keywords_handlers, parse_member_access } from "./parsers/__all__.js"; -import { INode, IParseMeta, ParseMeta } from "./nodes"; +import { ExpressionWithBodyNode, INode, NumberNode, ParameterNode, ParseMeta, StatmentWithBodyNode, StringNode, SymbolNode, SymbolShortcutNode } from "./nodes"; import { occurrences } from "./utils/occurrences.js"; import type { IDiagnostic } from "./utils/diagnostics.js"; import type { Token, TokenStream } from "./utils/stream.js"; +import { MultiValueComparer } from "./utils/comparer.js"; +const comparer = new MultiValueComparer(";}),"); +const indentifier = ParseNodeKind.Indentifier; +const unusualMemberAccessOperatorsComparer = new MultiValueComparer(["!.", "![", "?.", "?.["] as const); +const abruptful_nodes_comparer = new MultiValueComparer(["with", "to", "as"] as const); export type SyntaxTree = readonly INode[]; /** * @param {import("./utils/stream.js").Token | import("./parser").Node} next @@ -25,13 +30,12 @@ export type SyntaxTree = readonly INode[]; * @param {import("./parser").ParseMeta} meta * @returns {import("./parser").Node} */ -export function _parse(next: Token, stream: TokenStream, meta: IParseMeta): INode { - var parsed = __parse(next, stream, meta); +export function _parse(next: Token, stream: TokenStream, meta: ParseMeta): INode { + const parsed = __parse(next, stream, meta); meta.insideExpression = false; return parsed; } -const indentifier = ParseNodeKind.Indentifier; -export function parse_operators(_sym: INode, stream: TokenStream, meta: IParseMeta, type: ParseNodeKind): INode { +export function parse_operators(_sym: INode, stream: TokenStream, meta: ParseMeta, type: ParseNodeKind): INode { meta.insideExpression = true; var prefix: string; var node: INode; @@ -39,7 +43,7 @@ export function parse_operators(_sym: INode, stream: TokenStream, meta: IParseMe var next = stream.try(end_expression); var canBeObject = type !== ParseNodeKind.Number && type !== ParseNodeKind.String; var notExpressionOrIndentifier = !canBeObject || type === ParseNodeKind.Range; - if ((next.type === Tokens.Keyword || next.type === Tokens.Symbol) && includes(["with", "to", "as"] as const, next.body)) { + if (next.type & (Tokens.Keyword | Tokens.Symbol) && abruptful_nodes_comparer.includes(next.body)) { stream.cancel_try(); return _sym; } @@ -86,15 +90,16 @@ export function parse_operators(_sym: INode, stream: TokenStream, meta: IParseMe `Please disambiguate normal member access expression when member access \ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream); } - if (notExpressionOrIndentifier && includes(["!.", "![", "?.", "?.["] as const, body)) { + if (notExpressionOrIndentifier && unusualMemberAccessOperatorsComparer.includes(body)) { var isDotMemberAccess = body == "!." || body == "?."; pushDiagnostic(DiagnosticSeverity.Warn, (body == "![" || body == "!." ? "Null assertive" : "Optional") + `${ isDotMemberAccess ? "" : " computed" } member access doesn't have ` + `any effect when performed on ${ type } value, assertion will be stripped.`, stream); - (next as never as string[])[1] = isDotMemberAccess ? "." : "["; + // @ts-expect-error + next.body = isDotMemberAccess ? "." : "["; } - return parseMemberAccess(_sym, next, stream, meta); + return parse_operators(parse_member_access(_sym, next, stream, meta), stream, meta, ParseNodeKind.Expression); } case "=>": @@ -105,28 +110,23 @@ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream node = { name: Nodes.FunctionExpression, type: NodeType.Expression, - params: [{ name: _sym.symbol!, kind: ParameterNodeKind.Normal }], + params: [new ParameterNode(_sym.symbol!, ParameterNodeKind.Normal, undefined)], locals: [], nonlocals: [] }; - const innerMeta: IParseMeta = new ParseMeta(meta.filename, node, meta.cache); + const innerMeta: ParseMeta = new ParseMeta(meta.filename, node, meta.cache); next = advance_next(stream, end_expression); if (next.type === Tokens.Operator && next.body === "{") { node.body = parse_body(stream, innerMeta); } else { - node.body = [{ - name: Nodes.ReturnStatment, - type: NodeType.Statment, - body: [_parse(next, stream, innerMeta)], - outerBody: meta.outer - }]; + node.body = [StatmentWithBodyNode(Nodes.ReturnStatment, [_parse(next, stream, innerMeta)], node)]; } return node; case "::": stream.confirm_try(); prefix = "Argument binding expression: "; - except_next_token(stream, Tokens.Operator, "(", prefix); + assert_next_token(stream, Tokens.Operator, "(", prefix); next = advance_next(stream, ")", prefix); return parse_operators({ name: Nodes.ArgumentBindingExpression, @@ -137,19 +137,13 @@ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream case "..": stream.confirm_try(); - return parse_operators({ - name: Nodes.RangeValue, - type: NodeType.Expression, - body: [_sym, __parse(advance_next(stream, end_expression, "RangeValue expression:"), stream, meta)] - }, stream, meta, ParseNodeKind.Expression); + return parse_operators(ExpressionWithBodyNode( + Nodes.RangeExpression, [_sym, __parse(advance_next(stream, end_expression, "RangeValue expression:"), stream, meta)] + ), stream, meta, ParseNodeKind.Expression); case "!": stream.confirm_try(); - node = parse_operators(notExpressionOrIndentifier ? _sym : { - name: Nodes.NullAssertionExpression, - type: NodeType.Expression, - body: [_sym] - }, stream, meta, ParseNodeKind.Expression); + node = parse_operators(notExpressionOrIndentifier ? _sym : ExpressionWithBodyNode(Nodes.NullAssertionExpression, [_sym]), stream, meta, ParseNodeKind.Expression); if (notExpressionOrIndentifier) { pushDiagnostic(DiagnosticSeverity.Warn, `Null assertion expression doesn't have any effect on ${ type } value, ` + @@ -180,58 +174,18 @@ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream * @param {import("./parser").ParseMeta} meta * @returns {import("./parser").Node | [import("./parser").Node]} */ -export function __parse(next: Token, stream: TokenStream, meta: IParseMeta): INode { - var _sym: INode; +export function __parse(next: Token, stream: TokenStream, meta: ParseMeta): INode { if (isSymbol(next)) { - // next = stream.try(end_expression); - // if (next.type === Tokens.String) { - // stream.confirm_try(); - // return parse_operators({ - // name: Nodes.CallExpression, - // type: NodeType.Expression, - // body: [_sym], - // args: [{ - // name: Nodes.StringValue, - // type: NodeType.Expression, - // body: next.body - // }] - // }, stream, meta, expression__); - // } - // stream.cancel_try(); - return parse_operators(next.type === Tokens.Keyword ? keywords_handlers[next.body](stream, meta) : { - name: Nodes.Symbol, - type: NodeType.Expression, - symbol: next.body - }, stream, meta, indentifier); + return parse_operators(next.type === Tokens.Keyword ? keywords_handlers[next.body](stream, meta) : SymbolNode(next.body), stream, meta, indentifier); } else if (next.type === Tokens.Keyword) { - assert_type(next); return keywords_handlers[next.body](stream, meta); } else if (next.type === Tokens.Number) { - assert_type(next); - let _temp = next.body; - _sym = { - name: Nodes.NumberValue, - type: NodeType.Expression, - symbol: _temp - }; - return parse_operators(_sym, stream, meta, ParseNodeKind.Number); + return parse_operators(NumberNode(next.body), stream, meta, ParseNodeKind.Number); } else if (next.type === Tokens.String) { - assert_type(next); - return parse_operators({ - name: Nodes.StringValue, - type: NodeType.Expression, - symbol: next.body - }, stream, meta, ParseNodeKind.String); - } else if (next.type === Tokens.Operator && ~[";", ")", "}", ","].indexOf(next.body)) { - - } else if (next.type === Tokens.Operator) { + return parse_operators(StringNode(next.body), stream, meta, ParseNodeKind.String); + } else if (next.type === Tokens.Operator && !comparer.includes(next.body)) { if (next.body === "{") { - return { - name: Nodes.CodeBlock, - type: NodeType.Statment, - body: parse_body(stream, meta), - outerBody: meta.outer - }; + return StatmentWithBodyNode(Nodes.CodeBlock, parse_body(stream, meta), meta.outer); } else if (next.body === "(") { return parse_group_expression(stream, meta); } @@ -244,16 +198,7 @@ export function __parse(next: Token, stream: TokenStream, meta: IParseMeta): INo pushDiagnostic(DiagnosticSeverity.Warn, "Decorators are not emitting yet!", stream); next = advance_next(stream, "decorator name"); if (isSymbol(next)) { - _sym = { - name: Nodes.Decorator, - type: NodeType.Expression, - symbol: next.body - }; } else if (next.type === Tokens.Operator && next.body === "(") { - _sym = { - name: Nodes.Decorator, - type: NodeType.Expression - }; var body = parse_group_expression(stream, meta); throw "Decorators are not finished at all!"; } else { @@ -262,11 +207,9 @@ export function __parse(next: Token, stream: TokenStream, meta: IParseMeta): INo break; case "@@": - return parse_operators({ - name: Nodes.SymbolShortcut, - type: NodeType.Expression, - symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword, undefined, undefined, "symbol-constructor-property").body - }, stream, meta, ParseNodeKind.Expression); + return parse_operators(SymbolShortcutNode( + assert_next_token(stream, Tokens.Symbol | Tokens.Keyword, undefined, undefined, "symbol-constructor-property").body + ), stream, meta, ParseNodeKind.Expression); case "/": return parse_operators(parse_regexp(stream), stream, meta, ParseNodeKind.Expression); @@ -289,14 +232,14 @@ export function __parse(next: Token, stream: TokenStream, meta: IParseMeta): INo * @param {import("./utils/stream.js").TokenStream} stream * @param {import("./parser").ParseMeta} meta */ -export function parse_expression

(stream: import("./utils/stream.js").TokenStream, meta: IParseMeta, prefix?: Prefix

) { +export function parse_expression

(stream: import("./utils/stream.js").TokenStream, meta: ParseMeta, prefix?: Prefix

) { return __parse(advance_next(stream, end_expression, prefix), stream, meta); } -export function _parse_and_assert_last_token

(stream: TokenStream, meta: IParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

, parse: typeof __parse = _parse) { +export function _parse_and_assert_last_token

(stream: TokenStream, meta: ParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

, parse: typeof __parse = _parse) { var arg: INode; arg = parse(advance_next(stream, end_expression, prefix), stream, meta); - except_next_token(stream, token_type, token_string); + assert_next_token(stream, token_type, token_string); return arg; } // var __line = 0; @@ -307,27 +250,36 @@ export const diagnostics: readonly IDiagnostic[] = []; export class Diagnostic implements IDiagnostic { public readonly line: number; public readonly column: number; - constructor(public readonly severity: DiagnosticSeverity, public readonly message: string, { text_stream }: Partial = {}) { + public constructor(public readonly severity: DiagnosticSeverity, public readonly message: unknown, { text_stream }: Partial = {}) { const text = text_stream?.text.slice(0, text_stream.index); this.line = text ? occurrences(text, '\n') + 1 : '?' as never; this.column = text ? text_stream?.index! - text?.lastIndexOf('\n') : '?' as never; } - log() { + public log() { const level = (["Info", "Warn", "RuntimeError", "Error", "FatalError"] as const)[this.severity]; console.log(`Diagnostic[Level: ${ level }, Line: ${ this.line }, Column: ${ this.column }]:`, this.message); } } -export function pushDiagnostic(severity: DiagnosticSeverity, message: string, stream?: TokenStream, _diagnostics: readonly IDiagnostic[] = diagnostics) { +export function pushDiagnostic(severity: DiagnosticSeverity, message: unknown, stream?: TokenStream, _diagnostics: readonly IDiagnostic[] = diagnostics) { (_diagnostics as IDiagnostic[]).push(new Diagnostic(severity, message, stream)); } export var promises: Promise[] = []; export interface ParserOutput { readonly output: Readonly; readonly diagnostics: readonly IDiagnostic[]; - readonly __used: Readonly>; + readonly __used: Readonly; } export var __cache = true; -export var __used: Record; +class KnownUsed implements Record { + public throw = false; + /** null assert */ + public na = false; + public contains = false; + [key: string]: boolean; +} + +export type { KnownUsed }; +export var __used: KnownUsed; /** * @param {import("./utils/stream.js").TokenList} stream * @param {string} filename @@ -344,7 +296,7 @@ export function parse(stream: TokenStream, filename: string, cache: boolean): Pa locals: [], meta: {} }; - __used = {}; + __used = new KnownUsed(); const output: ParserOutput = { diagnostics, output: __top_fn_node, @@ -361,9 +313,8 @@ export function parse(stream: TokenStream, filename: string, cache: boolean): Pa */ export function main_parse(stream: TokenStream, filename: string, outer: INode, cache: boolean, insideExpression = false): SyntaxTree { const parsed: INode[] = [], meta = new ParseMeta(filename, outer, cache, insideExpression); - var next: Token; parse_shebang(stream, outer); - while (!nullish(next = stream.advance())) { + for (const next of stream) { // try { // var newlines = occurrences(next[1], '\n'); // var __line_cache = __line += newlines; @@ -394,8 +345,8 @@ export function main_parse(stream: TokenStream, filename: string, outer: INode, } function parse_shebang({ text_stream }: TokenStream, outer: INode) { - var next = text_stream.move(), text = ""; - if (next === "#") { + var next: string, text = ""; + if (text_stream.move() === "#") { if (text_stream.move() === "!") { while ((next = text_stream.move()) !== "\n" && next !== "\r") { text += next; diff --git a/src/lib/parsers/assignments.ts b/src/lib/parsers/assignments.ts index f49b622..8a14ea3 100644 --- a/src/lib/parsers/assignments.ts +++ b/src/lib/parsers/assignments.ts @@ -1,37 +1,24 @@ -import { Nodes, NodeType, AccessChainItemKind, DiagnosticSeverity } from "../enums"; +import { Nodes, DiagnosticSeverity } from "../enums"; import { AssignmentOperatorTable, type AssignmentOperatorTableKeys } from "../utils/table.js"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; import { pushDiagnostic, _parse } from "../parser.js"; +import { INode, type ParseMeta, ExpressionWithBodyAndSymbolNode } from "../nodes"; +import { optionalChainsSet } from "./member-access.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { INode, IParseMeta, AccessChainItem } from "../nodes"; -export function parse_assignment(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta): INode | undefined { - if (name = AssignmentOperatorTable[next.body as AssignmentOperatorTableKeys] as Nodes | undefined) { - if (_sym.name === Nodes.MemberAccessExpression) { - const body = _sym.body as AccessChainItem[]; - var name: Nodes | undefined, parsed: INode, node: INode; - for (var index = 0; index < body.length; index++) { - const item = body[index]; - if (item.kind === AccessChainItemKind.Optional || item.kind === AccessChainItemKind.OptionalComputed) { - pushDiagnostic(DiagnosticSeverity.RuntimeError, - `The left-hand side of an assignment expression may not be an optional property access.`, stream); - } - } +export function parse_assignment(_sym: INode, next: Token, stream: TokenStream, meta: ParseMeta): INode | undefined { + var name: Nodes | undefined; + if (name = AssignmentOperatorTable[next.body as AssignmentOperatorTableKeys]) { + if (optionalChainsSet.has(_sym)) { + pushDiagnostic(DiagnosticSeverity.RuntimeError, `The left-hand side of an assignment expression may not be an optional property access.`, stream); } - parsed = _parse(advance_next(stream, end_expression), stream, meta) as INode; - node = { - name, - type: NodeType.Expression, - body: [_sym, parsed], - symbol: next.body - }; if (_sym.name !== Nodes.MemberAccessExpression && !~meta.outer.locals!.indexOf(_sym.symbol!) && !~(meta.outer.nonlocals?.indexOf(_sym.symbol!) ?? -1)) { meta.outer.locals!.push(_sym.symbol!); } - return node; + return ExpressionWithBodyAndSymbolNode(name, [_sym, _parse(advance_next(stream, end_expression), stream, meta)], next.body); } } diff --git a/src/lib/parsers/body-parser.ts b/src/lib/parsers/body-parser.ts index 90b1793..0ef96a3 100644 --- a/src/lib/parsers/body-parser.ts +++ b/src/lib/parsers/body-parser.ts @@ -1,33 +1,30 @@ import { Tokens, DiagnosticSeverity } from "../enums"; -import { advance_next, except_next_token, type Prefix } from "../utils/advancers.js"; +import { advance_next, assert_next_token, type Prefix } from "../utils/advancers.js"; import { _parse, pushDiagnostic } from "../parser.js"; import type { IParseMeta, INode } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ export function parse_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { - var next: Token = advance_next(stream, "}", prefix); + // var next: Token = advance_next(stream, "}", prefix); const nodes: INode[] = []; + var next: Token //console.log(1123124); - while ((next /*, console.log("next:", next), next*/).type !== Tokens.Operator || next.body !== "}") { + while ((next = advance_next(stream, "}", prefix)/*, console.log("next:", next), next*/).type !== Tokens.Operator || next.body !== "}") { // console.log(next); try { var _parsed = _parse(next, stream, meta); _parsed && nodes.push(_parsed); - next = advance_next(stream, "}", prefix); + // next = advance_next(stream, "}", prefix); } catch (_e) { pushDiagnostic(DiagnosticSeverity.Error, _e as never, stream); - next = advance_next(stream, "}", prefix); + // next = advance_next(stream, "}", prefix); } } return nodes; } export function parse_next_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { - except_next_token(stream, Tokens.Operator, "{", prefix); + assert_next_token(stream, Tokens.Operator, "{", prefix); return parse_body(stream, meta, prefix); } diff --git a/src/lib/parsers/common-expressions.ts b/src/lib/parsers/common-expressions.ts index 4215b03..e701ffc 100644 --- a/src/lib/parsers/common-expressions.ts +++ b/src/lib/parsers/common-expressions.ts @@ -1,32 +1,14 @@ -import { Nodes, NodeType } from "../enums"; +import { Nodes } from "../enums"; import { CommonOperatorTable, type CommonOperatorTableKeys } from "../utils/table.js"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; import { __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { INode, IParseMeta } from "../nodes"; +import { ExpressionWithBodyAndSymbolNode, INode, IParseMeta } from "../nodes"; +const table: Readonly> = { and: "&&", or: "||" }; export function parse_common_expressions(_sym: INode, next: Token, stream: TokenStream, meta: IParseMeta): INode | undefined { const name: Nodes | undefined = CommonOperatorTable[next.body as CommonOperatorTableKeys]; - if (name) { - const parsed = __parse(advance_next(stream, end_expression), stream, meta); - const node: INode = { - name, - type: NodeType.Expression, - body: [_sym, parsed], - symbol: { and: "&&", or: "||" }[next.body] || next.body - }; - if (name === Nodes.ExponentiationExpression) { - // Here is the logic: - // If parsed is a common | assignment expression - // Succumb it onto this ** expression - if (typeof parsed.symbol === "string" && typeof parsed.body === "object") { - node.body![1] = parsed.body[0]; - parsed.body[0] = node; - } - return parsed; - } - return node; - } + return name && ExpressionWithBodyAndSymbolNode(name, [_sym, __parse(advance_next(stream, end_expression), stream, meta)], table[next.body] ?? next.body); } diff --git a/src/lib/parsers/external-var.ts b/src/lib/parsers/external-var.ts index e973db3..b72f099 100644 --- a/src/lib/parsers/external-var.ts +++ b/src/lib/parsers/external-var.ts @@ -1,21 +1,17 @@ import { Nodes, NodeType, Tokens } from "../enums"; -import { except_next_token } from "../utils/advancers.js"; +import { assert_next_token } from "../utils/advancers.js"; import { undefined } from "../utils/util.js"; -import type { INode } from "../nodes.js"; +import { type INode, Node, ParseMeta } from "../nodes.js"; import type { TokenStream } from "../utils/stream.js"; export function __external_var_creator(type: NodeType) { - return function __external_var(stream: TokenStream): INode { + return function __external_var(stream: TokenStream, meta: ParseMeta): INode { const prefix = `External variable expression:`; - except_next_token(stream, Tokens.Operator, "(", prefix); - except_next_token(stream, Tokens.String, undefined, prefix); + assert_next_token(stream, Tokens.Operator, "(", prefix); + assert_next_token(stream, Tokens.String, undefined, prefix); const { body } = stream.next; - except_next_token(stream, Tokens.Operator, ")", prefix); - return { - name: Nodes.ExternalVariable, - type: type, - symbol: body - }; + assert_next_token(stream, Tokens.Operator, ")", prefix); + return new Node(Nodes.ExternalVariable, type, undefined, type === NodeType.Statment ? meta.outer : undefined, body, undefined); }; } diff --git a/src/lib/parsers/keywords.ts b/src/lib/parsers/keywords.ts index 00c8090..8db5f62 100644 --- a/src/lib/parsers/keywords.ts +++ b/src/lib/parsers/keywords.ts @@ -1,22 +1,28 @@ import { isArray, include, undefined, SyntaxError, random_var_name, includes, - error_unexcepted_token, assert_type, except_token + error_unexcepted_token, assert_type, assert_token } from "../utils/util.js"; import { _echo } from "../utils/_echo.js"; import { FunctionNodeKind, Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, Tokens, DiagnosticSeverity } from "../enums"; import { lex } from "../lexer.js"; import { memberAccessOperators, end_expression } from "../utils/constants.js"; -import { _parseMemberAccess } from "./member-access.js"; -import { advance_next, except_next_token } from "../utils/advancers.js"; +import { parse_member_access } from "./member-access.js"; +import { advance_next, assert_next_token } from "../utils/advancers.js"; import { parse_body, parse_next_body } from "./body-parser.js"; import { __cache, main_parse, promises, _parse, __parse, __used, _parse_and_assert_last_token, pushDiagnostic } from "../parser.js"; import { __external_var_creator } from "./external-var.js"; import { parse_call_expression } from "./call-expression.js"; -import { type IParseMeta, type INode, type IParameterNode, type IClassNode, type AccessChainItem, type IUsingStatmentNode, ParseMeta, ParameterNode } from "../nodes"; +import { type INode, type IClassNode, type AccessChainItem, ParseMeta, ParameterNode, Node, SymbolNode, StatmentWithBodyNode, TryStatmentNode, Writable, IfStatmentNode, ExpressionWithBodyNode, PrefixlessSymbolNode, ExpressionWithBodyAndOuterNode } from "../nodes"; import type { TokenStream } from "../utils/stream.js"; +import { MultiValueComparer } from "../utils/comparer.js"; -type KeywordParsers = Readonly Readonly>>; +type KeywordParsers = Readonly Readonly>>; +const try_phrases = new MultiValueComparer(["catch", "else", "finally"]); +const keepStatmentStuff = [',', ')'].join('" | "') + memberAccessOperators.join('" | "'); +const awaitOps = ['any', 'all', 'allSettled', 'race']; +const awaitOpsComparer = new MultiValueComparer(awaitOps); +const awaitOpsJoined = awaitOps.join('" | "'); export const keywords_handlers = { /** * @param {import("./utils/stream.js").TokenStream} stream @@ -26,7 +32,7 @@ export const keywords_handlers = { if (!meta.outer.nonlocals) { throw "Nonlocal statment: this statment cannot be used in top-level scope!"; } - const next = except_next_token(stream, Tokens.Symbol); + const next = assert_next_token(stream, Tokens.Symbol); meta.outer.nonlocals.push(next.body); meta.outer.locals = meta.outer.locals!.filter(sym => sym !== next.body); return { @@ -51,9 +57,9 @@ export const keywords_handlers = { type: NodeType.Statment, outerBody: meta.outer }; - except_next_token(stream, Tokens.Operator, "}", "Include statment:"); - except_next_token(stream, Tokens.Keyword, "from", "Include statment:"); - except_next_token(stream, Tokens.String, undefined, "Include statment:"); + assert_next_token(stream, Tokens.Operator, "}", "Include statment:"); + assert_next_token(stream, Tokens.Keyword, "from", "Include statment:"); + assert_next_token(stream, Tokens.String, undefined, "Include statment:"); } else { error_unexcepted_token(next); } @@ -75,34 +81,15 @@ export const keywords_handlers = { * @param {import("./parser").ParseMeta} meta */ if(stream, meta) { - except_next_token(stream, Tokens.Operator, "("); + assert_next_token(stream, Tokens.Operator, "("); var expression = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")"), expressions: INode[]; var next = advance_next(stream, "{"); if (next.type === Tokens.Operator && next.body === "{") { expressions = parse_body(stream, meta); } else { - expressions = [_parse(next, stream, meta) as INode]; + expressions = [_parse(next, stream, meta)]; } - var node: INode = { - name: Nodes.IfStatment, - type: NodeType.Statment, - body: expressions, - args: [expression], - else: undefined!, - elseif: undefined!, - outerBody: meta.outer - // /** - // * @param {boolean} pretty - // * @param {string} whitespace - // */ - // toString(pretty: boolean, whitespace: string) { - // if (pretty) { - // return `if (${ expression }) ${ impl ? expressions.toString(true) : `{\n${ whitespace + " " }${ expressions.toString(true, whitespace + " ") }${ whitespace }\n}` }`; - // } else { - // return `if(${ expression })${ impl ? expressions.toString(false) : `{${ expressions.toString(false) }}` }`; - // } - // } - }; + var node = IfStatmentNode(expressions as Node[], meta.outer as Node, expression as Node); try { next = stream.try("else"); } catch (error) { @@ -112,14 +99,9 @@ export const keywords_handlers = { stream.confirm_try(); next = advance_next(stream, "if"); if (next.type === Tokens.Keyword && next.body === "if") { - node.elseif = keywords_handlers.if(stream, meta); + node.meta.elseif = keywords_handlers.if(stream, meta) as Node; } else { - node.else = { - name: Nodes.ElseStatment, - type: NodeType.Statment, - body: next.type === Tokens.Operator && next.body === "{" ? parse_body(stream, meta) : [_parse(next, stream, meta) as INode], - outerBody: meta.outer - }; + node.meta.else = StatmentWithBodyNode(Nodes.ElseStatment, next.type === Tokens.Operator && next.body === "{" ? parse_body(stream, meta) : [_parse(next, stream, meta) as INode], meta.outer); } } else { stream.cancel_try(); @@ -187,31 +169,14 @@ export const keywords_handlers = { * @param {import("./utils/stream.js").TokenStream} stream */ async(stream, meta) { - except_next_token(stream, Tokens.Keyword, "fn", "Async(Generator?)Function statment:"); + assert_next_token(stream, Tokens.Keyword, "fn", "Async(Generator?)Function statment:"); return keywords_handlers.fn(stream, meta, FunctionNodeKind.Async); }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ not(stream, meta) { - return { - name: Nodes.LiteralLogicalNotExpression, - type: NodeType.Expression, - body: [__parse(advance_next(stream, end_expression), stream, meta)] - }; + return ExpressionWithBodyNode(Nodes.LiteralLogicalNotExpression, [__parse(advance_next(stream, end_expression), stream, meta)]); }, - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ __external_var: __external_var_creator(NodeType.Expression), - /** - * @param {import("./utils/stream.js").TokenStream} stream - */ __external: __external_var_creator(NodeType.Statment), - /** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ fn(stream, meta, type: FunctionNodeKind = FunctionNodeKind.Sync) { type _1 = "Function statment:"; type _2 = `Generator${ _1 }`; @@ -226,7 +191,7 @@ export const keywords_handlers = { _[3] = "Async" + _[1] as _4; const prefix = _[type]; var name = ""; - var params: IParameterNode[] = []; + var params: ParameterNode[] = []; var next = advance_next(stream, 'symbol" | "(', prefix); var paramType: ParameterNodeKind; var hasRest = false; @@ -277,10 +242,10 @@ export const keywords_handlers = { next = advance_next(stream, ",", prefix); if (next.type === Tokens.Operator && next.body === "=") { - var parsed = _parse(advance_next(stream, end_expression, prefix), stream, innerMeta); + var parsed: INode | undefined = _parse(advance_next(stream, end_expression, prefix), stream, innerMeta); next = advance_next(stream, end_expression, prefix); } - params.push(new ParameterNode(body, paramType, parsed!)); + params.push(new ParameterNode(body, paramType, parsed)); if (next.type === Tokens.Operator && next.body === ")") { break; @@ -302,18 +267,13 @@ export const keywords_handlers = { next = advance_next(stream, "{", prefix); if (next.type === Tokens.Operator && next.body === "=>") { next = advance_next(stream, end_expression, prefix); - innerMeta.insideExpression = true; if (next.type !== Tokens.Operator && next.body !== "{") { - node.body = [{ - name: Nodes.ReturnStatment, - type: NodeType.Statment, - body: [_parse(next, stream, innerMeta)], - outerBody: node - }]; + innerMeta.insideExpression = true; + node.body = [StatmentWithBodyNode(Nodes.ReturnStatment, [_parse(next, stream, innerMeta)], node)]; return node; } } - except_token(next, Tokens.Operator, "{"); + assert_token(next, Tokens.Operator, "{"); node.body = parse_body(stream, innerMeta); return node; }, @@ -377,33 +337,18 @@ export const keywords_handlers = { return node; }, return(stream, meta) { - return { - name: Nodes.ReturnStatment, - type: NodeType.Statment, - body: [_parse(advance_next(stream, end_expression, "Return statment:"), stream, meta)], - outerBody: meta.outer - }; + return StatmentWithBodyNode(Nodes.ReturnStatment, [_parse(advance_next(stream, end_expression, "Return statment:"), stream, meta)], meta.outer); }, throw(stream, meta) { __used.throw = true; - return { - name: Nodes.ThrowExpression, - type: NodeType.Expression, - body: [__parse(advance_next(stream, end_expression, "Throw statment:"), stream, meta)] - }; + return ExpressionWithBodyNode(Nodes.ThrowExpression, [__parse(advance_next(stream, end_expression, "Throw statment:"), stream, meta)]); }, yield(stream, meta) { var next = advance_next(stream, end_expression, "Yield expression:"); var yield_from = next.type === Tokens.Operator && next.body === "*"; - var expression = yield_from ? + return ExpressionWithBodyAndOuterNode(yield_from ? Nodes.YieldFromExpression : Nodes.YieldExpression, [yield_from ? __parse(advance_next(stream, end_expression), stream, meta) : - __parse(next, stream, meta); - return { - name: yield_from ? Nodes.YieldFromExpression : Nodes.YieldExpression, - type: NodeType.Expression, - outerBody: meta.outer, - body: [expression] - }; + __parse(next, stream, meta)], meta.outer as Node); }, await(stream, meta) { if (meta.outer.name === Nodes.FunctionExpression) { @@ -415,16 +360,12 @@ export const keywords_handlers = { const prefix = "Await expression:"; var next = advance_next(stream, end_expression, prefix); if (next.type === Tokens.Operator && next.body === ".") { - next = advance_next(stream, ['any', 'all', 'allSettled', 'race'].join('" | "'), prefix); - if (next.type === Tokens.Symbol && /^(any|all(Settled)?|race)$/m.test(next.body)) { + next = advance_next(stream, awaitOpsJoined, prefix); + if (next.type === Tokens.Symbol && awaitOpsComparer.includes(next.body)) { var expression: INode = { name: Nodes.CallExpression, type: NodeType.Expression, - body: [{ - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: `p.${ next.body }` - }], + body: [PrefixlessSymbolNode(`p.${ next.body }`)], args: [_parse(advance_next(stream, end_expression, prefix), stream, meta)] }; } else { @@ -433,24 +374,15 @@ export const keywords_handlers = { } else { expression = _parse(next, stream, meta); } - return { - name: Nodes.AwaitExpression, - type: NodeType.Expression, - outerBody: meta.outer, - body: [expression] - }; + return ExpressionWithBodyAndOuterNode(Nodes.AwaitExpression, [expression], meta.outer as Node); }, this() { - return { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: "this" - }; + return PrefixlessSymbolNode(`this`); }, keep(stream, meta) { const prefix = "Keep statment:"; const args: INode[] = []; - except_next_token(stream, Tokens.Operator, "("); + assert_next_token(stream, Tokens.Operator, "("); var next = advance_next(stream, "symbol", prefix); // ??? if (next.type === Tokens.Operator || next.body !== ")") { @@ -471,13 +403,9 @@ export const keywords_handlers = { if (!(isConstantObject || next.type === Tokens.Symbol)) { error_unexcepted_token(next); } - next2 = advance_next(stream, [',', ')'].join('" | "') + memberAccessOperators.join('" | "'), prefix); + next2 = advance_next(stream, keepStatmentStuff, prefix); if (next2.type === Tokens.Operator && includes(memberAccessOperators, next2.body)) { - arg = { - name: Nodes.MemberAccessExpression, - type: NodeType.Expression, - body: _parseMemberAccess(arg, next, stream, meta), - }; + arg = parse_member_access(arg, next, stream, meta); } else { isConstantObject && pushDiagnostic(DiagnosticSeverity.RuntimeError, `Assignment to "${ next.type }" will fail at runtime!`, stream); next = next2; @@ -495,7 +423,7 @@ export const keywords_handlers = { next = advance_next(stream, "symbol"); } } - except_next_token(stream, Tokens.Operator, "{", prefix); + assert_next_token(stream, Tokens.Operator, "{", prefix); return { name: Nodes.KeepStatment, type: NodeType.Statment, @@ -534,51 +462,33 @@ export const keywords_handlers = { }, // TODO try(stream, meta) { - const node: Partial = { - name: Nodes.TryStatment, - type: NodeType.Statment, - catch: null!, - else: null!, - body: null!, - finally: null!, - args: null!, - outerBody: meta.outer - }; - var prefix: `Try${"" | "-Using"} statment:` = "Try statment:", - next = advance_next(stream, end_expression, prefix), nonuseless = true; - if (next.type === Tokens.Keyword && next.body === "using") { - assert_type(node); - node.args = []; - prefix = "Try-Using statment:"; - } - if (next.type === Tokens.Operator && next.body === "{") { - node.body = parse_body(stream, meta); - } - next = advance_next(stream, end_expression, prefix); - nonuseless = false; - while (next.type === Tokens.Keyword && includes(["catch", "else", "finally"] as const, next.body)) { - nonuseless = true; + const prefix = "Try statment:"; + const node = TryStatmentNode(parse_next_body(stream, meta, prefix) as Node[], undefined!, undefined!, undefined!, meta.outer as Node); + var next = stream.try(end_expression, prefix); + var useless = true; + var word: string; + while (next.type === Tokens.Keyword && try_phrases.includes(word = next.body)) { + useless = false; stream.confirm_try(); - const word = next.body, toAppend = word === "catch" ? ["", []] as IUsingStatmentNode["catch"] : undefined; - next = stream.try(end_expression, prefix); - if (word === "catch" && next.type === Tokens.Operator && next.body === "(") { - stream.confirm_try(); - except_next_token(stream, Tokens.Symbol); - toAppend![0] = stream.next.body; - except_next_token(stream, Tokens.Operator, ")", prefix); - } else stream.cancel_try(); + const toAppend = word === "catch" ? StatmentWithBodyNode(Nodes.CatchStatment, undefined!, meta.outer) as Writable : undefined; if (word === "catch") { - toAppend![1] = parse_next_body(stream, meta); - node[word] = toAppend!; + next = advance_next(stream, end_expression, prefix); + if (next.type === Tokens.Operator && next.body === "(") { + toAppend!.symbol = assert_next_token(stream, Tokens.Symbol).body; + assert_next_token(stream, Tokens.Operator, ")", prefix); + advance_next(stream, end_expression, prefix); + } + toAppend!.body = parse_body(stream, meta); + node.meta[word] = toAppend!; } else { - node[word] = parse_next_body(stream, meta); + node.meta[word] = parse_next_body(stream, meta) as Node[]; } next = stream.try(end_expression, prefix); } stream.cancel_try(); - if (!nonuseless) { - pushDiagnostic(DiagnosticSeverity.Warn, `Try statment is useless without else, catch, finally clauses!`, stream); - node.finally = []; + if (useless) { + pushDiagnostic(DiagnosticSeverity.Error, `Try statment was not followed by catch, else or finally clauses`, stream); + node.meta.finally = []; } return node; }, @@ -587,7 +497,7 @@ export const keywords_handlers = { }, while(stream, meta) { const prefix = "While statment:"; - except_next_token(stream, Tokens.Operator, "(", prefix); + assert_next_token(stream, Tokens.Operator, "(", prefix); const arg = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix); return { name: Nodes.WhileStatment, @@ -600,8 +510,8 @@ export const keywords_handlers = { do(stream, meta) { const prefix = "Do-While statment:"; var body = parse_next_body(stream, meta, prefix); - except_next_token(stream, Tokens.Keyword, "while", prefix); - except_next_token(stream, Tokens.Operator, "(", prefix); + assert_next_token(stream, Tokens.Keyword, "while", prefix); + assert_next_token(stream, Tokens.Operator, "(", prefix); return { name: Nodes.DoWhileStatment, type: NodeType.Statment, @@ -617,7 +527,7 @@ export const keywords_handlers = { error_unexcepted_token(stream.next); }, import(stream, meta): INode { - except_next_token(stream, Tokens.Operator, "(", "Import statment:"); + assert_next_token(stream, Tokens.Operator, "(", "Import statment:"); return { name: Nodes.ImportExpression, type: NodeType.Expression, @@ -625,17 +535,17 @@ export const keywords_handlers = { }; }, for(stream, meta) { - except_next_token(stream, Tokens.Symbol, "range", "For statment:"); - except_next_token(stream, Tokens.Operator, "(", "For statment:"); + assert_next_token(stream, Tokens.Symbol, "range", "For statment:"); + assert_next_token(stream, Tokens.Operator, "(", "For statment:"); return { name: Nodes.ForRangeStatment, type: NodeType.Statment, args: [ _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "to"), _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "as"), - "$" + except_next_token(stream, Tokens.Symbol, undefined, "For statment:").body + SymbolNode(assert_next_token(stream, Tokens.Symbol, undefined, "For statment:").body) ], - body: (except_next_token(stream, Tokens.Operator, ")", "For statment:"), parse_next_body(stream, meta)), + body: (assert_next_token(stream, Tokens.Operator, ")", "For statment:"), parse_next_body(stream, meta)), outerBody: meta.outer }; } diff --git a/src/lib/parsers/member-access.ts b/src/lib/parsers/member-access.ts index 3099554..67b7d20 100644 --- a/src/lib/parsers/member-access.ts +++ b/src/lib/parsers/member-access.ts @@ -1,50 +1,58 @@ -import { includes } from "../utils/util.js"; -import { Nodes, NodeType, AccessChainItemKind, Tokens, ParseNodeKind } from "../enums"; -import { memberAccessOperators, end_expression } from "../utils/constants.js"; +import { Nodes, AccessChainItemKind, Tokens, ParseNodeKind } from "../enums"; import { __parse, __used, _parse, parse_operators } from "../parser.js"; -import { advance_next, except_next_token } from "../utils/advancers.js"; +import { MultiValueComparer } from "../utils/comparer.js"; +import { advance_next, assert_next_token } from "../utils/advancers.js"; +import { memberAccessOperators, end_expression } from "../utils/constants.js"; +import { type INode, type ParseMeta, AccessChainItem, PrefixlessSymbolNode, ExpressionWithBodyNode } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; -import { type INode, type IParseMeta, AccessChainItem } from "../nodes"; -export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { - const chain = [new AccessChainItem(AccessChainItemKind.Head, sym)]; - while (next.type === Tokens.Operator && includes(memberAccessOperators, next.body)) { +const memberAccessOperatorsComparer = new MultiValueComparer(memberAccessOperators); +export const optionalChainsSet = new WeakSet; +export function parse_member_access(sym: INode, next: Token, stream: TokenStream, meta: ParseMeta) { + const chain = [new AccessChainItem(AccessChainItemKind.Head, sym)], node = ExpressionWithBodyNode(Nodes.MemberAccessExpression, chain); + while (next.type === Tokens.Operator && memberAccessOperatorsComparer.includes(next.body)) { stream.confirm_try(); - if (next.body === ".") { - chain.push(new AccessChainItem(AccessChainItemKind.Normal, { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body - })); - } else if (next.body === "[") { - const parsed = __parse(advance_next(stream, end_expression), stream, meta); - except_next_token(stream, Tokens.Operator, "]"); - chain.push(new AccessChainItem(AccessChainItemKind.Computed, parsed)); - } else if (next.body === "?.") { - chain.push(new AccessChainItem(AccessChainItemKind.Optional, { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body - })); - } else if (next.body === "?.[") { - const parsed = __parse(advance_next(stream, end_expression), stream, meta); - except_next_token(stream, Tokens.Operator, "]"); - chain.push(new AccessChainItem(AccessChainItemKind.OptionalComputed, parsed)); - } else if (next.body === "!.") { - __used.na = true; - chain.push(new AccessChainItem(AccessChainItemKind.NormalNullAsserted, { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: except_next_token(stream, Tokens.Symbol | Tokens.Keyword).body - })); - } else if (next.body === "!.[") { - const parsed = __parse(advance_next(stream, end_expression), stream, meta); - except_next_token(stream, Tokens.Operator, "]"); - __used.na = true; - chain.push(new AccessChainItem(AccessChainItemKind.ComputedNullAsserted, parsed)); - } else { - break; + switch (next.body) { + case ".": + chain.push(new AccessChainItem(AccessChainItemKind.Normal, PrefixlessSymbolNode(assert_next_token(stream, Tokens.Symbol | Tokens.Keyword).body))); + break; + + case "[": { + const parsed = __parse(advance_next(stream, end_expression), stream, meta); + assert_next_token(stream, Tokens.Operator, "]"); + chain.push(new AccessChainItem(AccessChainItemKind.Computed, parsed)); + break; + } + + case "?.": + optionalChainsSet.add(node); + chain.push(new AccessChainItem(AccessChainItemKind.Optional, PrefixlessSymbolNode(assert_next_token(stream, Tokens.Symbol | Tokens.Keyword).body))); + break; + + case "?.[": { + optionalChainsSet.add(node); + const parsed = __parse(advance_next(stream, end_expression), stream, meta); + assert_next_token(stream, Tokens.Operator, "]"); + chain.push(new AccessChainItem(AccessChainItemKind.OptionalComputed, parsed)); + break; + } + + case "!.": + __used.na = true; + chain.push(new AccessChainItem(AccessChainItemKind.NormalNullAsserted, PrefixlessSymbolNode(assert_next_token(stream, Tokens.Symbol | Tokens.Keyword).body))); + break; + + case "!.[": { + const parsed = __parse(advance_next(stream, end_expression), stream, meta); + assert_next_token(stream, Tokens.Operator, "]"); + __used.na = true; + chain.push(new AccessChainItem(AccessChainItemKind.ComputedNullAsserted, parsed)); + break; + } + + default: + throw RangeError("should never happen"); } try { next = stream.try("operator"); @@ -53,12 +61,5 @@ export function _parseMemberAccess(sym: INode, next: Token, stream: TokenStream, } } stream.cancel_try(); - return chain; -} -export function parseMemberAccess(sym: INode, next: Token, stream: TokenStream, meta: IParseMeta) { - return parse_operators({ - name: Nodes.MemberAccessExpression, - type: NodeType.Expression, - body: _parseMemberAccess(sym, next, stream, meta), - }, stream, meta, ParseNodeKind.Expression); + return ExpressionWithBodyNode(Nodes.MemberAccessExpression, chain); } diff --git a/src/lib/parsers/object-expression.ts b/src/lib/parsers/object-expression.ts index 6a90a64..d0e38a5 100644 --- a/src/lib/parsers/object-expression.ts +++ b/src/lib/parsers/object-expression.ts @@ -1,7 +1,7 @@ import { Nodes, NodeType, Tokens } from "../enums.js"; import { advance_next } from "../utils/advancers.js"; import { end_expression } from "../utils/constants.js"; -import { except_token } from "../utils/util.js"; +import { assert_token } from "../utils/util.js"; import type { INode, ObjectNode, IParseMeta } from "../nodes.js"; import type { Token, TokenStream } from "../utils/stream.js"; @@ -18,6 +18,6 @@ export function parse_object_expression(stream: TokenStream, meta: IParseMeta): while (next = advance_next(stream, end_expression), next.type === Tokens.Operator && next.body === ",") { recursive_attrs(stream, next, meta, []); } - except_token(next, Tokens.Operator, "}"); + assert_token(next, Tokens.Operator, "}"); return node; } \ No newline at end of file diff --git a/src/lib/parsers/regexp.ts b/src/lib/parsers/regexp.ts index 7788707..eac2c65 100644 --- a/src/lib/parsers/regexp.ts +++ b/src/lib/parsers/regexp.ts @@ -4,7 +4,7 @@ import { undefined } from "../utils/util.js"; import type { INode } from "../nodes.js"; -const symbolicCharsRegex = /^[^\s<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; +const symbolicCharsRegex = /^[^\ \t\r\f\v\n<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; export function parse_regexp({ text_stream }: TokenStream) { function parse_list() { while (next !== "]") { @@ -26,7 +26,7 @@ export function parse_regexp({ text_stream }: TokenStream) { function parse_group() { while (next !== ")") { if (next == undefined) { - throw "Unterminated regular expression character list."; + throw "Unterminated regular expression group."; } if (next === "\\") { body += next + text_stream.move(); diff --git a/src/lib/predence.ts b/src/lib/predence.ts new file mode 100644 index 0000000..5e7676a --- /dev/null +++ b/src/lib/predence.ts @@ -0,0 +1,63 @@ +import { Nodes } from "./enums.js"; +import { AssignmentOperatorTable } from "./utils/table.js"; +import { frozen } from "./utils/util.js"; + +export const enum Predence { + Null, + Comma, + AssignmentAndYield, + Ternary, + Coalescing, + LiteralLogicalNot, + LogicalOR, + LogicalAND, + Pipeline, + BitwiseOR, + BitwiseXOR, + BitwiseAND, + Equality, + /** > >= < <= in instanceof contains */ + ThanAndIn, + Shift, + AddAndSub, + RemDivAndMul, + Expondentiation, + Range, + PrefixOps, + PostfixIncAndDec, + ArgumentlessNew, + CallsAndMemberAccess, + Grouping, + Highest = 0xffffffff +} + +export const PredenceMap: ReadonlyMap = new Map(); + +const object = frozen({ + [Predence.AssignmentAndYield]: [...Object.values(AssignmentOperatorTable), Nodes.YieldExpression, Nodes.YieldFromExpression], + [Predence.Ternary]: [Nodes.TernaryExpression], + [Predence.Coalescing]: [Nodes.NullishCoalescingExpression], + [Predence.LiteralLogicalNot]: [Nodes.LiteralLogicalNotExpression], + [Predence.LogicalOR]: [Nodes.LogicalORExpression], + [Predence.LogicalAND]: [Nodes.LogicalANDExpression], + [Predence.BitwiseOR]: [Nodes.BitwiseORExpression], + [Predence.BitwiseXOR]: [Nodes.BitwiseXORExpression], + [Predence.BitwiseAND]: [Nodes.BitwiseANDExpression], + [Predence.Equality]: [Nodes.LooseEquality, Nodes.LooseInequality, Nodes.StrictEquality, Nodes.StrictInequality], + [Predence.ThanAndIn]: [Nodes.GreaterThan, Nodes.GreaterThanOrEqual, Nodes.LessThan, Nodes.LessThanOrEqual, Nodes.InExpression, Nodes.InstanceOfExpression, Nodes.ContainsExpression], + [Predence.Shift]: [Nodes.BitwiseLeftShiftExpression, Nodes.BitwiseRightShiftExpression, Nodes.BitwiseUnsignedRightShiftExpression], + [Predence.AddAndSub]: [Nodes.AddictionExpression, Nodes.SubstractionExpression], + [Predence.RemDivAndMul]: [Nodes.RemainderExpression, Nodes.DivisionExpression, Nodes.MultiplicationExpression], + [Predence.Expondentiation]: [Nodes.ExponentiationExpression], + [Predence.Range]: [Nodes.RangeExpression], + [Predence.PrefixOps]: [Nodes.AwaitExpression, Nodes.VoidExpression, Nodes.DeleteExpression, Nodes.TypeOfExpression, Nodes.PrefixIncrementExpression, Nodes.PrefixDecrementExpression, Nodes.PlusExpression, Nodes.NegatationExpression, Nodes.BitwiseRevertExpression, Nodes.LogicalNOTExpresssion], + [Predence.PostfixIncAndDec]: [Nodes.PostfixIncrementExpression, Nodes.PostfixDecrementExpression], + [Predence.ArgumentlessNew]: [Nodes.NewExpression], + [Predence.CallsAndMemberAccess]: [Nodes.MemberAccessExpression, Nodes.CallExpression, Nodes.ArgumentBindingExpression, Nodes.OptionalCallExpression] +} as unknown as Record); + +for (const [predence, values] of Object.entries(object)) { + for (const value of values) { + (PredenceMap as Map).set(value, +predence); + } +} diff --git a/src/lib/utils/advancers.ts b/src/lib/utils/advancers.ts index e83076a..082c56a 100644 --- a/src/lib/utils/advancers.ts +++ b/src/lib/utils/advancers.ts @@ -1,4 +1,4 @@ -import { except_token } from "./util.js"; +import { assert_token } from "./util.js"; import type { Tokens } from "../enums"; import type { TokenStream } from "./stream.js"; @@ -10,6 +10,6 @@ export function advance_next

(stream: TokenStream, end: string, } export declare type Prefix

= string extends P ? string : P extends `${ infer S }${ string } ${ "statment" | "expression" }:` ? S extends Uppercase ? P : never: never; -export function except_next_token

(stream: TokenStream, token_type: Tokens, token_string?: string, prefix?: Prefix

, end = token_string, rest = "") { - return except_token(advance_next(stream, end!, prefix), token_type, token_string, rest); +export function assert_next_token

(stream: TokenStream, token_type: Tokens, token_string?: string, prefix?: Prefix

, end = token_string, rest = "") { + return assert_token(advance_next(stream, end!, prefix), token_type, token_string, rest); } diff --git a/src/lib/utils/comparer.ts b/src/lib/utils/comparer.ts new file mode 100644 index 0000000..3ef3935 --- /dev/null +++ b/src/lib/utils/comparer.ts @@ -0,0 +1,66 @@ +import { $validIDs } from "./valid-id.js"; + + +const s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +export interface MultiValueComparer { + includes(value: unknown): value is T; + [Symbol.iterator](): IterableIterator; +} + +interface MultiValueComparerConstructor { + readonly prototype: MultiValueComparer; + new >(values: T): MultiValueComparer : T extends Iterable ? P : never>; +} + +class $MultiValueComparer { + protected readonly values: Map; + public constructor(values: Iterable | string) { + this.values = new Map([...values].map(x => [x as T, true])); + } + public includes(value: any): value is T { + return this.values.has(value); + } + public [Symbol.iterator]() { + return this.values.keys(); + } +} + +export const MultiValueComparer = $MultiValueComparer as MultiValueComparerConstructor; + +export class ValidCharsComparer extends $MultiValueComparer { + private validIDs = $validIDs; + public constructor() { + super(`$0123456789_${ s }${ s.toLowerCase() }`); + this.validIDs.splice(0, 6); + this.init("\uffd7"); + } + public init(toChar: string) { + const id = toChar.codePointAt(0)!; + let deleteCount = 0; + for (const element of this.validIDs) { + if (element.length === 2) { + let [start, end] = element; + if (end > id) { + for (; start <= id;) this.values.set(String.fromCodePoint(start++), true); + this.validIDs.splice(0, deleteCount); + element[0] = start; + return; + } else { + for (; start < end;) this.values.set(String.fromCodePoint(start++), true); + } + } else { + this.values.set(String.fromCodePoint(element[0]), true); + } + deleteCount++; + } + } + /** + * This method is considered safe because it continues initialization of this comparer and re-compares again if char is not in the values map + */ + public safeIncludes(x: string) { + return this.values.has(x) || (this.init(x), this.values.has(x)); + } +} + +type $PopulateString = S extends `${ infer C }${ infer R }` ? $PopulateString : Cache; +export type PopulateString = S extends `${ infer C }${ infer R }` ? $PopulateString : S; diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts index acf4bad..42a686e 100644 --- a/src/lib/utils/constants.ts +++ b/src/lib/utils/constants.ts @@ -4,7 +4,7 @@ import { _echo } from "./_echo.js"; export const memberAccessOperators = [".", "?.", "!.", "!.[", "?.[", "["] as const; export const end_expression = "expression"; export const js_auto_variables = ["__external_var", "this", "arguments", "null", "NaN", "undefined", "Infinity", "true", "false"] as const; -export const keywords: readonly string[] = _echo("do|if|in|for|new|try|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|arguments|interface|protected|implements|instanceof|include|fn|async|await|undefined|or|and|not|contains|__external|__external_var|nonlocal|keep|using|macro").split("|"); +export const keywords = ["do", "fn", "if", "in", "or", "and", "for", "new", "not", "try", "case", "else", "enum", "eval", "keep", "null", "this", "true", "void", "with", "async", "await", "break", "catch", "class", "const", "false", "macro", "super", "throw", "using", "while", "delete", "yield", "export", "extern", "import", "public", "return", "static", "switch", "typeof", "default", "extends", "finally", "include", "package", "private", "continue", "contains", "debugger", "arguments", "nonlocal", "interface", "__external", "protected", "implements", "instanceof", "undefined", "__external_var"] as const; export const validChars = (function () { try { return Function("return/(?!\\d)[$_\\u200C\\u200D\\p{ID_Continue}]+/yu")() as RegExp; diff --git a/src/lib/utils/diagnostics.ts b/src/lib/utils/diagnostics.ts index 89a1364..198110d 100644 --- a/src/lib/utils/diagnostics.ts +++ b/src/lib/utils/diagnostics.ts @@ -3,5 +3,5 @@ import type { DiagnosticSeverity } from "../enums"; export interface IDiagnostic { readonly severity: DiagnosticSeverity; - readonly message: string; + readonly message: unknown; } \ No newline at end of file diff --git a/src/lib/utils/scope.ts b/src/lib/utils/scope.ts new file mode 100644 index 0000000..ea1bf20 --- /dev/null +++ b/src/lib/utils/scope.ts @@ -0,0 +1,21 @@ +import { Node } from "../nodes.js"; + + +export class Scope { + public readonly variables = new Map(); + public readonly nonlocals: Global extends true ? undefined : Map = new Map() as never; + public readonly globals: Global extends true ? undefined : Map = new Map() as never; + public readonly externs: Global extends true ? Map : undefined = new Map() as never; + + public constructor(public readonly func: Global extends true ? undefined : Node) { } + addVariable(variable: string) { + this.nonlocals?.has(variable) || this.externs?.has(variable) || this.variables.set(variable, undefined!); + } + viewVariables() { + return this.variables.keys(); + } + [Symbol.iterator]() { return this.variables.keys(); } + viewExternals() { + return this.externs?.keys(); + } +} diff --git a/src/lib/utils/stream.ts b/src/lib/utils/stream.ts index 4fbcea1..65bf14b 100644 --- a/src/lib/utils/stream.ts +++ b/src/lib/utils/stream.ts @@ -18,11 +18,12 @@ export interface TokenStream { confirm_try(): void; cancel_try(): void; readonly text_stream: TextStream; - [Symbol.iterator]?(): Iterator; + [Symbol.iterator](): Generator; }; export class Token { constructor(public readonly type: Tokens, public readonly body: string) { } } +/**@deprecated */ export type TokenList = readonly Token[]; export class Stream implements TextStream { diff --git a/src/lib/utils/table.ts b/src/lib/utils/table.ts index 1ee6919..6b325ee 100644 --- a/src/lib/utils/table.ts +++ b/src/lib/utils/table.ts @@ -28,10 +28,10 @@ export const CommonOperatorTable = { ">=": Nodes.GreaterThanOrEqual, "<": Nodes.LessThan, "<=": Nodes.LessThanOrEqual, - "==": Nodes.LooseComparison, - "===": Nodes.StrictComparison, - "!=": Nodes.LooseNegativeComparison, - "!==": Nodes.StrictNegativeComparison + "==": Nodes.LooseEquality, + "===": Nodes.StrictEquality, + "!=": Nodes.LooseInequality, + "!==": Nodes.StrictInequality } as const; export var AssignmentOperatorTable = { "=": Nodes.AssignmentExpression, @@ -50,5 +50,5 @@ export var AssignmentOperatorTable = { "<<=": Nodes.BitwiseLeftShiftAssignmentExpression, ">>=": Nodes.BitwiseRightShiftAssignmentExpression, ">>>=": Nodes.BitwiseUnsignedRightShiftAssignmentExpression -} +} as const; diff --git a/src/lib/utils/util.ts b/src/lib/utils/util.ts index d16d418..bf5d7ca 100644 --- a/src/lib/utils/util.ts +++ b/src/lib/utils/util.ts @@ -2,19 +2,14 @@ import { js_auto_variables } from "./constants.js"; import { Nodes, Tokens } from "../enums"; import type { Token } from "./stream.js"; import type { INode } from "../nodes"; +import { MultiValueComparer } from "./comparer.js"; -export type CallFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, ...args: Parameters) => ReturnType; -export type ApplyFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, args: Parameters | IArguments) => ReturnType; -export type BindFunctionType = void>(func: T, thisArg: ThisParameterType | undefined, ...args: Parameters | undefined[]) => T; -const __call = nullish.call; -export const bind = __call.bind(nullish.bind) as BindFunctionType; -export const call = bind(__call, __call as any) as CallFunctionType; -export const apply = bind(__call, nullish.apply as any) as ApplyFunctionType; -export type ArrayValueType = { + +export type ArrayValueType = { [key in Exclude]: T[key]; } extends { [key: string]: infer V; } ? V : never; -export function includes(array: A, value: unknown): - value is A extends string ? string : any[] extends A ? boolean : ArrayValueType> { +export function includes(array: A, value: unknown): + value is A extends string ? string : unknown[] extends A ? boolean : ArrayValueType> { return ~array.indexOf(value as never) as never; } export function nullish(arg: unknown): arg is null | undefined { @@ -29,9 +24,10 @@ export function resetCounter() { __counter__ = 0; } export function assert_type(value: unknown): asserts value is T { } -export const isArray: (arg: any) => arg is T[] = Array.isArray || function (value) { +export const isArray: (arg: unknown) => arg is T[] = Array.isArray || function (value) { return value instanceof Array; }; +export const frozen: (object: T) => Readonly = object => Object.freeze(Object.setPrototypeOf(object, null)); interface CacheEntry { code: string; mtime: number; @@ -87,11 +83,12 @@ export function include(path: URL, cache = true): string | Promise { throw "Unsupported protocol '" + protocol + "'!"; }; } +const autoVariablesComparer = new MultiValueComparer(js_auto_variables); export function inspectLog(shit: any) { console.log(typeof require === "function" ? require("util").inspect(shit, !0, 1 / 0, !0) : shit); } export function isSymbol(next: Token) { - return next.type === Tokens.Symbol || next.type === Tokens.Keyword && includes(js_auto_variables, next.body); + return next.type === Tokens.Symbol || next.type === Tokens.Keyword && autoVariablesComparer.includes(next.body); } export function remove_trailing_undefined(values: INode[]) { @@ -102,7 +99,7 @@ export function error_unexcepted_token(next: Token, rest = ""): never { assert(0, `Unexcepted token '${ next.body }'${ rest }`); } -export function except_token(next: Token, token_type: Tokens, token_string?: string, rest = "") { +export function assert_token(next: Token, token_type: Tokens, token_string?: string, rest = "") { if (((next.type & token_type) !== 0) && next.body !== token_string && token_string !== undefined) error_unexcepted_token(next, rest); return next; } @@ -119,6 +116,7 @@ export function assert(condition: unknown, message: string | { [Symbol.toPrimiti * Checks if expression is an abrupt node ([Node]) and * returns abrupt node with body with abrupted expression * else returns node with body equal to passed expression + * @deprecated */ export function abruptify(node: INode, expression: INode | [INode]): INode { return node; diff --git a/src/lib/utils/valid-id.ts b/src/lib/utils/valid-id.ts new file mode 100644 index 0000000..e5cfc1b --- /dev/null +++ b/src/lib/utils/valid-id.ts @@ -0,0 +1,2 @@ +export const $validIDs: ([number] | [number, number])[] = [[36], [48, 57], [65, 90], [95], [97, 122], [170], [181], [186], [192, 214], [216, 246], [248, 705], [710, 721], [736, 740], [748], [750], [768, 879], [880, 884], [886], [887], [890, 893], [902], [904, 906], [908], [910, 929], [931, 1013], [1015, 1153], [1155, 1159], [1162, 1319], [1329, 1366], [1369], [1377, 1415], [1425, 1469], [1471], [1473], [1474], [1476], [1477], [1479], [1488, 1514], [1520, 1522], [1552, 1562], [1568, 1610], [1611, 1641], [1646], [1647], [1648], [1649, 1747], [1749], [1750, 1756], [1759, 1764], [1765], [1766], [1767], [1768], [1770, 1773], [1774], [1775], [1776, 1785], [1786, 1788], [1791], [1808], [1809], [1810, 1839], [1840, 1866], [1869, 1957], [1958, 1968], [1969], [1984, 1993], [1994, 2026], [2027, 2035], [2036], [2037], [2042], [2048, 2069], [2070, 2073], [2074], [2075, 2083], [2084], [2085, 2087], [2088], [2089, 2093], [2112, 2136], [2137, 2139], [2208], [2210, 2220], [2276, 2302], [2304, 2307], [2308, 2361], [2362, 2364], [2365], [2366, 2383], [2384], [2385, 2391], [2392, 2401], [2402], [2403], [2406, 2415], [2417, 2423], [2425, 2431], [2433, 2435], [2437, 2444], [2447], [2448], [2451, 2472], [2474, 2480], [2482], [2486, 2489], [2492], [2493], [2494, 2500], [2503], [2504], [2507, 2509], [2510], [2519], [2524], [2525], [2527, 2529], [2530], [2531], [2534, 2543], [2544], [2545], [2561, 2563], [2565, 2570], [2575], [2576], [2579, 2600], [2602, 2608], [2610], [2611], [2613], [2614], [2616], [2617], [2620], [2622, 2626], [2631], [2632], [2635, 2637], [2641], [2649, 2652], [2654], [2662, 2673], [2674, 2676], [2677], [2689, 2691], [2693, 2701], [2703, 2705], [2707, 2728], [2730, 2736], [2738], [2739], [2741, 2745], [2748], [2749], [2750, 2757], [2759, 2761], [2763, 2765], [2768], [2784], [2785], [2786], [2787], [2790, 2799], [2817, 2819], [2821, 2828], [2831], [2832], [2835, 2856], [2858, 2864], [2866], [2867], [2869, 2873], [2876], [2877], [2878, 2884], [2887], [2888], [2891, 2893], [2902], [2903], [2908], [2909], [2911, 2913], [2914], [2915], [2918, 2927], [2929], [2946], [2947], [2949, 2954], [2958, 2960], [2962, 2965], [2969], [2970], [2972], [2974], [2975], [2979], [2980], [2984, 2986], [2990, 3001], [3006, 3010], [3014, 3016], [3018, 3021], [3024], [3031], [3046, 3055], [3073, 3075], [3077, 3084], [3086, 3088], [3090, 3112], [3114, 3123], [3125, 3129], [3133], [3134, 3140], [3142, 3144], [3146, 3149], [3157], [3158], [3160], [3161], [3168], [3169], [3170], [3171], [3174, 3183], [3202], [3203], [3205, 3212], [3214, 3216], [3218, 3240], [3242, 3251], [3253, 3257], [3260], [3261], [3262, 3268], [3270, 3272], [3274, 3277], [3285], [3286], [3294], [3296], [3297], [3298], [3299], [3302, 3311], [3313], [3314], [3330], [3331], [3333, 3340], [3342, 3344], [3346, 3386], [3389], [3390, 3396], [3398, 3400], [3402, 3405], [3406], [3415], [3424], [3425], [3426], [3427], [3430, 3439], [3450, 3455], [3458], [3459], [3461, 3478], [3482, 3505], [3507, 3515], [3517], [3520, 3526], [3530], [3535, 3540], [3542], [3544, 3551], [3570], [3571], [3585, 3632], [3633], [3634], [3635], [3636, 3642], [3648, 3654], [3655, 3662], [3664, 3673], [3713], [3714], [3716], [3719], [3720], [3722], [3725], [3732, 3735], [3737, 3743], [3745, 3747], [3749], [3751], [3754], [3755], [3757, 3760], [3761], [3762], [3763], [3764, 3769], [3771], [3772], [3773], [3776, 3780], [3782], [3784, 3789], [3792, 3801], [3804, 3807], [3840], [3864], [3865], [3872, 3881], [3893], [3895], [3897], [3902], [3903], [3904, 3911], [3913, 3948], [3953, 3972], [3974], [3975], [3976, 3980], [3981, 3991], [3993, 4028], [4038], [4096, 4138], [4139, 4158], [4159], [4160, 4169], [4176, 4181], [4182, 4185], [4186, 4189], [4190, 4192], [4193], [4194, 4196], [4197], [4198], [4199, 4205], [4206, 4208], [4209, 4212], [4213, 4225], [4226, 4237], [4238], [4239, 4253], [4256, 4293], [4295], [4301], [4304, 4346], [4348, 4680], [4682, 4685], [4688, 4694], [4696], [4698, 4701], [4704, 4744], [4746, 4749], [4752, 4784], [4786, 4789], [4792, 4798], [4800], [4802, 4805], [4808, 4822], [4824, 4880], [4882, 4885], [4888, 4954], [4957, 4959], [4992, 5007], [5024, 5108], [5121, 5740], [5743, 5759], [5761, 5786], [5792, 5866], [5870, 5872], [5888, 5900], [5902, 5905], [5906, 5908], [5920, 5937], [5938, 5940], [5952, 5969], [5970], [5971], [5984, 5996], [5998, 6000], [6002], [6003], [6016, 6067], [6068, 6099], [6103], [6108], [6109], [6112, 6121], [6155, 6157], [6160, 6169], [6176, 6263], [6272, 6312], [6313], [6314], [6320, 6389], [6400, 6428], [6432, 6443], [6448, 6459], [6470, 6479], [6480, 6509], [6512, 6516], [6528, 6571], [6576, 6592], [6593, 6599], [6600], [6601], [6608, 6617], [6656, 6678], [6679, 6683], [6688, 6740], [6741, 6750], [6752, 6780], [6783, 6793], [6800, 6809], [6823], [6912, 6916], [6917, 6963], [6964, 6980], [6981, 6987], [6992, 7001], [7019, 7027], [7040, 7042], [7043, 7072], [7073, 7085], [7086], [7087], [7088, 7097], [7098, 7141], [7142, 7155], [7168, 7203], [7204, 7223], [7232, 7241], [7245, 7247], [7248, 7257], [7258, 7293], [7376, 7378], [7380, 7400], [7401, 7404], [7405], [7406, 7409], [7410, 7412], [7413], [7414], [7424, 7615], [7616, 7654], [7676, 7679], [7680, 7957], [7960, 7965], [7968, 8005], [8008, 8013], [8016, 8023], [8025], [8027], [8029], [8031, 8061], [8064, 8116], [8118, 8124], [8126], [8130, 8132], [8134, 8140], [8144, 8147], [8150, 8155], [8160, 8172], [8178, 8180], [8182, 8188], [8204], [8205], [8255], [8256], [8276], [8305], [8319], [8336, 8348], [8400, 8412], [8417], [8421, 8432], [8450], [8455], [8458, 8467], [8469], [8473, 8477], [8484], [8486], [8488], [8490, 8493], [8495, 8505], [8508, 8511], [8517, 8521], [8526], [8544, 8584], [11264, 11310], [11312, 11358], [11360, 11492], [11499, 11502], [11503, 11505], [11506], [11507], [11520, 11557], [11559], [11565], [11568, 11623], [11631], [11647], [11648, 11670], [11680, 11686], [11688, 11694], [11696, 11702], [11704, 11710], [11712, 11718], [11720, 11726], [11728, 11734], [11736, 11742], [11744, 11775], [11823], [12293, 12295], [12321, 12329], [12330, 12335], [12337, 12341], [12344, 12348], [12353, 12438], [12441], [12442], [12445, 12447], [12449, 12538], [12540, 12543], [12549, 12589], [12593, 12686], [12704, 12730], [12784, 12799], [13312, 19893], [19968, 40908], [40960, 42124], [42192, 42237], [42240, 42508], [42512, 42527], [42528, 42537], [42538], [42539], [42560, 42606], [42607], [42612, 42621], [42623, 42647], [42655], [42656, 42735], [42736], [42737], [42775, 42783], [42786, 42888], [42891, 42894], [42896, 42899], [42912, 42922], [43000, 43009], [43010], [43011, 43013], [43014], [43015, 43018], [43019], [43020, 43042], [43043, 43047], [43072, 43123], [43136], [43137], [43138, 43187], [43188, 43204], [43216, 43225], [43232, 43249], [43250, 43255], [43259], [43264, 43273], [43274, 43301], [43302, 43309], [43312, 43334], [43335, 43347], [43360, 43388], [43392, 43395], [43396, 43442], [43443, 43456], [43471], [43472, 43481], [43520, 43560], [43561, 43574], [43584, 43586], [43587], [43588, 43595], [43596], [43597], [43600, 43609], [43616, 43638], [43642], [43643], [43648, 43695], [43696], [43697], [43698, 43700], [43701], [43702], [43703], [43704], [43705, 43709], [43710], [43711], [43712], [43713], [43714], [43739, 43741], [43744, 43754], [43755, 43759], [43762, 43764], [43765], [43766], [43777, 43782], [43785, 43790], [43793, 43798], [43808, 43814], [43816, 43822], [43968, 44002], [44003, 44010], [44012], [44013], [44016, 44025], [44032, 55203], [55216, 55238], [55243, 55291], [63744, 64109], [64112, 64217], [64256, 64262], [64275, 64279], [64285], [64286], [64287, 64296], [64298, 64310], [64312, 64316], [64318], [64320], [64321], [64323], [64324], [64326, 64433], [64467, 64829], [64848, 64911], [64914, 64967], [65008, 65019], [65024, 65039], [65056, 65062], [65075], [65076], [65101, 65103], [65136, 65140], [65142, 65276], [65296, 65305], [65313, 65338], [65343], [65345, 65370], [65382, 65470], [65474, 65479], [65482, 65487], [65490, 65495]]; +export const $initialValidIDs: [number, number?][] = [[36], [48, 57], [65, 90], [95], [97, 122]]; diff --git a/src/lib/wrapper.ts b/src/lib/wrapper.ts index b3b3f6c..3b3be33 100644 --- a/src/lib/wrapper.ts +++ b/src/lib/wrapper.ts @@ -1,3 +1,5 @@ +import type { KnownUsed } from "./parser.js"; + const __async = `function __async(f,t,a){` + `return new p(r=>{` + `var g=__apply(f,t,a),n=g.next,` + @@ -17,7 +19,7 @@ const __contains = `function __contains(i,v){` + // i = iterable, v = value `return!1}`; const __throw = "function __throw(e){throw e}"; -export function wrap(code: string, used: Readonly>) { +export function wrap(code: string, used: Readonly) { return `(function(p,u){var c=n.call,__bind=c.bind(n.bind),` + `pr=__bind(p.resolve,p),__call=__bind(c,c),__apply=__bind(c,n.apply);` + `${ __nullish }${ __async }${ used.contains ? __contains : "" }${ used.na ? __null_assert : "" }${ used.throw ? diff --git a/tsconfig.json b/tsconfig.json index 4cd4cd3..969c709 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "esnext", - "lib": ["dom", "dom.iterable"], + "target": "es6", + "lib": ["dom", "dom.iterable", "es6"], "module": "esnext", "importsNotUsedAsValues": "remove", "moduleResolution": "node", @@ -11,7 +11,6 @@ "strict": true, "rootDir": "src", "outDir": "./build", - "skipDefaultLibCheck": true, "sourceMap": true, "composite": true, "tsBuildInfoFile": ".tsbuildinfo", From 35ac0f3e0da186e937429fe6c2e88d2cfbac0bca Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 7 Jan 2022 18:22:24 +0300 Subject: [PATCH 05/14] uncomment shebang --- samples/index.tsk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/index.tsk b/samples/index.tsk index 46bbdff..d9f4821 100644 --- a/samples/index.tsk +++ b/samples/index.tsk @@ -1,4 +1,4 @@ -// #!/usr/bin/env -S tskc --pretty --out=../build +#!/usr/bin/env -S tskc --pretty --out=../build "use strict"; // Include statment includes code from specified file // include "./example-module.tsk"; From 9c02ea1a9f053b8c72fab5c44d590ebef9e77126 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 7 Jan 2022 18:27:06 +0300 Subject: [PATCH 06/14] cache operator tokens --- src/lib/lexer.ts | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index 28ff7c5..9d95bcc 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -14,6 +14,8 @@ const $3charOperatorComparer = new MultiValueComparer($3charoperators); const keywordComparer = new MultiValueComparer(keywords); const validAfterNumberChars = new MultiValueComparer([...whitespaceCharsComparer, ...operatorCharsComparer, "'" as const, '"' as const]); const validIDComparer = new ValidCharsComparer(); +const operatorTokenMap = new Map([...operatorCharsComparer, ...$2charoperators, ...$3charoperators, ">>>=" as const] + .map(operator => [operator, new Token(Tokens.Operator, operator)])); @@ -57,31 +59,28 @@ class Lexer implements TokenStream { if (nullish(char)) { return char; } else if (operatorCharsComparer.includes(char)) { - var _char = this.text_stream.move(); - var joined = char + _char; + const _char = this.text_stream.move(); + const joined = char + _char; if ($2charOperatorComparer.includes(joined)) { - var __char = this.text_stream.move(); - var _joined = joined + __char; + const __char = this.text_stream.move(); + const _joined = joined + __char; if ($3charOperatorComparer.includes(_joined)) { - var ___char = this.text_stream.move(); - var __joined = _joined + ___char; + const ___char = this.text_stream.move(); + const __joined = _joined + ___char; if (">>>=" === __joined) { - return new Token(Tokens.Operator, __joined); + return operatorTokenMap.get(__joined)!; } else { - this.text_stream.down(1); - return new Token(Tokens.Operator, _joined); + return this.text_stream.down(1), operatorTokenMap.get(_joined)!; } } else if (joined === "//") { return this._scanComment(), this._lex(this.text_stream.move()); } else if (joined === "/*") { return this._scanMultiineComment(__char), this._lex(this.text_stream.move()); } else { - this.text_stream.down(1); - return new Token(Tokens.Operator, joined); + return this.text_stream.down(1), operatorTokenMap.get(joined)!; } } else { - this.text_stream.down(1); - return new Token(Tokens.Operator, char); + return this.text_stream.down(1), operatorTokenMap.get(char)!; } } else if (whitespaceCharsComparer.includes(char)) { return this._scanWhitespace(), this._lex(this.text_stream.move()); From f7071b1edbaefcb9c0b7982abc7c4c869d8be30e Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 7 Jan 2022 19:29:59 +0300 Subject: [PATCH 07/14] Fix ?.() not emitting --- samples/index.tsk | 1 + src/lib/emitter.ts | 25 +++++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/samples/index.tsk b/samples/index.tsk index d9f4821..7daab98 100644 --- a/samples/index.tsk +++ b/samples/index.tsk @@ -198,6 +198,7 @@ for range (0 to 5 as i) { } if (1) {} else 0xff; ((fn () => fn () {})()()?.p); +null?.(11111); // 0 or 1; // / /; //;~; diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index 01ed0b9..876b745 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -53,7 +53,7 @@ function isSimple(node: INode) { Nodes.NaNValue, Nodes.NullValue, Nodes.NumberValue, - Nodes.RangeExpression, + // Nodes.RangeExpression, Nodes.StringValue, Nodes.Symbol, Nodes.SymbolNoPrefix, @@ -461,11 +461,32 @@ function _emit(node: INode, meta: EmitterOptions) { break; case Nodes.CallExpression: - assert_type(body); + assert_type<[Node]>(body); __text += _emit(body[0], meta); emitCallExpression(); break; + case Nodes.OptionalCallExpression: { + assert_type<[Node]>(body); + const random_name = declare(random_var_name()); + __text += `(n(${ random_name }`; + sp(); + __text += "="; + sp(); + __text += `${ _emit(body[0], meta) })`; + sp() + __text += "?"; + sp(); + __text += "u"; + sp(); + __text += ":"; + sp(); + __text += random_name; + emitCallExpression(); + __text += ")"; + break; + } + case Nodes.GroupExpression: assert_type(body); __text += `(${ body.map(node => _emit(as_expression(node), meta)).join(commaAndWhitespace) })`; From 94dc80091d4d54dfcc7e96a1a385b6b8cb48570d Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 15:42:30 +0300 Subject: [PATCH 08/14] commit --- rollup.config.mjs | 4 +- server.mjs | 20 +- src/lib/compiler.ts | 87 ++++---- src/lib/emitter.ts | 311 ++++++++++++--------------- src/lib/enums.ts | 7 +- src/lib/lexer.ts | 31 +-- src/lib/nodes.ts | 36 +++- src/lib/parser.ts | 188 +++++++--------- src/lib/parsers/array-expression.ts | 16 +- src/lib/parsers/body-parser.ts | 13 +- src/lib/parsers/call-expression.ts | 42 ++-- src/lib/parsers/group-expression.ts | 8 +- src/lib/parsers/keywords.ts | 121 +++++------ src/lib/parsers/member-access.ts | 20 +- src/lib/parsers/object-expression.ts | 2 +- src/lib/parsers/regexp.ts | 11 +- src/lib/utils/advancers.ts | 8 +- src/lib/utils/comparer.ts | 20 +- src/lib/utils/constants.ts | 12 +- src/lib/utils/occurrences.ts | 13 +- src/lib/utils/scope.ts | 3 +- src/lib/utils/stream.ts | 13 +- src/lib/utils/table.ts | 4 +- src/lib/utils/util.ts | 29 ++- src/lib/utils/valid-chars.ts | 1 - src/lib/utils/valid-id.ts | 1 - src/lib/utils/variable-namer.ts | 24 --- src/lib/wrapper.ts | 11 +- tsconfig.json | 3 +- 29 files changed, 468 insertions(+), 591 deletions(-) delete mode 100644 src/lib/utils/valid-chars.ts delete mode 100644 src/lib/utils/variable-namer.ts diff --git a/rollup.config.mjs b/rollup.config.mjs index b97e09f..949b50f 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -2,7 +2,7 @@ import typescript from 'rollup-plugin-typescript2'; import { terser } from 'rollup-plugin-terser'; -const plugin_terser = terser({ format: { comments: false }, mangle: true, compress: true }); +const plugin_terser = terser({ format: { comments: false }, mangle: { toplevel: true, module: true }, compress: { passes: 4, unsafe_undefined: true } }); export default { onwarn(warning) { if (warning.code !== 'CIRCULAR_DEPENDENCY') { @@ -40,7 +40,7 @@ export default { file: './build/bundle.min.mjs', format: 'esm', sourcemap: true, - plugins: [plugin_terser], + plugins: [plugin_terser] }, { file: './build/bundle.min.cjs', exports: "named", diff --git a/server.mjs b/server.mjs index f0ba959..d1c31d5 100644 --- a/server.mjs +++ b/server.mjs @@ -88,7 +88,7 @@ createSecureServer({ key: await readFile(new URL(await import.meta.resolve("./server.key"))) }, (req, res) => { const { httpVersion } = req; - if (httpVersion !== '2.0') { + if (httpVersion !== "2.0") { return http1RequestProcessor(req, res); } }).on("stream", async (stream, headers) => { @@ -162,11 +162,11 @@ async function readSaved(handle, path) { read = buffer; } headers = { - ':status': 200, + ":status": 200, "access-control-allow-origin": "*", - 'content-type': uncompressable_files[ext], - 'content-length': `${stats.size}`, - 'content-security-policy': CSPPolicy + "content-type": uncompressable_files[ext], + "content-length": `${stats.size}`, + "content-security-policy": CSPPolicy }; } else { const { mtime, buffer } = $cache3[path] ?? {}; @@ -179,12 +179,12 @@ async function readSaved(handle, path) { read = buffer; } headers = { - ':status': 200, + ":status": 200, "access-control-allow-origin": "*", - 'content-type': `${content_type_for_ext[ext] ?? 'text/plain'}; charset=utf-8`, - 'content-length': `${stats.size}`, - 'content-encoding': 'br', - 'content-security-policy': CSPPolicy + "content-type": `${content_type_for_ext[ext] ?? "text/plain"}; charset=utf-8`, + "content-length": `${stats.size}`, + "content-encoding": "br", + "content-security-policy": CSPPolicy }; } return { read, headers }; diff --git a/src/lib/compiler.ts b/src/lib/compiler.ts index 17d2f33..90d26d7 100644 --- a/src/lib/compiler.ts +++ b/src/lib/compiler.ts @@ -7,6 +7,47 @@ import { wrap } from "./wrapper.js"; import { lex } from "./lexer.js"; +const $ = ` +[Lyrics for Nightcore - Seventh Day (Besomorph & Coopex), The music of my soul] +[https://www.youtube.com/watch?v=ppMksUwC7Sg] + +God won't take me to heaven +Blood on my knees when i'm begging +Why? I didn't mean to start a war + +Wanna be strong but i'm broken +Try to breathe but i'm choking +I'm in a million pieces on the floor + +I'm making friends with my demons +They understand what i'm needing +I just wanna feel something +I wish i was dreaming + +I'm making friends with my demons +I try to run but i need them +I just wanna feel something +I wish i was dreaming + +I got used to the taste of +Poison on my tongue, what a waste of +Time, give me pill for paradise + +I'm making friends with my demons +They understand what i'm needing +I just wanna feel something +I wish i was dreaming + +I'm not afraid of the darkness +It's all around me regardless +I'm tired of feeling nothing +Why am i so heartless? + +Tell these white lies, see how i hide +Sticks and stones they break all my bones +Tell these white lies, see how i hide +Sticks and stones they break all my bones +` export interface CompilerOutput { readonly diagnostics: readonly IDiagnostic[]; readonly output: string; @@ -24,47 +65,7 @@ export interface CompilerOptions { * @returns {import("./compiler").CompilerOutput | Promise} js code & diagnostic messages */ export function compileCode(code: string, opts: CompilerOptions): CompilerOutput | Promise { - if (/seventh[- ]day/i.test(code)) return { diagnostics: [], output: ` - [Lyrics for Nightcore - Seventh Day (Besomorph & Coopex), The music of my soul] - [https://www.youtube.com/watch?v=ppMksUwC7Sg] - - God won't take me to heaven - Blood on my knees when i'm begging - Why? I didn't mean to start a war - - Wanna be strong but i'm broken - Try to breathe but i'm choking - I'm in a million pieces on the floor - - I'm making friends with my demons - They understand what i'm needing - I just wanna feel something - I wish i was dreaming - - I'm making friends with my demons - I try to run but i need them - I just wanna feel something - I wish i was dreaming - - I got used to the taste of - Poison on my tongue, what a waste of - Time, give me pill for paradise - - I'm making friends with my demons - They understand what i'm needing - I just wanna feel something - I wish i was dreaming - - I'm not afraid of the darkness - It's all around me regardless - I'm tired of feeling nothing - Why am i so heartless? - - Tell these white lies, see how i hide - Sticks and stones they break all my bones - Tell these white lies, see how i hide - Sticks and stones they break all my bones - `.replace(/\n +/, "\n") }; + if (/seventh[- ]day/i.test(code)) return { diagnostics: [], output: $.trim() }; var parsed = parse(lex(code), opts.url!, opts.cache ?? true); /**@param {import("../parser").ParserOutput} parsed */ function _({ diagnostics, __used, output }: ParserOutput) { @@ -100,8 +101,8 @@ export { parse } from "./parser.js"; export * from "./wrapper.js"; export * from "./emitter.js"; export type { - ParserOutput, - SyntaxTree + ParserOutput, + KnownUsed } from "./parser"; export type { AccessChainItem, diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index 876b745..94a6b04 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -1,66 +1,67 @@ import { AccessChainItemKind, Nodes, NodeType, ParameterNodeKind } from "./enums"; import { occurrences } from "./utils/occurrences.js"; -import { assert_type, includes, random_var_name, undefined } from "./utils/util.js"; +import { assert_type, random_var_name, should_not_happen, undefined } from "./utils/util.js"; import { _echo } from "./utils/_echo.js"; -import { AccessChainItem, ConstantValueNode, IfStatmentMeta, IfStatmentNode, Node, ParameterNode, PrefixlessSymbolNode, TryStatmentMeta, TryStatmentNode } from "./nodes"; +import { AccessChainItem, ConstantValueNode, ExpressionWithBodyAndArgsNode, ExpressionWithBodyAndSymbolNode, ExpressionWithBodyNode, IfStatmentMeta, IfStatmentNode, Node, ParameterNode, PrefixlessSymbolNode, TryStatmentMeta, TryStatmentNode } from "./nodes.js"; +import { MultiValueComparer } from "./utils/comparer.js"; import type { IClassNode, INode } from "./nodes"; +const block_node_comparer = new MultiValueComparer([ + Nodes.FunctionExpression, + Nodes.AsyncFunctionExpression, + Nodes.GeneratorFunctionExpression, + Nodes.AsyncGeneratorFunctionExpression, + Nodes.IncludeStatment, + Nodes.KeepStatment, + Nodes.CodeBlock, + Nodes.TryStatment, + Nodes.IfStatment +] as const); +const simple_node_comparer = new MultiValueComparer([ + Nodes.Array, + Nodes.ArgumentBindingExpression, + Nodes.AsyncFunctionExpression, + Nodes.AsyncGeneratorFunctionExpression, + Nodes.BigIntValue, + // Nodes.CallExpression, + Nodes.MemberAccessExpression, + Nodes.FalseValue, + Nodes.TrueValue, + Nodes.InfinityValue, + Nodes.NaNValue, + Nodes.NullValue, + Nodes.NumberValue, + // Nodes.RangeExpression, + Nodes.StringValue, + Nodes.Symbol, + Nodes.SymbolNoPrefix, + Nodes.UndefinedValue, + Nodes.ArgumentsObject, + Nodes.ExternalVariable +] as const); var __pretty = true; var commaAndWhitespace: string; function as_expression(exp: INode): INode { if (exp.type === NodeType.Expression) { return exp; } else { - return { - name: Nodes.CallExpression, + return ExpressionWithBodyAndArgsNode(Nodes.CallExpression, [{ + name: exp.outerBody?.name ?? Nodes.FunctionExpression, type: NodeType.Expression, - body: [{ - name: exp.outerBody?.name ?? Nodes.FunctionExpression, - type: NodeType.Expression, - body: [exp], - params: [] - }], - args: [] - }; + body: [exp], + params: [] + } as never], []); } } function isBlockNode(node: INode) { - return includes([ - Nodes.FunctionExpression, - Nodes.AsyncFunctionExpression, - Nodes.GeneratorFunctionExpression, - Nodes.AsyncGeneratorFunctionExpression, - Nodes.IncludeStatment, - Nodes.KeepStatment, - Nodes.CodeBlock, - Nodes.TryStatment, - Nodes.IfStatment - ] as const, node.name); + return block_node_comparer.includes(node.name); } function isSimple(node: INode) { - return includes([ - Nodes.Array, - Nodes.ArgumentBindingExpression, - Nodes.AsyncFunctionExpression, - Nodes.AsyncGeneratorFunctionExpression, - Nodes.BigIntValue, - // Nodes.CallExpression, - Nodes.MemberAccessExpression, - Nodes.FalseValue, - Nodes.TrueValue, - Nodes.InfinityValue, - Nodes.NaNValue, - Nodes.NullValue, - Nodes.NumberValue, - // Nodes.RangeExpression, - Nodes.StringValue, - Nodes.Symbol, - Nodes.SymbolNoPrefix, - Nodes.UndefinedValue, - Nodes.ArgumentsObject, - Nodes.ExternalVariable - ] as const, node.name); + return simple_node_comparer.includes(node.name); +} +function space() { + return __pretty ? " " : ""; } /** * @param {import("./parser").Node} node @@ -134,47 +135,34 @@ function _emit(node: INode, meta: EmitterOptions) { sp(); } } - function emitChain(nodes: AccessChainItem[]): string { - function sp() { - __pretty && (___text += " "); - } - for (var index = 0, __text = ""; index < nodes.length; index++) { + function emitChain(nodes: AccessChainItem[], __text = "", index = 0): string { + for (; index < nodes.length; index++) { const node = nodes[index], { body, kind } = node; - if (kind === AccessChainItemKind.Head) { - __text += _emit(isSimple(body) && body.name !== Nodes.NumberValue ? as_expression(body) : - ({ name: Nodes.GroupExpression, type: NodeType.Expression, body: [body] }), meta); - } else if (kind === AccessChainItemKind.Normal) { - __text += `.${ _emit(body, meta) }`; - } else if (kind === AccessChainItemKind.Computed) { - __text += `[${ _emit(body, meta) }]`; - } else if (kind === AccessChainItemKind.Optional || kind === AccessChainItemKind.OptionalComputed) { - var randomName = declare(random_var_name()), ___text = `(n(${ randomName }`; - sp(); - ___text += "="; - sp(); - ___text += __text + ")"; - sp(); - ___text += "?"; - sp(); - ___text += "u"; - sp(); - ___text += ":"; - sp(); - nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, PrefixlessSymbolNode(randomName))); - node.kind = kind === AccessChainItemKind.Optional ? - AccessChainItemKind.Normal : - AccessChainItemKind.Computed; - return `${ ___text }${ emitChain(nodes) })`; - } else { - nodes.splice(0, index, new AccessChainItem(AccessChainItemKind.Head, { - name: Nodes.SymbolNoPrefix, - type: NodeType.Expression, - symbol: `__na(${ __text })` - })); - node.kind = kind === AccessChainItemKind.NormalNullAsserted ? - AccessChainItemKind.Normal : - AccessChainItemKind.Computed; - return emitChain(nodes); + switch (kind) { + case AccessChainItemKind.Head: + __text += _emit(isSimple(body) && body.name !== Nodes.NumberValue ? as_expression(body) : + ExpressionWithBodyNode(Nodes.GroupExpression, [body]), meta); + break; + + case AccessChainItemKind.Normal: + __text += `.${ _emit(body, meta) }`; + break; + + + case AccessChainItemKind.Computed: + __text += `[${ _emit(body, meta) }]`; + break; + + case AccessChainItemKind.Optional: + case AccessChainItemKind.OptionalComputed: + var random_name = declare(random_var_name()); + node.kind = kind === AccessChainItemKind.Optional ? + AccessChainItemKind.Normal : + AccessChainItemKind.Computed; + return `(n(${ random_name }${ space() }=${ space() }${ __text })${ space() }?${ space() }u${ space() }:${ space() }${ emitChain(nodes, random_name, index) })`; + + default: + should_not_happen(); } } return __text; @@ -193,12 +181,12 @@ function _emit(node: INode, meta: EmitterOptions) { } function emitCallExpression() { __text += "("; - elementArgs = node.args!; - length = elementArgs.length; - for (index = 0; index < length; index++) { - const node = elementArgs[index]; + const args = node.meta!.args as Node[]; + const length = args.length; + for (index = 0; index < length;) { + const node = args[index]; __text += _emit(node, meta); - if (index + 1 < length) { + if (++index < length) { __text += commaAndWhitespace; } } @@ -253,8 +241,7 @@ function _emit(node: INode, meta: EmitterOptions) { index = 0; var hasBody = body.length > 0; for (; index < length; index++) { - const element = elementParams[index]; - var namae = element.name; + const element = elementParams[index], namae = element.name; if (!!element.default) hasBody = true; if (element.kind === ParameterNodeKind.Rest) { hasBody = true; @@ -278,7 +265,7 @@ function _emit(node: INode, meta: EmitterOptions) { hasBody && nl(); if (node.locals?.length) { is(); - __text += `var ${ node.locals.map(local => `$${ local }`).join(`,${ __pretty ? " " : "" }`) };`; + __text += `var ${ node.locals.map(local => `$${ local }`).join(commaAndWhitespace) };`; nl(); } if (node_name === Nodes.AsyncFunctionExpression || node_name === Nodes.AsyncGeneratorFunctionExpression) { @@ -296,15 +283,13 @@ function _emit(node: INode, meta: EmitterOptions) { name = ""; var hadRestParam = false; for (; index < length; index++) { - let node = elementParams[index]; - namae = node.name; + const node = elementParams[index], namae = node.name; if (hadRestParam) { if (typeof namae === "string") { is(); __text += node.name = name = `${ node.kind === ParameterNodeKind.NoPrefix ? "" : "$" }${ namae || random_var_name() }`; if (node.default) { - var _tempVar = random_var_name(); - declare(_tempVar); + const _tempVar = declare(random_var_name()); sp(); __text += "="; sp(); @@ -319,6 +304,7 @@ function _emit(node: INode, meta: EmitterOptions) { __text += _emit(node.default, meta); sp(); __text += ":"; + sp(); __text += `${ _tempVar })`; } else { sp(); @@ -354,7 +340,6 @@ function _emit(node: INode, meta: EmitterOptions) { } __text += `)${ index + 1 < length ? "," : ";" }`; nl(); - hadRestParam = true; } if (node.default && !hadRestParam) { is(); @@ -418,6 +403,10 @@ function _emit(node: INode, meta: EmitterOptions) { __text += __pretty ? "Infinity" : "1/0"; break; + case Nodes.ThisObject: + __text += "this"; + break; + case Nodes.Symbol: __text += `$${ node.symbol }`; break; @@ -466,26 +455,27 @@ function _emit(node: INode, meta: EmitterOptions) { emitCallExpression(); break; - case Nodes.OptionalCallExpression: { - assert_type<[Node]>(body); - const random_name = declare(random_var_name()); - __text += `(n(${ random_name }`; - sp(); - __text += "="; - sp(); - __text += `${ _emit(body[0], meta) })`; - sp() - __text += "?"; - sp(); - __text += "u"; - sp(); - __text += ":"; - sp(); - __text += random_name; - emitCallExpression(); - __text += ")"; - break; - } + case Nodes.OptionalCallExpression: + { + assert_type<[Node]>(body); + const random_name = declare(random_var_name()); + __text += `(n(${ random_name }`; + sp(); + __text += "="; + sp(); + __text += `${ _emit(body[0], meta) })`; + sp(); + __text += "?"; + sp(); + __text += "u"; + sp(); + __text += ":"; + sp(); + __text += random_name; + emitCallExpression(); + __text += ")"; + break; + } case Nodes.GroupExpression: assert_type(body); @@ -499,7 +489,7 @@ function _emit(node: INode, meta: EmitterOptions) { case Nodes.RangeExpression: assert_type<[INode, INode]>(body); - __text += `(function*(){for(var i=${ _emit(body[0], meta) },e=${ _emit(body[1], meta) };i(body); - // __text += _emit(body[0], meta) + "."; - // if (body[1].name !== Nodes.Symbol && body[1].name !== Nodes.SymbolNoPrefix) { - // (body[1].body![0] as Node).name = Nodes.SymbolNoPrefix; - // } - // if (body[1].name === Nodes.Symbol) { - // body[1].name = Nodes.SymbolNoPrefix; - // } - // __text += _emit(body[1], meta); - // // console.log(__text); - // break; - - // case Nodes.ComputedMemberAccessExpression: - // assert<[Node, Node]>(body); - // __text += `${ _emit(body[0], meta) }[${ _emit(body[1], meta) }]`; - // // console.log(__text); - // break; - case Nodes.Array: assert_type(body); __text += `[${ body.map(node => _emit(as_expression(node), meta)).join(commaAndWhitespace) }]`; @@ -734,7 +705,7 @@ function _emit(node: INode, meta: EmitterOptions) { case Nodes.NullAssertionExpression: assert_type<[INode]>(body); - __text += `__na(${ _emit(as_expression(body[0]), meta) })`; + __text += _emit(as_expression(body[0]), meta); break; case Nodes.NewExpression: @@ -743,44 +714,36 @@ function _emit(node: INode, meta: EmitterOptions) { break; case Nodes.TryStatment: - assert_type>(node); - assert_type(body); - __text += "try"; - sp(); - namae = node.meta.else ? declare(random_var_name()) : ""; - simple_body_emit(namae ? [{ - name: Nodes.AssignmentExpression, - type: NodeType.Expression, - body: [ - PrefixlessSymbolNode(namae), - ConstantValueNode(Nodes.TrueValue) - ], - symbol: "=" - }, ...body] : body); - if (node.meta.catch) { - sp(); - __text += "catch"; - sp(); - __text += `(${ node.meta.catch.symbol ? `$${ node.meta.catch.symbol }` : "_" })`; + { + assert_type>(node); + assert_type(body); + __text += "try"; sp(); - simple_body_emit(node.meta.else ? [{ - name: Nodes.AssignmentExpression, - type: NodeType.Expression, - body: [ - PrefixlessSymbolNode(namae), + const name = node.meta.else ? declare(random_var_name()) : ""; + simple_body_emit(name ? [ExpressionWithBodyAndSymbolNode(Nodes.AssignmentExpression, [ + PrefixlessSymbolNode(name), + ConstantValueNode(Nodes.TrueValue) + ], "="), ...body] : body); + if (node.meta.catch) { + sp(); + __text += "catch"; + sp(); + __text += `(${ node.meta.catch.symbol ? `$${ node.meta.catch.symbol }` : "_" })`; + sp(); + simple_body_emit(node.meta.else ? [ExpressionWithBodyAndSymbolNode(Nodes.AssignmentExpression, [ + PrefixlessSymbolNode(name), ConstantValueNode(Nodes.FalseValue) - ], - symbol: "=" - }, ...(node.meta.catch.body as Node[] ?? [])] : node.meta.catch.body as Node[]); - } - if (node.meta.finally || namae) { - sp(); - __text += "finally"; - sp(); - const $if = IfStatmentNode(node.meta.else, node.outerBody as Node, PrefixlessSymbolNode(namae)); - simple_body_emit(namae ? [TryStatmentNode([$if], undefined!, undefined!, node.meta.finally ?? [], node.outerBody as never)] : node.meta.finally); + ], "="), ...node.meta.catch.body as Node[] ?? []] : node.meta.catch.body as Node[]); + } + if (node.meta.finally || name) { + sp(); + __text += "finally"; + sp(); + const $if = IfStatmentNode(node.meta.else, node.outerBody as Node, PrefixlessSymbolNode(name)); + simple_body_emit(name ? [TryStatmentNode([$if], undefined!, undefined!, node.meta.finally ?? [], node.outerBody as never)] : node.meta.finally); + } + break; } - break; case Nodes.SymbolShortcut: __text += `Symbol.${ node.symbol! }`; diff --git a/src/lib/enums.ts b/src/lib/enums.ts index d7fa4c1..eb25473 100644 --- a/src/lib/enums.ts +++ b/src/lib/enums.ts @@ -121,7 +121,8 @@ export const enum Nodes { BitwiseRevertExpression, PostfixIncrementExpression, PostfixDecrementExpression, - TernaryExpression + TernaryExpression, + ThisObject } export const enum FunctionNodeKind { Sync, @@ -154,9 +155,7 @@ export const enum AccessChainItemKind { Normal, Computed, Optional, - OptionalComputed, - NormalNullAsserted, - ComputedNullAsserted + OptionalComputed } export const enum Tokens { String = 0x0000001, diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index 9d95bcc..092f657 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -1,5 +1,5 @@ import { Stream, type TextStream, Token, type TokenStream } from "./utils/stream.js"; -import { error_unexcepted_token, nullish, undefined } from "./utils/util.js"; +import { error_unexcepted_token, fatal, nullish, Prototypeless, undefined } from "./utils/util.js"; import { DiagnosticSeverity, Tokens } from "./enums"; import { keywords, $2charoperators, $3charoperators } from "./utils/constants.js"; import { advance_next, type Prefix } from "./utils/advancers.js"; @@ -18,8 +18,7 @@ const operatorTokenMap = new Map([...operatorCharsComparer, ...$2charoperators, .map(operator => [operator, new Token(Tokens.Operator, operator)])); - - +@Prototypeless class Lexer implements TokenStream { public readonly next!: Token; _triaged?: Token; @@ -102,30 +101,19 @@ class Lexer implements TokenStream { } private _scanChars(result: string) { var next: string; - while (!nullish(next = this.text_stream.next) && validIDComparer.includes(next)) { - this.text_stream.advance(); + while (!nullish(next = this.text_stream.move()) && validIDComparer.includes(next)) { result += next; } return new Token(keywordComparer.includes(result) ? Tokens.Keyword : Tokens.Symbol, result); } private _scanSingleQuoteText(): Token { var result = "", last = "", next: string; - while ((next = this.text_stream.move()) !== "'" || last + next === "\\'") { - if (nullish(next)) { - throw "Unexcepted EOF"; - } - result += last = next; - } + while ((next = this.text_stream.move() ?? fatal("Unexcepted EOF")) !== "'" || last === "\\") result += last = next; return new Token(Tokens.String, result); } private _scanDoubleQuoteText(): Token { var result = "", last = "", next: string; - while ((next = this.text_stream.move()) !== '"' || last + next === '\\"') { - if (nullish(next)) { - throw "Unexcepted EOF"; - } - result += last = next; - } + while ((next = this.text_stream.move() ?? fatal("Unexcepted EOF")) !== '"' || last === '\\') result += last = next; return new Token(Tokens.String, result); } private _scanWhitespace(): void { @@ -202,11 +190,14 @@ class Lexer implements TokenStream { this.text_stream.down(1); return new Token(Tokens.Number, result); } + /** + * @internal For testing purposes + */ + protected consume() { + while (!nullish(this.advance())); + } }; -/** - * @param {string} text - */ export function lex(text: string): TokenStream { return new Lexer(new Stream(text)); } \ No newline at end of file diff --git a/src/lib/nodes.ts b/src/lib/nodes.ts index d4fd096..93720a5 100644 --- a/src/lib/nodes.ts +++ b/src/lib/nodes.ts @@ -1,7 +1,8 @@ import { Nodes, type ParameterNodeKind, NodeType, type AccessChainItemKind, type ObjectBodyNodeKind } from "./enums"; +import { undefined } from "./utils/util.js"; -type NodeBody = INode[] | AccessChainItem[] | Record[] | undefined; +type NodeBody = INode[] | AccessChainItem[] | undefined; export type Writable = { -readonly [K in keyof T]: T[K] }; export interface INodeBase { @@ -18,6 +19,7 @@ export interface INode extends INodeBase { args?: INode[]; locals?: string[]; nonlocals?: string[]; + condition?: INode; } export abstract class BasicMeta { @@ -49,6 +51,9 @@ export const PrefixlessSymbolNode = (symbol: string) => export const SymbolNode = (symbol: string) => new Node(Nodes.Symbol, NodeType.Expression, undefined, undefined, symbol, undefined); +export const RegularExpressionNode = (symbol: string) => + new Node(Nodes.RegularExpression, NodeType.Expression, undefined, undefined, symbol, undefined); + export const ConstantValueNode = (nodename: Nodes) => new Node(nodename, NodeType.Expression, undefined, undefined, undefined, undefined); @@ -61,6 +66,20 @@ export const NumberNode = (symbol: string) => export const SymbolShortcutNode = (symbol: string) => new Node(Nodes.SymbolShortcut, NodeType.Expression, undefined, undefined, symbol, undefined); +export class NodeWithArgsMeta extends BasicMeta { + constructor(public readonly args: Node[]) { super(); } +} + +export const ExpressionWithBodyAndArgsNode = (name: Nodes, body: NodeBody, args: Node[]) => + new Node(name, NodeType.Expression, body, undefined, undefined, new NodeWithArgsMeta(args)); + +export class NodeWithConditionMeta extends BasicMeta { + constructor(public readonly condition: Node) { super(); } +} + +export const StatmentWithBodyAndConditionNode = (name: Nodes, body: NodeBody, condition: Node, outerBody: Node) => + new Node(name, NodeType.Statment, body, outerBody, undefined, new NodeWithConditionMeta(condition)); + export class IfStatmentMeta extends BasicMeta { public readonly else: Node; constructor($else: Node, public readonly elseif: Node, public readonly condition: Node) { @@ -69,7 +88,7 @@ export class IfStatmentMeta extends BasicMeta { } } -export const IfStatmentNode = (body: Node[], outer: Node, condition: Node) => +export const IfStatmentNode = (body: NodeBody, outer: Node, condition: Node) => new Node(Nodes.IfStatment, NodeType.Statment, body, outer, undefined, new IfStatmentMeta(undefined!, undefined!, condition) as Writable); export class TryStatmentMeta extends BasicMeta { @@ -84,9 +103,20 @@ export class TryStatmentMeta extends BasicMeta { } } -export const TryStatmentNode = (body: Node[], $else: Node[], $catch: Node, $finally: Node[], outerBody: Node) => +export const TryStatmentNode = (body: NodeBody, $else: Node[], $catch: Node, $finally: Node[], outerBody: Node) => new Node(Nodes.TryStatment, NodeType.Statment, body, outerBody, undefined, new TryStatmentMeta($else, $catch, $finally) as Writable); +export const ConstantNodeMap = new Map([ + ["arguments", ConstantValueNode(Nodes.ArgumentsObject)], + ["false", ConstantValueNode(Nodes.FalseValue)], + ["Infinity", ConstantValueNode(Nodes.InfinityValue)], + ["NaN", ConstantValueNode(Nodes.NaNValue)], + ["null", ConstantValueNode(Nodes.NullValue)], + ["this", ConstantValueNode(Nodes.ThisObject)], + ["true", ConstantValueNode(Nodes.TrueValue)], + ["undefined", ConstantValueNode(Nodes.UndefinedValue)], +] as const); + export interface ClassProperty { name: INode; body: INode[]; diff --git a/src/lib/parser.ts b/src/lib/parser.ts index 8d11d3c..ff1276c 100644 --- a/src/lib/parser.ts +++ b/src/lib/parser.ts @@ -1,8 +1,7 @@ // @ts-check /** @author MadProbe#7435 */ import { - nullish, resetCounter, undefined, SyntaxError, includes, error_unexcepted_token, isSymbol, remove_trailing_undefined -} from "./utils/util.js"; + reset_counter, undefined, SyntaxError, error_unexcepted_token, isSymbol, should_not_happen, fatal} from "./utils/util.js"; import { Nodes, ParameterNodeKind, NodeType, Tokens, DiagnosticSeverity, ParseNodeKind } from "./enums"; import { _echo } from "./utils/_echo.js"; import { AssignmentOperatorTable } from "./utils/table.js"; @@ -12,32 +11,34 @@ import { parse_call_expression, parse_body, parse_common_expressions, parse_regexp, parse_array_expression, parse_assignment, parse_group_expression, keywords_handlers, parse_member_access } from "./parsers/__all__.js"; -import { ExpressionWithBodyNode, INode, NumberNode, ParameterNode, ParseMeta, StatmentWithBodyNode, StringNode, SymbolNode, SymbolShortcutNode } from "./nodes"; +import { ConstantNodeMap, ExpressionWithBodyAndArgsNode, ExpressionWithBodyNode, INode, NumberNode, ParameterNode, ParseMeta, StatmentWithBodyNode, StringNode, SymbolNode, SymbolShortcutNode } from "./nodes"; import { occurrences } from "./utils/occurrences.js"; +import { MultiValueComparer } from "./utils/comparer.js"; import type { IDiagnostic } from "./utils/diagnostics.js"; import type { Token, TokenStream } from "./utils/stream.js"; -import { MultiValueComparer } from "./utils/comparer.js"; + const comparer = new MultiValueComparer(";}),"); const indentifier = ParseNodeKind.Indentifier; -const unusualMemberAccessOperatorsComparer = new MultiValueComparer(["!.", "![", "?.", "?.["] as const); +const unusual_member_access_operators_comparer = new MultiValueComparer(["?.", "?.["] as const); const abruptful_nodes_comparer = new MultiValueComparer(["with", "to", "as"] as const); -export type SyntaxTree = readonly INode[]; -/** - * @param {import("./utils/stream.js").Token | import("./parser").Node} next - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - * @returns {import("./parser").Node} - */ + +var __top_fn_node: INode; +export var __used: KnownUsed; +export var promises: Promise[] = []; +export var __cache = true; + +export const diagnostics: readonly IDiagnostic[] = []; + export function _parse(next: Token, stream: TokenStream, meta: ParseMeta): INode { const parsed = __parse(next, stream, meta); meta.insideExpression = false; return parsed; } + export function parse_operators(_sym: INode, stream: TokenStream, meta: ParseMeta, type: ParseNodeKind): INode { meta.insideExpression = true; - var prefix: string; var node: INode; var parsed: INode | undefined; var next = stream.try(end_expression); @@ -61,26 +62,28 @@ export function parse_operators(_sym: INode, stream: TokenStream, meta: ParseMet stream.cancel_try(); return _sym; + // TODO: Chained comparisons - 2 < 3 < 4 === 2 < 3 && 3 < 4 + // case ">": + // const expr = parse_expression(stream, meta); + // const nextOperator = stream.try("operator"); + // if (nextOperator.type === Tokens.Operator && nextOperator.body === next.body) { + // stream.confirm_try(); + // // ... + // } else stream.cancel_try(); + case "(": case "?.(": stream.confirm_try(); - // console.log("():", next); notExpressionOrIndentifier && pushDiagnostic(DiagnosticSeverity.RuntimeError, `Call on ${ type } will fail at runtime because ${ type } is not callable.`, stream); - var args = parse_call_expression(advance_next(stream, ")", "Call expression:"), stream, meta); - remove_trailing_undefined(args); - return parse_operators({ - name: next.body === "(" ? Nodes.CallExpression : Nodes.OptionalCallExpression, - type: NodeType.Expression, - body: [_sym], - args - }, stream, meta, ParseNodeKind.Expression); + return parse_operators(ExpressionWithBodyAndArgsNode( + next.body === "(" ? Nodes.CallExpression : Nodes.OptionalCallExpression, [_sym as never], + parse_call_expression(advance_next(stream, ")", "Call expression:"), stream, meta) as never + ), stream, meta, ParseNodeKind.Expression); case ".": case "[": - case "!.": - case "![": case "?.": case "?.[": { stream.confirm_try(); @@ -90,11 +93,10 @@ export function parse_operators(_sym: INode, stream: TokenStream, meta: ParseMet `Please disambiguate normal member access expression when member access \ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream); } - if (notExpressionOrIndentifier && unusualMemberAccessOperatorsComparer.includes(body)) { - var isDotMemberAccess = body == "!." || body == "?."; + if (notExpressionOrIndentifier && unusual_member_access_operators_comparer.includes(body)) { + var isDotMemberAccess = body == "?."; pushDiagnostic(DiagnosticSeverity.Warn, - (body == "![" || body == "!." ? "Null assertive" : "Optional") + - `${ isDotMemberAccess ? "" : " computed" } member access doesn't have ` + + `Optional${ isDotMemberAccess ? "" : " computed" } member access doesn't have ` + `any effect when performed on ${ type } value, assertion will be stripped.`, stream); // @ts-expect-error next.body = isDotMemberAccess ? "." : "["; @@ -125,33 +127,22 @@ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream case "::": stream.confirm_try(); - prefix = "Argument binding expression: "; + const prefix = "Argument binding expression:"; assert_next_token(stream, Tokens.Operator, "(", prefix); next = advance_next(stream, ")", prefix); - return parse_operators({ - name: Nodes.ArgumentBindingExpression, - type: NodeType.Expression, - body: [_sym], - args: parse_call_expression(next, stream, meta) - }, stream, meta, ParseNodeKind.Expression); + return parse_operators(ExpressionWithBodyAndArgsNode( + Nodes.ArgumentBindingExpression, [_sym as never], parse_call_expression(next, stream, meta) as never + ), stream, meta, ParseNodeKind.Expression); case "..": stream.confirm_try(); return parse_operators(ExpressionWithBodyNode( - Nodes.RangeExpression, [_sym, __parse(advance_next(stream, end_expression, "RangeValue expression:"), stream, meta)] + Nodes.RangeExpression, [_sym, parse_expression(stream, meta, "RangeValue expression:")] ), stream, meta, ParseNodeKind.Expression); case "!": stream.confirm_try(); - node = parse_operators(notExpressionOrIndentifier ? _sym : ExpressionWithBodyNode(Nodes.NullAssertionExpression, [_sym]), stream, meta, ParseNodeKind.Expression); - if (notExpressionOrIndentifier) { - pushDiagnostic(DiagnosticSeverity.Warn, - `Null assertion expression doesn't have any effect on ${ type } value, ` + - `null assertion operator will be stripped in output`, stream); - } else { - __used.na = true; - } - return node; + return parse_operators(ExpressionWithBodyNode(Nodes.NullAssertionExpression, [_sym]), stream, meta, ParseNodeKind.Expression); default: stream.confirm_try(); @@ -168,17 +159,13 @@ performed on ${ type } value by wrapping ${ type } value in parenthezis`, stream return parsed; } } -/** - * @param {import("./utils/stream.js").Token | import("./parser").Node} next - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - * @returns {import("./parser").Node | [import("./parser").Node]} - */ + export function __parse(next: Token, stream: TokenStream, meta: ParseMeta): INode { if (isSymbol(next)) { - return parse_operators(next.type === Tokens.Keyword ? keywords_handlers[next.body](stream, meta) : SymbolNode(next.body), stream, meta, indentifier); + return parse_operators(next.type === Tokens.Keyword ? ConstantNodeMap.get(next.body) ?? should_not_happen() : SymbolNode(next.body), stream, meta, indentifier); } else if (next.type === Tokens.Keyword) { - return keywords_handlers[next.body](stream, meta); + if (next.body === "__external_var") return parse_operators(keywords_handlers.__external_var(stream, meta), stream, meta, indentifier); + return keywords_handlers[next.body]?.(stream, meta) ?? fatal(`"${ next.body }" keyword will be implemented some time later.`); } else if (next.type === Tokens.Number) { return parse_operators(NumberNode(next.body), stream, meta, ParseNodeKind.Number); } else if (next.type === Tokens.String) { @@ -186,11 +173,12 @@ export function __parse(next: Token, stream: TokenStream, meta: ParseMeta): INod } else if (next.type === Tokens.Operator && !comparer.includes(next.body)) { if (next.body === "{") { return StatmentWithBodyNode(Nodes.CodeBlock, parse_body(stream, meta), meta.outer); - } else if (next.body === "(") { - return parse_group_expression(stream, meta); } meta.insideExpression = true; switch (next.body) { + case "(": + return parse_group_expression(stream, meta); + case "[": return parse_array_expression(stream, meta); @@ -228,102 +216,80 @@ export function __parse(next: Token, stream: TokenStream, meta: ParseMeta): INod return undefined!; } -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {import("./parser").ParseMeta} meta - */ export function parse_expression

(stream: import("./utils/stream.js").TokenStream, meta: ParseMeta, prefix?: Prefix

) { return __parse(advance_next(stream, end_expression, prefix), stream, meta); } -export function _parse_and_assert_last_token

(stream: TokenStream, meta: ParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

, parse: typeof __parse = _parse) { - var arg: INode; - arg = parse(advance_next(stream, end_expression, prefix), stream, meta); +export function parse_and_assert_last_token

(stream: TokenStream, meta: ParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

) { + const arg = _parse(advance_next(stream, end_expression, prefix), stream, meta); assert_next_token(stream, token_type, token_string); return arg; } -// var __line = 0; -// var __column = 0; -/**@type {import("./parser").Node} */ -var __top_fn_node: INode; -export const diagnostics: readonly IDiagnostic[] = []; + +export function _parse_and_assert_last_token

(stream: TokenStream, meta: ParseMeta, token_type: Tokens, token_string?: string, prefix?: Prefix

) { + const arg = __parse(advance_next(stream, end_expression, prefix), stream, meta); + assert_next_token(stream, token_type, token_string); + return arg; +} + export class Diagnostic implements IDiagnostic { public readonly line: number; public readonly column: number; public constructor(public readonly severity: DiagnosticSeverity, public readonly message: unknown, { text_stream }: Partial = {}) { const text = text_stream?.text.slice(0, text_stream.index); - this.line = text ? occurrences(text, '\n') + 1 : '?' as never; - this.column = text ? text_stream?.index! - text?.lastIndexOf('\n') : '?' as never; + this.line = text ? occurrences(text, '\n') + 1 : NaN; + this.column = text ? text_stream?.index! - text?.lastIndexOf('\n') : NaN; } public log() { const level = (["Info", "Warn", "RuntimeError", "Error", "FatalError"] as const)[this.severity]; console.log(`Diagnostic[Level: ${ level }, Line: ${ this.line }, Column: ${ this.column }]:`, this.message); } } + export function pushDiagnostic(severity: DiagnosticSeverity, message: unknown, stream?: TokenStream, _diagnostics: readonly IDiagnostic[] = diagnostics) { (_diagnostics as IDiagnostic[]).push(new Diagnostic(severity, message, stream)); } -export var promises: Promise[] = []; + export interface ParserOutput { readonly output: Readonly; readonly diagnostics: readonly IDiagnostic[]; readonly __used: Readonly; } -export var __cache = true; + class KnownUsed implements Record { - public throw = false; - /** null assert */ - public na = false; - public contains = false; + public throw: boolean = false; + public contains: boolean = false; [key: string]: boolean; } export type { KnownUsed }; -export var __used: KnownUsed; -/** - * @param {import("./utils/stream.js").TokenList} stream - * @param {string} filename - * @returns {import("./parser").ParserOutput | Promise} - */ + export function parse(stream: TokenStream, filename: string, cache: boolean): ParserOutput | Promise { - resetCounter(); + reset_counter(); __cache = cache; - // __line = __column = 0; - __top_fn_node = { - name: Nodes.AsyncFunctionExpression, - type: NodeType.Expression, - params: [], - locals: [], - meta: {} - }; - __used = new KnownUsed(); const output: ParserOutput = { diagnostics, - output: __top_fn_node, - __used + __used: __used = new KnownUsed(), + output: __top_fn_node = { + name: Nodes.AsyncFunctionExpression, + type: NodeType.Expression, + params: [], + locals: [], + meta: {}, + body: undefined + } }; __top_fn_node.body = main_parse(stream, filename, __top_fn_node, cache) as never; return promises.length ? Promise.all(promises).then(() => output) : output; } + /* それは、にんげんはかたちをした〈モノ〉 */ -/** - * @param {import("./utils/stream.js").TokenStream} stream - * @param {string} filename - * @param {import("./parser").Node} outer - */ -export function main_parse(stream: TokenStream, filename: string, outer: INode, cache: boolean, insideExpression = false): SyntaxTree { +export function main_parse(stream: TokenStream, filename: string, outer: INode, cache: boolean, insideExpression: boolean = false): readonly INode[] { const parsed: INode[] = [], meta = new ParseMeta(filename, outer, cache, insideExpression); parse_shebang(stream, outer); for (const next of stream) { - // try { - // var newlines = occurrences(next[1], '\n'); - // var __line_cache = __line += newlines; - // if (newlines <= 0) { - // __column = 0; - // } - // var __column_cache = __column += next[1].length - next[1].lastIndexOf("\n"); try { - var _parsed = _parse(next, stream, meta); + const _parsed = _parse(next, stream, meta); _parsed && parsed.push(_parsed); } catch (error) { if (String(error).startsWith("SyntaxError") ? error + "" != last! : true) { @@ -333,13 +299,6 @@ export function main_parse(stream: TokenStream, filename: string, outer: INode, DiagnosticSeverity.Error, error as never); } } - // } catch (error) { - // if (typeof error === "string") { - // throw `${ __line_cache }.${ __column_cache }:${ __line }.${ __column }::${ filename } - ${ error }`; - // } else { - // throw error; - // } - // } } return parsed; } @@ -356,4 +315,3 @@ function parse_shebang({ text_stream }: TokenStream, outer: INode) { if (__top_fn_node === outer) __top_fn_node.meta!.shebang = text; } - diff --git a/src/lib/parsers/array-expression.ts b/src/lib/parsers/array-expression.ts index cfd19c6..b547e8a 100644 --- a/src/lib/parsers/array-expression.ts +++ b/src/lib/parsers/array-expression.ts @@ -3,20 +3,13 @@ import { Nodes, NodeType, ParseNodeKind, Tokens } from "../enums"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; import { parse_operators, _parse, __parse } from "../parser.js"; -import type { INode, IParseMeta } from "../nodes"; +import { ExpressionWithBodyNode, INode, IParseMeta } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; export function parse_array_expression(stream: TokenStream, meta: IParseMeta) { const body: INode[] = []; - /**@type {import("./parser").Node}*/ - const node: INode = { - name: Nodes.Array, - type: NodeType.Expression, - body - }; - var parsed: INode; - var next: Token; + var parsed: INode, next: Token; while (next = advance_next(stream, end_expression)) { if (next.type === Tokens.Operator && next.body === ",") { body.push({ @@ -37,8 +30,5 @@ export function parse_array_expression(stream: TokenStream, meta: IParseMeta) { break; } } - // trailing undefineds are needed here - // remove_trailing_undefined(body); - parsed = parse_operators(node, stream, meta, ParseNodeKind.Expression); - return parsed; + return parse_operators(ExpressionWithBodyNode(Nodes.Array, body), stream, meta, ParseNodeKind.Expression); } diff --git a/src/lib/parsers/body-parser.ts b/src/lib/parsers/body-parser.ts index 0ef96a3..8230f3d 100644 --- a/src/lib/parsers/body-parser.ts +++ b/src/lib/parsers/body-parser.ts @@ -6,19 +6,14 @@ import type { Token, TokenStream } from "../utils/stream.js"; export function parse_body

(stream: TokenStream, meta: IParseMeta, prefix?: Prefix

): INode[] { - // var next: Token = advance_next(stream, "}", prefix); const nodes: INode[] = []; - var next: Token - //console.log(1123124); - while ((next = advance_next(stream, "}", prefix)/*, console.log("next:", next), next*/).type !== Tokens.Operator || next.body !== "}") { - // console.log(next); + var next: Token; + while ((next = advance_next(stream, "}", prefix)).type !== Tokens.Operator || next.body !== "}") { try { - var _parsed = _parse(next, stream, meta); + const _parsed = _parse(next, stream, meta); _parsed && nodes.push(_parsed); - // next = advance_next(stream, "}", prefix); } catch (_e) { - pushDiagnostic(DiagnosticSeverity.Error, _e as never, stream); - // next = advance_next(stream, "}", prefix); + pushDiagnostic(DiagnosticSeverity.Error, _e, stream); } } return nodes; diff --git a/src/lib/parsers/call-expression.ts b/src/lib/parsers/call-expression.ts index a2f3ee3..784ba86 100644 --- a/src/lib/parsers/call-expression.ts +++ b/src/lib/parsers/call-expression.ts @@ -1,39 +1,31 @@ import { error_unexcepted_token } from "../utils/util.js"; -import { Nodes, NodeType, Tokens } from "../enums"; +import { Tokens } from "../enums"; import { end_expression } from "../utils/constants.js"; import { advance_next } from "../utils/advancers.js"; import { __parse } from "../parser.js"; +import { type IParseMeta, type INode, ConstantNodeMap } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { IParseMeta, INode } from "../nodes"; export function parse_call_expression(next: Token, stream: TokenStream, meta: IParseMeta): INode[] { const args: INode[] = []; - if (next.type !== Tokens.Operator || next.body !== ")") { - while (1) { - if (next.type === Tokens.Operator && next.body === ")") { - break; - } - if (next.type === Tokens.Operator && next.body === ",") { - args.push({ - name: Nodes.UndefinedValue, - type: NodeType.Expression - }); - next = advance_next(stream, end_expression); - continue; - } - args.push(__parse(next, stream, meta)); - next = advance_next(stream, ")"); - if (next.type === Tokens.Operator) { - if (next.body === ")") { - break; - } else if (next.body !== ",") { - error_unexcepted_token(next); - } - } else - error_unexcepted_token(next); + while (next.type !== Tokens.Operator || next.body !== ")") { + if (next.type === Tokens.Operator && next.body === ",") { + args.push(ConstantNodeMap.get("undefined")!); next = advance_next(stream, end_expression); + continue; } + args.push(__parse(next, stream, meta)); + next = advance_next(stream, ")"); + if (next.type === Tokens.Operator) { + if (next.body === ")") { + break; + } else if (next.body !== ",") { + error_unexcepted_token(next); + } + } else + error_unexcepted_token(next); + next = advance_next(stream, end_expression); } return args; } diff --git a/src/lib/parsers/group-expression.ts b/src/lib/parsers/group-expression.ts index 5adbf06..b7549fe 100644 --- a/src/lib/parsers/group-expression.ts +++ b/src/lib/parsers/group-expression.ts @@ -4,18 +4,20 @@ import { end_expression } from "../utils/constants.js"; import { error_unexcepted_token, includes } from "../utils/util.js"; import { parse_operators, __parse } from "../parser.js"; import type { Token, TokenStream } from "../utils/stream.js"; -import type { INode, IParseMeta } from "../nodes.js"; +import { ExpressionWithBodyNode, INode, IParseMeta } from "../nodes.js"; +import { MultiValueComparer } from "../utils/comparer.js"; +const group_end_comparer = new MultiValueComparer(",)"); export function parse_group_expression(stream: TokenStream, meta: IParseMeta) { const prefix = "Group expression:", body: INode[] = [], - node: INode = { name: Nodes.GroupExpression, type: NodeType.Expression, body }; + node: INode = ExpressionWithBodyNode(Nodes.GroupExpression, body); var next: Token, parsed: INode; while (next = advance_next(stream, end_expression, prefix), next.type !== Tokens.Operator || next.body !== ")") { parsed = __parse(next, stream, meta); next = advance_next(stream, end_expression, prefix); body.push(parsed); - if (next.type !== Tokens.Operator && !includes(",)", next.body)) { + if (next.type !== Tokens.Operator || !group_end_comparer.includes(next.body)) { error_unexcepted_token(next); } else if (next.body === ")") { break; diff --git a/src/lib/parsers/keywords.ts b/src/lib/parsers/keywords.ts index 8db5f62..b159f33 100644 --- a/src/lib/parsers/keywords.ts +++ b/src/lib/parsers/keywords.ts @@ -1,25 +1,25 @@ import { isArray, include, undefined, SyntaxError, random_var_name, includes, - error_unexcepted_token, assert_type, assert_token + error_unexcepted_token, assert_type, assert_token, fatal, auto_variables_comparer, should_not_happen } from "../utils/util.js"; import { _echo } from "../utils/_echo.js"; import { FunctionNodeKind, Nodes, ParameterNodeKind, NodeType, AccessChainItemKind, Tokens, DiagnosticSeverity } from "../enums"; import { lex } from "../lexer.js"; -import { memberAccessOperators, end_expression } from "../utils/constants.js"; +import { member_access_operators, end_expression, auto_variables } from "../utils/constants.js"; import { parse_member_access } from "./member-access.js"; import { advance_next, assert_next_token } from "../utils/advancers.js"; import { parse_body, parse_next_body } from "./body-parser.js"; -import { __cache, main_parse, promises, _parse, __parse, __used, _parse_and_assert_last_token, pushDiagnostic } from "../parser.js"; +import { __cache, main_parse, promises, _parse, __parse, __used, parse_and_assert_last_token, pushDiagnostic, parse_expression } from "../parser.js"; import { __external_var_creator } from "./external-var.js"; import { parse_call_expression } from "./call-expression.js"; -import { type INode, type IClassNode, type AccessChainItem, ParseMeta, ParameterNode, Node, SymbolNode, StatmentWithBodyNode, TryStatmentNode, Writable, IfStatmentNode, ExpressionWithBodyNode, PrefixlessSymbolNode, ExpressionWithBodyAndOuterNode } from "../nodes"; +import { type INode, type IClassNode, AccessChainItem, ParseMeta, ParameterNode, Node, SymbolNode, StatmentWithBodyNode, TryStatmentNode, Writable, IfStatmentNode, ExpressionWithBodyNode, PrefixlessSymbolNode, ExpressionWithBodyAndOuterNode, ExpressionWithBodyAndArgsNode, ConstantNodeMap } from "../nodes"; import type { TokenStream } from "../utils/stream.js"; import { MultiValueComparer } from "../utils/comparer.js"; type KeywordParsers = Readonly Readonly>>; const try_phrases = new MultiValueComparer(["catch", "else", "finally"]); -const keepStatmentStuff = [',', ')'].join('" | "') + memberAccessOperators.join('" | "'); +const keepStatmentStuff = [',', ')'].join('" | "') + member_access_operators.join('" | "'); const awaitOps = ['any', 'all', 'allSettled', 'race']; const awaitOpsComparer = new MultiValueComparer(awaitOps); const awaitOpsJoined = awaitOps.join('" | "'); @@ -82,7 +82,7 @@ export const keywords_handlers = { */ if(stream, meta) { assert_next_token(stream, Tokens.Operator, "("); - var expression = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")"), expressions: INode[]; + var expression = parse_and_assert_last_token(stream, meta, Tokens.Operator, ")"), expressions: INode[]; var next = advance_next(stream, "{"); if (next.type === Tokens.Operator && next.body === "{") { expressions = parse_body(stream, meta); @@ -193,7 +193,6 @@ export const keywords_handlers = { var name = ""; var params: ParameterNode[] = []; var next = advance_next(stream, 'symbol" | "(', prefix); - var paramType: ParameterNodeKind; var hasRest = false; var index: number; if (next.type === Tokens.Operator && next.body === "*") { @@ -210,7 +209,7 @@ export const keywords_handlers = { name = next.body; next = advance_next(stream, "(", prefix); } - if (next.type !== Tokens.Operator && next.body !== "(") { + if (next.type !== Tokens.Operator || next.body !== "(") { error_unexcepted_token(next); } const node: INode = { @@ -223,7 +222,7 @@ export const keywords_handlers = { }; const innerMeta = new ParseMeta(meta.filename, node, meta.cache); for (; ;) { - paramType = ParameterNodeKind.Normal; + var paramType = ParameterNodeKind.Normal; next = advance_next(stream, "symbol", prefix); if (next.type === Tokens.Operator && next.body === ",") { params.push(new ParameterNode("", ParameterNodeKind.Empty, undefined)); @@ -249,7 +248,7 @@ export const keywords_handlers = { if (next.type === Tokens.Operator && next.body === ")") { break; - } else if (next.type !== Tokens.Operator && next.body !== ",") { + } else if (next.type !== Tokens.Operator || next.body !== ",") { error_unexcepted_token(next); } } else if (next.type === Tokens.Operator && next.body === ",") { @@ -263,11 +262,10 @@ export const keywords_handlers = { index = params.length; for (; index && params[--index].kind === ParameterNodeKind.Empty;) params.pop(); - // apply(console.log, console, params); // IE 8 is very old and strange shit next = advance_next(stream, "{", prefix); if (next.type === Tokens.Operator && next.body === "=>") { next = advance_next(stream, end_expression, prefix); - if (next.type !== Tokens.Operator && next.body !== "{") { + if (next.type !== Tokens.Operator || next.body !== "{") { innerMeta.insideExpression = true; node.body = [StatmentWithBodyNode(Nodes.ReturnStatment, [_parse(next, stream, innerMeta)], node)]; return node; @@ -278,8 +276,9 @@ export const keywords_handlers = { return node; }, class(stream, meta) { + (fatal("TODO: Finish implementation of classes after i finish the unification node objects and regular objects")); const type = meta.insideExpression ? NodeType.Expression : NodeType.Statment; - const node: IClassNode = { + const node = { name: Nodes.ClassExpression, type, getters: [], @@ -292,7 +291,7 @@ export const keywords_handlers = { privateProps: [], mixins: [], outerBody: meta.outer - }; + } as IClassNode; const prefix = "Class expression:"; var next = advance_next(stream, ["{", "symbol", "extends"].join('" | "'), prefix); if (next.type === Tokens.Symbol) { @@ -328,12 +327,7 @@ export const keywords_handlers = { } } } - // next = next_and_skip_shit_or_fail(stream, "}", prefix); - // if (next[0] !== Tokens.Special || next[1] !== "}") { - // error_unexcepted_token(next); - // } - } else - error_unexcepted_token(next); + } else error_unexcepted_token(next); return node; }, return(stream, meta) { @@ -362,17 +356,12 @@ export const keywords_handlers = { if (next.type === Tokens.Operator && next.body === ".") { next = advance_next(stream, awaitOpsJoined, prefix); if (next.type === Tokens.Symbol && awaitOpsComparer.includes(next.body)) { - var expression: INode = { - name: Nodes.CallExpression, - type: NodeType.Expression, - body: [PrefixlessSymbolNode(`p.${ next.body }`)], - args: [_parse(advance_next(stream, end_expression, prefix), stream, meta)] - }; + var expression = ExpressionWithBodyAndArgsNode(Nodes.CallExpression, [PrefixlessSymbolNode(`p.${ next.body }`)], [parse_expression(stream, meta, prefix) as Node]); } else { error_unexcepted_token(next); } } else { - expression = _parse(next, stream, meta); + expression = _parse(next, stream, meta) as never; } return ExpressionWithBodyAndOuterNode(Nodes.AwaitExpression, [expression], meta.outer as Node); }, @@ -384,58 +373,47 @@ export const keywords_handlers = { const args: INode[] = []; assert_next_token(stream, Tokens.Operator, "("); var next = advance_next(stream, "symbol", prefix); - // ??? - if (next.type === Tokens.Operator || next.body !== ")") { - while (1) { - if (next.type === Tokens.Operator && next.body === ")") { - break; + while (next.type !== Tokens.Operator || next.body !== ")") { + if (next.type === Tokens.Operator && next.body === ",") { + next = advance_next(stream, end_expression); + continue; + } else { + var next2, isConstantObject = next.type === Tokens.Keyword && auto_variables_comparer.includes(next.body), + arg: INode = isConstantObject ? ConstantNodeMap.get(next.body) ?? should_not_happen() : SymbolNode(next.body); + if (!(isConstantObject || next.type === Tokens.Symbol)) { + error_unexcepted_token(next); } - if (next.type === Tokens.Operator && next.body === ",") { - next = advance_next(stream, end_expression); - continue; + next2 = advance_next(stream, keepStatmentStuff, prefix); + if (next2.type === Tokens.Operator && includes(member_access_operators, next2.body)) { + arg = parse_member_access(arg, next, stream, meta); } else { - var next2, isConstantObject = next.type === Tokens.Keyword && includes(["this", "arguments"] as const, next.body), - arg: INode = (isConstantObject ? keywords_handlers[next.body]() : { - name: Nodes.Symbol, - type: NodeType.Expression, - symbol: next.body - }); - if (!(isConstantObject || next.type === Tokens.Symbol)) { - error_unexcepted_token(next); - } - next2 = advance_next(stream, keepStatmentStuff, prefix); - if (next2.type === Tokens.Operator && includes(memberAccessOperators, next2.body)) { - arg = parse_member_access(arg, next, stream, meta); - } else { - isConstantObject && pushDiagnostic(DiagnosticSeverity.RuntimeError, `Assignment to "${ next.type }" will fail at runtime!`, stream); - next = next2; - } + isConstantObject && pushDiagnostic(DiagnosticSeverity.RuntimeError, `Assignment to "${ next.type }" will fail at runtime!`, stream); + next = next2; } - args.push(arg); - if (next.type === Tokens.Operator) { - if (next.body === ")") { - break; - } else if (next.body !== ",") { - error_unexcepted_token(next); - } - } else - error_unexcepted_token(next); - next = advance_next(stream, "symbol"); } + args.push(arg); + if (next.type === Tokens.Operator) { + if (next.body === ")") { + break; + } else if (next.body !== ",") { + error_unexcepted_token(next); + } + } else + error_unexcepted_token(next); + next = advance_next(stream, "symbol"); } - assert_next_token(stream, Tokens.Operator, "{", prefix); return { name: Nodes.KeepStatment, type: NodeType.Statment, - body: parse_body(stream, meta), + body: parse_next_body(stream, meta), args, outerBody: meta.outer } as INode; }, new(stream, meta) { - const expression = __parse(advance_next(stream, end_expression), stream, meta); + const expression = parse_expression(stream, meta); // The logic is to intercept from parsed node last CallExpression and mutate it into NewExpression - const node: INode = { name: Nodes.NewExpression, type: NodeType.Expression, body: [expression] }, intercepted: INode[] = []; + const node: INode = ExpressionWithBodyNode(Nodes.NewExpression, [expression]), intercepted: INode[] = []; var body = expression.body, expression_ = expression; while (expression_.type === NodeType.Expression && isArray(body)) { expression_ = (body[0] as INode).name ? body[0] as INode : (body[0] as AccessChainItem).body; @@ -450,10 +428,7 @@ export const keywords_handlers = { if (expressionAbove.name !== Nodes.MemberAccessExpression) { (expressionAbove.body as INode[])[0] = node; } else { - (expressionAbove.body as AccessChainItem[])[0] = { - body: node, - kind: AccessChainItemKind.Head - }; + (expressionAbove.body as AccessChainItem[])[0] = new AccessChainItem(AccessChainItemKind.Head, node); } return expression; } @@ -498,7 +473,7 @@ export const keywords_handlers = { while(stream, meta) { const prefix = "While statment:"; assert_next_token(stream, Tokens.Operator, "(", prefix); - const arg = _parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix); + const arg = parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix); return { name: Nodes.WhileStatment, type: NodeType.Statment, @@ -516,7 +491,7 @@ export const keywords_handlers = { name: Nodes.DoWhileStatment, type: NodeType.Statment, body, - args: [_parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix)], + args: [parse_and_assert_last_token(stream, meta, Tokens.Operator, ")", prefix)], outerBody: meta.outer }; }, @@ -541,8 +516,8 @@ export const keywords_handlers = { name: Nodes.ForRangeStatment, type: NodeType.Statment, args: [ - _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "to"), - _parse_and_assert_last_token(stream, meta, Tokens.Keyword, "as"), + parse_and_assert_last_token(stream, meta, Tokens.Keyword, "to"), + parse_and_assert_last_token(stream, meta, Tokens.Keyword, "as"), SymbolNode(assert_next_token(stream, Tokens.Symbol, undefined, "For statment:").body) ], body: (assert_next_token(stream, Tokens.Operator, ")", "For statment:"), parse_next_body(stream, meta)), diff --git a/src/lib/parsers/member-access.ts b/src/lib/parsers/member-access.ts index 67b7d20..a0109c9 100644 --- a/src/lib/parsers/member-access.ts +++ b/src/lib/parsers/member-access.ts @@ -2,12 +2,13 @@ import { Nodes, AccessChainItemKind, Tokens, ParseNodeKind } from "../enums"; import { __parse, __used, _parse, parse_operators } from "../parser.js"; import { MultiValueComparer } from "../utils/comparer.js"; import { advance_next, assert_next_token } from "../utils/advancers.js"; -import { memberAccessOperators, end_expression } from "../utils/constants.js"; +import { member_access_operators, end_expression } from "../utils/constants.js"; import { type INode, type ParseMeta, AccessChainItem, PrefixlessSymbolNode, ExpressionWithBodyNode } from "../nodes"; import type { Token, TokenStream } from "../utils/stream.js"; +import { should_not_happen } from "../utils/util.js"; -const memberAccessOperatorsComparer = new MultiValueComparer(memberAccessOperators); +const memberAccessOperatorsComparer = new MultiValueComparer(member_access_operators); export const optionalChainsSet = new WeakSet; export function parse_member_access(sym: INode, next: Token, stream: TokenStream, meta: ParseMeta) { const chain = [new AccessChainItem(AccessChainItemKind.Head, sym)], node = ExpressionWithBodyNode(Nodes.MemberAccessExpression, chain); @@ -38,21 +39,8 @@ export function parse_member_access(sym: INode, next: Token, stream: TokenStream break; } - case "!.": - __used.na = true; - chain.push(new AccessChainItem(AccessChainItemKind.NormalNullAsserted, PrefixlessSymbolNode(assert_next_token(stream, Tokens.Symbol | Tokens.Keyword).body))); - break; - - case "!.[": { - const parsed = __parse(advance_next(stream, end_expression), stream, meta); - assert_next_token(stream, Tokens.Operator, "]"); - __used.na = true; - chain.push(new AccessChainItem(AccessChainItemKind.ComputedNullAsserted, parsed)); - break; - } - default: - throw RangeError("should never happen"); + should_not_happen(); } try { next = stream.try("operator"); diff --git a/src/lib/parsers/object-expression.ts b/src/lib/parsers/object-expression.ts index d0e38a5..0eb9dc5 100644 --- a/src/lib/parsers/object-expression.ts +++ b/src/lib/parsers/object-expression.ts @@ -19,5 +19,5 @@ export function parse_object_expression(stream: TokenStream, meta: IParseMeta): recursive_attrs(stream, next, meta, []); } assert_token(next, Tokens.Operator, "}"); - return node; + return node as never; } \ No newline at end of file diff --git a/src/lib/parsers/regexp.ts b/src/lib/parsers/regexp.ts index eac2c65..7a38911 100644 --- a/src/lib/parsers/regexp.ts +++ b/src/lib/parsers/regexp.ts @@ -1,7 +1,7 @@ import { Nodes, NodeType } from "../enums"; import { TokenStream } from "../utils/stream.js"; import { undefined } from "../utils/util.js"; -import type { INode } from "../nodes.js"; +import { INode, RegularExpressionNode } from "../nodes.js"; const symbolicCharsRegex = /^[^\ \t\r\f\v\n<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; @@ -40,11 +40,7 @@ export function parse_regexp({ text_stream }: TokenStream) { next = text_stream.move(); } } - var node: INode = { - name: Nodes.RegularExpression, - type: NodeType.Expression, - symbol: "" - }, next: string, body = "/"; + var next: string, body = "/"; while ((next = text_stream.next) !== "/") { if (next == undefined) { throw "Unterminated regular expression"; @@ -68,6 +64,5 @@ export function parse_regexp({ text_stream }: TokenStream) { body += text_stream.next; text_stream.move(); } - node.symbol = body; - return node; + return RegularExpressionNode(body); } \ No newline at end of file diff --git a/src/lib/utils/advancers.ts b/src/lib/utils/advancers.ts index 082c56a..46421cd 100644 --- a/src/lib/utils/advancers.ts +++ b/src/lib/utils/advancers.ts @@ -1,15 +1,15 @@ -import { assert_token } from "./util.js"; +import { assert_token, nullish } from "./util.js"; import type { Tokens } from "../enums"; import type { TokenStream } from "./stream.js"; export function advance_next

(stream: TokenStream, end: string, prefix?: Prefix

) { const next = stream.advance(); - if (!next) throw `${ prefix ? `${ prefix } ` : "" }Unexcepted EOF - '${ end }' excepted`; + if (nullish(next)) throw `${ prefix ? `${ prefix } ` : "" }Unexcepted EOF - '${ end }' excepted`; return next; } export declare type Prefix

= string extends P ? string : P extends `${ infer S }${ string } ${ "statment" | "expression" }:` ? S extends Uppercase ? P : never: never; -export function assert_next_token

(stream: TokenStream, token_type: Tokens, token_string?: string, prefix?: Prefix

, end = token_string, rest = "") { - return assert_token(advance_next(stream, end!, prefix), token_type, token_string, rest); +export function assert_next_token

(stream: TokenStream, token_type: Tokens, token_string?: string, prefix?: Prefix

, end = token_string!, rest = "") { + return assert_token(advance_next(stream, end, prefix), token_type, token_string, rest); } diff --git a/src/lib/utils/comparer.ts b/src/lib/utils/comparer.ts index 3ef3935..7f3a412 100644 --- a/src/lib/utils/comparer.ts +++ b/src/lib/utils/comparer.ts @@ -2,6 +2,10 @@ import { $validIDs } from "./valid-id.js"; const s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + +export type CharComparerMode = "normal" | "extended"; + export interface MultiValueComparer { includes(value: unknown): value is T; [Symbol.iterator](): IterableIterator; @@ -28,21 +32,24 @@ class $MultiValueComparer { export const MultiValueComparer = $MultiValueComparer as MultiValueComparerConstructor; export class ValidCharsComparer extends $MultiValueComparer { - private validIDs = $validIDs; + private _validIDs = $validIDs; + private _extended_utf_char_range: Map = undefined!; + private _normal_utf_char_range = this.values; + private _mode: CharComparerMode = "normal"; public constructor() { super(`$0123456789_${ s }${ s.toLowerCase() }`); - this.validIDs.splice(0, 6); + this._validIDs.splice(0, 6); this.init("\uffd7"); } public init(toChar: string) { const id = toChar.codePointAt(0)!; let deleteCount = 0; - for (const element of this.validIDs) { + for (const element of this._validIDs) { if (element.length === 2) { let [start, end] = element; if (end > id) { for (; start <= id;) this.values.set(String.fromCodePoint(start++), true); - this.validIDs.splice(0, deleteCount); + this._validIDs.splice(0, deleteCount); element[0] = start; return; } else { @@ -53,9 +60,14 @@ export class ValidCharsComparer extends $MultiValueComparer { } deleteCount++; } + } + public changeMode() { + } /** * This method is considered safe because it continues initialization of this comparer and re-compares again if char is not in the values map + * @internal + * @deprecated */ public safeIncludes(x: string) { return this.values.has(x) || (this.init(x), this.values.has(x)); diff --git a/src/lib/utils/constants.ts b/src/lib/utils/constants.ts index 42a686e..319fd21 100644 --- a/src/lib/utils/constants.ts +++ b/src/lib/utils/constants.ts @@ -1,10 +1,8 @@ -import { _echo } from "./_echo.js"; - - -export const memberAccessOperators = [".", "?.", "!.", "!.[", "?.[", "["] as const; +export const member_access_operators = [".", "?.", "?.[", "["] as const; export const end_expression = "expression"; -export const js_auto_variables = ["__external_var", "this", "arguments", "null", "NaN", "undefined", "Infinity", "true", "false"] as const; +export const auto_variables = ["this", "arguments", "null", "NaN", "undefined", "Infinity", "true", "false"] as const; export const keywords = ["do", "fn", "if", "in", "or", "and", "for", "new", "not", "try", "case", "else", "enum", "eval", "keep", "null", "this", "true", "void", "with", "async", "await", "break", "catch", "class", "const", "false", "macro", "super", "throw", "using", "while", "delete", "yield", "export", "extern", "import", "public", "return", "static", "switch", "typeof", "default", "extends", "finally", "include", "package", "private", "continue", "contains", "debugger", "arguments", "nonlocal", "interface", "__external", "protected", "implements", "instanceof", "undefined", "__external_var"] as const; +/**@deprecated */ export const validChars = (function () { try { return Function("return/(?!\\d)[$_\\u200C\\u200D\\p{ID_Continue}]+/yu")() as RegExp; @@ -12,6 +10,6 @@ export const validChars = (function () { return /[$\w_][\d\w$_]*/y; } })(); -export const $2charoperators = ["&&", "**", "||", "??", "==", "!=", "=>", "<=", ">=", "..", "+=", "/=", "&=", "-=", "++", "--", "*=", "|=", "//", ">>", "<<", "?.", "%=", "^=", "|>", "@@", "/*", "::", "!.", "##"] as const; -export const $3charoperators = ["!.[", "?.[", "?.(", "??=", "||=", "&&=", "**=", ">>>", "...", ">>=", "<<=", "===", "!==", "##[", "##{", "##<"] as const; +export const $2charoperators = ["&&", "**", "||", "??", "==", "!=", "=>", "<=", ">=", "..", "+=", "/=", "&=", "-=", "++", "--", "*=", "|=", "//", ">>", "<<", "?.", "%=", "^=", "|>", "@@", "/*", "::", "##"] as const; +export const $3charoperators = ["?.[", "?.(", "??=", "||=", "&&=", "**=", ">>>", "...", ">>=", "<<=", "===", "!==", "##[", "##{", "##<"] as const; export { end_expression as expression }; diff --git a/src/lib/utils/occurrences.ts b/src/lib/utils/occurrences.ts index 5d558f8..016fe3c 100644 --- a/src/lib/utils/occurrences.ts +++ b/src/lib/utils/occurrences.ts @@ -1,4 +1,4 @@ -// Adopted to ts by MadProbe#7435 +// Adopted to ts and removed unneeded functionality by MadProbe#7435 // All credits goes to Vitim.us // @see {https://gist.github.com/victornpb/7736865} /** Function that count occurrences of a substring in a string; @@ -10,18 +10,13 @@ * @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/ * @see https://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240 */ -export function occurrences(string: string, subString: string, allowOverlapping?: boolean): number { - string += ""; - subString += ""; - if (subString.length <= 0) return (string.length + 1); - +export function occurrences(string: string, subString: string): number { var n = 0, - pos = 0, - step = allowOverlapping ? 1 : subString.length; + pos = 0; while ((pos = string.indexOf(subString, pos)) >= 0) { ++n; - pos += step; + ++pos; } return n; } \ No newline at end of file diff --git a/src/lib/utils/scope.ts b/src/lib/utils/scope.ts index ea1bf20..f1c6564 100644 --- a/src/lib/utils/scope.ts +++ b/src/lib/utils/scope.ts @@ -1,4 +1,5 @@ -import { Node } from "../nodes.js"; +import { undefined } from "./util.js"; +import type { Node } from "../nodes.js"; export class Scope { diff --git a/src/lib/utils/stream.ts b/src/lib/utils/stream.ts index 65bf14b..afc2d18 100644 --- a/src/lib/utils/stream.ts +++ b/src/lib/utils/stream.ts @@ -1,3 +1,4 @@ +import { Prototypeless } from "./util.js"; import type { Tokens } from "../enums"; import type { Prefix } from "./advancers.js"; @@ -20,14 +21,20 @@ export interface TokenStream { readonly text_stream: TextStream; [Symbol.iterator](): Generator; }; +@Prototypeless export class Token { constructor(public readonly type: Tokens, public readonly body: string) { } + is(type: Tokens, body: string) { + return (this.type & type) !== 0 && this.body === body; + } } /**@deprecated */ export type TokenList = readonly Token[]; + +@Prototypeless export class Stream implements TextStream { - public index = 0; + public index: number = 0; public next: string; constructor(public readonly text: string) { this.next = text[0]; @@ -36,8 +43,8 @@ export class Stream implements TextStream { return this.next = this.text[++this.index]; } move() { - const __next = this.text[this.index++]; - this.next = this.text[this.index]; + const __next = this.text[this.index]; + this.next = this.text[++this.index]; return __next!; } down(times: number) { diff --git a/src/lib/utils/table.ts b/src/lib/utils/table.ts index 6b325ee..17bd533 100644 --- a/src/lib/utils/table.ts +++ b/src/lib/utils/table.ts @@ -15,11 +15,9 @@ export const CommonOperatorTable = { "|": Nodes.BitwiseORExpression, "??": Nodes.NullishCoalescingExpression, "&&": Nodes.LogicalANDExpression, + "and": Nodes.LogicalANDExpression, "||": Nodes.LogicalORExpression, "or": Nodes.LogicalORExpression, - "and": Nodes.LogicalANDExpression, - // "!": Nodes.LogicalNOTExpresssion, // Leaving this uncommented may lead to fun bugs - // expression ! expression will be parsed without compilation errors LOL "<<": Nodes.BitwiseLeftShiftExpression, ">>": Nodes.BitwiseRightShiftExpression, ">>>": Nodes.BitwiseUnsignedRightShiftExpression, diff --git a/src/lib/utils/util.ts b/src/lib/utils/util.ts index bf5d7ca..b291add 100644 --- a/src/lib/utils/util.ts +++ b/src/lib/utils/util.ts @@ -1,4 +1,4 @@ -import { js_auto_variables } from "./constants.js"; +import { auto_variables } from "./constants.js"; import { Nodes, Tokens } from "../enums"; import type { Token } from "./stream.js"; import type { INode } from "../nodes"; @@ -13,14 +13,14 @@ export function includes(array: A, value: return ~array.indexOf(value as never) as never; } export function nullish(arg: unknown): arg is null | undefined { - return arg === void 0 || arg === null; + return arg === undefined || arg === null; } export var undefined: undefined; var __counter__ = 0; export function random_var_name() { return `_${ (__counter__++).toString(36) }`; // + "__" + Math.random().toString(16).slice(2); } -export function resetCounter() { +export function reset_counter() { __counter__ = 0; } export function assert_type(value: unknown): asserts value is T { } @@ -28,6 +28,10 @@ export const isArray: (arg: unknown) => arg is T[] = Array.isArray || functio return value instanceof Array; }; export const frozen: (object: T) => Readonly = object => Object.freeze(Object.setPrototypeOf(object, null)); +/** + * Removes Object.prototype from prototype chain and freezes class's prototype. + */ +export const Prototypeless: ClassDecorator = klass => void frozen(klass.prototype); interface CacheEntry { code: string; mtime: number; @@ -64,7 +68,7 @@ export function include(path: URL, cache = true): string | Promise { if (typeof require !== "function") { throw "Please expose 'require' function into the global scope in order to use include statment"; } - global.fetch = require('node-fetch').default; + global.fetch = require(require.resolve('node-fetch')).default; } else { throw "Fetching web resource with no fetch function attached to global in web env!"; } @@ -83,16 +87,21 @@ export function include(path: URL, cache = true): string | Promise { throw "Unsupported protocol '" + protocol + "'!"; }; } -const autoVariablesComparer = new MultiValueComparer(js_auto_variables); +export const auto_variables_comparer = new MultiValueComparer(auto_variables); export function inspectLog(shit: any) { console.log(typeof require === "function" ? require("util").inspect(shit, !0, 1 / 0, !0) : shit); } export function isSymbol(next: Token) { - return next.type === Tokens.Symbol || next.type === Tokens.Keyword && autoVariablesComparer.includes(next.body); + return next.type === Tokens.Symbol || next.type === Tokens.Keyword && auto_variables_comparer.includes(next.body); } export function remove_trailing_undefined(values: INode[]) { for (var index = values.length; index && values[--index].name === Nodes.UndefinedValue;) values.pop(); + return values; +} + +export function should_not_happen(): never { + throw RangeError("should never happen"); } export function error_unexcepted_token(next: Token, rest = ""): never { @@ -104,6 +113,14 @@ export function assert_token(next: Token, token_type: Tokens, token_string?: str return next; } +export class FatalError extends Error { + name = "FatalError"; +} + +export function fatal(error: string): never { + throw new FatalError(error); +} + export function assert(condition: 0 | false, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type?: ErrorConstructor): never; export function assert(condition: unknown, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type?: ErrorConstructor): void; export function assert(condition: unknown, message: string | { [Symbol.toPrimitive](hint: "string"): string; }, error_type: ErrorConstructor = _SyntaxError) { diff --git a/src/lib/utils/valid-chars.ts b/src/lib/utils/valid-chars.ts deleted file mode 100644 index 7e7370c..0000000 --- a/src/lib/utils/valid-chars.ts +++ /dev/null @@ -1 +0,0 @@ -export const _validChars = /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/m \ No newline at end of file diff --git a/src/lib/utils/valid-id.ts b/src/lib/utils/valid-id.ts index e5cfc1b..0a22978 100644 --- a/src/lib/utils/valid-id.ts +++ b/src/lib/utils/valid-id.ts @@ -1,2 +1 @@ export const $validIDs: ([number] | [number, number])[] = [[36], [48, 57], [65, 90], [95], [97, 122], [170], [181], [186], [192, 214], [216, 246], [248, 705], [710, 721], [736, 740], [748], [750], [768, 879], [880, 884], [886], [887], [890, 893], [902], [904, 906], [908], [910, 929], [931, 1013], [1015, 1153], [1155, 1159], [1162, 1319], [1329, 1366], [1369], [1377, 1415], [1425, 1469], [1471], [1473], [1474], [1476], [1477], [1479], [1488, 1514], [1520, 1522], [1552, 1562], [1568, 1610], [1611, 1641], [1646], [1647], [1648], [1649, 1747], [1749], [1750, 1756], [1759, 1764], [1765], [1766], [1767], [1768], [1770, 1773], [1774], [1775], [1776, 1785], [1786, 1788], [1791], [1808], [1809], [1810, 1839], [1840, 1866], [1869, 1957], [1958, 1968], [1969], [1984, 1993], [1994, 2026], [2027, 2035], [2036], [2037], [2042], [2048, 2069], [2070, 2073], [2074], [2075, 2083], [2084], [2085, 2087], [2088], [2089, 2093], [2112, 2136], [2137, 2139], [2208], [2210, 2220], [2276, 2302], [2304, 2307], [2308, 2361], [2362, 2364], [2365], [2366, 2383], [2384], [2385, 2391], [2392, 2401], [2402], [2403], [2406, 2415], [2417, 2423], [2425, 2431], [2433, 2435], [2437, 2444], [2447], [2448], [2451, 2472], [2474, 2480], [2482], [2486, 2489], [2492], [2493], [2494, 2500], [2503], [2504], [2507, 2509], [2510], [2519], [2524], [2525], [2527, 2529], [2530], [2531], [2534, 2543], [2544], [2545], [2561, 2563], [2565, 2570], [2575], [2576], [2579, 2600], [2602, 2608], [2610], [2611], [2613], [2614], [2616], [2617], [2620], [2622, 2626], [2631], [2632], [2635, 2637], [2641], [2649, 2652], [2654], [2662, 2673], [2674, 2676], [2677], [2689, 2691], [2693, 2701], [2703, 2705], [2707, 2728], [2730, 2736], [2738], [2739], [2741, 2745], [2748], [2749], [2750, 2757], [2759, 2761], [2763, 2765], [2768], [2784], [2785], [2786], [2787], [2790, 2799], [2817, 2819], [2821, 2828], [2831], [2832], [2835, 2856], [2858, 2864], [2866], [2867], [2869, 2873], [2876], [2877], [2878, 2884], [2887], [2888], [2891, 2893], [2902], [2903], [2908], [2909], [2911, 2913], [2914], [2915], [2918, 2927], [2929], [2946], [2947], [2949, 2954], [2958, 2960], [2962, 2965], [2969], [2970], [2972], [2974], [2975], [2979], [2980], [2984, 2986], [2990, 3001], [3006, 3010], [3014, 3016], [3018, 3021], [3024], [3031], [3046, 3055], [3073, 3075], [3077, 3084], [3086, 3088], [3090, 3112], [3114, 3123], [3125, 3129], [3133], [3134, 3140], [3142, 3144], [3146, 3149], [3157], [3158], [3160], [3161], [3168], [3169], [3170], [3171], [3174, 3183], [3202], [3203], [3205, 3212], [3214, 3216], [3218, 3240], [3242, 3251], [3253, 3257], [3260], [3261], [3262, 3268], [3270, 3272], [3274, 3277], [3285], [3286], [3294], [3296], [3297], [3298], [3299], [3302, 3311], [3313], [3314], [3330], [3331], [3333, 3340], [3342, 3344], [3346, 3386], [3389], [3390, 3396], [3398, 3400], [3402, 3405], [3406], [3415], [3424], [3425], [3426], [3427], [3430, 3439], [3450, 3455], [3458], [3459], [3461, 3478], [3482, 3505], [3507, 3515], [3517], [3520, 3526], [3530], [3535, 3540], [3542], [3544, 3551], [3570], [3571], [3585, 3632], [3633], [3634], [3635], [3636, 3642], [3648, 3654], [3655, 3662], [3664, 3673], [3713], [3714], [3716], [3719], [3720], [3722], [3725], [3732, 3735], [3737, 3743], [3745, 3747], [3749], [3751], [3754], [3755], [3757, 3760], [3761], [3762], [3763], [3764, 3769], [3771], [3772], [3773], [3776, 3780], [3782], [3784, 3789], [3792, 3801], [3804, 3807], [3840], [3864], [3865], [3872, 3881], [3893], [3895], [3897], [3902], [3903], [3904, 3911], [3913, 3948], [3953, 3972], [3974], [3975], [3976, 3980], [3981, 3991], [3993, 4028], [4038], [4096, 4138], [4139, 4158], [4159], [4160, 4169], [4176, 4181], [4182, 4185], [4186, 4189], [4190, 4192], [4193], [4194, 4196], [4197], [4198], [4199, 4205], [4206, 4208], [4209, 4212], [4213, 4225], [4226, 4237], [4238], [4239, 4253], [4256, 4293], [4295], [4301], [4304, 4346], [4348, 4680], [4682, 4685], [4688, 4694], [4696], [4698, 4701], [4704, 4744], [4746, 4749], [4752, 4784], [4786, 4789], [4792, 4798], [4800], [4802, 4805], [4808, 4822], [4824, 4880], [4882, 4885], [4888, 4954], [4957, 4959], [4992, 5007], [5024, 5108], [5121, 5740], [5743, 5759], [5761, 5786], [5792, 5866], [5870, 5872], [5888, 5900], [5902, 5905], [5906, 5908], [5920, 5937], [5938, 5940], [5952, 5969], [5970], [5971], [5984, 5996], [5998, 6000], [6002], [6003], [6016, 6067], [6068, 6099], [6103], [6108], [6109], [6112, 6121], [6155, 6157], [6160, 6169], [6176, 6263], [6272, 6312], [6313], [6314], [6320, 6389], [6400, 6428], [6432, 6443], [6448, 6459], [6470, 6479], [6480, 6509], [6512, 6516], [6528, 6571], [6576, 6592], [6593, 6599], [6600], [6601], [6608, 6617], [6656, 6678], [6679, 6683], [6688, 6740], [6741, 6750], [6752, 6780], [6783, 6793], [6800, 6809], [6823], [6912, 6916], [6917, 6963], [6964, 6980], [6981, 6987], [6992, 7001], [7019, 7027], [7040, 7042], [7043, 7072], [7073, 7085], [7086], [7087], [7088, 7097], [7098, 7141], [7142, 7155], [7168, 7203], [7204, 7223], [7232, 7241], [7245, 7247], [7248, 7257], [7258, 7293], [7376, 7378], [7380, 7400], [7401, 7404], [7405], [7406, 7409], [7410, 7412], [7413], [7414], [7424, 7615], [7616, 7654], [7676, 7679], [7680, 7957], [7960, 7965], [7968, 8005], [8008, 8013], [8016, 8023], [8025], [8027], [8029], [8031, 8061], [8064, 8116], [8118, 8124], [8126], [8130, 8132], [8134, 8140], [8144, 8147], [8150, 8155], [8160, 8172], [8178, 8180], [8182, 8188], [8204], [8205], [8255], [8256], [8276], [8305], [8319], [8336, 8348], [8400, 8412], [8417], [8421, 8432], [8450], [8455], [8458, 8467], [8469], [8473, 8477], [8484], [8486], [8488], [8490, 8493], [8495, 8505], [8508, 8511], [8517, 8521], [8526], [8544, 8584], [11264, 11310], [11312, 11358], [11360, 11492], [11499, 11502], [11503, 11505], [11506], [11507], [11520, 11557], [11559], [11565], [11568, 11623], [11631], [11647], [11648, 11670], [11680, 11686], [11688, 11694], [11696, 11702], [11704, 11710], [11712, 11718], [11720, 11726], [11728, 11734], [11736, 11742], [11744, 11775], [11823], [12293, 12295], [12321, 12329], [12330, 12335], [12337, 12341], [12344, 12348], [12353, 12438], [12441], [12442], [12445, 12447], [12449, 12538], [12540, 12543], [12549, 12589], [12593, 12686], [12704, 12730], [12784, 12799], [13312, 19893], [19968, 40908], [40960, 42124], [42192, 42237], [42240, 42508], [42512, 42527], [42528, 42537], [42538], [42539], [42560, 42606], [42607], [42612, 42621], [42623, 42647], [42655], [42656, 42735], [42736], [42737], [42775, 42783], [42786, 42888], [42891, 42894], [42896, 42899], [42912, 42922], [43000, 43009], [43010], [43011, 43013], [43014], [43015, 43018], [43019], [43020, 43042], [43043, 43047], [43072, 43123], [43136], [43137], [43138, 43187], [43188, 43204], [43216, 43225], [43232, 43249], [43250, 43255], [43259], [43264, 43273], [43274, 43301], [43302, 43309], [43312, 43334], [43335, 43347], [43360, 43388], [43392, 43395], [43396, 43442], [43443, 43456], [43471], [43472, 43481], [43520, 43560], [43561, 43574], [43584, 43586], [43587], [43588, 43595], [43596], [43597], [43600, 43609], [43616, 43638], [43642], [43643], [43648, 43695], [43696], [43697], [43698, 43700], [43701], [43702], [43703], [43704], [43705, 43709], [43710], [43711], [43712], [43713], [43714], [43739, 43741], [43744, 43754], [43755, 43759], [43762, 43764], [43765], [43766], [43777, 43782], [43785, 43790], [43793, 43798], [43808, 43814], [43816, 43822], [43968, 44002], [44003, 44010], [44012], [44013], [44016, 44025], [44032, 55203], [55216, 55238], [55243, 55291], [63744, 64109], [64112, 64217], [64256, 64262], [64275, 64279], [64285], [64286], [64287, 64296], [64298, 64310], [64312, 64316], [64318], [64320], [64321], [64323], [64324], [64326, 64433], [64467, 64829], [64848, 64911], [64914, 64967], [65008, 65019], [65024, 65039], [65056, 65062], [65075], [65076], [65101, 65103], [65136, 65140], [65142, 65276], [65296, 65305], [65313, 65338], [65343], [65345, 65370], [65382, 65470], [65474, 65479], [65482, 65487], [65490, 65495]]; -export const $initialValidIDs: [number, number?][] = [[36], [48, 57], [65, 90], [95], [97, 122]]; diff --git a/src/lib/utils/variable-namer.ts b/src/lib/utils/variable-namer.ts deleted file mode 100644 index 89a5cdd..0000000 --- a/src/lib/utils/variable-namer.ts +++ /dev/null @@ -1,24 +0,0 @@ -const __vars: Record = {}; -var chars = StringRange("a", "z") + StringRange("A", "Z") + "_$"; -function StringRange(a: string, b: string) { - var char = a.charCodeAt(0); - var char2 = b.charCodeAt(0); - var res = ""; - for (; char <= char2; char++) res += String.fromCharCode(char); - return res; -} -function toChar(code: string) { - return Function('"' + code + '"')() -} -var __NON_ASCII_CHARS_ALLOWED__ = true; -if (__NON_ASCII_CHARS_ALLOWED__) { - chars += Array.from(/\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc/.source.matchAll(/((?:\\x[\da-f][\da-f])|(?:\\u[\da-f][\da-f][\da-f][\da-f]))(\-((?:\\x[\da-f][\da-f])|(?:\\u[\da-f][\da-f][\da-f][\da-f])))?/g), - s => s[3] ? StringRange(toChar(s[1]), toChar(s[3])) : toChar(s[1])).join(''); -} -export function varname(symbol: string) { - var sym = __vars[symbol]; - if (sym) { - return sym; - } - -} diff --git a/src/lib/wrapper.ts b/src/lib/wrapper.ts index 3b3be33..27e17b0 100644 --- a/src/lib/wrapper.ts +++ b/src/lib/wrapper.ts @@ -11,18 +11,13 @@ const __async = `function __async(f,t,a){` + `})` + `}`; -const __null_assert = `function __na(v){if(n(v))throw TypeError("Null assertion");return v}`; const __nullish = `function n(v){return v===null||v===u}`; const __contains = `function __contains(i,v){` + // i = iterable, v = value // _ = iterator, n = next method of _, t = temp variable - `for(var _=i[Symbol.iterator](),n=_.next,t;!(t=__call(n,_)).done;)if((t=t.value)===v||v!==v&&t!==t)return!0;` + - `return!1}`; + `for(var _=i[Symbol.iterator](),n=_.next,t;!(t=__call(n,_)).done;)if((t=t.value)===v||v!==v&&t!==t)return!0;return!1}`; const __throw = "function __throw(e){throw e}"; export function wrap(code: string, used: Readonly) { - return `(function(p,u){var c=n.call,__bind=c.bind(n.bind),` + - `pr=__bind(p.resolve,p),__call=__bind(c,c),__apply=__bind(c,n.apply);` + - `${ __nullish }${ __async }${ used.contains ? __contains : "" }${ used.na ? __null_assert : "" }${ used.throw ? - __throw : "" }` + - `return ${ code }})(Promise)()`; + return `(function(p,u){const c=n.call,__bind=c.bind(n.bind),pr=__bind(p.resolve,p),__call=__bind(c,c),__apply=__bind(c,n.apply);` + + `${ __nullish }${ __async }${ used.contains ? __contains : "" }${ used.throw ? __throw : "" }return ${ code }})(Promise)()`; } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 969c709..885ed3e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "sourceMap": true, "composite": true, "tsBuildInfoFile": ".tsbuildinfo", - "incremental": true + "incremental": true, + "experimentalDecorators": true }, "include": ["./src/lib"] } \ No newline at end of file From 79bb522f3f7e3ed10df1c3a0fb8ad9160fcca468 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:38:01 +0300 Subject: [PATCH 09/14] update block nodes --- src/lib/emitter.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/lib/emitter.ts b/src/lib/emitter.ts index 94a6b04..1df9f20 100644 --- a/src/lib/emitter.ts +++ b/src/lib/emitter.ts @@ -16,7 +16,13 @@ const block_node_comparer = new MultiValueComparer([ Nodes.KeepStatment, Nodes.CodeBlock, Nodes.TryStatment, - Nodes.IfStatment + Nodes.IfStatment, + Nodes.DoWhileStatment, + Nodes.WhileStatment, + Nodes.ForOfStatment, + Nodes.ForRangeStatment, + Nodes.ForStatment, + Nodes.NamedIncludeStatment, ] as const); const simple_node_comparer = new MultiValueComparer([ Nodes.Array, @@ -50,8 +56,10 @@ function as_expression(exp: INode): INode { name: exp.outerBody?.name ?? Nodes.FunctionExpression, type: NodeType.Expression, body: [exp], - params: [] - } as never], []); + params: [], + locals: [], + nonlocals: [] + }], []); } } function isBlockNode(node: INode) { From 21d2ab85bf82afe87b209a773919a60a40b6deb8 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:38:21 +0300 Subject: [PATCH 10/14] remove Tokens.Range --- src/lib/enums.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/enums.ts b/src/lib/enums.ts index eb25473..d37c8c4 100644 --- a/src/lib/enums.ts +++ b/src/lib/enums.ts @@ -166,6 +166,7 @@ export const enum Tokens { Comment = 0x00000020, MultilineComment = 0x00000040, Keyword = 0x00000080, + /**@deprecated */ Range = 0x00000100 } export const enum DiagnosticSeverity { From adbbcea8e7a052f624f906a264f227547a5d256a Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:38:59 +0300 Subject: [PATCH 11/14] server: allow http1 and markdown --- server.mjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server.mjs b/server.mjs index d1c31d5..250b0f6 100644 --- a/server.mjs +++ b/server.mjs @@ -14,6 +14,7 @@ const compressGzip = promisify(gzip); const currentDirectoryOverrride = argv.find(x => x.startsWith("--dir="))?.slice(6); const __dirname = currentDirectoryOverrride || cwd(); const content_type_for_ext = { + ".md": "text/markdown", ".html": "text/html", ".js": "application/javascript", ".mjs": "application/javascript", @@ -21,7 +22,7 @@ const content_type_for_ext = { ".css": "text/css", ".map": "application/json", ".json": "application/json", - ".webmanifest": "application/json", + ".webmanifest": "application/json" }; const uncompressable_files = { ".ico": "image/png", @@ -66,6 +67,7 @@ const http1RequestProcessor = async (req, res) => { mtime: stats.mtimeNs }).compressed; res.setHeader("Content-Type", contentTypeFromExt(ext)); + res.setHeader("Content-Length", Number(stats.size)); if (!uncompressable_files[ext]) { res.setHeader("Content-Encoding", "gzip"); } @@ -85,7 +87,8 @@ createServer(http1RequestProcessor).listen(settings?.http1?.port || port || 80); createSecureServer({ cert: await readFile(new URL(await import.meta.resolve("./server.crt"))), - key: await readFile(new URL(await import.meta.resolve("./server.key"))) + key: await readFile(new URL(await import.meta.resolve("./server.key"))), + allowHTTP1: true }, (req, res) => { const { httpVersion } = req; if (httpVersion !== "2.0") { From 4e998b9a1f0b1571a5da6be7f13cb2f0227e027b Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 22:51:54 +0300 Subject: [PATCH 12/14] make regexp parser a bit faster and better errors --- src/lib/lexer.ts | 2 +- src/lib/parsers/regexp.ts | 34 ++++++++++++++++++++-------------- src/lib/utils/util.ts | 2 +- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index 092f657..218a0f3 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -12,10 +12,10 @@ const operatorCharsComparer = new MultiValueComparer("<>/*+-?|&^!%.@:=[](){};,~# const $2charOperatorComparer = new MultiValueComparer($2charoperators); const $3charOperatorComparer = new MultiValueComparer($3charoperators); const keywordComparer = new MultiValueComparer(keywords); -const validAfterNumberChars = new MultiValueComparer([...whitespaceCharsComparer, ...operatorCharsComparer, "'" as const, '"' as const]); const validIDComparer = new ValidCharsComparer(); const operatorTokenMap = new Map([...operatorCharsComparer, ...$2charoperators, ...$3charoperators, ">>>=" as const] .map(operator => [operator, new Token(Tokens.Operator, operator)])); +export const validAfterNumberChars = new MultiValueComparer([...whitespaceCharsComparer, ...operatorCharsComparer, "'" as const, '"' as const]); @Prototypeless diff --git a/src/lib/parsers/regexp.ts b/src/lib/parsers/regexp.ts index 7a38911..9c1e74b 100644 --- a/src/lib/parsers/regexp.ts +++ b/src/lib/parsers/regexp.ts @@ -1,15 +1,19 @@ -import { Nodes, NodeType } from "../enums"; import { TokenStream } from "../utils/stream.js"; -import { undefined } from "../utils/util.js"; -import { INode, RegularExpressionNode } from "../nodes.js"; +import { fatal, nullish, undefined } from "../utils/util.js"; +import { RegularExpressionNode } from "../nodes.js"; +import { MultiValueComparer } from "../utils/comparer.js"; +import { validAfterNumberChars } from "../lexer.js"; +import { pushDiagnostic } from "../parser.js"; +import { DiagnosticSeverity } from "../enums.js"; -const symbolicCharsRegex = /^[^\ \t\r\f\v\n<>\/*+\-?|&\^!%\.@:=\[\]~(){};,"'#]$/m; +const validChars = new MultiValueComparer([...validAfterNumberChars, "\\" as const]); +const validFlags = new MultiValueComparer("dgmuiys"); export function parse_regexp({ text_stream }: TokenStream) { function parse_list() { while (next !== "]") { - if (next == undefined) { - throw "Unterminated regular expression character list."; + if (nullish(next)) { + fatal("Unterminated regular expression character list"); } if (next === "\\") { body += next + text_stream.move(); @@ -25,8 +29,8 @@ export function parse_regexp({ text_stream }: TokenStream) { } function parse_group() { while (next !== ")") { - if (next == undefined) { - throw "Unterminated regular expression group."; + if (nullish(next)) { + fatal("Unterminated regular expression group"); } if (next === "\\") { body += next + text_stream.move(); @@ -42,8 +46,8 @@ export function parse_regexp({ text_stream }: TokenStream) { } var next: string, body = "/"; while ((next = text_stream.next) !== "/") { - if (next == undefined) { - throw "Unterminated regular expression"; + if (nullish(next)) { + fatal("Unterminated regular expression"); } if (next === "\\") { body += text_stream.move() + text_stream.move(); @@ -59,10 +63,12 @@ export function parse_regexp({ text_stream }: TokenStream) { next = text_stream.move(); } body += text_stream.move(); - while (text_stream.next != undefined && symbolicCharsRegex.test(text_stream.next)) { - if (!/[dgmuiys]/.test(text_stream.next)) throw `Invalid regular expression flag ${ text_stream.next }`; - body += text_stream.next; - text_stream.move(); + while (validChars.includes(text_stream.next)) { + if (!validFlags.includes(text_stream.next)) { + pushDiagnostic(DiagnosticSeverity.Error, `Invalid regular expression flag ${ text_stream.move() }`); + break; + } + body += text_stream.move(); } return RegularExpressionNode(body); } \ No newline at end of file diff --git a/src/lib/utils/util.ts b/src/lib/utils/util.ts index b291add..1c186c2 100644 --- a/src/lib/utils/util.ts +++ b/src/lib/utils/util.ts @@ -117,7 +117,7 @@ export class FatalError extends Error { name = "FatalError"; } -export function fatal(error: string): never { +export function fatal

(error: P extends `${string}.` ? undefined : P): never { throw new FatalError(error); } From 6f70e032f12a99fbf965bb5ee2ca9218a83e3d15 Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Tue, 18 Jan 2022 23:55:57 +0300 Subject: [PATCH 13/14] Add a small overview the compiler --- src/lib/readme.md | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/lib/readme.md diff --git a/src/lib/readme.md b/src/lib/readme.md new file mode 100644 index 0000000..0011383 --- /dev/null +++ b/src/lib/readme.md @@ -0,0 +1,43 @@ +# A small overview for those who may want to dig into this compiler + - [compiler.ts](./compiler.ts) - de facto the entry point to the compiler machinery, joins up the lexer, parser, emitter and code wrapper together. + - [parser.ts](./parser.ts) - self-explanatory, important functions: + 1. parse - called by compileCode() function, entry to the parser machinery: resets random private variable counter, initialized parser's output object, diagnostics array, converts its result when any async operation occured. + 2. @internal main_parse - called by parse() function, loops through tokens from lexer and calls _parse() function. + 3. _parse - called by various other parser function when insideExpression meta flag must be disposed e.g. resulting expression can safely be also typeof statment without any wrapping. + 4. __parse - decides how the `next` token must be treated and then either parsers into nothing (undefined) if token must be treated as nothing or to a Node. + 5. @internal parse_operators - self-explanatory. + + - [parsers](./parsers) folder contains functions that parse certain expression(s). + 1. [keywords.ts](./parsers/keywords.ts) - Contains big ol' object with function for each supported keyword. (BIGGG WIP) + 2. [array-expression.ts](./parsers/array-expression.ts) - self-explanatory. + 3. [group-expression.ts](./parsers/group-expression.ts) - self-explanatory. + 4. [call-expression.ts](./parsers/call-expression.ts) - self-explanatory. + 5. [external-var.ts](./parsers/external-var.ts) - self-explanatory. + 6. [assignments.ts](./parsers/assignments.ts) - self-explanatory. + 7. [common-expressions.ts](./parsers/common-expressions.ts) - self-explanatory. + 8. [body-parser.ts](./parsers/body-parser.ts) - self-explanatory. + 9. [object-expression.ts](./parsers/object-expression.ts) - self-explanatory (WIP). + 10. [regexp.ts](./parsers/regexp.ts) - self-explanatory. + 11. [member-access.ts](./parsers/member-access.ts) - self-explanatory. + - [enums.ts](./enums.ts) - es habt alle da const enums. + - [nodes.ts](./nodes.ts) - contains definition of class and interface of a Node and functions, wrapping Node constructor for simplicity. + - [predence.ts](./predence.ts) - defines predence for each (almost) node type. + - [wrapper.ts](./wrapper.ts) - wraps emitted code into a IIFE with functions exported and appends nessecary. + - [emitter.ts](./emitter.ts) - Emits AST into JS code. + 1. emit - called by compileCode() function, prepares stuff before emitting and optionally emits shebang into the output. + 2. @internal _emit - called by emit(), self and other functions, decides how to emit node basing on its type (`node.name`: `type Nodes`). + - var __text - carries the emitted JS code. + - declare - appends compiler variable into function scope. + - emitChain - emits chain of AccesssItemChain array. + - emitSlicedArguments - emits code for function arguments after rest parameter. + - emitCallExpression - emits code for `Nodes.CallExpression` like nodes. + - emit_body - emits code from `body` parameter with default of `node.body`. + - simple_emit_body - emits curly braces and prepares indentation before call to `emit_body`. + - sp - inserts optional whitespace if `pretty` compiler option is specified and equals to `true`. + - nl - inserts optional newline if `pretty` compiler option is specified and equals to `true`. + - ri - raises indentation by 4 spaces (` `) if `pretty` compiler option is specified and equals to `true`. + - li - lowers indentation by 4 spaces (` `) if `pretty` compiler option is specified and equals to `true`. + - is - inserts indentation into text (controlled by ri() and li() functions) if `pretty` compiler option is specified and equals to `true`. + 3. @internal isBlockNode - determines if node has body with curly braces `{}`. + 4. @internal isSimple - determines if node can be emitted without parenthesis `()`. + 5. @internal var __pretty - carries value of `pretty` compiler option for the sake of optimizations and simplicity. From 6e87d45ba369761a5580927c1e997ed80cc154ef Mon Sep 17 00:00:00 2001 From: MadProbe <49519179+MadProbe@users.noreply.github.com> Date: Fri, 21 Jan 2022 00:34:54 +0300 Subject: [PATCH 14/14] fix critical bug --- src/lib/lexer.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/lexer.ts b/src/lib/lexer.ts index 218a0f3..b444b65 100644 --- a/src/lib/lexer.ts +++ b/src/lib/lexer.ts @@ -100,9 +100,8 @@ class Lexer implements TokenStream { } } private _scanChars(result: string) { - var next: string; - while (!nullish(next = this.text_stream.move()) && validIDComparer.includes(next)) { - result += next; + while (validIDComparer.includes(this.text_stream.next)) { + result += this.text_stream.move(); } return new Token(keywordComparer.includes(result) ? Tokens.Keyword : Tokens.Symbol, result); }